Today I experimented with ppchTeX, a macro package for plain TeX, LaTeX and ConTeXt to typeset chemical formulas.
It’s stucture is very interesting; it uses an arcane syntax which in fact is a domain specific language. I’ll show some examples here.
 First, Ethene (CH2CH2).
First, Ethene (CH2CH2).
The code of this looks like this (there is some stuff around it, but this is the code unique to this certain formula):
\chemical[ONE,SB46,DB1,Z0146,MOV1,SB28,Z28][C,C,H,H,H,H]
This reads like a simple program:
- ONE: This is the command to introduce an “node” inside the formula.
- SB46: Draw a Single Bond on position 4 and 6 of the current node. This is bottom-left and top-left.
- DB1: Draw a Double Bond on position 1 of the current node. This is right-middle.
- Z0146: Add the name of the atoms at position 0 (the middle of the node), 1, 4 and 6. These get the names from the data attached to the call; i.e. the current node gets named- C, just like the right node, and the two left ones get- H.
- MOV1: Move to the node at position 1, that is, the right node.
- SB28and- Z28: Draw the upper-right and bottom-right bonds, and name them accordingly.
This sounds quite compilicated, but once you got how to look at the formula, its quite easy to write.

Now, a bit more complicated example, two acetic acid molecules connected by hydrogen bonds. The code:
\chemical[ONE,Z05,SB25,DB8][C,H_3C]
\chemical[PB:Z2,ONE,Z01,SB1,PE][O,H]
\chemical[PB:Z8,ONE,Z0,HB1,PE][O]
\chemical[SUB1,ONE,18OFF1,Z01,SB16,DB4][C,CH_3]
\chemical[PB:Z4,ONE,Z0,HB5,PE][O]
\chemical[PB:Z6,ONE,Z05,SB5,PE][O,H]
I’ll only explain the stuff not covered above:
- PB:pos…- PE: Start a subdiagram at position pos.
- SUB1: move one structure in relation to another in the direction given.
- 18OFF1: do 18 small steps in direction 1 (right).
Now, a quite tricky one, Guanine:
\chemical[FIVE,SB235,DB14,SR4,Z1245,RZ4][C,C,C,N,H]
\chemical[PB:Z3,ONE,Z0,SB3,CZ3,PE][N,H]
\chemical[ADJ1,SIX,SB1356,DB2,Z1236,DR6,RZ6][N,C,N,C,O]
\chemical[ADJ1,SIX,SB35,Z6][H,H]
\chemical[PB:Z3,ONE,Z0,SB28,CZ28,PE][N,H,H]

- FIVEdraws a five-ring.
- RZdraws substituents using names from the data given.
- ADJ1moves another structure in the direction given adjacent to a bond.
Yeah, that’s it. Lots of fun and a source of endless frustration… :-)
NP: Grateful Dead—Mountains Of The Moon