Thanks Roeland. I was able to insert most of the values into my non-standard invoice design, but it’s a lot harder to do this sort of customisation than it used to be with the way theme variables have been structured.
In case it’s useful to anyone, here’s a barebones template, which you can try and style with CSS (if, like me, you can’t bring yourself to re-embrace ye olde table-based layouts of the default themes). If I were starting again, I’d probably start with something like this:
{% if business.logo != null %}
<img src="{{ business.logo }}"/>
{% endif %}
<div>
<p>{{ business.name }}<br>
{{ business.address }}</p>
<p>ABN: {{ business.identifier }}</p>
</div>
<div>
<p>{{ recipient.name }} {{ recipient.code }}<br>
{{ recipient.address | newline_to_br }}</p>
<p>{{ recipient.identifier }}</p>
</div>
<div>
{% for field in fields %}
<p>{{ field.label }}: {{ field.text }}</p>
{% endfor %}
</div>
<div>
<h1>{{ description }}</h1>
</div>
<table>
<tr>
{% for column in table.columns %}
<td>{{ column.label }}</td>
{% endfor %}
</tr>
{% for row in table.rows %}
<tr>
{% for cell in row.cells %}
<td>{{ cell.text | newline_to_br }}</td>
{% endfor %}
</tr>
{% endfor %}
{% for total in table.totals %}
<tr>
<td colspan="{{ table.columns | size | minus:1 }}" >{{ total.label }}</td>
<td>{{ total.text }}</td>
</tr>
{% endfor %}
</table>
<div>
{% for field in custom_fields %}
<p>{{ field.label }}: {{ field.text }}</p>
{% endfor %}
</div>
Be warned though, I’m beginning to suspect that CSS might be broken in a way it wasn’t with the original Manager templates. Code that still works in a web browser is not being styled correctly in Manager themes.
As for me, I’m ready to give up on themes.