x-chemml.mkiv /size: 7736 b    last modification: 2020-07-01 14:35
1%D \module
2%D   [       file=x-cml,
3%D        version=2007.09.03, % reimplementation
4%D          title=\CONTEXT\ XML Modules,
5%D       subtitle=MkIV ChemML renderer,
6%D         author=Hans Hagen,
7%D           date=\currentdate,
8%D      copyright={PRAGMA ADE \& \CONTEXT\ Development Team}]
9%C
10%C This module is part of the \CONTEXT\ macro||package and is
11%C therefore copyrighted by \PRAGMA. See mreadme.pdf for
12%C details.
13
14% This needs an update!
15
16\writestatus{loading}{ConTeXt XML Macros / Chemistry}
17
18\registerctxluafile{x-chemml}{}
19
20\def\ctxmodulechemml#1{\ctxlua{moduledata.chemml.#1}}
21
22%D The following code assumes a load||flush approach to \XML.
23
24\unprotect
25
26\startxmlsetups xml:cml:process
27    \xmlstrip    {#1} {cml:chem|cml:ichem|cml:dchem|cml:reaction|cml:molecule|cml:ion|cml:structure}
28    \xmlsetsetup {#1} {cml:*}                                                  {cml:*}
29    \xmlsetsetup {#1} {cml:gives|cml:equilibrium|cml:mesomeric}                {cml:arrow}
30    \xmlsetsetup {#1} {cml:plus|cml:minus|cml:equal}                           {cml:operator}
31    \xmlsetsetup {#1} {cml:bond|cml:singlebond|cml:doublebound|cml: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]} % old stuff
40
41\setupCMLappearance [ion] [\c!alternative=\v!a]
42
43\def\doifelseCMLvariable#1#2#3% id key value
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% main top bot
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:atom|cml:bond|cml:singlebond|cml:doublebond|cml: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% It makes not much sense to adapt ppchtex to accept different input. Maybe some day.
195
196\startxmlsetups cml:component
197    \expanded {
198        \chemical
199            [\ctxmodulechemml{do_graphic("#1")}]
200            [\ctxmodulechemml{no_graphic("#1")}]
201    }
202\stopxmlsetups
203
204\unexpanded\def\doCMLannotation#1% #2#3% loc caption text
205  {\xmlval{cml:a:l}{#1}{\chemicalright}}% {#2}{#3}}
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}  % \xmlmapvalue {cml:a:l} {cl} {\chemicalleftcentered}
212\xmlmapvalue {cml:a:l} {rc} {\chemicalrightcentered} % \xmlmapvalue {cml:a:l} {cr} {\chemicalrightcentered}
213\xmlmapvalue {cml:a:l} {tl} {\chemicaltopleft}       % \xmlmapvalue {cml:a:l} {lt} {\chemicaltopleft}
214\xmlmapvalue {cml:a:l} {bl} {\chemicalbottomleft}    % \xmlmapvalue {cml:a:l} {lb} {\chemicalbottomleft}
215\xmlmapvalue {cml:a:l} {tr} {\chemicaltopright}      % \xmlmapvalue {cml:a:l} {rt} {\chemicaltopright}
216\xmlmapvalue {cml:a:l} {br} {\chemicalbottomright}   % \xmlmapvalue {cml:a:l} {rb} {\chemicalbottomright}
217\xmlmapvalue {cml:a:l} {lt} {\chemicallefttop}       % \xmlmapvalue {cml:a:l} {tl} {\chemicallefttop}
218\xmlmapvalue {cml:a:l} {lb} {\chemicalleftbottom}    % \xmlmapvalue {cml:a:l} {bl} {\chemicalleftbottom}
219\xmlmapvalue {cml:a:l} {rt} {\chemicalrighttop}      % \xmlmapvalue {cml:a:l} {tr} {\chemicalrighttop}
220\xmlmapvalue {cml:a:l} {rb} {\chemicalrightbottom}   % \xmlmapvalue {cml:a:l} {br} {\chemicalrightbottom}
221\xmlmapvalue {cml:a:l} {x}  {\chemicaltighttext}
222\xmlmapvalue {cml:a:l} {sl} {\chemicalsmashedleft}   % \xmlmapvalue {cml:a:l} {ls} {\chemicalsmashedleft}
223\xmlmapvalue {cml:a:l} {sm} {\chemicalsmashedmiddle} % \xmlmapvalue {cml:a:l} {ms} {\chemicalsmashedmiddle}
224\xmlmapvalue {cml:a:l} {sr} {\chemicalsmashedright}  % \xmlmapvalue {cml:a:l} {rs} {\chemicalsmashedright}
225
226\startxmlsetups cml:forever
227    \left[\xmlflush{#1}\right]
228\stopxmlsetups
229
230% \starttext
231%     \xmlprocess{main}{cmltest.xml}{xml:process}
232% \stoptext
233
234\protect \endinput
235