1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16\writestatus{loading}{ConTeXt XML Macros Chemistry}
17
18\registerctxluafile{xchemml}{}
19
20\def\ctxmodulechemml#1{\ctxlua{moduledata.chemml.#1}}
21
22
23
24\unprotect
25
26\startxmlsetups xml:cml:process
27 \xmlstrip {#1} {cml:chemcml:ichemcml:dchemcml:reactioncml:moleculecml:ioncml:structure}
28 \xmlsetsetup {#1} {cml:*} {cml:*}
29 \xmlsetsetup {#1} {cml:givescml:equilibriumcml:mesomeric} {cml:arrow}
30 \xmlsetsetup {#1} {cml:pluscml:minuscml:equal} {cml:operator}
31 \xmlsetsetup {#1} {cml:bondcml:singlebondcml:doubleboundcml:triplebond} {cml:bond}
32 \xmlsetsetup {#1} {pi::chemml} {cml:pi}
33\stopxmlsetups
34
35\xmlregistersetup{xml:cml:process}
36
37\xmlregisterns{cml}{chemml}
38
39\unexpanded\def\setupCMLappearance[#1]{\dodoubleargument\getparameters[@@CML#1]}
40
41\setupCMLappearance [ion] [\c!alternative=\v!a]
42
43\def\doifelseCMLvariable#1#2#3
44 {\doifelse{\xmlatt{#1}{#2}}{#3}
45 \firstoftwoarguments
46 {\doifelse{\getvalue{@@CML\xmltag{#1}#2}}{#3}
47 \firstoftwoarguments
48 \secondoftwoarguments}}
49
50\startxmlsetups cml:pi
51 \ctxmodulechemml{pi(#1)}
52\stopxmlsetups
53
54\startxmlsetups cml:chem
55 \automathematics{\xmlflush{#1}}
56\stopxmlsetups
57\startxmlsetups cml:ichem
58 \inlinemathematics{\xmlflush{#1}}
59\stopxmlsetups
60\startxmlsetups cml:dchem
61 \displaymathematics{\xmlflush{#1}}
62\stopxmlsetups
63
64\startxmlsetups cml:reaction
65 \xmlflush{#1}
66\stopxmlsetups
67
68\unexpanded\def\doCMLtext#1#2#3
69 {\setbox0\hbox{\doifsomething{#2}{\txx\setstrut\strut\ignorespaces#2\unskip}}
70 \setbox2\hbox{\ignorespaces\strut#1\unskip}
71 \setbox4\hbox{\doifsomething{#3}{\txx\setstrut\strut\ignorespaces#3\unskip}}
72 \scratchdimen=\wd2\advance\scratchdimen.5em
73 \ifdim\wd0>\scratchdimen
74 \setbox0\hbox spread .5em{\hss\box0\hss}
75 \fi
76 \ifdim\wd4>\scratchdimen
77 \setbox4\hbox spread .5em{\hss\box4\hss}
78 \fi
79 \setbox6=\vbox
80 {\offinterlineskip\halign{\hss##\hss\cr\copy0\cr\copy2\cr\copy4\cr}}
81 \hbox{\lower\ht4\hbox{\lower\dp2\box6}}}
82
83\def\doCMLamount#1
84 {\scratchcounter0\xmlatt{#1}{n}\relax
85 \ifnum\scratchcounter>0 \number\scratchcounter \fi}
86
87\startxmlsetups cml:molecule
88 \doCMLtext
89 {\doCMLamount{#1}
90 \xmlall{#1}{cml:atomcml:bondcml:singlebondcml:doublebondcml:triplebond}}
91 {\xmlindex{#1}{cml:caption}{2}}
92 {\xmlindex{#1}{cml:caption}{1}}
93\stopxmlsetups
94
95\startxmlsetups cml:atom
96 \doCMLtext {
97 \lohi {
98 \normalstartimath
99 \tfxx\xmlatt{#1}{protons}
100 \normalstopimath
101 } {
102 \normalstartimath
103 \tfxx\xmlatt{#1}{weight}
104 \normalstopimath
105 }
106 \xmlflush{#1}
107 \lohi {
108 \normalstartimath
109 \tfxx\xmlatt{#1}{n}
110 \normalstopimath
111 } {
112 \normalstartimath
113 \tfxx\xmlatt{#1}{charge}
114 \normalstopimath
115 }
116 }
117 {\xmlindex{#1}{cml:caption}{2}}
118 {\xmlindex{#1}{cml:caption}{1}}
119\stopxmlsetups
120
121\startxmlsetups cml:ion
122 \doifelseCMLvariable{#1}{alternative}{b} {
123 \left[
124 \doCMLtext
125 {\doCMLamount{#1}
126 \xmlall{#1}{cml:atom}}
127 {\xmlindex{#1}{cml:caption}{2}}
128 {\xmlindex{#1}{cml:caption}{1}}
129 \right]
130 } {
131 \doCMLtext
132 {\doCMLamount{#1}
133 \xmlall{#1}{cml:atom}}
134 {\xmlindex{#1}{cml:caption}{2}}
135 {\xmlindex{#1}{cml:caption}{1}}
136 }
137 \high {\xmlatt{#1}{charge}}
138\stopxmlsetups
139
140\def\doCMLgives {\xrightarrow}
141\def\doCMLequilibrium{\xleftrightarrow}
142\def\doCMLmesomeric {\xrightoverleftarrow}
143\def\doCMLplus {}
144\def\doCMLminus {}
145\def\doCMLequal {=}
146
147\startxmlsetups cml:arrow
148 \quad
149 \executeifdefined{doCML\xmlname{#1}}\doCMLgives{\tf\xmlindex{#1}{cml:caption}{2}}{\tf\xmlindex{#1}{cml:caption}{1}}
150 \quad
151\stopxmlsetups
152
153\startxmlsetups cml:operator
154 \quad
155 \mathop{\executeifdefined{doCML\xmlname{#1}}\doCMLplus}
156 \quad
157\stopxmlsetups
158
159\startxmlsetups cml:bond
160 \executeifdefined{doCML\xmlname{#1}} {
161 \ifcase0\xmlatt{#1}{n}\relax
162 \doCMLsinglebond
163 \or
164 \doCMLdoublebond
165 \or
166 \doCMLtriplebond
167 \fi
168 }
169\stopxmlsetups
170
171\def\doCMLbond
172 {\hrule\s!width\hsize\s!height.1ex\relax}
173
174\def\dodoCMLbond#1#2#3
175 {\begingroup
176 \setbox\scratchbox\hbox{\normalstartimath M\normalstopimath}
177 \vbox to \ht\scratchbox
178 {\hsize\wd\scratchbox
179 \vskip.1\wd\scratchbox
180 #1\vfill#2\vfill#3
181 \vskip.1\wd\scratchbox}
182 \endgroup}
183
184\def\doCMLsinglebond{\dodoCMLbond\relax \doCMLbond\relax }
185\def\doCMLdoublebond{\dodoCMLbond\doCMLbond\relax \doCMLbond}
186\def\doCMLtriplebond{\dodoCMLbond\doCMLbond\doCMLbond\doCMLbond}
187
188\startxmlsetups cml:structure
189 \startchemical
190 \xmlall{#1}{cml:component}
191 \stopchemical
192\stopxmlsetups
193
194
195
196\startxmlsetups cml:component
197 \expanded {
198 \chemical
199 [\ctxmodulechemml{dographic("#1")}]
200 [\ctxmodulechemml{nographic("#1")}]
201 }
202\stopxmlsetups
203
204\unexpanded\def\doCMLannotation#1
205 {\xmlval{cml:a:l}{#1}{\chemicalright}}
206
207\xmlmapvalue {cml:a:l} {t} {\chemicaltop}
208\xmlmapvalue {cml:a:l} {b} {\chemicalbottom}
209\xmlmapvalue {cml:a:l} {l} {\chemicalleft}
210\xmlmapvalue {cml:a:l} {r} {\chemicalright}
211\xmlmapvalue {cml:a:l} {lc} {\chemicalleftcentered}
212\xmlmapvalue {cml:a:l} {rc} {\chemicalrightcentered}
213\xmlmapvalue {cml:a:l} {tl} {\chemicaltopleft}
214\xmlmapvalue {cml:a:l} {bl} {\chemicalbottomleft}
215\xmlmapvalue {cml:a:l} {tr} {\chemicaltopright}
216\xmlmapvalue {cml:a:l} {br} {\chemicalbottomright}
217\xmlmapvalue {cml:a:l} {lt} {\chemicallefttop}
218\xmlmapvalue {cml:a:l} {lb} {\chemicalleftbottom}
219\xmlmapvalue {cml:a:l} {rt} {\chemicalrighttop}
220\xmlmapvalue {cml:a:l} {rb} {\chemicalrightbottom}
221\xmlmapvalue {cml:a:l} {x} {\chemicaltighttext}
222\xmlmapvalue {cml:a:l} {sl} {\chemicalsmashedleft}
223\xmlmapvalue {cml:a:l} {sm} {\chemicalsmashedmiddle}
224\xmlmapvalue {cml:a:l} {sr} {\chemicalsmashedright}
225
226\startxmlsetups cml:forever
227 \left[\xmlflush{#1}\right]
228\stopxmlsetups
229
230
231
232
233
234\protect \endinput
235 |