% language=us runpath=texruns:manuals/musings % \enableexperiments[fonts.compact] \startcomponent musings-deserved \environment musings-style \startchapter[title={We deserved it}] \startsection[title={Introduction}] Among the first macros we cooked up are the ones that we used to typeset chemistry. They come under the \PPCHTEX, and it was mostly done by Hans, Ton and Tobias. Over time rendering structures by \PICTEX\ got replaced by \PSTRICKS\ and later \METAPOST. When we moved to \MKIV\ all that got reimplemented, this time by Hans and Alan and we stuck to \METAPOST. We actually also updated the syntax and, because old documents were supposed to be rendered by \MKII\ we took the liberty to sacrifice some compatibility for a more complete and consistent feature set. However we never came to updating the existing manual and the new one became work in progress. We didn't really needed the code and Alan, who did need it, knew what was there anyway. Then Mikael had some questions and it pushed me into manual mode: upgrade the old one and combine it with the pending new one. That also made me wonder if we could now benefit from some new features in the math engine, which in turn could simplify the code base. This is typically something that takes weeks instead of hours so better do it right from the start. And, while at it, one then of course ends up in looking (again) at arrows (or more specifically: stackers) and from that to \UNICODE, which in turn is good for some introspection. \stopsection \startsection[title={Implementation}] Among the (old) complications in dealing with chemistry are the following: \startitemize[packed] \startitem Simple inline chemical formulas (snippets) of the kind \ic { U __92 ^^ 238 ^ +} where scripts need to be properly vertically aligned and an upright font is used. \stopitem \startitem In running text one wants to use \ic {A + B -> C} but also \ic {A + B <-> C} or \ic {A + B <=> C}. \stopitem \startitem Even more symbolic representations might be on the wish list, think of \ic {A - B -- C --- D}. \stopitem \stopitemize There is more but these examples demonstrate a few features: we need prescripts, proper spacing, line breaks at preferred spots, and some symbols. \start \setupalign[profile] % \showglyphs \showmakeup[boxes] \showstruts \setupmathstackers[reverse][strut=no] \startitemize[packed] \startitem And of course one also wants to annotate like \ic {A + B ->{here} C} but also \ic {A + B <->{}{there} C} or \ic {A + B <=>{where}{every} C} where the arrows stretch with the text. \stopitem \startitem It would be nice if we can also use the advanced alignment options that are available in math but discussing this is beyond this musing. \stopitem \stopitemize \stop \stopsection \startsection[title=Unicode] Implementing the above has never been that hard but just became a little easier in \LMTX. However, when doing that I wondered if there were more than the already present symbols to be taken care of. And so I did a search on the internet for \quotation {unicode and chemistry}. One of the first hits was \quotation {Five symbols used in chemistry L2/23-193}, a request for some more arrows. One can search the web for it and see if it is still around. When staring at I wondered a bit about the descriptions: \starttyping BALANCED EQUILIBRIUM ARROW EQUILIBRIUM ARROW LYING TOWARD THE RIGHT EQUILIBRIUM ARROW LYING TOWARD THE LEFT REACTION DOES NOT PROCEED STANDARD STATE SYMBOL \stoptyping When later I discussed this with Mikael we came to the conclusion that \quote {LYING} probably means \quote {LEANING} but we're not chemists so we can be wrong. The proposed rendering of the first three boils down to arrows with half a tip, also known as harpoons: long left and right pointing ones stacked for the first and long over short ones for the other two. \startlinecorrection \setupmathstackers[mathematics][strut=no] \startcombination[nx=3,ny=1] {\vbox{\offinterlineskip\glyphscale2000 \ruledhbox to 2cm{$\mrightharpoonup {\hskip2cm}{}$} \ruledhbox to 2cm{$\mleftharpoondown{\hskip1cm}{}\hss$} }} {} {\vbox{\offinterlineskip\glyphscale2000 \ruledhbox to 2cm{$\mrightharpoonup {\hskip2cm}{}$} \ruledhbox to 2cm{$\mleftharpoondown{\hskip2cm}{}$} }} {} {\vbox{\offinterlineskip\glyphscale2000 \ruledhbox to 2cm{$\mleftharpoonup{\hskip2cm}{}$} \ruledhbox to 2cm{\hss$\mrightharpoondown{\hskip1cm}{}$} }} {} \stopcombination \stoplinecorrection There are several observation to make here. First of all, there is a whole bunch of arrows (stacked and single) that bare descriptions mentioning them being arrows. There is no meaning in them. One can even wonder why some are there. So, in order to be in sync with that it makes more sense to add a few more harpoons. Cooking up names like this serves no purpose. If we look at the proposed shapes (which are actually different from those used in \TEX\ packages that are references) one can actually wonder about the way these are supposed to stretch. The short variant is not different from existing double harpoons in which case the meaning is lost. Then when we go longer we get this empty space and then we should wonder how the extensible should kick in: how do the left- and rightmost fixed glyphs and the one or two middle repeated ones behave? \startlinecorrection \setupmathstackers[mathematics][strut=no] \startcombination[nx=3,ny=1] {\vbox{\offinterlineskip\glyphscale2000 \ruledhbox to 1cm{$\mrightharpoonup {\hskip1cm}{}$} \ruledhbox to 1cm{$\mleftharpoondown{\hskip1cm}{}\hss$} }} {} {\vbox{\offinterlineskip\glyphscale2000 \ruledhbox to 1cm{$\mrightharpoonup {\hskip1cm}{}$} \ruledhbox to 1cm{$\mleftharpoondown{\hskip1cm}{}$} }} {} {\vbox{\offinterlineskip\glyphscale2000 \ruledhbox to 1cm{$\mleftharpoonup{\hskip1cm}{}$} \ruledhbox to 1cm{\hss$\mrightharpoondown{\hskip1cm}{}$} }} {} \stopcombination \stoplinecorrection Why don't we just use the next three? After all, as with math, how we interpret symbols depends on how we define them to be read. Sometimes Mikael and I get a good laugh over some of the shapes bound to math code points and we're sure that some legend is needed when using them. \startlinecorrection \setupmathstackers[mathematics][strut=no] \startcombination[nx=3,ny=1] {\vbox{\offinterlineskip\glyphscale2000 \ruledhbox to 2cm{$\mleftrightharpoons{\hskip2cm}{}$} }} {} {\vbox{\offinterlineskip\glyphscale2000 \ruledhbox to 2cm{$\mrightharpoonup {\hskip2cm}{}$} }} {} {\vbox{\offinterlineskip\glyphscale2000 \ruledhbox to 2cm{$\mleftharpoondown{\hskip2cm}{}\hss$} }} {} \stopcombination \stoplinecorrection Of course there are and can be conventions but getting some agreement is not trivial. We only have to look at \UNICODE\ math to see some issues, like: \startitemize[packed] \startitem The repertoire of symbols is large but to a large extent somewhat arbitrary: what was known (or assumed) to be used got in there. There is a difference between a left, right and even middle bar, just like there is a left and right brace. \stopitem \startitem There are alphabets but they come with holes. We're not supposed to distinguish between a Plank constant \quote {h} and variable \quote {h}. We can distinguish the greek uppercase \type {A} from a latin \type {A} so mathematicians are less convincing. \stopitem \startitem One can define extensible fences with components but not all of them. There are no constructors for arrows. Some likely come from old encodings but why add these and not be consistent. \stopitem \stopitemize Plugging a hole in an alphabet is doable. Adding some missing snippets for fences is also no big deal, just because we have a limited set. Making bars consistent also is not hard. But I don't see it happen soon. After all, we're decades along the road and no one bothered much about it till now, and above all, it will never be complete. I wonder if there ever has been a good analysis, extensive description and a watertight arguing from the \TEX\ community about what should go in \UNICODE\ and fonts. It was easy to point to existing fonts and the names used in macro packages and that shows. To the above we can add: \startitemize[packed] \startitem There are some combinations of arrows and e.g.rules missing that could have made adding composed constructs easier when there is demand for that. After all, this is what existing characters are also used for. And these chemistry ones fit into this. \stopitem \stopitemize Our solution is to just accept that the \TEX\ community got what it deserved: a bit of chaos, unreliable cur'n'paste support, symbols but no meaning, imperfect \UNICODE\ coverage and therefore imperfect coverage in fonts. The good news is that we can adapt. But we have to be honest: it is not perfect. \stopsection \startsection[title=How about] As mentioned we have a problem with base glyphs versus extensibles and these combined hooked things are bad for that. In the chemistry macros the first four are the ones that we always had and the last two are examples of how we can render the two leaning extras. \starttabulate[|c||c||] \NC \type {<->} \NC \ic {A + B <-> C}\NC \type {<-->} \NC \ic {A + B <--> C} \NC \NR \NC \type {->} \NC \ic {A + B -> C}\NC \type {-->} \NC \ic {A + B --> C} \NC \NR \NC \type {<-} \NC \ic {A + B <- C}\NC \type {<--} \NC \ic {A + B <-- C} \NC \NR \NC \type {<=>} \NC \ic {A + B <=> C}\NC \type {<==>} \NC \ic {A + B <==> C} \NC \NR \ML \NC \type {=>} \NC \ic {A + B => C}\NC \type {==>} \NC \ic {A + B ==> C} \NC \NR \NC \type {<=} \NC \ic {A + B <= C}\NC \type {<==} \NC \ic {A + B <== C} \NC \NR \stoptabulate Watch the longer should arrow. Not al fonts have it as extensible, which indicates that not that much thought has been put in usage patterns. That said, more interesting would be to use something like this, where we fake a character from two existing arrows: \startlinecorrection \switchtobodyfont[cambria] \definemathextensible [mathematics] [mleftarrowdashed] ["21E0] \definemathextensible [mathematics] [mrightarrowdashed] ["21E2] \setupmathstackers[mathematics][strut=no] \startcombination[nx=4,ny=1] {\vbox{\offinterlineskip\glyphscale2000 \ruledhbox{$\mrightarrow {}{}$} \ruledhbox{$\mleftarrowdashed{}{}$} }} {} {\vbox{\offinterlineskip\glyphscale2000 \ruledhbox{$\mrightarrow{}{}$} \ruledhbox{$\mleftarrow {}{}$} }} {} {\vbox{\offinterlineskip\glyphscale2000 \ruledhbox{$\mrightarrowdashed{}{}$} \ruledhbox{$\mleftarrow {}{}$} }} {} {\vbox{\offinterlineskip\glyphscale2000 \ruledhbox{$\mrightarrowdashed{}{}$} \ruledhbox{$\mleftarrowdashed {}{}$} }} {} % {\vbox{\offinterlineskip\glyphscale2000 % \ruledhbox to 2cm{$\mrightarrow {\hskip2cm}{}$} % \ruledhbox to 2cm{$\mleftarrowdashed{\hskip2cm}{}$} % }} {} % {\vbox{\offinterlineskip\glyphscale2000 % \ruledhbox to 2cm{$\mrightarrow{\hskip2cm}{}$} % \ruledhbox to 2cm{$\mleftarrow {\hskip2cm}{}$} % }} {} % {\vbox{\offinterlineskip\glyphscale2000 % \ruledhbox to 2cm{$\mrightarrowdashed{\hskip2cm}{}$} % \ruledhbox to 2cm{$\mleftarrow {\hskip2cm}{}$} % }} {} % {\vbox{\offinterlineskip\glyphscale2000 % \ruledhbox to 2cm{$\mrightarrowdashed{\hskip2cm}{}$} % \ruledhbox to 2cm{$\mleftarrowdashed {\hskip2cm}{}$} % }} {} \stopcombination \stoplinecorrection However, not all math fonts provide these dashed arrows and therefore here we have to use Cambria (here). And even if it has such dashed hashes, they don't come with an extensible. I just want to point out that by looking at what we already have, it might make more sense to extend some (combinations) of those. It is good to notice that these arrows come with qualifications like \quotation {code for undetermined script}, so one can wonder how much they relate to math. Actually the fact that we have these holes in alphabets already indicates that math is not really seen as script. Occasionally (old) scripts get added and they get lots of code points, while one can argue for sharing there too, but maybe their status is higher than the status of math. In \OPENTYPE\ fonts math is seen as script but that's because it is basically a selector. One can actually argue for chemistry as a math language in fonts. The main point I want to make here is that adding some new symbol that is somewhere used but never made it in \UNICODE\ in the first place needs some thought. Especially when used in a setting of formulas, where size matters. \stopsection \startsection[title=Also] In \CONTEXT\ we have stackers: text above and|/|or below an extensible, or extensibles above and|/|or below text. The mentioned arrows are using this mechanism. However, when playing with \type {\iff}, \typ {\implies} and \typ {impliedby} in math mode, we noticed some spacing side effects. Originally these double arrows got skips around them but that interfered with our alignment mechanism. However, that could be solved without much hassle by letting the commands check the nature (class) of the previous atom (an indication of being at the start of a next alignment line). In the end that we decided that an extra \quote {implication} class was more flexible than adding glue. More interesting was the observation that in Latin Modern and some other math fonts these arrows have different dimensions, which leads to yet another alignment issue. Again that could be solved by taking the usage into account but one can wonder why the opportunity was lost to make the glyphs consistent with each other, read: come up with a proper analysis of requirements based on decades of \TEX\ usage. At least there could have been recommended alternates. But wait, aren't alternates kind of bad as they demand user intervention (choices)? Sure, but there are more examples of alternates, take the \quote {\dotlessi} (dotless i). It has a textual code point but is not in the math alphabets, so one needs alternates as way out (and yes, fonts then have a blackboard and fraktur dotless i). One can argue that these are visual aspects, but with arrows as well as symbols, we have ended up in a somewhat curious inconsistent situation: there are no established command names for the single arrows, so there we speak \type {\..arrow..} while for some there are names, like \type {\iff}. The same is true for characters like the dotless i and j. Some mathematicians use these in the same way as some hard- and software vendors put an \quote {i} in front of a product name, but in order to get it one has to communicate in terms of \type {\dotless.} or somthing with an \type {i} in the macro name. \stopsection \startsection[title=Conclusion] To come back to updating chemistry. It makes no sense to add much more. Implementing the left- and right leaning is easy with existing hooks so this is what we will do. Proper math fonts have these and how likely is it that existing math fonts get new ones? If it ever comes to more chemistry in \UNICODE\ a handful of them will not help much. It is probably not that hard to find an existing symbol that can act as standard state symbol. In fact, some code points have several additional descriptions so we could just add some to existing one. It's not like we have gone over the top with doing that for math yet. \stopsection \stopchapter \stopcomponent