1
2
3
4
5
6
7
8
9
10
11
12
13
14
15\endinput
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60\doifundefined{usemodule}
61 {\writestatus{loading}{ConTeXt Chemical Macros 1996.3.1}}
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84\startcommands dutch english german
85
86 gotochemical: naarchemie gotochemical zurchemie
87 setupchemical: stelchemiein setupchemical stellechemieein
88 startchemical: startchemie startchemical startchemie
89 stopchemical: stopchemie stopchemical stopchemie
90 definechemical: definieerchemie definechemical definierechemie
91 chemical: chemie chemical chemie
92 toptext: boventekst toptext textueber
93 bottext: ondertekst bottext textunter
94 midtext: middentekst midtext textmitte
95
96\stopcommands
97
98\doifundefined{fiverm}
99 {\font\fiverm=cmr5 }
100
101\newconstant\chemicaldrawingmode
102
103\doifelsedefined{beginpicture}
104 {\doifelsedefined{startMPdrawing}
105 {\chemicaldrawingmode\plustwo }
106 {\chemicaldrawingmode\zerocount}}
107 {\doifelsedefined{psaxes}
108 {\chemicaldrawingmode\plusone }
109 {\chemicaldrawingmode\plusthree}}
110
111\ifcase\chemicaldrawingmode
112 \writestatus{ppchtex}{using PiCTeX}
113\or
114 \writestatus{ppchtex}{using PSTricks (still experimental)}
115 \writestatus{ppchtex}{automatic sizing not (yet) supported}
116\or
117 \writestatus{ppchtex}{using PiCTeX and MetaPost}
118\else
119 \writestatus{ppchtex}{load PiCTeX (prepost) or PSTricks (pstplot) first}
120 \bgroup
121 \read16 to \exit
122 \egroup
123 \expandafter\endinput
124\fi
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271\unprotect
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289\newif\ifloweredsubscripts
290
291\def\setsubscripts
292 {\def\dosetsubscript##1##2##3
293 {\dimen0=##3\fontexheight##2
294 \setxvalue{@@\string##1\string##2}{\the##1##2\relax}
295 ##1##2=\dimen0\relax}
296 \def\dodosetsubscript##1##2
297 {\dosetsubscript{##1}{\textfont 2}{##2}
298 \dosetsubscript{##1}{\scriptfont 2}{##2}
299 \dosetsubscript{##1}{\scriptscriptfont2}{##2}}
300
301 \dodosetsubscript\mathsubnormal {.7}
302 \dodosetsubscript\mathsubcombined{.7}
303 \global\loweredsubscriptstrue}
304
305\def\resetsubscripts
306 {\ifloweredsubscripts
307 \def\doresetsubscript##1##2
308 {\dimen0=\getvalue{@@\string##1\string##2}\relax
309 ##1##2=\dimen0}
310 \def\dodoresetsubscript##1
311 {\doresetsubscript{##1}{\textfont2}
312 \doresetsubscript{##1}{\scriptfont2}
313 \doresetsubscript{##1}{\scriptscriptfont2}}
314
315 \dodoresetsubscript\mathsubnormal
316 \dodoresetsubscript\mathsubcombined
317 \global\loweredsubscriptsfalse
318 \fi}
319
320\ifx\Umathchar\undefined \else
321
322
323 \let\setsubscripts \relax
324 \let\resetsubscripts\relax
325\fi
326
327\def\doresetsubscripts
328 {\resetsubscripts}
329
330\def\sethighsubscripts
331 {\resetsubscripts
332 \let\dosetsubscripts=\relax}
333
334\def\setlowsubscripts
335 {\def\dosetsubscripts{\setsubscripts}}
336
337\setlowsubscripts
338
339\newcount\horchemical
340\newcount\verchemical
341\newcount\txtchemical
342\newcount\levchemical
343
344\newif\ifinchemical \inchemicalfalse
345\newif\iffixedchemical \fixedchemicalfalse
346
347\newbox\chemicalsymbols
348
349
350
351
352\definesystemvariable {chemical}
353
354\definesystemconstant {chemical}
355
356\definesystemconstant {translate}
357\definesystemconstant {distance}
358\definesystemconstant {mirror}
359\definesystemconstant {rotate}
360\definesystemconstant {substitute}
361\definesystemconstant {angle}
362
363\definesystemconstant {executechemical}
364\definesystemconstant {chemicaltextelement}
365\definesystemconstant {chemicallinesegment}
366\definesystemconstant {chemicalcircsegment}
367
368\def\chemicalspace {\quad}
369
370
371
372
373
374
375
376
377
378\def\dowithchemical
379 {}
380
381\def\localgotochemical#1#2{\gotobox{#2}[#1]}
382\def\localthisischemical#1{\pagereference[#1]}
383
384
385
386\def\setchemicalmaximum #1
387 {\def\maxchemical{#1}}
388
389\def\doifchemicalnumber#1#2#3
390 {\doifelsenumber{#1}
391 {\ifnum#1>\maxchemical\relax
392 \writestatus{ppchtex}{number #1 is skipped}
393 \else
394 #3
395 \fi}
396 {\unknownchemical{#2}}}
397
398\newif\ifsmallchemicaltext
399
400\let\@@localchemicalstyle\empty
401
402\unexpanded\def\setupchemicalformat[#1]
403 {\processaction
404 [\getvalue{#1\c!size}]
405 [ \v!small=>\def\@@localchemicalformat{\scriptscriptstyle},
406 \v!medium=>\def\@@localchemicalformat{\ifsmallchemicaltext\scriptscriptstyle\else\scriptstyle\fi},
407 \v!big=>\def\@@localchemicalformat{\ifsmallchemicaltext\scriptstyle\else\textstyle\fi},
408 \s!unknown=>\def\@@localchemicalformat{\getvalue{#1\c!size}}]
409 \processaction
410 [\getvalue{#1\c!textsize}]
411 [ \v!small=>\def\@@localchemicalstyle{\scriptscriptstyle},
412 \v!medium=>\def\@@localchemicalstyle{\ifsmallchemicaltext\scriptscriptstyle\else\scriptstyle\fi},
413 \v!big=>\def\@@localchemicalstyle{\ifsmallchemicaltext\scriptstyle\else\textstyle\fi},
414 \s!unknown=>\def\@@localchemicalstyle{\getvalue{#1\c!textsize}}]
415 \processaction
416 [\getvalue{#1\c!scale}]
417 [ \v!small=>\def\@@localchemicalscale{500},
418 \v!medium=>\def\@@localchemicalscale{625},
419 \v!big=>\def\@@localchemicalscale{750},
420 \s!unknown=>\def\@@localchemicalscale{\getvalue{#1\c!scale}}]}
421
422\def\@@currentchemicalformat
423 {\ifinchemical
424 \@@localchemicalformat
425 \else
426 \@@localchemicalstyle
427 \fi}
428
429\def\dosetupchemical[#1]
430 {\getparameters[\??chemical\s!chemical][#1]
431 \doifelse{\@@chemicalchemicaloffset}{LOW}
432 {\setlowsubscripts}
433 {\sethighsubscripts}
434 \setupchemicalformat[\??chemical\s!chemical]
435 \ignorespaces}
436
437\unexpanded\def\setupchemical
438 {\dosingleargument\dosetupchemical}
439
440\def\@@dochemicalstyle
441 {\@@chemicalstyle}
442
443\def\@@dochemicalcolor
444 {}
445
446\def\@@chemicalstyle
447 {\@@chemicalchemicalstyle}
448
449\def\@@writechemicalstate#1#2
450 {}
451
452\def\@@beginchemicallocalpicture
453 {\ifcase\chemicaldrawingmode
454 \beginpicture
455 \or
456 \pspicture(0,0)(0,0)
457 \or
458 \pushMPdrawing
459 \startMPdrawing
460
461
462 u := 10*\@@chemicalunit;
463 bboxmargin := 0pt ;
464 pickup pencircle scaled 2u ;
465 \stopMPdrawing
466 \beginpicture
467 \fi}
468
469\def\@@endchemicallocalpicture#1#2
470 {\ifcase\chemicaldrawingmode
471 \endpicture
472 \or
473 \endpspicture
474 \or
475 \resetchemicalcoordinates
476 \setbox2\hbox{\ignoreMPboxdepth\getMPdrawing}
477 \wd2\zeropoint
478 \ht2\zeropoint
479 \dp2\zeropoint
480 \put {\box2} at 0 0
481 \endpicture
482 \popMPdrawing
483 \fi}
484
485\def\@@beginchemicalpicture#1#2#3#4
486 {\ifnum\chemicaldrawingmode=1
487 \pspicture(#1,#3)(#2,#4)
488 \def\account##1##2{}
489 \psaxes[axesstyle=none,labels=none,ticks=none](#1,#3)(#2,#4)
490 \else
491 \beginpicture
492 \setplotarea
493 x from {#1} to {#2},
494 y from {#3} to {#4}
495 \iffixedchemical
496 \accountingon
497 \def\account##1##2
498 {\put {} at {##1} {##2} }
499 \else
500 \accountingoff
501 \def\account##1##2{}
502 \fi
503 \fi
504 \ignorespaces}
505
506\def\@@endchemicalpicture
507 {\ifcase\chemicaldrawingmode
508 \put {\box\chemicalsymbols} at 0 0
509 \endpicture
510 \or
511 \rput(0,0){\box\chemicalsymbols}
512 \endpspicture
513 \or
514 \put {\box\chemicalsymbols} at 0 0
515 \ifMPdrawingdone
516 \resetchemicalcoordinates
517 \setbox2\hbox{\ignoreMPboxdepth\getMPdrawing}
518 \wd2\zeropoint
519 \ht2\zeropoint
520 \dp2\zeropoint
521 \put {\box2} at 0 0
522 \fi
523 \endpicture
524 \fi}
525
526\def\@@setchemicalcoordinatesystem#1
527 {\edef\@@chemicalunit{#1}
528 \ifcase\chemicaldrawingmode
529 \setcoordinatesystem units <\@@chemicalunit,\@@chemicalunit>
530 \or
531 \psset{unit=\@@chemicalunit}
532 \or
533 \setcoordinatesystem units <\@@chemicalunit,\@@chemicalunit>
534 \startMPdrawing
535
536
537 u := 10*#1;
538 bboxmargin := 0pt ;
539 pickup pencircle scaled 2u ;
540 \stopMPdrawing
541 \fi}
542
543\ifx\MPdivten\undefined
544 \def\MPdivten[#1]{\withoutpt\the\dimexpr#1pt10\relax}
545\fi
546
547\def\@@setchemicalaxis#1#2#3#4
548 {\ifcase\chemicaldrawingmode
549 \axis
550 bottom shiftedto y=0
551 ticks from {#1} to {#2} by 500
552 \axis
553 left shiftedto x=0
554 ticks from {#3} to {#4} by 500
555 \or
556 \psaxes[labels=none,Dx=500,Dy=500](0,0)(#1,#3)(#2,#4)
557 \or
558 \global\MPdrawingdonetrue
559
560 \startMPdrawing
561 x1 := \MPdivten[#1]u ; x2 := \MPdivten[#2]u;
562 y1 := \MPdivten[#3]u ; y2 := \MPdivten[#4]u;
563 draw z1(x2,y1)z2(x1,y2)cycle ;
564 d := 50u ; dd := 10u ;
565 draw (x1,0)(x2,0) ;
566 draw (0,y1)(0,y2) ;
567 for i=d step d until x1: draw (i,dd)(i,dd) ; endfor ;
568 for i=d step d until x2: draw (i,dd)(i,dd) ; endfor ;
569 for i=d step d until y1: draw (dd,i)(dd,i) ; endfor ;
570 for i=d step d until y2: draw (dd,i)(dd,i) ; endfor ;
571 \stopMPdrawing
572 \fi}
573
574\def\@@setsecondchemicalplotsymbol
575 {\ifcase\chemicaldrawingmode
576 \!!widtha=50.8mm
577 \divide\!!widtha by \@@chemicalresolution\relax
578 \plotsymbolspacing=\!!widtha
579 \setplotsymbol({\vrule\s!height\!!widtha\s!width\!!widtha})
580 \fi}
581
582
583
584\newcount \currentchemical
585
586
587
588\def\setchemicaldimensions#1#2#3
589 {\bgroup
590 \global\advance\currentchemical by 1
591 \dimen0=#1\relax
592 \dimen2=#2\relax
593 \dimen4=#3\relax
594 \setxvalue{chemical::\the\currentchemical}
595 {\noexpand\docommand{\the\dimen0}{\the\dimen2}{\the\dimen4}}
596 \egroup}
597
598\ifx\normalchemicalframe\undefined
599 \let\normalchemicalframe\hbox
600\fi
601
602\unexpanded\def\complexstartchemical[#1]
603 {\copyparameters
604 [\??chemical][\??chemical\s!chemical]
605 [\c!width,\c!height,\c!left,\c!right,\c!top,\c!bottom,
606 \c!bodyfont,\c!size,\c!scale,\c!state,\c!frame,\c!axis,\c!factor,
607 \c!location,\c!option,\c!alternative,\c!resolution,\c!offset,\c!style,
608 \c!color,\c!rulecolor,\c!rulethickness]
609 \getparameters
610 [\??chemical]
611 [#1]
612
613 \setupchemicalformat[\??chemical]
614
615 \ifnum\chemicaldrawingmode=2
616 \resetMPdrawing
617 \fi
618
619 \doif{\@@chemicalalternative}{2}
620 {\@@setsecondchemicalplotsymbol}
621
622 \doif{\@@chemicalaxis}\v!on
623 {\let\chemicalframe\hbox}
624
625 \!!counta=250000
626 \divide\!!counta by \@@localchemicalscale
627 \!!widtha=\@@chemicalbodyfont
628 \divide\!!widtha by \!!counta
629 \@@setchemicalcoordinatesystem{\the\!!widtha}
630
631
632
633
634 \def\calculateaxis##1##2##3##4##5
635 {##1=##3\relax
636 ##2=##4\relax
637 \ifnum##5=0
638 \ifnum##3=0
639 \ifnum##4=0
640 ##1=2000
641 ##2=2000
642 \fi
643 \fi
644 \else
645 \ifnum##3=0
646 \ifnum##4=0
647 ##1=##5\relax
648 \divide##1 by 2
649 ##2=##1\relax
650 \else
651 ##1=##5\relax
652 \advance##1 by ##2\relax
653 \fi
654 \else
655 \ifnum##4=0
656 ##2=##5\relax
657 \advance##2 by ##1\relax
658 \fi
659 \fi
660 \fi}
661 \fixedchemicalfalse
662 \doif\@@chemicalwidth\v!fit
663 {\edef\@@chemicalwidth
664 {\ifnum\chemicaldrawingmode=1 2000 \else 1 \fi}
665 \fixedchemicaltrue}
666 \doif\@@chemicalheight\v!fit
667 {\edef\@@chemicalheight
668 {\ifnum\chemicaldrawingmode=1 2000 \else 1 \fi}
669 \fixedchemicaltrue}
670 \doifelse\@@chemicallocation\v!intext
671 {\!!counta=0 \!!countb=0
672 \!!counta=0 \!!countd=0 }
673 {\calculateaxis
674 \!!counta\!!countb
675 \@@chemicalleft\@@chemicalright\@@chemicalwidth
676 \calculateaxis
677 \!!countc\!!countd
678 \@@chemicalbottom\@@chemicaltop\@@chemicalheight}
679
680 \edef\@@chemheight {\the\!!countc}
681 \edef\@@chemdepth {\the\!!countd}
682 \edef\@@chemicaltop {\the\!!countc}
683 \edef\@@chemicalbottom{\the\!!countd}
684
685 \doifelseinset\v!on{\@@chemicalframe,\@@chemicalaxis}
686 {\def\@@chemicalborder{\chemicalframe}}
687 {\def\@@chemicalborder{\normalchemicalframe}}
688
689 \setbox0=\hbox\bgroup
690
691 \@@beginchemicalpicture
692 {\the\!!counta}{\the\!!countb}
693 {\the\!!countc}{\the\!!countd}
694 \doif{\@@chemicalstate}\v!start
695 {\doif\@@chemicalaxis\v!on
696 {\@@setchemicalaxis
697 {\the\!!counta}{\the\!!countb}
698 {\the\!!countc}{\the\!!countd}}}
699 \doifelse\@@chemicaloption\v!test
700 {\def\@@writechemicalstate##1##2
701 {\convertargument##2\to\ascii
702 \writestatus{##1}{\ascii}}}
703 {\def\@@writechemicalstate##1##2{}}
704 \ignorespaces}
705
706\def\dostartchemical
707 {\catcode\^=\superscriptcatcode
708 \catcode\_=\subscriptcatcode
709 \begingroup
710 \inchemicaltrue
711 \def\toptext##1{\gdef\thetoptext{##1}\ignorespaces}\toptext{}
712 \def\bottext##1{\gdef\thebottext{##1}\ignorespaces}\bottext{}
713 \def\midtext##1{\gdef\themidtext{##1}\ignorespaces}\midtext{}
714 \def\@@chemicalpostponed{}
715 \complexorsimpleempty\startchemical}
716
717\unexpanded\def\startchemical
718 {\bgroup
719 \dostartchemical}
720
721\unexpanded\def\stopchemical
722 {\checkchemicalpicture
723 \@@endchemicalpicture
724 \egroup
725 \ifnum\chemicaldrawingmode=1
726 \dimen0=\@@chemicalunit
727 \setbox0=\hbox{\lower\@@chemdepth\dimen0\box0}
728 \ht0=\@@chemheight\dimen0
729 \dp0=\@@chemdepth\dimen0
730 \fi
731 \dimen0=\ht0
732 \advance\dimen0 by \dp0
733 \inchemicalfalse
734 \setbox4=\alignedchemical\themidtext
735 \setbox6=\alignedchemical\thetoptext
736 \setbox8=\alignedchemical\thebottext
737 \setbox4=\hbox to \wd0
738 {\strut\hss$\vcenter{\box4}$\hss}
739 \setbox2=\vbox to \dimen0
740 {\hbox to \wd0{\strut\hss\box6\hss}
741 \vfill
742 \hbox to \wd0{\strut\hss\box8\hss}
743 \vss}
744 \wd0=0pt \wd4=0pt
745 \ht2=\ht0 \dp2=\dp0
746 \ht4=\ht0 \dp4=\dp0
747 \@@chemicalborder{\box0\box4\box2}
748 \endgroup
749 \ignorespaces
750 \egroup}
751
752\def\alignedchemical#1
753 {\vtop
754 {\def\par{\egroup\hbox\bgroup\strut}
755 \let\\=\par
756 \let\endgraf=\par
757 \hbox\bgroup\strut#1\egroup}}
758
759
760
761
762
763
764\newif\ifchemicaldirection
765
766\def\checkchemicaldirection#1#2
767 {\ifchemicaldirection
768 \ifnum#1>0 \advance\horchemical \chemicaldirection \fi
769 \ifnum#1<0 \advance\horchemical \chemicaldirection \fi
770 \ifnum#2>0 \advance\verchemical \chemicaldirection \fi
771 \ifnum#2<0 \advance\verchemical \chemicaldirection \fi
772 \chemicaldirectionfalse
773 \fi}
774
775\def\processchemicaldirection
776 {\chemicaldirectiontrue\processchemicaltranslate}
777
778\def\setchemicalcoordinates#1#2
779 {\advance\horchemical #1\relax
780 \advance\verchemical #2\relax
781 \checkchemicaldirection{#1}{#2}
782 \!!counta=\horchemical\edef\chemicalxoffset{\the\!!counta}
783 \!!countb=\verchemical\edef\chemicalyoffset{\the\!!countb}
784 \ifnum\chemicaldrawingmode=1
785
786 \else
787 \setcoordinatesystem point at {\the\horchemical} {\the\verchemical}
788 \fi}
789
790\def\resetchemicalcoordinates
791 {\horchemical=0
792 \verchemical=0
793 \edef\chemicalxoffset{0}
794 \edef\chemicalyoffset{0}
795 \ifnum\chemicaldrawingmode=1
796
797 \else
798 \setcoordinatesystem point at 0 0
799 \fi}
800
801\def\restorechemicalcoordinates
802 {
803 \edef\chemicalxoffset{\the\horchemical}
804 \edef\chemicalyoffset{\the\verchemical}
805 \ifnum\chemicaldrawingmode=1
806
807 \else
808 \setcoordinatesystem point at {\the\horchemical} {\the\verchemical}
809 \fi}
810
811\def\setchemicaltranslate #1 #2 #3
812 {\setvalue{\s!translate#1}{\setchemicalcoordinates{#2}{#3}}}
813
814\def\processchemicaltranslate#1
815 {\def\doprocess[##1##2]
816 {\doifchemicalnumber{##1}{MOV#1}
817 {\ifnum##1=0
818 \def\chemicaloffset{0}
819 \resetchemicalcoordinates
820 \else
821 \getvalue{\s!translate##1}
822 \dochemicaloffset{##1}
823 \def\chemicaloffset{0}
824 \fi}}
825 \doprocess[#1]}
826
827\def\setchemicaldistance #1
828 {\setvalue{\s!distance1}{\setchemicalcoordinates{#1}{ 0}}
829 \setvalue{\s!distance2}{\setchemicalcoordinates{ 0}{ #1}}
830 \setvalue{\s!distance3}{\setchemicalcoordinates{ #1}{ 0}}
831 \setvalue{\s!distance4}{\setchemicalcoordinates{ 0}{#1}}}
832
833\def\setchemicaldirection #1
834 {\def\chemicaldirection{#1}}
835
836\def\processchemicaldistance#1
837 {\def\doprocess[##1##2]
838 {\doifchemicalnumber{##1}{ADJ#1}
839 {\ifnum##1=0
840 \resetchemicalcoordinates
841 \else
842 \def\@@chemicalpostponed{\getvalue{\s!distance##1}}
843 \@@chemicalpostponed
844 \fi}}
845 \doprocess[#1]}
846
847\def\setchemicalsubstitute #1
848 {\setvalue{\s!substitute1}{\setchemicalcoordinates{#1}{ 0}}
849 \setvalue{\s!substitute2}{\setchemicalcoordinates{ 0}{ #1}}
850 \setvalue{\s!substitute3}{\setchemicalcoordinates{ #1}{ 0}}
851 \setvalue{\s!substitute4}{\setchemicalcoordinates{ 0}{#1}}}
852
853\def\processchemicalsubstitute#1
854 {\def\doprocess[##1##2]
855 {\doifchemicalnumber{##1}{SUB#1}
856 {\ifnum##1=0
857 \resetchemicalcoordinates
858 \else
859 \def\@@chemicalpostponed{\getvalue{\s!substitute##1}}
860 \@@chemicalpostponed
861 \fi}}
862 \doprocess[#1]}
863
864
865
866
867\def\chemicalrepeat {1}
868
869\def\redoprocesschemical[#1#2]
870 {\doifelseinstring{#1}{0123456789.}
871 {\edef\chemicalrepeat{\chemicalrepeat#1}
872 \redoprocesschemical[#2]}
873 {\processchemical[#1#2]
874 \def\chemicalrepeat{1}}}
875
876\def\doprocesschemical[#1#2]#3
877 {\doifelseinstring{#1}{0123456789.}
878 {\def\chemicalrepeat{#1}
879 \redoprocesschemical[#2]}
880 {#3}}
881
882
883
884
885
886\def\chemicaloffset{0}
887
888\def\processchemicaloffset#1
889 {\dimen0=62500 sp
890 \dimen0=\chemicalrepeat\dimen0
891 \divide\dimen0 by \@@localchemicalscale
892 \!!counta=\dimen0
893 \def\doprocess[##1##2]
894 {\doifelseinstring{##1}{128}
895 {\edef\chemicaloffset{\the\!!counta}}
896 {\doifelseinstring{##1}{456}
897 {\edef\chemicaloffset{\the\!!counta}}
898 {\doifelse{##1}{0}
899 {\edef\chemicaloffset{0}}
900 {\unknownchemical{OFF#1}}}}}
901 \doprocess[#1]}
902
903\def\dochemicaloffset#1
904 {\ifnum\chemicaloffset=0
905 \def\undochemicaloffset{}
906 \else
907 \setchemicalcoordinates{\chemicaloffset}{0}
908 \def\undochemicaloffset
909 {\setchemicalcoordinates{\chemicaloffset}{0}
910 \def\undochemicaloffset{}}
911 \fi}
912
913\def\processchemicalphantom#1#2
914 {\setbox0=\hbox
915 {\def\splitoff##1????{##1}
916 $\@@dochemicalstyle{\@@localchemicalformat\splitoff#2}$}
917 \dimen0=.25\wd0
918 \divide\dimen0 by \@@localchemicalscale
919 \!!counta=\dimen0
920 \doifelseinstring{#1}{128}
921 {\edef\chemicaloffset{\the\!!counta}}
922 {\doifelseinstring{#1}{456}
923 {\edef\chemicaloffset{\the\!!counta}}
924 {\doifelse{#1}{0}
925 {\edef\chemicaloffset{0}}
926 {\unknownchemical{OF#1:#2}}}}}
927
928
929
930
931
932
933\def\chemicalrotation {1}
934\def\chemicalangle {0}
935\def\chemicalxoffset {0}
936\def\chemicalyoffset {0}
937
938\def\setchemicalmirror#1
939 {\setvalue{\s!mirror#1}{*}}
940
941\def\resetchemicalmirror#1
942 {\resetvalue{\s!mirror#1}}
943
944\def\togglechemicalmirror#1
945 {\doifelse{\getvalue{\s!mirror#1}}{*}
946 {\resetchemicalmirror{#1}}
947 {\setchemicalmirror{#1}}}
948
949\def\setchemicalrotation #1 #2 #3 #4 #5 #6 #7 #8 #9
950 {\setvalue{\s!rotate1.#1}{\dosetchemicalrotation{#2}{#3}}
951 \setvalue{\s!rotate2.#1}{\dosetchemicalrotation{#4}{#5}}
952 \setvalue{\s!rotate3.#1}{\dosetchemicalrotation{#6}{#7}}
953 \setvalue{\s!rotate4.#1}{\dosetchemicalrotation{#8}{#9}}}
954
955\def\setchemicalangle #1 #2 #3 #4 #5
956 {\setvalue{\s!angle1.#1}{\dosetchemicalangle{#2}}
957 \setvalue{\s!angle2.#1}{\dosetchemicalangle{#3}}
958 \setvalue{\s!angle3.#1}{\dosetchemicalangle{#4}}
959 \setvalue{\s!angle4.#1}{\dosetchemicalangle{#5}}}
960
961\def\chemicalrotate[#1]
962 {\doifelsedefined{\s!mirror#1}
963 {\getvalue{\s!rotate\chemicalrotation.#1\getvalue{\s!mirror#1}}
964 \getvalue{\s!angle\chemicalrotation.#1\getvalue{\s!mirror#1}}}
965 {\getvalue{\s!rotate\chemicalrotation.#1}
966 \getvalue{\s!angle\chemicalrotation.#1}}}
967
968\def\dosetchemicalangle#1
969 {\def\chemicalangle{#1}}
970
971\def\dosetchemicalrotation#1#2
972 {\ifnum\chemicaldrawingmode=1
973
974 \else
975 \startrotation by {#1} {#2}
976 \fi}
977
978\def\doresetchemicalrotation
979 {\ifnum\chemicaldrawingmode=1
980
981 \else
982 \stoprotation
983 \fi}
984
985\def\processchemicalrotation#1
986 {\def\doprocess[##1##2]
987 {\doifelsenumber{##1}
988 {\def\chemicalrotation{##1}}
989 {\unknownchemical{ROT#1}}}
990 \doprocess[#1]}
991
992
993
994
995
996
997
998
999\def\setchemicallocation#1
1000 {\doifelse{#1}{}
1001 {\edef\chemicalloca{c}}
1002 {\edef\chemicalloca{#1}}}
1003
1004\newif\iffixedchemicaltext
1005
1006\def\filterchemicaltextelement[#1][#2][#3][#4]
1007 {\ifchemicaltextconstant
1008 \def\chemicaltext{#4}
1009 \setchemicallocation{}
1010 \else
1011 \ifnum#1=0\relax
1012 \setchemicallocation{}
1013 \else
1014 \iffixedchemicaltext
1015 \!!counta#2
1016 \else
1017 \!!counta=\chemicalrotation
1018 \advance\!!counta 1
1019 \multiply\!!counta #2
1020 \advance\!!counta #1
1021 \fi
1022 \getfromcommalist[#3][\the\!!counta]
1023 \setchemicallocation\commalistelement
1024 \fi
1025 \ifchemicalpicture
1026 \let\chemicaltext\relax
1027 \else
1028 \advance\txtchemical 1
1029 \getfromcommalist[#4][\txtchemical]
1030 \let\chemicaltext\commalistelement
1031 \fi
1032 \fi
1033 \fixedchemicaltextfalse}
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047\ifx\ruledhbox\undefined
1048 \def\chemicalframe#1
1049 {\hbox
1050 {\vrule\hskip.4pt
1051 \vbox{\hrule\vskip.4pt\hbox{#1}\vskip.4pt\hrule}
1052 \hskip.4pt\vrule}}
1053\else
1054 \def\chemicalframe#1
1055 {\ruledhbox{#1}}
1056\fi
1057
1058\def\doputchemicaltext#1 [#2] at #3 #4
1059 {\ifnum\chemicaldrawingmode=1
1060 \rput
1061 {\chemicalangle}(\chemicalxoffset,\chemicalyoffset)
1062 {\expanded{\rput[#2]{\chemicalangle}(#3,#4){#1}}}
1063 \else
1064 \put {#1} [#2] at {#3} {#4}
1065 \fi}
1066
1067\def\dodoifsinglelocation#1#2\\#3
1068 {\ifx#2\relax#3\fi}
1069
1070\def\doifelsesinglelocation#1
1071 {\expandafter\dodoifsinglelocationelse#1\relax\\}
1072
1073\let\doifsinglelocationelse\doifelsesinglelocation
1074
1075\def\putchemicaltext#1#2
1076 {\enablechemicalspecials
1077 \ifchemicalpicture
1078 \setchemicalpicture{#1}{#2}
1079 \else
1080 \doifelse\@@chemicaloption\v!test
1081 {\def\@@chemicalframe{\chemicalframe}}
1082 {\def\@@chemicalframe{}}
1083 \dosetsubscripts
1084 \setbox2=\hbox{\@@dochemicalcolor
1085 $\@@dochemicalstyle{\@@localchemicalformat \chemicaltext}$}
1086 \setbox4=\hbox{$\@@dochemicalstyle{\@@localchemicalformat C\normalsubscript2\normapsuperscript2}$}
1087 \setbox6=\hbox{$\@@dochemicalstyle{\@@localchemicalformat O}$}
1088 \doresetsubscripts
1089 \doifnot\@@chemicallocation\v!intext
1090 {\ht2=\ht4
1091 \dp2=\dp4}
1092 \setbox2=\hbox{\@@chemicalframe{\box2}}
1093 \ifdim\wd2>\wd6
1094 \doifelse{#1}{0}
1095 {\doifnot{#2}{0}{\wd2=\wd6}}
1096 {
1097 {\doifinset{\chemicalloca}{t,b}{\wd2=\wd6}}}
1098 \fi
1099 \expanded
1100 {\doputchemicaltext
1101 {\noexpand\dowithchemical{\copy2}}
1102 [\chemicalloca] at {#1} {#2} }
1103 \nomoreaccounting
1104 \fi
1105 \disablechemicalspecials}
1106
1107\def\setchemicaltextelement #1 #2 #3
1108 {\setvalue{\s!chemicaltextelement#1}{\putchemicaltext{#2}{#3}}}
1109
1110\def\getchemicalfixedtextelement
1111 {\fixedchemicaltexttrue
1112 \getchemicaltextelement}
1113
1114\def\getchemicaltextelement[#1][#2][#3][#4][#5]
1115 {\filterchemicaltextelement[#2][#3][#4][#5]
1116 \doifelse{#2}{0}
1117 {\dochemicaloffset{#2}
1118 \putchemicaltext{0}{0}
1119 \undochemicaloffset}
1120 {\chemicalrotate[#2]
1121 \dochemicaloffset{#2}
1122 \def\chemicaltextelementnumber{#2}
1123 \getvalue{\s!chemicaltextelement#1}
1124 \getvalue{\s!chemicaltextelement#11}
1125 \getvalue{\s!chemicaltextelement#12}
1126 \getvalue{\s!chemicaltextelement#13}
1127 \undochemicaloffset}}
1128
1129\def\processchemicaltextelement#1#2#3#4#5
1130 {\def\doprocess[##1##2##3##4##5]
1131 {\doifelse{##1}{?}
1132 {\doprocess[1..\maxchemical ????]}
1133 {\doifchemicalnumber{##1}{#1#2}
1134 {\doifelse{##2##3}{..}
1135 {\doifchemicalnumber{##4}{#1#2}
1136 {\getchemicaltextelement[#1][##1][#4][#5][#3]
1137 \doifnot{##1}{##4}
1138 {\!!counta=##1\relax
1139 \advance\!!counta by 1
1140 \edef\nextsegment{\the\!!counta}
1141 \doprocess[\nextsegment..##4##5]}}}
1142 {\getchemicaltextelement[#1][##1][#4][#5][#3]
1143 \doifnot{##2}{?}{\doprocess[##2##3##4##5]}}}}}
1144 \doprocess[#2]
1145 \smallchemicaltextfalse}
1146
1147\def\processchemicalsmalltextelement
1148 {\smallchemicaltexttrue\processchemicaltextelement}
1149
1150\def\processchemicalsmalltextconstant
1151 {\smallchemicaltexttrue\processchemicaltextconstant}
1152
1153\def\processchemicalunrotatedtextelement#1#2#3#4#5#6
1154 {\bgroup
1155 \xdef\@@xxx{0}
1156 \xdef\@@yyy{0}
1157 \def\putchemicaltext##1##2
1158 {\xdef\@@xxx{##1}
1159 \xdef\@@yyy{##2}}
1160 \getvalue{\s!chemicaltextelement#1}
1161 \egroup
1162 \bgroup
1163 \def\doputchemicaltext##1 [##2] at ##3 ##4
1164 {\ifnum\chemicaldrawingmode=1
1165 \rput
1166 {\chemicalangle}(\chemicalxoffset,\chemicalyoffset)
1167 {\rput{\chemicalangle}(\@@xxx,\@@yyy){\expanded{\rput[##2](##3,##4){##1}}}}
1168 \else
1169 \put
1170 {\stoprotation \setcoordinatesystem point at 0 0
1171 \expanded{\put {##1} [##2] at {##3} {##4} }}
1172 at {\@@xxx} {\@@yyy}
1173 \fi}
1174 \processchemicaltextelement{#2}{#3}{#4}{#5}{#6}
1175 \egroup}
1176
1177\newif\ifchemicaltextconstant
1178
1179\def\processchemicaltextconstant#1#2#3#4
1180 {\chemicaltextconstanttrue
1181 \let\@@oldchemicalframe\@@chemicalframe
1182 \let\@@chemicalframe\relax
1183 \processchemicaltextelement{#1}{#2}{#3}{#4}{}
1184 \let\@@chemicalframe\@@oldchemicalframe
1185 \chemicaltextconstantfalse}
1186
1187
1188
1189
1190
1191
1192
1193
1194\newconstant\chemicallinetype
1195
1196\def\doplotchemicalline
1197 {\!!counte=\!!countc \advance\!!counte by \!!counta
1198 \!!countf=\!!countd \advance\!!countf by \!!countb
1199 \bgroup
1200 \ifcase\chemicaldrawingmode
1201 \ifcase\chemicallinetype
1202
1203 \plot {\!!counta} {\!!countb} {\!!countc} {\!!countd}
1204 \or
1205
1206 \arrow <5pt> [.2,.67] from {\!!counta} {\!!countb} to {\!!countc} {\!!countd}
1207 \or
1208
1209 \arrow <5pt> [.2,.67] from {\!!countc} {\!!countd} to {\!!counta} {\!!countb}
1210 \or
1211
1212 \put {\stoprotation \setcoordinatesystem point at 0 0
1213 \plot 0 0 {\!!counte} {\!!countf} }
1214 [\chemicallineposition] at {\!!counta} {\!!countb}
1215 \else
1216
1217 \findlength {\plot {\!!counta} {\!!countb} {\!!countc} {\!!countd} }
1218 \setdashesnear <2pt> for <\totalarclength>
1219 \plot {\!!counta} {\!!countb} {\!!countc} {\!!countd}
1220 \fi
1221 \or
1222 \ifcase\chemicallinetype
1223 \rput
1224 {\chemicalangle}(\chemicalxoffset,\chemicalyoffset)
1225 {\psline(\!!counta,\!!countb)(\!!countc,\!!countd)}
1226 \or
1227 \rput
1228 {\chemicalangle}(\chemicalxoffset,\chemicalyoffset)
1229 {\psline{>}(\!!counta,\!!countb)(\!!countc,\!!countd)}
1230 \or
1231 \rput
1232 {\chemicalangle}(\chemicalxoffset,\chemicalyoffset)
1233 {\psline{<}(\!!counta,\!!countb)(\!!countc,\!!countd)}
1234 \or
1235 \rput
1236 {\chemicalangle}(\chemicalxoffset,\chemicalyoffset)
1237 {\expanded{\rput[\chemicallineposition]{\chemicalangle}
1238 (\!!counta,\!!countb){\psline(0,0)(\!!counte,\!!countf)}}}
1239 \else
1240 \psset{linestyle=dashed}
1241 \rput
1242 {\chemicalangle}(\chemicalxoffset,\chemicalyoffset)
1243 {\psline(\!!counta,\!!countb)(\!!countc,\!!countd)}
1244 \fi
1245 \or
1246 \global\MPdrawingdonetrue
1247 \setchemicalattributes
1248 \startMPdrawing
1249 x0 := \MPdivten[\chemicalxoffset]u ;
1250 y0 := \MPdivten[\chemicalyoffset]u ;
1251 x1 := \MPdivten[\the\!!counta]u ;
1252 y1 := \MPdivten[\the\!!countb]u ;
1253 x2 := \MPdivten[\the\!!countc]u ;
1254 y2 := \MPdivten[\the\!!countd]u ;
1255 x3 := \MPdivten[\the\!!counte]u ;
1256 y3 := \MPdivten[\the\!!countf]u ;
1257 \ifcase\chemicallinetype
1258
1259 draw ((z1z2) rotatedaround(origin,\chemicalangle))
1260 shifted z0 ;
1261 \or
1262
1263 drawarrow ((z1z2) rotatedaround(origin,\chemicalangle))
1264 shifted z0 ;
1265 \or
1266
1267 drawarrow ((z2z1) rotatedaround(origin,\chemicalangle))
1268 shifted z0 ;
1269 \or
1270
1271 draw (originz3)
1272 shifted (z1 rotatedaround(origin,\chemicalangle))
1273 shifted z0 ;
1274 \else
1275
1276 draw ((z1z2) rotatedaround(origin,\chemicalangle))
1277 shifted z0 dashed dashpattern(on 5.5u off 6u) ;
1278 \fi
1279 \stopMPdrawing
1280 \fi
1281 \egroup
1282 \account\!!counta\!!countb
1283 \account\!!countc\!!countd}
1284
1285\def\plotchemicalline#1#2#3#4
1286 {\!!counta=#1\!!countb=#2\!!countc=#3\!!countd=#4\relax
1287 \doplotchemicalline}
1288
1289\def\plotchemicalfactorline#1#2#3#4
1290 {\!!counta=#1\!!countb=#2\!!countc=#3\!!countd=#4\relax
1291 \ifdim\@@chemicalfactor\onepoint=\onepoint \else
1292 \scratchdimen\!!counta\s!sp \multiply\scratchdimen1000 \scratchdimen\@@chemicalfactor\scratchdimen \divide\scratchdimen1000 \!!counta\scratchdimen
1293 \scratchdimen\!!countc\s!sp \multiply\scratchdimen1000 \scratchdimen\@@chemicalfactor\scratchdimen \divide\scratchdimen1000 \!!countc\scratchdimen
1294 \fi
1295 \doplotchemicalline}
1296
1297\def\plotchemicalzline#1#2#3#4
1298 {\!!counta=#1\!!countb=#2\!!countc=#3\!!countd=#4\relax
1299 \ifnum\chemicaldrawingmode=2
1300 \global\MPdrawingdonetrue
1301 \setchemicalattributes
1302 \startMPdrawing
1303 x0 := \MPdivten[\chemicalxoffset]u ;
1304 y0 := \MPdivten[\chemicalyoffset]u ;
1305 x1 := \MPdivten[\the\!!counta]u ;
1306 y1 := \MPdivten[\the\!!countb]u ;
1307 x2 := \MPdivten[\the\!!countc]u ;
1308 y2 := \MPdivten[\the\!!countd]u ;
1309 filldraw ((
1310 \ifnum\chemicalangle>180
1311 z1z2
1312 \else\ifnum\chemicalangle<90
1313 z1(z2 shifted (2u,2u))(z2 shifted (2u,2u))
1314 \else\ifnum\chemicalangle=90
1315 (z1 shifted (2u,2u))(z1 shifted (2u,2u))
1316 (z2 shifted (2u,2u))(z2 shifted (2u,2u))
1317 \else
1318 (z1 shifted (2u,2u))(z1 shifted (2u,2u))z2
1319 \fi\fi\fi
1320 cycle) rotatedaround(origin,\chemicalangle)) shifted z0 ;
1321 \stopMPdrawing
1322 \else
1323 \doplotchemicalline
1324 \ifnum\chemicalangle>180 \else
1325 \ifnum\chemicalangle=90
1326 \advance\!!counta by 20 \advance\!!countc by 20
1327 \doplotchemicalline
1328 \advance\!!counta by 40 \advance\!!countc by 40
1329 \else\ifnum\chemicalangle<90
1330 \advance\!!countc by 20 \advance\!!countd by 20
1331 \doplotchemicalline
1332 \advance\!!countc by 40 \advance\!!countd by 40
1333 \else
1334 \advance\!!counta by 20 \advance\!!countb by 20
1335 \doplotchemicalline
1336 \advance\!!counta by 40 \advance\!!countb by 40
1337 \fi\fi
1338 \fi
1339 \doplotchemicalline
1340 \fi}
1341
1342\def\plotchemicaldeltaline#1#2#3#4
1343 {\!!counta=#1\!!countb=#2\!!countc=#3\!!countd=#4\relax
1344 \ifnum\chemicaldrawingmode=2
1345 \global\MPdrawingdonetrue
1346 \setchemicalattributes
1347 \startMPdrawing
1348 x0 := \MPdivten[\chemicalxoffset]u ;
1349 y0 := \MPdivten[\chemicalyoffset]u ;
1350 x1 := \MPdivten[\the\!!counta]u ;
1351 y1 := \MPdivten[\the\!!countb]u ;
1352 x2 := \MPdivten[\the\!!countc]u ;
1353 y2 := \MPdivten[\the\!!countd]u ;
1354 filldraw ((z1(z2 rotatedaround(z1,5))(z2 rotatedaround(z1,5))
1355 cycle) rotatedaround(origin,\chemicalangle))
1356 shifted z0 ;
1357 \stopMPdrawing
1358 \account{#1}{#2}
1359 \account{#3}{#4}
1360 \else
1361 \doplotchemicalline
1362 \advance\!!countc by 16 \advance\!!countd by 21
1363 \doplotchemicalline
1364 \advance\!!countc by 4 \advance\!!countd by 7
1365 \doplotchemicalline
1366 \advance\!!countc by 4 \advance\!!countd by 7
1367 \doplotchemicalline
1368 \advance\!!countc by 8 \advance\!!countd by 14
1369 \doplotchemicalline
1370 \advance\!!countc by 4 \advance\!!countd by 7
1371 \doplotchemicalline
1372 \advance\!!countc by 4 \advance\!!countd by 7
1373 \doplotchemicalline
1374 \advance\!!countc by 4 \advance\!!countd by 7
1375 \doplotchemicalline
1376 \fi}
1377
1378\def\setchemicallinesegment #1 #2 #3 #4 #5
1379 {\setvalue{\s!chemicallinesegment#1}{\plotchemicalline{#2}{#3}{#4}{#5}}}
1380
1381\def\setchemicalfactorlinesegment #1 #2 #3 #4 #5
1382 {\setvalue{\s!chemicallinesegment#1}{\plotchemicalfactorline{#2}{#3}{#4}{#5}}}
1383
1384\def\getchemicallinesegment[#1][#2]
1385 {\chemicalrotate[#1]
1386 \dochemicaloffset{#1}
1387 \getvalue{\s!chemicallinesegment#2}
1388 \getvalue{\s!chemicallinesegment#21}
1389 \getvalue{\s!chemicallinesegment#22}
1390 \undochemicaloffset}
1391
1392\def\getprivatechemicallinesegment[#1][#2]
1393 {\chemicalrotate[#1]
1394 \getvalue{\s!chemicallinesegment#2#1}}
1395
1396\def\doprocesschemicallinesegment#1#2#3#4#5
1397 {\chemicallinetype#1\relax
1398 \def\chemicallineposition{#2}
1399 \def\doprocess[##1##2##3##4##5]
1400 {\doifelse{##1}{?}
1401 {\doprocess[1..\maxchemical ????]}
1402 {\doifchemicalnumber{##1}{#4#5}
1403 {\doifelse{##2##3}{..}
1404 {\doifchemicalnumber{##4}{#4#5}
1405 {#3[##1][#4]
1406 \doifnot{##1}{##4}
1407 {\!!counta=##1\relax
1408 \advance\!!counta by 1
1409 \edef\nextsegment{\the\!!counta}
1410 \doprocess[\nextsegment..##4##5]}}}
1411 {#3[##1][#4]
1412 \doifnot{##2}{?}
1413 {\doprocess[##2##3##4##5]}}}}}
1414 \doprocess[#5]}
1415
1416\def\processchemicallinesegment
1417 {\doprocesschemicallinesegment0c\getchemicallinesegment}
1418
1419\def\processchemicalzlinesegment#1#2
1420 {
1421 \bgroup
1422 \def\plotchemicalline{\plotchemicalzline}
1423 \doprocesschemicallinesegment0c\getchemicallinesegment{#1}{#2}
1424 \egroup}
1425
1426\def\processchemicaldeltalinesegment#1#2
1427 {
1428 \bgroup
1429 \def\plotchemicalline{\plotchemicaldeltaline}
1430 \doprocesschemicallinesegment0c\getchemicallinesegment{#1}{#2}
1431 \egroup}
1432
1433\def\processprivatechemicallinesegment
1434 {\doprocesschemicallinesegment0c\getprivatechemicallinesegment}
1435
1436\def\processchemicaldownarrowsegment
1437 {\doprocesschemicallinesegment1c\getchemicallinesegment}
1438
1439\def\processchemicaluparrowsegment
1440 {\doprocesschemicallinesegment2c\getchemicallinesegment}
1441
1442\def\processchemicalunrotatedlinesegment#1
1443 {\doprocesschemicallinesegment3{#1}\getchemicallinesegment}
1444
1445\def\processchemicaldashedlinesegment
1446 {\doprocesschemicallinesegment4c\getchemicallinesegment}
1447
1448\def\plotchemicaldasheddeltaline#1#2#3#4
1449 {\!!counta=#1\!!countb=#2\!!countc=#3\!!countd=#4\relax
1450 \ifnum\chemicaldrawingmode=2
1451 \global\MPdrawingdonetrue
1452 \setchemicalattributes
1453 \startMPdrawing
1454 x0 := \MPdivten[\chemicalxoffset]u ;
1455 y0 := \MPdivten[\chemicalyoffset]u ;
1456 x1 := \MPdivten[\the\!!counta]u ;
1457 y1 := \MPdivten[\the\!!countb]u ;
1458 x2 := \MPdivten[\the\!!countc]u ;
1459 y2 := \MPdivten[\the\!!countd]u ;
1460 z20 = z2 rotatedaround(z1,5) ;
1461 z21 = z2 rotatedaround(z1,5) ;
1462 draw (z1 rotatedaround(origin,\chemicalangle)) shifted z0 ;
1463 save n ; n := 5 ;
1464 for i=1 upto n :
1465 draw ((((z20z21) shifted z2) shifted (in)[z2,z1])
1466 rotatedaround(origin,\chemicalangle)) shifted z0 ;
1467 endfor
1468 \stopMPdrawing
1469 \account{#1}{#2}
1470 \account{#3}{#4}
1471 \else
1472 \doplotchemicalline
1473 \advance\!!countc by 16 \advance\!!countd by 21
1474 \doplotchemicalline
1475 \advance\!!countc by 4 \advance\!!countd by 7
1476 \doplotchemicalline
1477 \advance\!!countc by 4 \advance\!!countd by 7
1478 \doplotchemicalline
1479 \advance\!!countc by 8 \advance\!!countd by 14
1480 \doplotchemicalline
1481 \advance\!!countc by 4 \advance\!!countd by 7
1482 \doplotchemicalline
1483 \advance\!!countc by 4 \advance\!!countd by 7
1484 \doplotchemicalline
1485 \advance\!!countc by 4 \advance\!!countd by 7
1486 \doplotchemicalline
1487 \fi}
1488
1489\def\plotchemicalwavyline#1#2#3#4
1490 {\!!counta=#1\!!countb=#2\!!countc=#3\!!countd=#4\relax
1491 \ifnum\chemicaldrawingmode=2
1492 \global\MPdrawingdonetrue
1493 \setchemicalattributes
1494 \startMPdrawing
1495 x0 := \MPdivten[\chemicalxoffset]u ;
1496 y0 := \MPdivten[\chemicalyoffset]u ;
1497 x1 := \MPdivten[\the\!!counta]u ;
1498 y1 := \MPdivten[\the\!!countb]u ;
1499 x2 := \MPdivten[\the\!!countc]u ;
1500 y2 := \MPdivten[\the\!!countd]u ;
1501 save d ; pair d ;
1502 d := z2 rotatedaround(z1,5) shifted z2 ;
1503 save n ; n := 4 ;
1504 draw ((for i=0 upto n1 :
1505 ((i)n)[z1,z2] ..
1506 ((i.25)n)[z1,z2] shifted d ..
1507 ((i.50)n)[z1,z2] ..
1508 ((i.75)n)[z1,z2] shifted d ..
1509 endfor
1510 z2) rotatedaround(origin,\chemicalangle)) shifted z0 ;
1511 \stopMPdrawing
1512 \account{#1}{#2}
1513 \account{#3}{#4}
1514 \else
1515 \doplotchemicalline
1516 \advance\!!countc by 16 \advance\!!countd by 21
1517 \doplotchemicalline
1518 \advance\!!countc by 4 \advance\!!countd by 7
1519 \doplotchemicalline
1520 \advance\!!countc by 4 \advance\!!countd by 7
1521 \doplotchemicalline
1522 \advance\!!countc by 8 \advance\!!countd by 14
1523 \doplotchemicalline
1524 \advance\!!countc by 4 \advance\!!countd by 7
1525 \doplotchemicalline
1526 \advance\!!countc by 4 \advance\!!countd by 7
1527 \doplotchemicalline
1528 \advance\!!countc by 4 \advance\!!countd by 7
1529 \doplotchemicalline
1530 \fi}
1531
1532\def\processchemicaldasheddeltalinesegment#1#2
1533 {\bgroup
1534 \def\plotchemicalline{\plotchemicaldasheddeltaline}
1535 \doprocesschemicallinesegment0c\getchemicallinesegment{#1}{#2}
1536 \egroup}
1537
1538\def\processchemicalwavylinesegment#1#2
1539 {\bgroup
1540 \def\plotchemicalline{\plotchemicalwavyline}
1541 \doprocesschemicallinesegment0c\getchemicallinesegment{#1}{#2}
1542 \egroup}
1543
1544\def\processchemicalopenend#1#2
1545 {\doprocesschemicallinesegment0c\doprocesschemicalopenend{#1}{#2}}
1546
1547\def\doprocesschemicalopenend[#1][#2]
1548 {\chemicalrotate[#1]
1549 \dochemicaloffset{#1}
1550 \ifcase\chemicaldrawingmode
1551 \beginpicture
1552 \setquadratic\plot
1553 300 0 400 0
1554 500 0 550 75
1555 600 0 650 75
1556 700 0 750 75
1557 800 0 850 75
1558 900 0 950 0
1559 1050 0
1560 \endpicture
1561 \or
1562 \rput{\chemicalangle}(\chemicalxoffset,\chemicalyoffset)
1563 {\psline(300,0)(500,0)
1564 \rput(500,0){\psplot[yunit=75,plotstyle=curve]{0}{720}{x sin}}
1565 \psline(950,0)(1050,0)}
1566 \or
1567 \global\MPdrawingdonetrue
1568 \setchemicalattributes
1569 \startMPdrawing
1570 x0 := \MPdivten[\chemicalxoffset]u ;
1571 y0 := \MPdivten[\chemicalyoffset]u ;
1572 draw
1573 (((30.0u,0)(50.0u,0){up}..(55.0u,7.5u)..
1574 (60.0u,0)..(65.0u,7.5u)..(70.0u,0)..
1575 (75.0u,7.5u)..(80.0u,0)..(85.0u,7.5u)..{up}
1576 (90.0u,0)(105.0u,0)) rotatedaround(origin,\chemicalangle))
1577 shifted z0 ;
1578 \stopMPdrawing
1579 \fi
1580 \undochemicaloffset}
1581
1582
1583
1584
1585
1586
1587
1588\newif\ifchemicaldotted
1589
1590\def\plotchemicalcircle#1#2#3#4#5#6
1591 {\bgroup
1592 \ifcase\chemicaldrawingmode
1593 \ifchemicaldotted
1594 \findlength{\circulararc {#4} degrees from {#5} {#6} center at {0} {0} }
1595 \divide\totalarclength by 6
1596 \def\b{\the\totalarclength}
1597 \divide\totalarclength by 2
1598 \def\a{\the\totalarclength}
1599 \setdashpattern <\a,\b,\b,\b,\b,\b,\a>
1600 \fi
1601 \circulararc {#4} degrees from {#5} {#6} center at {0} {0}
1602 \or
1603 \ifchemicaldotted
1604 \psset{linestyle=dashed}
1605 \fi
1606 \rput
1607 {\chemicalangle}(\chemicalxoffset,\chemicalyoffset)
1608 {\psarc(0,0){#3}{#1}{#2}}
1609 \or
1610 \global\MPdrawingdonetrue
1611 \setchemicalattributes
1612 \startMPdrawing
1613 r := \MPdivten[#3]*2u;
1614 x0 := \MPdivten[\chemicalxoffset]u ;
1615 y0 := \MPdivten[\chemicalyoffset]u ;
1616 draw ((subpath (#145,#245) of (fullcircle scaled (r)))
1617 rotatedaround (origin,\chemicalangle150))
1618 shifted z0 \ifchemicaldotted dashed withdots \fi ;
1619 \stopMPdrawing
1620 \fi
1621 \egroup}
1622
1623\def\setchemicalcircsegment #1 #2 #3 #4 #5 #6 #7
1624 {\setvalue{\s!chemicalcircsegment#1}{\plotchemicalcircle{#2}{#3}{#4}{#5}{#6}{#7}}}
1625
1626\def\getchemicalcircsegment[#1][#2]
1627 {\chemicalrotate[#1]
1628 \getvalue{\s!chemicalcircsegment#2}}
1629
1630\def\doprocesschemicalcircsegment#1#2
1631 {\def\doprocess[##1##2##3##4##5]
1632 {\doifelse{##1}{?}
1633 {\doprocess[1..\maxchemical ????]}
1634 {\doifchemicalnumber{##1}{#1#2}
1635 {\doifelse{##2##3}{..}
1636 {\doifchemicalnumber{##4}{#1#2}
1637 {\getchemicalcircsegment[##1][#1]
1638 \doifnot{##1}{##4}
1639 {\!!counta=##1\relax
1640 \advance\!!counta by 1
1641 \edef\nextsegment{\the\!!counta}
1642 \doprocess[\nextsegment..##4##5]}}}
1643 {\getchemicalcircsegment[##1][#1]
1644 \doifnot{##2}{?}
1645 {\doprocess[##2##3##4##5]}}}}}
1646 \doprocess[#2]}
1647
1648\def\processchemicalcircsegment
1649 {\chemicaldottedfalse\doprocesschemicalcircsegment}
1650
1651\def\processchemicaldottsegment
1652 {\chemicaldottedtrue\doprocesschemicalcircsegment}
1653
1654\let\endchemicalpicture = \relax
1655\let\checkchemicalpicture = \relax
1656\let\nomoreaccounting = \relax
1657
1658\newif\ifchemicalpicture
1659
1660\def\beginchemicalpicture#1
1661 {\checkchemicalpicture
1662 \bgroup
1663 \chemicalpicturetrue
1664 \processchemical[#1]}
1665
1666\def\setchemicalpicture#1#2
1667 {\chemicalpicturefalse
1668 \def\endchemicalpicture
1669 {\@@endchemicallocalpicture{#1}{#2}
1670 \egroup
1671 \ifnum\chemicaldrawingmode=1
1672 \rput
1673 {\chemicalangle}(\chemicalxoffset,\chemicalyoffset)
1674 {\expanded{\rput[\chemicalloca]{\chemicalangle}(#1,#2){\box\nextbox}}}
1675 \else
1676 \expanded{\put{\box\nextbox}[\chemicalloca] at {#1} {#2} }
1677 \fi
1678 \egroup}
1679 \def\checkchemicalpicture
1680 {\ifx\endchemicalpicture\relax \else
1681 \writestatus{ppchtex}{missing end of picture (PE)}
1682 \endchemicalpicture
1683 \fi}
1684 \setbox\nextbox=\hbox\bgroup
1685 \@@beginchemicallocalpicture
1686
1687 \ifnum\chemicaldrawingmode=1
1688
1689 \else
1690 \accountingon
1691 \let\nomoreaccounting=\accountingoff
1692 \fi}
1693
1694\def\doskipchemical[#1][#2]
1695 {{\tt[ppchtex]}}
1696
1697\def\skipchemical
1698 {\dodoubleargument\doskipchemical}
1699
1700\def\complexchemical
1701 {\ifinchemical
1702 \expandafter\dochemical
1703 \else
1704 \writestatus{ppchtex}{the [][]alternative is not permitted here}
1705 \expandafter\skipchemical
1706 \fi}
1707
1708\newif\ifinnerchemical
1709
1710\def\dosimplechemical#1#2#3
1711 {\doifelsedefined{\??chemical\c!location}
1712 {\writestatus{ppchtex}{the {}{}alternative is not permitted here}}
1713 {\ifinnerchemical
1714 \let\chemicalsign = \chemicalinnersign
1715 \let\chemicalmolecule = \chemicalinnermolecule
1716 \let\chemicalsinglearrow = \chemicalsingleinnerarrow
1717 \let\chemicaldoublearrow = \chemicaldoubleinnerarrow
1718 \let\chemicaltwintiparrow = \chemicaltwintipinnerarrow
1719 \else
1720 \let\chemicalsign = \chemicaloutersign
1721 \let\chemicalmolecule = \chemicaloutermolecule
1722 \let\chemicalsinglearrow = \chemicalsingleouterarrow
1723 \let\chemicaldoublearrow = \chemicaldoubleouterarrow
1724 \let\chemicaltwintiparrow = \chemicaltwintipouterarrow
1725 \fi
1726 \disablechemicalspecials
1727 \processallactionsinset
1728 [#1]
1729 [ HIGH=>\sethighsubscripts,
1730 LOW=>\setlowsubscripts,
1731 PLUS=>\chemicalsign{},
1732 GIVES=>\chemicalsinglearrow{#2}{#3},
1733 EQUILIBRIUM=>\chemicaldoublearrow{#2}{#3},
1734 MESOMERIC=>\chemicaltwintiparrow{#2}{#3},
1735 SINGLE=>\singlechemicalbond,
1736 DOUBLE=>\doublechemicalbond,
1737 TRIPLE=>\triplechemicalbond,
1738 =>\chemicalsign{},
1739 >=>\chemicalsinglearrow{#2}{#3},
1740 <>=>\chemicaldoublearrow{#2}{#3},
1741 <>=>\chemicaltwintiparrow{#2}{#3},
1742 =>\singlechemicalbond,
1743 =>\doublechemicalbond,
1744 =>\triplechemicalbond,
1745 \s!unknown=>\enablechemicalspecials
1746 \chemicalmolecule{\commalistelement}{#2}{#3}]}}
1747
1748\def\dosimplechemicalA#1#2#3
1749 {\let\chemicalspace=\relax
1750 \expandafter\dosimplechemical\expandafter{\@@chemicalchemicaloffset,#1}{#2}{#3}
1751 \egroup}
1752
1753\def\dosimplechemicalB#1#2#3
1754 {\dosimplechemical{#1}{#2}{#3}
1755 \egroup}
1756
1757\def\dosimplechemicalC#1#2#3
1758 {$\simplechemical{#1}{#2}{#3}$
1759 \egroup}
1760
1761\def\simplechemical
1762 {\ifinner
1763 \innerchemicaltrue
1764 \else
1765 \innerchemicalfalse
1766 \fi
1767 \bgroup
1768 \catcode\^=\superscriptcatcode
1769 \catcode\_=\subscriptcatcode
1770 \ifmmode
1771 \ifinnerchemical
1772 \def\next{\dotriplegroupempty\dosimplechemicalA}
1773 \else
1774 \def\next{\dotriplegroupempty\dosimplechemicalB}
1775 \fi
1776 \else
1777 \def\next{\dotriplegroupempty\dosimplechemicalC}
1778 \fi
1779 \next}
1780
1781\definecomplexorsimple\chemical
1782
1783\def\dogotochemical#1#2
1784 {\def\dowithchemical
1785 {\localgotochemical{#1}}
1786 \chemical}
1787
1788\def\gotochemical
1789 {\dosingleargument\dogotochemical}
1790
1791\def\dododochemical#1[#2][#3]
1792 {\def\simpledododochemical
1793 {#1[#2][#3]}
1794 \def\complexdododochemical[##1]
1795 {\def\dowithchemical
1796 {\localthisischemical{#2}}
1797 #1[#3][##1]}
1798 \complexorsimple\dododochemical}
1799
1800\def\dodochemical[#1][#2]
1801 {\ignorespaces
1802 \ifinchemical
1803 \drawchemical[#1][#2]
1804 \ignorespaces
1805 \else
1806 \startchemical[\c!location=\v!intext]
1807 \drawchemical[#1][#2]
1808 \expandafter\stopchemical
1809 \fi
1810 \ignorespaces}
1811
1812\def\dochemical[#1]
1813 {\def\simpledochemical
1814 {\@@writechemicalstate{ppchtex}{[#1][]}
1815 \dodochemical[#1][]}
1816
1817 \def\complexdochemical[##1]
1818 {\@@writechemicalstate{ppchtex}{[#1][##1]}
1819 \txtchemical=0
1820 \dodochemical[#1][##1]}
1821
1822 \def\complexdochemical[##1]
1823 {\@@writechemicalstate{ppchtex}{[#1][##1]}
1824 \txtchemical=0
1825 \dododochemical\dodochemical[#1][##1]}
1826
1827 \complexorsimple\dochemical}
1828
1829
1830
1831
1832
1833\def\dodoprocesschemical#1
1834 {\processchemical[#1????]}
1835
1836\def\processlocalchemicals#1
1837 {\processcommalist[#1]\dodoprocesschemical}
1838
1839
1840
1841
1842
1843
1844\def\localdodochemical[#1][#2]
1845 {\@@writechemicalstate{ppchtex}{[#1][#2]}
1846
1847 \advance\levchemical 1
1848 \letvalue{\??chemical\s!unknown\the\levchemical}\unknownchemical
1849 \setevalue{\??chemical\c!text\the\levchemical}{\the\txtchemical}
1850 \txtchemical=0
1851 \dodochemical[#1][#2]
1852
1853 \txtchemical\csname\??chemical\c!text\the\levchemical\endcsname
1854 \expandafter\let\expandafter\unknownchemical\csname\??chemical\s!unknown\the\levchemical\endcsname
1855 \advance\levchemical 1
1856
1857 \ignorespaces}
1858
1859\def\drawchemical[#1][#2]
1860 {\ignorespaces
1861 \def\dodochemical[##1][##2]
1862 {\drawchemical[##1][##2]
1863 \ignorespaces}
1864 \def\dochemical[##1]
1865 {\def\simpledochemical
1866 {\@@writechemicalstate{ppchtex}{[##1][#2]}
1867 \dodochemical[##1][#2]
1868 \ignorespaces}
1869 \def\complexdochemical[####1]
1870 {\dododochemical\localdodochemical[##1][####1,#2]}
1871 \complexorsimple\dochemical}
1872 \doif\@@chemicalstate\v!start
1873 {\doifelse\chemicalname\s!unknown
1874 {\getvalue{\s!executechemical\defaultchemical}[#2]}
1875 {\getvalue{\s!executechemical\chemicalname}[#2]}
1876 \def\unknownchemical##1
1877 {\processunknownchemical[##1][#2]}
1878 \processcommalist[\@@chemicaloffset,#1]\dodoprocesschemical}
1879 \ignorespaces}
1880
1881\unexpanded\def\chemicaloxidation#1#2#3
1882 {\chemicaltop
1883 {\ifnum#20=0
1884 0
1885 \else
1886 #1\expandafter\uppercase\expandafter{\romannumeral#2}
1887 \fi}
1888 {#3}}
1889
1890\def\chemicaltfraction{\ifinchemical.60\else.8\fi}
1891\def\chemicalbfraction{\ifinchemical.45\else.6\fi}
1892\def\chemicallfraction{\ifinchemical.1\else.1\fi}
1893\def\chemicalrfraction{\ifinchemical.1\else.1\fi}
1894
1895\def\chemicaltighttext
1896 {\def\chemicaltfraction{\ifinchemical.3\else.6\fi}
1897 \def\chemicalbfraction{\ifinchemical.2\else.4\fi}
1898 \def\chemicallfraction{\ifinchemical 0\else 0\fi}
1899 \def\chemicalrfraction{\ifinchemical 0\else 0\fi}}
1900
1901\def\dochemicaltop#1#2#3#4
1902 {\vbox
1903 {\@@dochemicalcolor
1904 \baselineskip=\chemicaltfraction\baselineskip \lineskip0pt
1905 \halign
1906 {#1###2\cr
1907 $\@@dochemicalstyle{\scriptscriptstyle#3}$\cr
1908 $\@@dochemicalstyle{\@@currentchemicalformat#4}$\cr}}}
1909
1910\def\dochemicalbottom#1#2#3#4
1911 {\vtop
1912 {\@@dochemicalcolor
1913 \baselineskip=\chemicalbfraction\baselineskip \lineskip0pt
1914 \halign
1915 {#1###2\cr
1916 $\@@dochemicalstyle{\@@currentchemicalformat#4}$\cr
1917 $\@@dochemicalstyle{\scriptscriptstyle#3}$\cr}}}
1918
1919\def\chemicalleft#1#2
1920 {\hbox
1921 {\@@dochemicalcolor
1922 $\@@dochemicalstyle{\scriptscriptstyle#1}$
1923 $\@@dochemicalstyle{\@@currentchemicalformat\hskip\chemicallfraction em#2}$}}
1924
1925\def\chemicalright#1#2
1926 {\hbox
1927 {\@@dochemicalcolor
1928 $\@@dochemicalstyle{\@@currentchemicalformat#2\hskip\chemicalrfraction em}$
1929 $\@@dochemicalstyle{\scriptscriptstyle#1}$}}
1930
1931\def\chemicalcentered#1
1932 {\setbox0=\hbox{$\@@dochemicalstyle{\scriptscriptstyle#1}$}
1933 \setbox2=\hbox{$\@@dochemicalstyle{\@@currentchemicalformat C}$}
1934 \dimen0=.5\ht2
1935 \advance\dimen0 by .5\ht0
1936 \advance\dimen0 by \dp0
1937 \hbox{\@@dochemicalcolor\raise\dimen0\box0}}
1938
1939\def\chemicalleftcentered#1#2
1940 {\hbox
1941 {\@@dochemicalcolor
1942 \chemicalcentered{#1}
1943 $\@@dochemicalstyle{\@@currentchemicalformat\hskip\chemicallfraction em#2}$}}
1944
1945\def\chemicalrightcentered#1#2
1946 {\hbox
1947 {\@@dochemicalcolor
1948 $\@@dochemicalstyle{\@@currentchemicalformat#2\hskip\chemicalrfraction em}$
1949 \chemicalcentered{#1}}}
1950
1951\def\chemicaltop {\dochemicaltop \hss \hss }
1952\def\chemicallefttop {\dochemicaltop \relax \hss }
1953\def\chemicalrighttop {\dochemicaltop \hss \relax}
1954\def\chemicalbottom {\dochemicalbottom \hss \hss }
1955\def\chemicalleftbottom {\dochemicalbottom \relax \hss }
1956\def\chemicalrightbottom {\dochemicalbottom \hss \relax}
1957
1958\def\chemicaltopleft #1{\chemicalleft {\chemicallefttop {#1}{}}}
1959\def\chemicalbottomleft #1{\chemicalleft {\chemicalleftbottom{#1}{}}}
1960\def\chemicaltopright #1{\chemicalright{\chemicallefttop {#1}{}}}
1961\def\chemicalbottomright#1{\chemicalright{\chemicalleftbottom{#1}{}}}
1962
1963\def\chemicalsmashedleft#1
1964 {\hbox\bgroup
1965 \@@dochemicalcolor
1966 \setbox0=\hbox{$\@@dochemicalstyle{\@@currentchemicalformat C}$}
1967 \setbox2=\hbox{$\@@dochemicalstyle{\@@currentchemicalformat#1}$}
1968 \wd2=\wd0
1969 \box2
1970 \egroup}
1971
1972\def\chemicalsmashedmiddle#1
1973 {\hbox\bgroup
1974 \@@dochemicalcolor
1975 \setbox0=\hbox{$\@@dochemicalstyle{\@@currentchemicalformat C}$}
1976 \setbox2=\hbox{$\@@dochemicalstyle{\@@currentchemicalformat#1}$}
1977 \hbox{\hskip.5\wd2\hskip.5\wd0\box2}
1978 \egroup}
1979
1980\def\chemicalsmashedright#1
1981 {\hbox\bgroup
1982 \@@dochemicalcolor
1983 \setbox0=\hbox{$\@@dochemicalstyle{\@@currentchemicalformat C}$}
1984 \setbox2=\hbox{$\@@dochemicalstyle{\@@currentchemicalformat#1}$}
1985 \hbox to \wd0{\hskip\wd2\hskip\wd0\box2}
1986 \egroup}
1987
1988\def\+{\tabalign}
1989
1990\def\chemicalforever#1#2
1991 {\bgroup
1992 \setbox0=\hbox
1993 {\@@dochemicalcolor
1994 $\@@dochemicalstyle{\scriptscriptstyle\hskip.15em#2}$}
1995 \wd0=0pt
1996 \big#1\normapsubscript{\hskip.1em\box0}
1997 \egroup}
1998
1999\def\disablechemicalspecials
2000 {\def\+##1{##1}\def\-##1{##1}
2001 \def\[{[}\def\]{]}
2002 \def\1{}\def\2{}\def\3{}\def\4{}\def\5{}\def\6{}\def\7{}
2003 \def\X{}
2004 \def\T{}\def\B{}\def\L{}\def\R{}\def\LC{}\def\RC{}
2005 \def\TL{}\def\BL{}\def\TR{}\def\BR{}
2006 \def\LT{}\def\LB{}\def\RT{}\def\RB{}
2007 \def\SL{}\def\SM{}\def\SR{}}
2008
2009\def\enablechemicalspecials
2010 {\def\+{\dodoublegroupempty\chemicaloxidation{}}
2011 \def\-{\dodoublegroupempty\chemicaloxidation{}}
2012 \def\[{\dodoublegroupempty\chemicalforever {[}}
2013 \def\]{\dodoublegroupempty\chemicalforever {]}}
2014 \def\1{\chemicaloxidation\relax1}
2015 \def\2{\chemicaloxidation\relax2}
2016 \def\3{\chemicaloxidation\relax3}
2017 \def\4{\chemicaloxidation\relax4}
2018 \def\5{\chemicaloxidation\relax5}
2019 \def\6{\chemicaloxidation\relax6}
2020 \def\7{\chemicaloxidation\relax7}
2021 \def\X{\chemicaltighttext}
2022 \def\T{\chemicaltop}
2023 \def\B{\chemicalbottom}
2024 \def\L{\chemicalleft}
2025 \def\LC{\chemicalleftcentered}
2026 \def\R{\chemicalright}
2027 \def\RC{\chemicalrightcentered}
2028 \def\TL{\chemicaltopleft}
2029 \def\BL{\chemicalbottomleft}
2030 \def\TR{\chemicaltopright}
2031 \def\BR{\chemicalbottomright}
2032 \def\LT{\chemicallefttop}
2033 \def\LB{\chemicalleftbottom}
2034 \def\RT{\chemicalrighttop}
2035 \def\RB{\chemicalrightbottom}
2036 \def\SL{\chemicalsmashedleft}
2037 \def\SM{\chemicalsmashedmiddle}
2038 \def\SR{\chemicalsmashedright}}
2039
2040
2041
2042
2043
2044
2045
2046\def\reversechemical#1#2#3
2047 {\def\doprocess[##1##2]
2048 {\doifchemicalnumber{##1}{#1#2}
2049 {\getfromcommalist[#3][##1]
2050 \let\reversechemicalaction=\commalistelement
2051 \processchemical[#1\reversechemicalaction##2]}}
2052 \doprocess[#2]}
2053
2054
2055
2056
2057
2058
2059\def\defaultchemical
2060 {SIX}
2061
2062\def\processunknownchemical[#1????][#2]
2063 {\processaction
2064 [#1]
2065 [ SAVE=>\executechemicalSAVE,
2066 RESTORE=>\executechemicalRESTORE,
2067 HIGH=>\sethighsubscripts,
2068 LOW=>\setlowsubscripts,
2069 \s!default=>,
2070 \s!unknown=>\doifelsedefined{\s!executechemical#1}
2071 {\def\chemicalrotation{1}
2072 \def\chemicaloffset{0}
2073 \doifdefined{\s!executechemical#1}
2074 {\getvalue{\s!executechemical#1}[#2]}
2075 \@@chemicalpostponed}
2076 {\getpredefinedchemical{#1}}]}
2077
2078\newcount\chemicalstack
2079
2080\setvalue{\s!chemical\c!x1}{0}
2081\setvalue{\s!chemical\c!y1}{0}
2082
2083\def\executechemicalSAVE
2084 {
2085 \advance\chemicalstack by 1
2086 \letvalue {\s!chemical n\the\chemicalstack}=\chemicalname
2087
2088 \setevalue{\s!chemical x\the\chemicalstack}{\the\horchemical}
2089 \setevalue{\s!chemical y\the\chemicalstack}{\the\verchemical}}
2090
2091\def\restorechemicalvalues#1
2092 {\let\oldprocesschemical=\processchemical
2093 \doifdefined{\s!executechemical#1}{\getvalue{\s!executechemical#1}[]}
2094 \let\processchemical=\oldprocesschemical}
2095
2096\def\executechemicalRESTORE
2097 {\ifnum\chemicalstack=0\relax
2098 \horchemical=\getvalue{\s!chemical x1}\relax
2099 \verchemical=\getvalue{\s!chemical y1}\relax
2100 \else
2101 \restorechemicalvalues{\getvalue{\s!chemical n\the\chemicalstack}}
2102
2103 \let\@@chemicalpostponed=\relax
2104 \horchemical=\getvalue{\s!chemical x\the\chemicalstack}\relax
2105 \verchemical=\getvalue{\s!chemical y\the\chemicalstack}\relax
2106 \advance\chemicalstack by 1
2107 \fi
2108 \restorechemicalcoordinates}
2109
2110
2111
2112
2113
2114\def\chemicalinnerclip#1
2115 {{\setbox0=\hbox{#1}\ht0\ht\strutbox\dp0\dp\strutbox\box0}}
2116
2117\def\chemicalraise#1#2
2118 {\chemicalinnerclip
2119 {\setbox0=\hbox{$#1$}
2120 \raise\dp0\hbox{$#1#2$}}}
2121
2122\def\chemicalinnersign#1
2123 {\chemicalraise{\@@localchemicalstyle}{#1}}
2124
2125\def\chemicaloutersign#1
2126 {\chemicalraise{}{\@@dochemicalcolor#1}}
2127
2128\def\chemicalsingleinnerarrow#1#2
2129 {\chemicalraise{\@@localchemicalstyle}{\longrightarrow}}
2130
2131\def\chemicaldoubleinnerarrow#1#2
2132 {\chemicalinnerclip
2133 {\lower.2ex\hbox
2134 {\setbox0=\hbox{$\@@localchemicalstyle\longrightarrow$}
2135 \setbox2=\hbox{$\@@localchemicalstyle\longleftarrow$}
2136 \wd0=0pt\raise\ht0\box0\box2}}}
2137
2138\def\chemicaltwintipinnerarrow#1#2
2139 {\chemicalinnerclip
2140 {\setbox0=\hbox{\chemicalraise{\@@localchemicalstyle}{\longrightarrow}}
2141 \setbox2=\hbox{\chemicalraise{\@@localchemicalstyle}{\longleftarrow}}
2142 \wd0=0pt\box0\box2}}
2143
2144\def\dochemicalouterarrow#1#2#3
2145 {\bgroup
2146 \setbox0=\hbox{$\longrightarrow$}
2147 \setbox2=\hbox{$\@@dochemicalstyle{\scriptstyle\quad#2\quad}$}
2148 \setbox4=\hbox{$\@@dochemicalstyle{\scriptstyle\quad#3\quad}$}
2149 \dimen2=\wd0
2150 \ifdim\wd2>\dimen2 \dimen0=\wd2 \fi
2151 \ifdim\wd4>\dimen2 \dimen0=\wd4 \fi
2152 \chemicaloutermolecule
2153 {#1}
2154 {\ifdim\ht2>\zeropoint\box2\fi}
2155 {\ifdim\ht4>\zeropoint\box4\fi}
2156 \egroup}
2157
2158\def\chemicalsingleouterarrow
2159 {\dochemicalouterarrow
2160 {\hbox to \dimen2{\rightarrowfill}}}
2161
2162\def\chemicaldoubleouterarrow
2163 {\dochemicalouterarrow
2164 {\lower.5\ht0\vbox
2165 {\offinterlineskip
2166 \hbox to \dimen2{\rightarrowfill}
2167 \hbox to \dimen2{\leftarrowfill}}}}
2168
2169\def\chemicaltwintipouterarrow
2170 {\dochemicalouterarrow
2171 {\hbox
2172 {\hbox to \dimen2{\rightarrowfill}
2173 \hskip\dimen2
2174 \hbox to \dimen2{\leftarrowfill}}}}
2175
2176\def\chemicalinnermolecule#1#2#3
2177 {\chemicalspace
2178 \chemicalinnerclip
2179 {\dosetsubscripts
2180 $\@@dochemicalstyle{\@@localchemicalstyle\strut#1}$
2181 \doresetsubscripts}
2182 \chemicalspace}
2183
2184\def\chemicaloutermolecule#1#2#3
2185 {\chemicalspace
2186 \bgroup
2187 \@@dochemicalcolor
2188 \setbox0=\hbox
2189 {\dosetsubscripts
2190 \hbox{$\@@dochemicalstyle{\strut#1}$}
2191 \doresetsubscripts}
2192 \mathop{\box0}
2193 \ifthirdargument
2194 \doifnot{#2}{}{\normapsuperscript{\@@dochemicalstyle{\strut#2}}}
2195 \doifnot{#3}{}{\normapsubscript {\@@dochemicalstyle{\strut#3}}}
2196 \else
2197 \doifnot{#2}{}
2198 {\normapsubscript{\@@dochemicalstyle{\strut#2}}}
2199 \fi
2200 \egroup
2201 \chemicalspace}
2202
2203\def\chemicalsinglepicturearrow#1
2204 {\lower.5ex\hbox
2205 {\@@dochemicalstyle
2206 $\chemicalspace
2207 \buildrel
2208 \@@dochemicalstyle{\scriptstyle\quad#1\quad}
2209 \over{\overrightarrow
2210 {\hphantom{\@chemicalstyle{\scriptstyle\quad#1\quad}}}}
2211 \chemicalspace$}}
2212
2213\def\chemicaldoublepicturearrow#1
2214 {\lower.5ex\hbox
2215 {\@@dochemicalstyle
2216 $\chemicalspace
2217 \buildrel
2218 \@@dochemicalstyle{\scriptstyle\quad#1\quad}
2219 \over{\overrightarrow{\overleftarrow
2220 {\hphantom{\@@dochemicalstyle{\scriptstyle\quad#1\quad}}}}}
2221 \chemicalspace$}}
2222
2223
2224
2225
2226
2227\def\somechemicalbond
2228 {\hrule width \wd0 height .4pt}
2229
2230\def\dochemicalbonds#1#2#3
2231 {{\setbox0=\hbox
2232 {${\@@localchemicalstyle M}$}
2233 \vbox to \ht0
2234 {\@@dochemicalcolor
2235 \hsize\wd0
2236 \vskip.1\wd0#1\vfill#2\vfill#3\vskip.1\wd0}}}
2237
2238\def\singlechemicalbond
2239 {\dochemicalbonds{}{\somechemicalbond}{}}
2240
2241\def\doublechemicalbond
2242 {\dochemicalbonds{\somechemicalbond}{}{\somechemicalbond}}
2243
2244\def\triplechemicalbond
2245 {\dochemicalbonds{\somechemicalbond}{\somechemicalbond}{\somechemicalbond}}
2246
2247
2248
2249
2250
2251
2252
2253
2254
2255
2256\def\dodefinechemical[#1]#2
2257 {\doifdefined{\??chemical#1}
2258 {\writestatus{ppchtex}{chemical definition #1 is redefined}}
2259 \setvalue{\??chemical#1}{#2}}
2260
2261\unexpanded\def\definechemical
2262 {\dosingleargument\dodefinechemical}
2263
2264\def\getpredefinedchemical#1
2265 {\doifelsedefined{\??chemical#1}
2266 {\getvalue{\??chemical#1}}
2267 {\doifelsedefined{#1}
2268 {\getvalue{#1}}
2269 {\writestatus{ppchtex}{unknown chemical definition #1}}}}
2270
2271
2272
2273
2274
2275
2276
2277
2278
2279
2280
2281
2282
2283
2284
2285
2286
2287
2288
2289
2290
2291
2292
2293\setchemicalmaximum 0
2294
2295\def\processchemical[#1]
2296 {\unknownchemical{#1}}
2297
2298\def\setchemicalname#1
2299 {\def\chemicalname{#1}}
2300
2301\let\chemicalname=\s!unknown
2302
2303
2304
2305
2306
2307
2308
2309
2310
2311
2312
2313
2314\def\executechemicalONE[#1]
2315 {\setchemicalname ONE
2316
2317 \setchemicalmaximum 8
2318 \setchemicaldistance 0
2319 \setchemicalsubstitute 625
2320 \setchemicaldirection 303
2321
2322 \setchemicalrotation 1 1 0 1 0 1 0 1 0
2323 \setchemicalrotation 2 0.707 0.707 0.707 0.707 0.707 0.707 0.707 0.707
2324 \setchemicalrotation 3 0 1 0 1 0 1 0 1
2325 \setchemicalrotation 4 0.707 0.707 0.707 0.707 0.707 0.707 0.707 0.707
2326 \setchemicalrotation 5 1 0 1 0 1 0 1 0
2327 \setchemicalrotation 6 0.707 0.707 0.707 0.707 0.707 0.707 0.707 0.707
2328 \setchemicalrotation 7 0 1 0 1 0 1 0 1
2329 \setchemicalrotation 8 0.707 0.707 0.707 0.707 0.707 0.707 0.707 0.707
2330
2331 \setchemicalangle 1 0 90 180 270
2332 \setchemicalangle 2 45 135 225 315
2333 \setchemicalangle 3 90 180 270 0
2334 \setchemicalangle 4 135 225 315 45
2335 \setchemicalangle 5 180 270 0 90
2336 \setchemicalangle 6 225 315 45 135
2337 \setchemicalangle 7 270 0 90 180
2338 \setchemicalangle 8 315 45 135 225
2339
2340 \setchemicaltranslate 1 1000 0
2341 \setchemicaltranslate 2 1000 1000
2342 \setchemicaltranslate 3 0 1000
2343 \setchemicaltranslate 4 1000 1000
2344 \setchemicaltranslate 5 1000 0
2345 \setchemicaltranslate 6 1000 1000
2346 \setchemicaltranslate 7 0 1000
2347 \setchemicaltranslate 8 1000 1000
2348
2349 \setchemicallinesegment SB 300 0 700 0
2350 \setchemicallinesegment DB1 300 50 700 50
2351 \setchemicallinesegment DB2 300 50 700 50
2352
2353
2354 \setchemicalfactorlinesegment EP 200 125 200 125
2355
2356 \setchemicaltextelement ES 200 0
2357 \setchemicaltextelement ED1 200 50
2358 \setchemicaltextelement ED2 200 50
2359 \setchemicaltextelement ET1 200 75
2360 \setchemicaltextelement ET2 200 0
2361 \setchemicaltextelement ET3 200 75
2362 \setchemicaltextelement HB1 300 0
2363 \setchemicaltextelement HB2 475 0
2364 \setchemicaltextelement HB3 650 0
2365
2366 \setchemicaltextelement Z 800 0
2367 \setchemicaltextelement RZ 950 0
2368 \setchemicaltextelement ZN 500 0
2369 \setchemicaltextelement ZTN 500 150
2370 \setchemicaltextelement ZBN 500 150
2371
2372 \def\processchemical[##1##2##3##4##5]
2373 {\doprocesschemical[##1##2##3##4##5]
2374 {\processaction
2375 [##1##2##3##4##5]
2376 [ PB:##4##5=>\beginchemicalpicture{##4##5},
2377 PE????=>\endchemicalpicture,
2378 SUB##4##5=>\processchemicalsubstitute{##4##5},
2379 ADJ##4##5=>\processchemicaldistance{##4##5},
2380 MOV##4##5=>\processchemicaltranslate{##4##5},
2381 DIR##4##5=>\processchemicaldirection{##4##5},
2382 OFF##4##5=>\processchemicaloffset{##4##5},
2383 CCD##4##5=>\processchemicaldottsegment{CC}{##4##5},
2384 LDD##4##5=>\processchemicaldashedlinesegment{DB1}{##4##5}
2385 \processchemicallinesegment{DB2}{##4##5},
2386 RDD##4##5=>\processchemicallinesegment{DB1}{##4##5}
2387 \processchemicaldashedlinesegment{DB2}{##4##5},
2388 OF##3:##5=>\processchemicalphantom{##3}{##5},
2389 OE##3##4##5=>\processchemicalopenend{OE}{##3##4##5},
2390 EP##3##4##5=>\processchemicallinesegment{EP}{##3##4##5},
2391 ES##3##4##5=>\processchemicaltextconstant{ES}{##3##4##5}{\hbox{$\cdot$}}{0},
2392 ED##3##4##5=>\processchemicaltextconstant{ED}{##3##4##5}{\hbox{$\cdot$}}{0},
2393 ET##3##4##5=>\processchemicaltextconstant{ET}{##3##4##5}{\hbox{$\cdot$}}{0},
2394 HB##3##4##5=>\processchemicaltextconstant{HB}{##3##4##5}{\hbox{$\cdot$}}{0},
2395 SB##3##4##5=>\processchemicallinesegment{SB}{##3##4##5},
2396 DB##3##4##5=>\processchemicallinesegment{DB}{##3##4##5},
2397 SB##3##4##5=>\processchemicallinesegment{SB}{##3##4##5},
2398 BB##3##4##5=>\processchemicaldeltalinesegment{SB}{##3##4##5},
2399 BD##3##4##5=>\processchemicaldasheddeltalinesegment{SB}{##3##4##5},
2400 BW##3##4##5=>\processchemicalwavylinesegment{SB}{##3##4##5},
2401 SD##3##4##5=>\processchemicaldashedlinesegment{SB}{##3##4##5},
2402 TB##3##4##5=>\processchemicallinesegment{SB}{##3##4##5}
2403 \processchemicallinesegment{DB}{##3##4##5},
2404 CZ##3##4##5=>\processchemicaltextelement{RZ}{##3##4##5}{#1}{0}{},
2405 ZTN##4##5=>\processchemicalsmalltextconstant{ZTN}{##4##5}{\chemicaltextelementnumber}{0},
2406 ZTT##4##5=>\processchemicalsmalltextelement{ZTN}{##4##5}{#1}{0}{},
2407 ZBN##4##5=>\processchemicalsmalltextconstant{ZBN}{##4##5}{\chemicaltextelementnumber}{0},
2408 ZBT##4##5=>\processchemicalsmalltextelement{ZBN}{##4##5}{#1}{0}{},
2409 ZN##3##4##5=>\processchemicaltextconstant{ZN}{##3##4##5}{\chemicaltextelementnumber}{0},
2410 ZT##3##4##5=>\processchemicaltextelement{ZN}{##3##4##5}{#1}{0}{},
2411 Z##2##3##4##5=>\processchemicaltextelement{Z}{##2##3##4##5}{#1}{0}
2412 {l,l,t,r,r,r,b,l},
2413 \s!unknown=>\unknownchemical{##1##2##3##4##5}]}}}
2414
2415\def\executechemicalTHREE[#1]
2416 {\setchemicalname THREE
2417
2418 \setchemicalmaximum 3
2419 \setchemicaldistance 289
2420 \setchemicalsubstitute 952
2421
2422 \setchemicalrotation 1 1 0 0 1 1 0 0 1
2423 \setchemicalrotation 2 0.5 0.866 0.866 0.5 0.5 0.866 0.866 0.5
2424 \setchemicalrotation 3 0.5 0.866 0.866 0.5 0.5 0.866 0.866 0.5
2425
2426 \setchemicalangle 1 0 90 180 270
2427 \setchemicalangle 2 120 210 300 30
2428 \setchemicalangle 3 240 330 60 150
2429
2430 \setchemicaltranslate 1 1000 0
2431 \setchemicaltranslate 2 0 1000
2432 \setchemicaltranslate 3 1000 0
2433 \setchemicaltranslate 4 0 1000
2434
2435 \setchemicallinesegment B 577 0 289 500
2436 \setchemicallinesegment SB 352 130 64 370
2437 \setchemicallinesegment SB 352 130 289 500
2438 \setchemicallinesegment SB 577 0 64 370
2439 \setchemicallinesegment DB1 327 87 89 327
2440 \setchemicallinesegment DB2 377 172 39 413
2441 \setchemicallinesegment R 577 0 1077 0
2442 \setchemicallinesegment R 577 0 1010 250
2443 \setchemicallinesegment R 577 0 1010 250
2444 \setchemicallinesegment ER1 577 50 1077 50
2445 \setchemicallinesegment ER2 577 50 1077 50
2446 \setchemicallinesegment SR 837 0 1077 0
2447 \setchemicallinesegment SR 802 130 1010 250
2448 \setchemicallinesegment SR 802 130 1010 250
2449 \setchemicallinesegment DR1 837 50 1077 50
2450 \setchemicallinesegment DR2 837 50 1077 50
2451
2452 \setchemicaltextelement Z 577 0
2453 \setchemicaltextelement RZ 1177 0
2454 \setchemicaltextelement RZ 1097 300
2455 \setchemicaltextelement RZ 1097 300
2456 \setchemicaltextelement CRZ 1077 0
2457
2458 \def\processchemical[##1##2##3##4]
2459 {\processaction
2460 [##1##2##3##4]
2461 [ ROT##4=>\processchemicalrotation{##4},
2462 MOV##4=>\processchemicaltranslate{##4},
2463 SUB##4=>\processchemicalsubstitute{##4},
2464 ADJ##4=>\processchemicaldistance{##4},
2465 RZ##4=>\processchemicaltextelement{RZ}{##4}{#1}{3}
2466 {l,t,r, l,r,l, r,b,l, r,l,r},
2467 RZ##4=>\processchemicaltextelement{RZ}{##4}{#1}{3}
2468 {l,r,b, r,r,l, r,l,t, l,l,r},
2469 SB##4=>\processchemicallinesegment{SB}{##4},
2470 SB##4=>\processchemicallinesegment{SB}{##4},
2471 SR##4=>\processchemicallinesegment{SR}{##4},
2472 SR##4=>\processchemicallinesegment{SR}{##4},
2473 CRZ##4=>\processchemicaltextelement{CRZ}{##4}{#1}{0}
2474 {},
2475 DB##3##4=>\processchemicallinesegment{DB}{##3##4},
2476 DR##3##4=>\processchemicallinesegment{DR}{##3##4},
2477 RZ##3##4=>\processchemicaltextelement{RZ}{##3##4}{#1}{3}
2478 {l,r,r, t,r,l, r,l,l, b,l,r},
2479 ER##3##4=>\processchemicallinesegment{ER}{##3##4},
2480 SB##3##4=>\processchemicallinesegment{SB}{##3##4},
2481 SR##3##4=>\processchemicallinesegment{SR}{##3##4},
2482 R##3##4=>\processchemicallinesegment{R}{##3##4},
2483 R##3##4=>\processchemicallinesegment{R}{##3##4},
2484 B##2##3##4=>\processchemicallinesegment{B}{##2##3##4},
2485 R##2##3##4=>\processchemicallinesegment{R}{##2##3##4},
2486 Z##2##3##4=>\processchemicaltextelement{Z}{##2##3##4}{#1}{0}{},
2487 \s!unknown=>\unknownchemical{##1##2##3##4}]}}
2488
2489\def\executechemicalFOUR[#1]
2490 {\setchemicalname FOUR
2491
2492 \setchemicalmaximum 4
2493 \setchemicaldistance 500
2494 \setchemicalsubstitute 0
2495
2496 \setchemicalrotation 1 1 0 0 1 1 0 0 1
2497 \setchemicalrotation 2 0 1 1 0 0 1 1 0
2498 \setchemicalrotation 3 1 0 0 1 1 0 0 1
2499 \setchemicalrotation 4 0 1 1 0 0 1 1 0
2500
2501 \setchemicalangle 1 0 90 180 270
2502 \setchemicalangle 2 90 180 270 0
2503 \setchemicalangle 3 180 270 0 90
2504 \setchemicalangle 4 270 0 90 180
2505
2506 \setchemicaltranslate 1 1000 0
2507 \setchemicaltranslate 2 0 1000
2508 \setchemicaltranslate 3 1000 0
2509 \setchemicaltranslate 4 0 1000
2510
2511 \setchemicallinesegment B 500 500 500 500
2512 \setchemicallinesegment SB 500 240 500 240
2513 \setchemicallinesegment SB 500 240 500 500
2514 \setchemicallinesegment SB 500 500 500 240
2515 \setchemicallinesegment DB1 450 240 450 240
2516 \setchemicallinesegment DB2 550 240 550 240
2517 \setchemicallinesegment EB 360 300 360 300
2518 \setchemicallinesegment R 500 500 854 854
2519 \setchemicallinesegment R 500 500 500 1000
2520 \setchemicallinesegment R 500 500 1000 500
2521 \setchemicallinesegment ER1 465 535 819 889
2522 \setchemicallinesegment ER2 535 465 889 819
2523 \setchemicallinesegment SR 684 684 854 854
2524 \setchemicallinesegment SR 500 760 500 1000
2525 \setchemicallinesegment SR 760 500 1000 500
2526 \setchemicallinesegment DR1 649 719 819 889
2527 \setchemicallinesegment DR2 719 649 889 819
2528
2529 \setchemicaltextelement Z 500 500
2530 \setchemicaltextelement RZ 925 925
2531 \setchemicaltextelement RZ 500 1100
2532 \setchemicaltextelement RZ 1100 500
2533 \setchemicaltextelement CRZ 1038 1038
2534
2535 \setchemicaltextelement ZN 350 350
2536
2537 \def\processchemical[##1##2##3##4]
2538 {\processaction
2539 [##1##2##3##4]
2540 [ PB:##4=>\beginchemicalpicture{##4},
2541 PE????=>\endchemicalpicture,
2542 ROT##4=>\processchemicalrotation{##4},
2543 SUB##4=>\processchemicalsubstitute{##4},
2544 ADJ##4=>\processchemicaldistance{##4},
2545 MOV##4=>\processchemicaltranslate{##4},
2546 RZ##4=>\processchemicaltextelement{RZ}{##4}{#1}{4}
2547 {b,l,t,r, l,t,r,b, t,r,b,l, r,b,l,t},
2548 RZ##4=>\processchemicaltextelement{RZ}{##4}{#1}{4}
2549 {l,t,r,b, t,r,b,l, r,b,l,t, b,l,t,r},
2550 SB##4=>\processchemicallinesegment{SB}{##4},
2551 SB##4=>\processchemicallinesegment{SB}{##4},
2552 SR##4=>\processchemicallinesegment{SR}{##4},
2553 SR##4=>\processchemicallinesegment{SR}{##4},
2554 CRZ##4=>\processchemicaltextelement{CRZ}{##4}{#1}{0}{},
2555 ZN##3##4=>\processchemicaltextconstant{ZN}{##3##4}{\chemicaltextelementnumber}{0},
2556 ZT##3##4=>\processchemicaltextelement{ZN}{##3##4}{#1}{0}{},
2557 DB##3##4=>\processchemicallinesegment{DB}{##3##4},
2558 DR##3##4=>\processchemicallinesegment{DR}{##3##4},
2559 EB##3##4=>\processchemicallinesegment{EB}{##3##4},
2560 ER##3##4=>\processchemicallinesegment{ER}{##3##4},
2561 RZ##3##4=>\processchemicaltextelement{RZ}{##3##4}{#1}{4}
2562 {lb,lt,rt,rb, lt,rt,rb,lb, rt,rb,lb,lt, rb,lb,lt,rt},
2563 SB##3##4=>\processchemicallinesegment{SB}{##3##4},
2564 SR##3##4=>\processchemicallinesegment{SR}{##3##4},
2565 R##3##4=>\processchemicallinesegment{R}{##3##4},
2566 R##3##4=>\processchemicallinesegment{R}{##3##4},
2567 B##2##3##4=>\processchemicallinesegment{B}{##2##3##4},
2568 R##2##3##4=>\processchemicallinesegment{R}{##2##3##4},
2569 Z##2##3##4=>\processchemicaltextelement{Z}{##2##3##4}{#1}{0}{},
2570 \s!unknown=>\unknownchemical{##1##2##3##4}]}}
2571
2572\def\executechemicalFIVE[#1]
2573 {\setchemicalname FIVE
2574
2575 \setchemicalmaximum 5
2576 \setchemicaldistance 688
2577 \setchemicalsubstitute 1226
2578
2579 \setchemicalrotation 1 1 0 0 1 1 0 0 1
2580 \setchemicalrotation 2 0.309 0.951 0.951 0.309 0.309 0.940 0.951 0.309
2581 \setchemicalrotation 3 0.809 0.588 0.588 0.809 0.809 0.588 0.588 0.809
2582 \setchemicalrotation 4 0.809 0.588 0.588 0.809 0.809 0.588 0.588 0.809
2583 \setchemicalrotation 5 0.309 0.951 0.951 0.309 0.309 0.951 0.951 0.309
2584
2585 \setchemicalangle 1 0 90 180 270
2586 \setchemicalangle 2 72 162 252 342
2587 \setchemicalangle 3 144 234 324 54
2588 \setchemicalangle 4 216 306 36 126
2589 \setchemicalangle 5 288 18 108 198
2590
2591 \setchemicaltranslate 1 1376 0
2592 \setchemicaltranslate 2 425 1304
2593 \setchemicaltranslate 3 1113 809
2594 \setchemicaltranslate 4 1113 809
2595 \setchemicaltranslate 5 425 1304
2596
2597 \setchemicallinesegment A 1188 500 1188 500
2598 \setchemicallinesegment B 688 500 688 500
2599 \setchemicallinesegment S 263 808 688 500
2600 \setchemicallinesegment SS 116 606 541 298
2601 \setchemicallinesegment SS 263 808 541 298
2602 \setchemicallinesegment SS 116 606 688 500
2603 \setchemicallinesegment SB 688 240 688 240
2604 \setchemicallinesegment SB 688 240 688 500
2605 \setchemicallinesegment SB 688 500 688 240
2606 \setchemicallinesegment DB1 638 240 638 240
2607 \setchemicallinesegment DB2 738 240 738 240
2608 \setchemicallinesegment EB 548 340 548 340
2609 \setchemicallinesegment R 688 500 1093 794
2610 \setchemicallinesegment R 688 500 688 1000
2611 \setchemicallinesegment R 688 500 1163 345
2612 \setchemicallinesegment ER1 659 540 1064 834
2613 \setchemicallinesegment ER2 727 460 1122 754
2614 \setchemicallinesegment SR 898 653 1093 794
2615 \setchemicallinesegment SR 688 760 688 1000
2616 \setchemicallinesegment SR 935 420 1163 345
2617 \setchemicallinesegment DR1 869 693 1064 834
2618 \setchemicallinesegment DR2 927 613 1122 754
2619
2620 \setchemicaltextelement Z 688 500
2621 \setchemicaltextelement RZ 1188 863
2622 \setchemicaltextelement RZ 688 1100
2623 \setchemicaltextelement RZ 1258 315
2624 \setchemicaltextelement CRZ 1323 947
2625
2626 \setchemicalcircsegment C 36 36 590 72 475 345
2627 \setchemicalcircsegment CC 72 0 590 72 182 561
2628
2629 \setchemicaltextelement ZN 468 350
2630 \setchemicaltextelement RN 860 625
2631 \setchemicaltextelement RTN 785 728
2632 \setchemicaltextelement RBN 935 522
2633
2634 \def\processchemical[##1##2##3##4]
2635 {\processaction
2636 [##1##2##3##4]
2637 [ FRONT????=>{\executechemicalFIVEFRONT[#1]},
2638 PB:##4=>\beginchemicalpicture{##4},
2639 PE????=>\endchemicalpicture,
2640 ROT##4=>\processchemicalrotation{##4},
2641 SUB##4=>\processchemicalsubstitute{##4},
2642 ADJ##4=>\processchemicaldistance{##4},
2643 MOV##4=>\processchemicaltranslate{##4},
2644 RZ##4=>\processchemicaltextelement{RZ}{##4}{#1}{5}
2645 {b,l,t,r,r, l,t,r,r,l, t,r,r,l,l, r,b,l,t,r},
2646 RZ##4=>\processchemicaltextelement{RZ}{##4}{#1}{5}
2647 {l,t,r,r,b, t,r,r,l,l, r,r,l,l,r, b,l,l,r,r},
2648 SB##4=>\processchemicallinesegment{SB}{##4},
2649 SB##4=>\processchemicallinesegment{SB}{##4},
2650 SR##4=>\processchemicallinesegment{SR}{##4},
2651 SR##4=>\processchemicallinesegment{SR}{##4},
2652 RD##4=>\processchemicaldashedlinesegment{R}{##4},
2653 RD##4=>\processchemicaldashedlinesegment{R}{##4},
2654 RB##4=>\processchemicaldeltalinesegment{R}{##4},
2655 RB##4=>\processchemicaldeltalinesegment{R}{##4},
2656 CRZ##4=>\processchemicaltextelement{CRZ}{##4}{#1}{0}{},
2657 RTN##4=>\processchemicaltextconstant{RTN}{##4}{\chemicaltextelementnumber}{0},
2658 RTT##4=>\processchemicaltextelement{RTN}{##4}{#1}{0}{},
2659 RBN##4=>\processchemicaltextconstant{RBN}{##4}{\chemicaltextelementnumber}{0},
2660 RBT##4=>\processchemicaltextelement{RBN}{##4}{#1}{0}{},
2661 SS##4=>\processchemicallinesegment{SS}{##4},
2662 SS##4=>\processchemicallinesegment{SS}{##4},
2663 CCD##4=>\processchemicaldottsegment{CC}{##4},
2664 SS##3##4=>\processchemicallinesegment{SS}{##3##4},
2665 RD##3##4=>\processchemicaldashedlinesegment{R}{##3##4},
2666 RB##3##4=>\processchemicaldeltalinesegment{R}{##3##4},
2667 ZN##3##4=>\processchemicaltextconstant{ZN}{##3##4}{\chemicaltextelementnumber}{0},
2668 ZT##3##4=>\processchemicaltextelement{ZN}{##3##4}{#1}{0}{},
2669 RN##3##4=>\processchemicaltextconstant{RN}{##3##4}{\chemicaltextelementnumber}{0},
2670 RT##3##4=>\processchemicaltextelement{RN}{##3##4}{#1}{0}{},
2671 AU##3##4=>\processchemicaluparrowsegment{A}{##3##4},
2672 AD##3##4=>\processchemicaldownarrowsegment{A}{##3##4},
2673 CC##3##4=>\processchemicalcircsegment{CC}{##3##4},
2674 CD##3##4=>\processchemicaldottsegment{C}{##3##4},
2675 DB##3##4=>\processchemicallinesegment{DB}{##3##4},
2676 DR##3##4=>\processchemicallinesegment{DR}{##3##4},
2677 EB##3##4=>\processchemicallinesegment{EB}{##3##4},
2678 ER##3##4=>\processchemicallinesegment{ER}{##3##4},
2679 RZ##3##4=>\processchemicaltextelement{RZ}{##3##4}{#1}{5}
2680 {l,l,r,r,r, l,r,r,b,l, r,r,b,l,t, r,l,l,t,r},
2681 SB##3##4=>\processchemicallinesegment{SB}{##3##4},
2682 SR##3##4=>\processchemicallinesegment{SR}{##3##4},
2683 R##3##4=>\processchemicallinesegment{R}{##3##4},
2684 R##3##4=>\processchemicallinesegment{R}{##3##4},
2685 B##2##3##4=>\processchemicallinesegment{B}{##2##3##4},
2686 C##2##3##4=>\processchemicalcircsegment{C}{##2##3##4},
2687 R##2##3##4=>\processchemicallinesegment{R}{##2##3##4},
2688 S##2##3##4=>\processchemicallinesegment{S}{##2##3##4},
2689 Z##2##3##4=>\processchemicaltextelement{Z}{##2##3##4}{#1}{0}{},
2690 \s!unknown=>\unknownchemical{##1##2##3##4}]}}
2691
2692\def\executechemicalSIX[#1]
2693 {\setchemicalname SIX
2694
2695 \setchemicalmaximum 6
2696 \setchemicalsubstitute 1375
2697 \setchemicaldistance 866
2698
2699 \setchemicalrotation 1 1 0 0 1 1 0 0 1
2700 \setchemicalrotation 2 0.5 0.866 0.866 0.5 0.5 0.866 0.866 0.5
2701 \setchemicalrotation 3 0.5 0.866 0.866 0.5 0.5 0.866 0.866 0.5
2702 \setchemicalrotation 4 1 0 0 1 1 0 0 1
2703 \setchemicalrotation 5 0.5 0.866 0.866 0.5 0.5 0.866 0.866 0.5
2704 \setchemicalrotation 6 0.5 0.866 0.866 0.5 0.5 0.866 0.866 0.5
2705
2706 \setchemicalangle 1 0 90 180 270
2707 \setchemicalangle 2 60 150 240 330
2708 \setchemicalangle 3 120 210 300 30
2709 \setchemicalangle 4 180 270 0 90
2710 \setchemicalangle 5 240 330 60 150
2711 \setchemicalangle 6 300 30 120 210
2712
2713 \setchemicaltranslate 1 1732 0
2714 \setchemicaltranslate 2 866 1500
2715 \setchemicaltranslate 3 866 1500
2716 \setchemicaltranslate 4 1732 0
2717 \setchemicaltranslate 5 866 1500
2718 \setchemicaltranslate 6 866 1500
2719
2720 \setchemicallinesegment A 1386 500 1386 500
2721 \setchemicallinesegment S 0 1000 866 500
2722 \setchemicallinesegment SS 125 783 741 283
2723 \setchemicallinesegment SS 0 1000 741 283
2724 \setchemicallinesegment SS 125 783 866 500
2725 \setchemicallinesegment B 866 500 866 500
2726 \setchemicallinesegment SB 866 240 866 240
2727 \setchemicallinesegment SB 866 240 866 500
2728 \setchemicallinesegment SB 866 500 866 240
2729 \setchemicallinesegment DB1 816 240 816 240
2730 \setchemicallinesegment DB2 916 240 916 240
2731 \setchemicallinesegment EB 726 340 726 340
2732 \setchemicallinesegment R 866 500 1299 750
2733 \setchemicallinesegment R 866 500 866 1000
2734 \setchemicallinesegment R 866 500 1299 250
2735 \setchemicallinesegment ER1 841 543 1274 793
2736 \setchemicallinesegment ER2 891 457 1324 707
2737 \setchemicallinesegment SR 1091 630 1299 750
2738 \setchemicallinesegment SR 866 740 866 1000
2739 \setchemicallinesegment SR 1091 370 1299 250
2740 \setchemicallinesegment DR1 1066 673 1274 793
2741 \setchemicallinesegment DR2 1116 588 1324 707
2742 \setchemicallinesegment MID1 0 1000 150 200
2743 \setchemicallinesegment MID2 0 1000 150 200
2744 \setchemicallinesegment MIDS1 0 1000 180 0
2745 \setchemicallinesegment MIDS2 0 1000 180 0
2746
2747 \setchemicalcircsegment C 30 30 700 60 600 346
2748 \setchemicalcircsegment CC 60 0 700 60 350 606
2749
2750 \setchemicaltextelement Z 866 500
2751 \setchemicaltextelement RZ 1386 800
2752 \setchemicaltextelement RZ 866 1100
2753 \setchemicaltextelement RZ 1386 200
2754 \setchemicaltextelement CRZ 1524 880
2755 \setchemicaltextelement MIDZ 150 0
2756
2757 \setchemicaltextelement ZN 589 350
2758 \setchemicaltextelement RN 1083 625
2759 \setchemicaltextelement RTN 1008 755
2760 \setchemicaltextelement RBN 1158 495
2761
2762 \def\processchemical[##1##2##3##4##5]
2763 {\processaction
2764 [##1##2##3##4##5]
2765 [ FRONT????=>{\executechemicalSIXFRONT[#1]},
2766 MID????=>\processchemicallinesegment{MID}{1????},
2767 MIDS????=>\processchemicallinesegment{MIDS}{1????},
2768 MIDZ????=>\processchemicaltextelement{MIDZ}{1????}{#1}{0}{},
2769 PB:##4##5=>\beginchemicalpicture{##4##5},
2770 PE????=>\endchemicalpicture,
2771 ROT##4##5=>\processchemicalrotation{##4##5},
2772 SUB##4##5=>\processchemicalsubstitute{##4##5},
2773 ADJ##4##5=>\processchemicaldistance{##4##5},
2774 MOV##4##5=>\processchemicaltranslate{##4##5},
2775 RZ##4##5=>\processchemicaltextelement{RZ}{##4##5}{#1}{6}
2776 {b,l,l,t,r,r, l,l,r,r,r,l, t,r,r,b,l,l, r,r,l,l,l,r},
2777 RZ##4##5=>\processchemicaltextelement{RZ}{##4##5}{#1}{6}
2778 {l,t,r,r,b,l, r,r,r,l,l,l, r,b,l,l,t,r, l,l,l,r,r,r},
2779 SB##4##5=>\processchemicallinesegment{SB}{##4##5},
2780 SB##4##5=>\processchemicallinesegment{SB}{##4##5},
2781 SR##4##5=>\processchemicallinesegment{SR}{##4##5},
2782 SR##4##5=>\processchemicallinesegment{SR}{##4##5},
2783 RD##4##5=>\processchemicaldashedlinesegment{R}{##4##5},
2784 RD##4##5=>\processchemicaldashedlinesegment{R}{##4##5},
2785 RB##4##5=>\processchemicaldeltalinesegment{R}{##4##5},
2786 RB##4##5=>\processchemicaldeltalinesegment{R}{##4##5},
2787 CRZ##4##5=>\processchemicaltextelement{CRZ}{##4##5}{#1}{0}{},
2788 SS##4##5=>\processchemicallinesegment{SS}{##4##5},
2789 SS##4##5=>\processchemicallinesegment{SS}{##4##5},
2790 CCD##4##5=>\processchemicaldottsegment{CC}{##4##5},
2791RTN##4##5=>\processchemicaltextconstant{RTN}{##4##5}{\chemicaltextelementnumber}{0},
2792RTT##4##5=>\processchemicaltextelement{RTN}{##4##5}{#1}{0}{},
2793RBN##4##5=>\processchemicaltextconstant{RBN}{##4##5}{\chemicaltextelementnumber}{0},
2794RBT##4##5=>\processchemicaltextelement{RBN}{##4##5}{#1}{0}{},
2795 SS##3##4##5=>\processchemicallinesegment{SS}{##3##4##5},
2796 RD##3##4##5=>\processchemicaldashedlinesegment{R}{##3##4##5},
2797 RB##3##4##5=>\processchemicaldeltalinesegment{R}{##3##4##5},
2798 ZN##3##4##5=>\processchemicaltextconstant{ZN}{##3##4##5}{\chemicaltextelementnumber}{0},
2799 ZT##3##4##5=>\processchemicaltextelement{ZN}{##3##4##5}{#1}{0}{},
2800RN##3##4##5=>\processchemicaltextconstant{RN}{##3##4##5}{\chemicaltextelementnumber}{0},
2801RT##3##4##5=>\processchemicaltextelement{RN}{##3##4##5}{#1}{0}{},
2802 AU##3##4##5=>\processchemicaluparrowsegment{A}{##3##4##5},
2803 AD##3##4##5=>\processchemicaldownarrowsegment{A}{##3##4##5},
2804 CD##3##4##5=>\processchemicaldottsegment{C}{##3##4##5},
2805 CC##3##4##5=>\processchemicalcircsegment{CC}{##3##4##5},
2806 DB##3##4##5=>\processchemicallinesegment{DB}{##3##4##5},
2807 EB##3##4##5=>\processchemicallinesegment{EB}{##3##4##5},
2808 ER##3##4##5=>\processchemicallinesegment{ER}{##3##4##5},
2809 RZ##3##4##5=>\processchemicaltextelement{RZ}{##3##4##5}{#1}{6}
2810 {l,l,t,r,r,b, l,r,r,r,l,l, r,r,b,l,l,t, r,l,l,l,r,r},
2811 SB##3##4##5=>\processchemicallinesegment{SB}{##3##4##5},
2812 SR##3##4##5=>\processchemicallinesegment{SR}{##3##4##5},
2813 DR##3##4##5=>\processchemicallinesegment{DR}{##3##4##5},
2814 R##3##4##5=>\processchemicallinesegment{R}{##3##4##5},
2815 R##3##4##5=>\processchemicallinesegment{R}{##3##4##5},
2816 B##2##3##4##5=>\processchemicallinesegment{B}{##2##3##4##5},
2817 C##2##3##4##5=>\processchemicalcircsegment{C}{##2##3##4##5},
2818 R##2##3##4##5=>\processchemicallinesegment{R}{##2##3##4##5},
2819 S##2##3##4##5=>\processchemicallinesegment{S}{##2##3##4##5},
2820 Z##2##3##4##5=>\processchemicaltextelement{Z}{##2##3##4##5}{#1}{0}{},
2821 \s!unknown=>\unknownchemical{##1##2##3##4##5}]}}
2822
2823\def\executechemicalSEVEN[#1]
2824 {\setchemicalname SEVEN
2825
2826 \setchemicalmaximum 7
2827 \setchemicalsubstitute
2828 \setchemicaldistance 1038
2829
2830 \setchemicalrotation 1 .623 .782
2831 \setchemicalrotation 2 .223 .975
2832 \setchemicalrotation 3 .901 .434
2833 \setchemicalrotation 4 .901 .434
2834 \setchemicalrotation 5 .223 .975
2835 \setchemicalrotation 6 .623 .782
2836 \setchemicalrotation 7 1 0
2837
2838 \setchemicalangle 1 0
2839 \setchemicalangle 2 51.429
2840 \setchemicalangle 3 102.857
2841 \setchemicalangle 4 154.286
2842 \setchemicalangle 5 205.714
2843 \setchemicalangle 6 257.143
2844 \setchemicalangle 7 308.571
2845
2846 \setchemicaltranslate 1
2847 \setchemicaltranslate 2
2848 \setchemicaltranslate 3
2849 \setchemicaltranslate 4
2850 \setchemicaltranslate 5
2851 \setchemicaltranslate 6
2852 \setchemicaltranslate 7
2853
2854 \setchemicallinesegment B 1038 500 1038 500
2855 \setchemicallinesegment SB 1038 240 1038 240
2856 \setchemicallinesegment SB 1038 240 1038 500
2857 \setchemicallinesegment SB 1038 500 1038 240
2858
2859 \setchemicaltextelement Z 1038 500
2860
2861 \def\processchemical[##1##2##3##4##5]
2862 {\processaction
2863 [##1##2##3##4##5]
2864 [ PB:##4##5=>\beginchemicalpicture{##4##5},
2865 PE????=>\endchemicalpicture,
2866
2867
2868
2869
2870 SB##4##5=>\processchemicallinesegment{SB}{##4##5},
2871 SB##4##5=>\processchemicallinesegment{SB}{##4##5},
2872 SB##3##4##5=>\processchemicallinesegment{SB}{##3##4##5},
2873 B##2##3##4##5=>\processchemicallinesegment{B}{##2##3##4##5},
2874 Z##2##3##4##5=>\processchemicaltextelement{Z}{##2##3##4##5}{#1}{0}{},
2875 \s!unknown=>\unknownchemical{##1##2##3##4##5}]}}
2876
2877\def\executechemicalEIGHT[#1]
2878 {\setchemicalname EIGHT
2879
2880 \setchemicalmaximum 8
2881
2882 \setchemicaldistance 1207
2883
2884 \setchemicalrotation 1 .707 .707
2885 \setchemicalrotation 2 0 1
2886 \setchemicalrotation 3 .707 .707
2887 \setchemicalrotation 4 1 0
2888 \setchemicalrotation 5 .707 .707
2889 \setchemicalrotation 6 0 1
2890 \setchemicalrotation 7 .707 .707
2891 \setchemicalrotation 8 1 0
2892
2893 \setchemicalangle 1 45
2894 \setchemicalangle 2 90
2895 \setchemicalangle 3 135
2896 \setchemicalangle 4 180
2897 \setchemicalangle 5 225
2898 \setchemicalangle 6 270
2899 \setchemicalangle 7 315
2900 \setchemicalangle 8 0
2901
2902 \setchemicaltranslate 1 2414 0
2903 \setchemicaltranslate 2 1706 1706
2904 \setchemicaltranslate 3 0 2414
2905 \setchemicaltranslate 4 1706 1706
2906 \setchemicaltranslate 5 2414 0
2907 \setchemicaltranslate 6 1706 1706
2908 \setchemicaltranslate 7 0 2414
2909 \setchemicaltranslate 8 1706 1706
2910
2911 \setchemicallinesegment B 1207 500 1207 500
2912 \setchemicallinesegment SB 1207 240 1207 240
2913 \setchemicallinesegment SB 1207 240 1207 500
2914 \setchemicallinesegment SB 1207 500 1207 240
2915
2916 \setchemicaltextelement Z 1207 500
2917
2918 \def\processchemical[##1##2##3##4##5]
2919 {\processaction
2920 [##1##2##3##4##5]
2921 [ PB:##4##5=>\beginchemicalpicture{##4##5},
2922 PE????=>\endchemicalpicture,
2923
2924 ADJ##4##5=>\processchemicaldistance{##4##5},
2925 MOV##4##5=>\processchemicaltranslate{##4##5},
2926 SB##4##5=>\processchemicallinesegment{SB}{##4##5},
2927 SB##4##5=>\processchemicallinesegment{SB}{##4##5},
2928 SB##3##4##5=>\processchemicallinesegment{SB}{##3##4##5},
2929 B##2##3##4##5=>\processchemicallinesegment{B}{##2##3##4##5},
2930 Z##2##3##4##5=>\processchemicaltextelement{Z}{##2##3##4##5}{#1}{0}{},
2931 \s!unknown=>\unknownchemical{##1##2##3##4##5}]}}
2932
2933\def\executechemicalFIVEFRONT[#1]
2934 {\executechemicalFIVE[]
2935
2936 \setchemicalname FIVEFRONT
2937
2938 \setchemicallinesegment R 688 500 688 100
2939 \setchemicallinesegment R 688 500 688 900
2940
2941 \setchemicaltextelement RZ 0 1300
2942 \setchemicaltextelement RZ 0 1300
2943
2944 \def\processchemical[##1##2##3##4]
2945 {\def\chemicalrotation{2}
2946 \processaction
2947 [##1##2##3##4]
2948 [ RZ##4=>\processchemicalunrotatedtextelement{Z}{RZ}{##4}{#1}{5}
2949 {,,,,, t,t,t,t,t},
2950 RZ##4=>\processchemicalunrotatedtextelement{Z}{RZ}{##4}{#1}{5}
2951 {,,,,, b,b,b,b,b},
2952 SB##4=>\processchemicallinesegment{SB}{##4},
2953 SB##4=>\processchemicallinesegment{SB}{##4},
2954 SB##3##4=>\processchemicallinesegment{SB}{##3##4},
2955 R##3##4=>\processchemicalunrotatedlinesegment{t}{R}{##3##4},
2956 R##3##4=>\processchemicalunrotatedlinesegment{b}{R}{##3##4},
2957 BB##3##4=>\processchemicalzlinesegment{B}{##3##4},
2958 R##2##3##4=>\processchemicalunrotatedlinesegment{t}{R}{##2##3##4}
2959 \processchemicalunrotatedlinesegment{b}{R}{##2##3##4},
2960 B##2##3##4=>\processchemicallinesegment{B}{##2##3##4},
2961 Z##2##3##4=>\processchemicaltextelement{Z}{##2##3##4}{#1}{0}{},
2962 \s!unknown=>\unknownchemical{##1##2##3##4}]}}
2963
2964\def\executechemicalSIXFRONT[#1]
2965 {\executechemicalSIX[]
2966
2967 \setchemicalname SIXFRONT
2968
2969 \setchemicallinesegment R 866 500 866 100
2970 \setchemicallinesegment R 866 500 866 900
2971
2972 \setchemicaltextelement RZ 0 1300
2973 \setchemicaltextelement RZ 0 1300
2974
2975 \def\processchemical[##1##2##3##4]
2976 {\def\chemicalrotation{2}
2977 \processaction
2978 [##1##2##3##4]
2979 [ RZ##4=>\processchemicalunrotatedtextelement{Z}{RZ}{##4}{#1}{6}
2980 {,,,,,, t,t,t,t,t,t},
2981 RZ##4=>\processchemicalunrotatedtextelement{Z}{RZ}{##4}{#1}{6}
2982 {,,,,,, b,b,b,b,b,b},
2983 SB##4=>\processchemicallinesegment{SB}{##4},
2984 SB##4=>\processchemicallinesegment{SB}{##4},
2985 SB##3##4=>\processchemicallinesegment{SB}{##3##4},
2986 R##3##4=>\processchemicalunrotatedlinesegment{t}{R}{##3##4},
2987 R##3##4=>\processchemicalunrotatedlinesegment{b}{R}{##3##4},
2988 BB##3##4=>\processchemicalzlinesegment{B}{##3##4},
2989 R##2##3##4=>\processchemicalunrotatedlinesegment{t}{R}{##2##3##4}
2990 \processchemicalunrotatedlinesegment{b}{R}{##2##3##4},
2991 B##2##3##4=>\processchemicallinesegment{B}{##2##3##4},
2992 Z##2##3##4=>\processchemicaltextelement{Z}{##2##3##4}{#1}{0}{},
2993 \s!unknown=>\unknownchemical{##1##2##3##4}]}}
2994
2995
2996
2997
2998
2999
3000
3001\def\executechemicalCARBON[#1]
3002 {\setchemicalname CARBON
3003
3004 \setchemicalmaximum 4
3005 \setchemicaldistance 0
3006 \setchemicalsubstitute 0
3007
3008 \setchemicalrotation 1 1 0 0 1 1 0 0 1
3009 \setchemicalrotation 2 0.423 0.906 0.906 0.423 0.423 0.906 0.906 0.423
3010 \setchemicalrotation 3 0.966 0.259 0.259 0.966 0.966 0.259 0.259 0.966
3011 \setchemicalrotation 3* 0.966 0.259 0.259 0.966 0.966 0.259 0.259 0.966
3012 \setchemicalrotation 4 0.423 0.906 0.906 0.423 0.423 0.906 0.906 0.423
3013
3014 \setchemicalangle 1 0 90 180 270
3015 \setchemicalangle 2 115 205 295 25
3016 \setchemicalangle 3 165 255 345 75
3017 \setchemicalangle 3* 195 285 15 105
3018 \setchemicalangle 4 245 335 65 155
3019
3020 \setchemicaltranslate 1 1500 0
3021 \setchemicaltranslate 2 0 1500
3022 \setchemicaltranslate 3 1500 0
3023 \setchemicaltranslate 4 0 1500
3024
3025 \setchemicallinesegment B1 500 0 1000 0
3026 \setchemicallinesegment B2 300 0 1000 0
3027 \setchemicallinesegment B3 500 0 1000 0
3028 \setchemicallinesegment B4 300 0 1000 0
3029
3030 \setchemicaltextelement Z 1100 0
3031
3032 \setchemicalcircsegment C 0 360 500 360 0 500
3033
3034 \def\processchemical[##1##2##3##4##5]
3035 {\processaction
3036 [##1##2##3##4##5]
3037 [ MIR????=>\setchemicalmirror{3},
3038 MIR????=>\resetchemicalmirror{3},
3039 *MIR????=>\togglechemicalmirror{3},
3040 CB????=>\processlocalchemicals{B,C,Z},
3041 C????=>\processchemicalcircsegment{C}{1????},
3042 ROT##5=>\reversechemical{ROT}{##5}{3,4,1,2},
3043 ROT##4##5=>\processchemicalrotation{##4##5},
3044 MOV##4##5=>\processchemicaltranslate{##4##5},
3045 CB##3##4##5=>\processlocalchemicals
3046 {ROT##3,C,B,Z2..4,
3047 MOV##3,*MIR,ROT##3,C,B,Z2..4},
3048 B##2##3##4##5=>\processprivatechemicallinesegment{B}{##2##3##4##5},
3049 Z##2##3##4##5=>\processchemicaltextelement{Z}{##2##3##4##5}{#1}{4}
3050 {l,t,r,b, t,r,b,l, r,b,l,t, b,l,t,r},
3051 \s!unknown=>\unknownchemical{##1##2##3##4##5}]}}
3052
3053
3054
3055
3056\newif\ifNEWMANstagger \NEWMANstaggertrue
3057
3058\def\executechemicalNEWMANSTAGGER
3059 {\NEWMANstaggertrue\executechemicalNEWMAN}
3060
3061\def\executechemicalNEWMANECLIPSE
3062 {\NEWMANstaggerfalse\executechemicalNEWMAN}
3063
3064\def\executechemicalNEWMAN[#1]
3065 {\setchemicalname NEWMAN
3066
3067 \setchemicalmaximum 6
3068 \setchemicaldistance 0
3069 \setchemicalsubstitute 0
3070
3071 \ifNEWMANstagger
3072 \setchemicalrotation 1 0.707 0.707 0.707 0.707 0.707 0.707 0.707 0.707
3073 \setchemicalrotation 2 0 1 1 0 0 1 1 0
3074 \setchemicalrotation 3 0.707 0.707 0.707 0.707 0.707 0.707 0.707 0.707
3075 \else
3076 \setchemicalrotation 1 .866 .5 .5 .866 .866 .5 .5 .866
3077 \setchemicalrotation 2 .259 .966 .966 .259 .259 .966 .966 .259
3078 \setchemicalrotation 3 .5 .866 .866 .5 .5 .866 .866 .5
3079 \fi
3080 \setchemicalrotation 4 0.707 0.707 0.707 0.707 0.707 0.707 0.707 0.707
3081 \setchemicalrotation 5 0.707 0.707 0.707 0.707 0.707 0.707 0.707 0.707
3082 \setchemicalrotation 6 0 1 1 0 0 1 1 0
3083
3084 \ifNEWMANstagger
3085 \setchemicalangle 1 315 45 135 225
3086 \setchemicalangle 2 90 180 270 0
3087 \setchemicalangle 3 225 315 45 135
3088 \else
3089 \setchemicalangle 1 30 120 210 300
3090 \setchemicalangle 2 255 345 75 165
3091 \setchemicalangle 3 120 210 300 30
3092 \fi
3093 \setchemicalangle 4 45 135 225 315
3094 \setchemicalangle 5 135 225 315 45
3095 \setchemicalangle 6 270 0 90 180
3096
3097 \setchemicaltranslate 1 1500 0
3098 \setchemicaltranslate 2 0 1500
3099 \setchemicaltranslate 3 1500 0
3100 \setchemicaltranslate 4 0 1500
3101
3102 \setchemicallinesegment B1 0 0 1000 0
3103 \setchemicallinesegment B2 0 0 1000 0
3104 \setchemicallinesegment B3 0 0 1000 0
3105 \setchemicallinesegment B4 500 0 1000 0
3106 \setchemicallinesegment B5 500 0 1000 0
3107 \setchemicallinesegment B6 500 0 1000 0
3108
3109 \setchemicaltextelement Z 1100 0
3110
3111 \setchemicalcircsegment C 0 360 500 360 0 500
3112
3113 \def\processchemical[##1##2##3##4]
3114 {\processaction
3115 [##1##2##3##4]
3116 [STAGGER????=>{\executechemicalNEWMANSTAGGER[#1]},
3117 ECLIPSE????=>{\executechemicalNEWMANECLIPSE[#1]},
3118 B????=>\processlocalchemicals{B1..6},
3119 CB????=>\processlocalchemicals{B1..6,C,Z1..6},
3120 C????=>\processchemicalcircsegment{C}{1????},
3121 ROT##4=>\processchemicalrotation{##4},
3122 MOV##4=>\processchemicaltranslate{##4},
3123 B##2##3##4=>\processprivatechemicallinesegment{B}{##2##3##4},
3124 Z##2##3##4=>\ifNEWMANstagger
3125 \processchemicaltextelement{Z}{##2##3##4}{#1}{6}
3126 {l,t,r,l,r,b, l,r,l,r,r,l, r,b,l,r,l,t, r,l,r,l,l,r}
3127 \else
3128 \processchemicaltextelement{Z}{##2##3##4}{#1}{6}
3129 {l,r,t,t,r,b, t,b,r,r,b,l, r,l,b,b,l,t, b,t,l,l,t,r}
3130 \fi,
3131 \s!unknown=>\unknownchemical{##1##2##3##4}]}}
3132
3133\def\executechemicalCHAIR[#1]
3134 {\setchemicalname CHAIR
3135
3136 \setchemicalmaximum 6
3137
3138 \setchemicallinesegment B1 1600 800 2800 800
3139 \setchemicallinesegment B2 2800 800 800 0
3140 \setchemicallinesegment B3 800 0 1600 800
3141 \setchemicallinesegment B4 1600 800 2800 800
3142 \setchemicallinesegment B5 2800 800 800 0
3143 \setchemicallinesegment B6 800 0 1600 800
3144
3145 \setchemicallinesegment R1 1600 800 1600 1600
3146 \setchemicallinesegment R2 2800 800 2800 1600
3147 \setchemicallinesegment R3 800 0 800 800
3148 \setchemicallinesegment R4 1600 800 1600 1600
3149 \setchemicallinesegment R5 2800 800 2800 1600
3150 \setchemicallinesegment R6 800 0 800 800
3151
3152 \setchemicallinesegment R1 1600 800 2350 522
3153 \setchemicallinesegment R2 2800 800 3493 400
3154 \setchemicallinesegment R3 800 0 1329 600
3155 \setchemicallinesegment R4 1600 800 2350 522
3156 \setchemicallinesegment R5 2800 800 3493 400
3157 \setchemicallinesegment R6 800 0 1329 600
3158
3159 \setchemicaltextelement RZ1 1600 1800
3160 \setchemicaltextelement RZ2 2800 1800
3161 \setchemicaltextelement RZ3 800 1000
3162 \setchemicaltextelement RZ4 1600 1800
3163 \setchemicaltextelement RZ5 2800 1800
3164 \setchemicaltextelement RZ6 800 1000
3165
3166 \setchemicaltextelement RZ1 2538 453
3167 \setchemicaltextelement RZ2 3666 300
3168 \setchemicaltextelement RZ3 1460 750
3169 \setchemicaltextelement RZ4 2538 453
3170 \setchemicaltextelement RZ5 3666 300
3171 \setchemicaltextelement RZ6 1460 750
3172
3173 \def\processchemical[##1##2##3##4##5]
3174 {\def\chemicalrotation{1}
3175 \processaction
3176 [##1##2##3##4##5]
3177 [ B????=>\processlocalchemicals{B1,B2,B3,B4,B5,B6},
3178 R????=>\processlocalchemicals{R1,R2,R3,R4,R5,R6},
3179 R????=>\processlocalchemicals{R1,R2,R3,R4,R5,R6},
3180 B##2????=>{\getchemicallinesegment[0][B##2]},
3181 RZ##4????=>{\getchemicalfixedtextelement[RZ##4][1][##4][l,l,tc,r,r,bc][#1]},
3182 RZ##4????=>{\getchemicalfixedtextelement[RZ##4][1][##4][c][#1]},
3183 R##3????=>{\getchemicallinesegment[0][R##3]},
3184 R##3????=>{\getchemicallinesegment[0][R##3]},
3185 \s!unknown=>\unknownchemical{##1##2##3##4##5}]}}
3186
3187\def\executechemicalarrow#1#2[#3]
3188 {\dogetcommalistelement1\from#3\to\toptext
3189 \dogetcommalistelement2\from#3\to\bottext
3190 \def\dochemicaltext##1
3191 {\dosetsubscripts
3192 $\@@dochemicalstyle{\@@localchemicalformat\strut##1}$
3193 \doresetsubscripts}
3194 \doifelse\@@chemicallocation\v!intext
3195 {#1{\dochemicaltext\toptext}}
3196 {\setbox\chemicalsymbols=\hbox
3197 {\box\chemicalsymbols
3198 \vbox{\halign{##\cr
3199 \hbox to 3em{\hss\dochemicaltext{\toptext}\hss}\cr
3200 #2
3201 \hbox to 3em{\hss\dochemicaltext{\bottext}\hss}\cr}}}}}
3202
3203\def\executechemicalGIVES
3204 {\executechemicalarrow
3205 {\chemicalsinglepicturearrow}
3206 {\rightarrowfill\cr}}
3207
3208\def\executechemicalEQUILIBRIUM
3209 {\executechemicalarrow
3210 {\chemicaldoublepicturearrow}
3211 {\rightarrowfill\cr\leftarrowfill\cr}}
3212
3213\def\executechemicalMESOMERIC
3214 {\executechemicalarrow
3215 {\chemicalsinglepicturearrow}
3216 {$\leftarrow\hskip1em$\rightarrowfill\cr}}
3217
3218\def\executechemicalsign#1[#2]
3219 {\doifelse\@@chemicallocation\v!intext
3220 {\dosetsubscripts
3221 $\@@dochemicalstyle{\@@localchemicalformat#1}$
3222 \doresetsubscripts}
3223 {\setbox\chemicalsymbols\hbox
3224 {\box\chemicalsymbols
3225 \dosetsubscripts
3226 $\@@dochemicalstyle{\@@localchemicalformat#1}$
3227 \doresetsubscripts}}}
3228
3229\def\executechemicalPLUS
3230 {\executechemicalsign{}}
3231
3232\def\executechemicalMINUS
3233 {\executechemicalsign{}}
3234
3235\def\executechemicalEQUAL
3236 {\executechemicalsign{=}}
3237
3238\def\executechemicalSPACE[#1]
3239 {\doifnot\@@chemicallocation\v!intext
3240 {\setbox\chemicalsymbols\hbox
3241 {\box\chemicalsymbols
3242 \quad}}}
3243
3244\def\executechemicalCHEM[#1]
3245 {\doifnot\@@chemicallocation\v!intext
3246 {\setbox\chemicalsymbols\hbox
3247 {\box\chemicalsymbols
3248 $\@@dochemicalstyle{\@@localchemicalformat#1}$}}}
3249
3250\def\executechemicalTEXT[#1]
3251 {\doifnot\@@chemicallocation\v!intext
3252 {\setbox\chemicalsymbols\hbox
3253 {\box\chemicalsymbols#1}}}
3254
3255
3256
3257
3258
3259
3260
3261\def\putchemicalrule#1#2#3#4
3262 {\ifcase\chemicaldrawingmode
3263 \putrule from {#1} {#2} to {#3} {#4}
3264 \or
3265 \psline(#1,#2)(#3,#4)
3266 \or
3267 \bgroup
3268 \!!counta=#1\!!countb=#2\!!countc=#3\!!countd=#4\relax
3269 \global\MPdrawingdonetrue
3270 \setchemicalattributes
3271 \startMPdrawing
3272 x1 := \MPdivten[\the\!!counta]u ;
3273 y1 := \MPdivten[\the\!!countb]u ;
3274 x2 := \MPdivten[\the\!!countc]u ;
3275 y2 := \MPdivten[\the\!!countd]u ;
3276 draw z1z2 ;
3277 \stopMPdrawing
3278 \egroup
3279 \fi}
3280
3281\def\executechemicalcomplex#1
3282 {\bgroup
3283 \putchemicalrule {0} {\@@chemicalbottom} {0} {\@@chemicaltop}
3284 \putchemicalrule {0} {\@@chemicaltop} {#1150} {\@@chemicaltop}
3285 \putchemicalrule {0} {\@@chemicalbottom} {#1150} {\@@chemicalbottom}
3286 \egroup}
3287
3288\def\executechemicalOPENCOMPLEX[#1]
3289 {\executechemicalcomplex\ignorespaces
3290 \executechemicalSPACE[]}
3291
3292\def\executechemicalCLOSECOMPLEX[#1]
3293 {\executechemicalSPACE[]
3294 \executechemicalcomplex\ignorespaces}
3295
3296
3297
3298\def\executechemicalverticalsymbol#1#2
3299 {\executechemicalTEXT
3300 [$\left#1\relax
3301 \dimen0=\@@chemicalunit
3302 \scratchcounter=\@@chemicaltop
3303 \advance\scratchcounter by \@@chemicalbottom
3304 \dimen0=\scratchcounter\dimen0
3305 \vcenter to \dimen0{}
3306 \dimen2=\@@chemicalunit
3307 \dimen2=\@@chemicalright\dimen0
3308 \vcenter{\leftskip1em\hsize\dimen2\relax\strut#2\strut}
3309 \right.$]}
3310
3311\def\executechemicalUPARROW[#1]
3312 {\executechemicalverticalsymbol\uparrow{#1}}
3313
3314\def\executechemicalDOWNARROW[#1]
3315 {\executechemicalverticalsymbol\downarrow{#1}}
3316
3317\def\executechemicalUPDOWNARROW[#1]
3318 {\executechemicalverticalsymbol\updownarrow{#1}}
3319
3320\let\setchemicalattributes\relax
3321
3322\setupchemical
3323 [\c!width=0,
3324 \c!height=0,
3325 \c!left=0,
3326 \c!right=0,
3327 \c!top=0,
3328 \c!bottom=0,
3329 \c!bodyfont=\the\bodyfontsize,
3330 \c!resolution=\outputresolution,
3331 \c!scale=\v!medium,
3332 \c!size=\v!medium,
3333 \c!textsize=\v!big,
3334 \c!frame=\v!off,
3335 \c!axis=\v!off,
3336 \c!state=\v!start,
3337 \c!style=\rm,
3338 \c!location=,
3339 \c!option=,
3340 \c!offset=LOW,
3341 \c!alternative=1,
3342 \c!color=,
3343 \c!rulethickness=,
3344 \c!rulecolor=,
3345 \c!factor=1]
3346
3347
3348
3349
3350
3351
3352\def\putontop#1#2
3353 {\vbox
3354 {\halign
3355 {\strut\hss##\hss\cr
3356 #1\cr
3357 #2\cr}}}
3358
3359\def\ttop#1#2
3360 {\putontop{\tx#1}{#2}}
3361
3362\def\mtop#1#2
3363 {\vbox
3364 {\offinterlineskip
3365 \halign
3366 {\hss##\hss\cr
3367 $\scriptscriptstyle#1$\cr
3368 \noalign{\vskip.5ex}
3369 $#2$\cr}}}
3370
3371\def\ctop#1#2
3372 {\vbox
3373 {\offinterlineskip
3374 \halign
3375 {\hss##\hss\cr
3376 $\@@dochemicalstyle{\@@localchemicalformat\scriptscriptstyle#1}$\cr
3377 \noalign{\vskip.5ex}
3378 $\@@dochemicalstyle{\@@localchemicalformat#2}$\cr}}}
3379
3380
3381
3382
3383
3384
3385
3386
3387
3388\let\@@chemicalrulecolor\empty
3389\let\@@chemicalcolor \empty
3390
3391\def\setchemicalattributes
3392 {\scratchdimen\@@chemicalrulethickness
3393 \def\chemicalattributes
3394 {withpen pencircle scaled \the\scratchdimen\space
3395 withcolor }
3396 \doifelsenothing\@@chemicalrulecolor
3397 {\edef\chemicalattributes{\chemicalattributes black}}
3398 {\edef\chemicalattributes{\chemicalattributes \MPcolor{\@@chemicalrulecolor}}}
3399 \startMPdrawing
3400 drawoptions (\chemicalattributes) ;
3401 \stopMPdrawing}
3402
3403\unexpanded\def\@@dochemicalcolor
3404 {\dousecolorparameter\@@chemicalcolor}
3405
3406\unexpanded\def\@@dochemicalstyle
3407 {\dousestyleparameter\@@chemicalstyle}
3408
3409\setupchemical
3410 [\c!rulethickness=\linewidth,
3411 \c!rulecolor=,
3412 \c!color=]
3413
3414\def\cpos#1#2
3415 {\iftrialtypesetting
3416 #2
3417 \else
3418 \bgroup
3419 \globalpushmacro\dowithchemical
3420 \gdef\dowithchemical##1{\hpos{#1}{##1}\globalpopmacro\dowithchemical}
3421 #2
3422 \egroup
3423 \fi}
3424
3425\protect \endinput
3426
3427
3428
3429
3430
3431
3432
3433
3434
3435
3436
3437
3438
3439
3440
3441
3442
3443
3444
3445
3446 |