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).
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 namedC
, just like the right node, and the two left ones getH
.MOV1
: Move to the node at position 1, that is, the right node.SB28
andZ28
: 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]
FIVE
draws a five-ring.RZ
draws substituents using names from the data given.ADJ1
moves 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