diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/streetex |
Initial commit
Diffstat (limited to 'macros/latex/contrib/streetex')
-rw-r--r-- | macros/latex/contrib/streetex/descript.ion | 4 | ||||
-rw-r--r-- | macros/latex/contrib/streetex/memo.lat | 94 | ||||
-rw-r--r-- | macros/latex/contrib/streetex/stree.sty | 669 | ||||
-rw-r--r-- | macros/latex/contrib/streetex/stree_en.lat | 959 | ||||
-rw-r--r-- | macros/latex/contrib/streetex/stree_en.pdf | bin | 0 -> 147579 bytes | |||
-rw-r--r-- | macros/latex/contrib/streetex/stree_ru.lat | 1141 |
6 files changed, 2867 insertions, 0 deletions
diff --git a/macros/latex/contrib/streetex/descript.ion b/macros/latex/contrib/streetex/descript.ion new file mode 100644 index 0000000000..4d71600e8e --- /dev/null +++ b/macros/latex/contrib/streetex/descript.ion @@ -0,0 +1,4 @@ +stree.sty the treeTeX +stree_en.lat description in English +stree_ru.LAT описание на русском +memo.LAT 1-page treeTeX reference diff --git a/macros/latex/contrib/streetex/memo.lat b/macros/latex/contrib/streetex/memo.lat new file mode 100644 index 0000000000..129828a2c8 --- /dev/null +++ b/macros/latex/contrib/streetex/memo.lat @@ -0,0 +1,94 @@ +% +%\documentstyle[art14,stree]{article} +% +\documentclass[12pt]{article} +\usepackage{stree} + +\advance\textheight3.5cm \advance\vsize3.5cm +\advance\voffset-1.5cm +\pagestyle{empty} +\begin{document} +\def\<#1>{$\langle$#1$\rangle$} +\def\1{\tt\symbol{123}} +\def\2{\tt\symbol{125}} +\bondlen=1.6em \large +\centering + +\begin{tabular}{r|c|l} + +\<prefix> & \<{\bf direction}> & \<suffix>\\ +&&\\ +\hline +&&\\ +\begin{tabular}[t]{c|c} +\tt /&\stree{/2}\\ +\tt //&\stree{//2}\\ +\tt ,&\stree{,2}\\ +{\tt+} and {\tt-}&\\ +\hline +\tt =&\stree{=3}\\ +\tt >&\stree{>3}\\ +\tt <&\stree{<3}\\ +\tt ==&\stree{==3}\\ +\tt ">&\stree{">3}\\ +\tt "<&\stree{"<3}\\ +\hline +\tt \_&\stree{_3}\\ +\tt '&\stree{'3}\\ +\hline +\verb"~"&invisible\\ +\verb"~~"&inv.\ label\\ +\tt :&\stree{:3}\\ +\tt *&\stree{*3}\\ +\tt **&\stree{**3}\\ +\verb"^"&\stree{^3}\\ +\verb"^*"&\stree{^*3}\\ +\hline +\tt .&\stree{C.2*} +\end{tabular} +& +\def\znakf#1{\tt #1} +\begin{tabular}[t]{c} +\stree{[0.00][1.1 1][2.22][3.33][4.44][5.55][6.66][7.77][8.88][9.99]% +[10.10{10}][11.11{1\rlap1}]}\\ +\stree[t]{[,2.,2{,2}][,5.,5{,5}][,8.,8{,8}][,11.,11{,11}]}\\ +\stree[t]{[:1][:2][:4][:5][:7][:8][:10][:11]% +[/1./1{/1}][/2./2{/2}][/4./4{/4}][/5./5{/5}][/7./7{/7}][/8./8{/8}]% +[/10./10{/10}][/11./11{/11}]}\\ +\stree[t]{[:1][:2][:4][:5][:7][:8][:10][:11]% +[//1.//1{//1}][//2.//2{//2}][//4.//4{//4}][//5.//5{//5}][//7.//7{//7}]% +[//8.//8{//8}][//10.//10{//10}][//11.//11{//11}]}\\\\ +\begin{tabular}[t]{c|c} +hours&offset\\\hline +\tt0&\tt-0+6\\ +\tt1&\tt+3+5\\\hline +\tt,2&\tt+4+4\\\hline +\tt/1&\tt+2+6\\\hline +\tt//1&\tt+1+6 +\end{tabular} +\end{tabular} +& +\def\arraystretch{0.3} +\begin{tabular}[t]{rl} +\verb"3O"&\stree{3O}\\\\ +\verb"3{OH}"&\stree{3{OH}}\\\\ +\verb"3`{OH}"&\stree{3`{OH}}\\\\ +\verb"3``{OH}"&\stree{3``{OH}}\\\\ +\hline\\\\ +\verb"\ph"&\stree{3\ph'9}\\\\ +\verb"\pho"&\stree{3\pho'9}\\\\ +\verb"\6"&\stree{3\6'9}\\\\ +\verb"\tbu"&\stree{3\tbu}\\\\ +\verb"\ip"&\stree{3\ip}\\\\ +\verb"\COOH"&\stree{3\COOH}\\\\ +\verb"\OH"&\stree{3\OH}\\\\ +\verb"\O"&\stree{3\O'11'7}\\\\ +\verb"\Me"&\stree{3\Me} +\end{tabular} +\end{tabular} + +%\depththreshold=11 +%\breadthmax=33 +%\showlists + +\end{document}
\ No newline at end of file diff --git a/macros/latex/contrib/streetex/stree.sty b/macros/latex/contrib/streetex/stree.sty new file mode 100644 index 0000000000..5ada0b469c --- /dev/null +++ b/macros/latex/contrib/streetex/stree.sty @@ -0,0 +1,669 @@ +% +% treeTeX: a tool for drawing structural formulae +% +% by Strokov Igor (strokov@nioch.nsc.ru), Oct.--Nov. 1996 +% +% WARNING: this package employs emTeX specials +% (e.g., \special{em:lineto} for short lines) +% +%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% +% +% This file may be freely distributed. +% Changes are not welcome unless carefully commented +% and reported to the author. +% + +\def\treeTeX{stree\kern-0.134em\TeX} + +\def\znakf#1{\small #1} +\newdimen\bondlen \bondlen=6.7mm +\newcount\ue \newcount\sixue \newcount\dim \newcount\diam +\newcount\dx \newcount\dy \newcount\tx \newcount\ty \newcount\px \newcount\py +\newcount\sx \newcount\sy \newcount\rx \newcount\ry \newcount\lx +\newcount\maxx \newcount\maxy \newcount\minx \newcount\miny +\newcount\tmp \newcount\tmx \newcount\tmy \newcount\mdx \newcount\mdy +\newcount\bmode \newcount\umode \newcount\lmode \newcount\pmode +\newcount\dmode \newcount\wmode \newcount\wemm \newcount\dpmode +\newcount\defwmode \defwmode=0 + +\def\mod#1{\ifnum#1<0#1=-#1\fi} +\def\advzn#1#2#3{\ifnum#3>0 \advance#1by#2 \else \advance#1by-#2 \fi} +\def\pozn#1#2{\ifnum#1<0 #1=-#2 \else #1=#2 \fi} +\def\mudi#1#2#3{\divide#1by5000\multiply#1by#2\divide#1by#3\multiply#1by5000} + +\def\vpered{\advance\px by\tmx \advance\py by\tmy \mudi\mdx56 \mudi\mdy56} +\def\vlevo{\advance\px by-\tmy \advance\py by\tmx} +\def\vpravo{\advance\px by\tmy \advance\py by-\tmx} +\newif\ifshort \newif\ifmetka +\def\linia{%\message{ line(\the\sx,\the\sy,\the\wmode) } + \dim=\mdx \ifnum\mdx=0 \dim=\mdy \fi + \ifcase\pmode %simple + \shortfalse + \ifnum\sx=0\else\ifnum\sy=0\else + \ifnum\dim<670000 \shorttrue \fi + \ifnum\sx<-6 \shorttrue \fi + \ifnum\sx>6 \shorttrue \fi + \ifnum\sy<-6 \shorttrue \fi + \ifnum\sy>6 \shorttrue \fi + \fi\fi + \ifnum\wmode=2 \shorttrue \fi + \ifnum\wemm=\wmode\else %\message{ em=\the\wemm, w=\the\wmode.} + \ifcase\wmode + \global\thinlines + \global\@wholewidth\fontdimen8\tenln + \put(\px,\py){\special{em:linewidth 0.4pt}} + \or + \global\thicklines + \global\@wholewidth\fontdimen8\tenlnw + \put(\px,\py){\special{em:linewidth 0.8pt}} + \or + \put(\px,\py){\special{em:linewidth 1.6pt}} + \fi + \global\@halfwidth .5\@wholewidth + \global\wemm=\wmode + \fi + \ifshort %\message{ short(\the\dim) } + \put(\px,\py){\special{em:moveto}} + {\advzn\px\mdx\dx \advzn\py\mdy\dy + \put(\px,\py){\special{em:lineto}}} + \else + \put(\px,\py){\line(\sx,\sy)\dim} + \fi + \or % 1 = dotted + \ifnum\mdx>\mdy + \tmp=\mdy \divide\tmp2 \advance\tmp\mdx + \else + \tmp=\mdx \divide\tmp2 \advance\tmp\mdy + \fi + \divide\tmp140000 + \pozn\dx\mdx \divide\dx by\tmp \pozn\dy\mdy \divide\dy by\tmp + \tmx=\dx \divide\tmx3 \tmy=\dy \divide\tmy3 + \advance\px\tmx \advance\py\tmy + \loop\ifnum\tmp>0 + \put(\px,\py){\makebox(0,0){\vrule height0.67pt width0.67pt depth0pt}} + \advance\px by\dx \advance\py by\dy + \advance\tmp-1 + \repeat + \or % 2 = vector + \ifnum\wmode=0 + \put(\px,\py){\vector(\sx,\sy)\dim} + \else + \pozn\dx\mdx \pozn\dy\mdy + \tmx=\px \advance\tmx by\dx + \tmy=\py \advance\tmy by\dy + \ifnum\wemm=2 + \tmp=\px \px=\tmx \tmx=\tmp + \tmp=\py \py=\tmy \tmy=\tmp + \fi + \divide\dx by20 \divide\dy by20 + \advance\tmx by-\dy \advance\tmy by\dx + \mudi\dx25 \mudi\dy25 + \tmp=5 + \put(\px,\py){\special{em:linewidth 0.4pt}} \wemm=0 + \loop\ifnum\tmp>0 + \put(\px,\py){\special{em:moveto}} + \put(\tmx,\tmy){\special{em:lineto}} + \advance\tmx by\dy \advance\tmy by-\dx + \advance\tmp by-1 + \repeat + \ifnum\wemm=2 + \global\wemm=0 + \else + \put(\px,\py){\special{em:linewidth 1.6pt}} + \global\wemm=2 + \fi + \fi + \fi + \advance\pmode by\dpmode + \dpmode=0} + +\def\lowbond{%\message{ bond(\the\dx,\the\dy,\the\mdx,\the\mdy)[\the\bmode]} + \tmx=\mdx \tmy=\mdy \divide\tmx by2 \divide\tmy by2 + \tmp=\tmy \ifnum\tmx>\tmy \tmp=\tmx \fi + \advance\tmp by\tmx \advance\tmp by\tmy %\message{ perp(\the\tmx,\the\tmy)(\the\ue/\the\tmp)} + \mudi\tmx\ue\tmp \ifnum\dx<0 \tmx=-\tmx \fi + \mudi\tmy\ue\tmp \ifnum\dy<0 \tmy=-\tmy \fi %\message{->(\the\tmx,\the\tmy)} + \ifcase\bmode + \ifnum\pmode=2\ifnum\wmode=1\ifnum\wemm=0\ifmetka\else + \mudi\mdx{19}{18} \mudi\mdy{19}{18} + \fi\fi\fi\fi + \linia + \or + \tmp=\tmx \divide\tmp by3 \advance\px by-\tmp + \tmp=\tmy \divide\tmp by3 \advance\py by-\tmp + \ifmetka\else + \mudi\mdx{19}{18} \mudi\mdy{19}{18} + \fi + {\vlevo\linia}\vpravo\linia + \or + \mudi\tmx45 \mudi\tmy45 + {\linia\vlevo\vlevo\linia}\vpravo\vpravo\linia + \or + \linia\vlevo\vlevo\vpered\linia + \or + \linia\vpravo\vpravo\vpered\linia + \fi} + +\newif\ifresult +\def\poslednii#1#2{\ifx#2\relax \toks0={#1} \let\next=\relax \else + \toks2=\expandafter{\the\toks2 #1} \let\next=\poslednii \fi \next#2} +\def\lsubst#1{\toks2={}\poslednii#1\relax} +\def\pervyi#1#2\konez{\toks0={#1}\toks2={#2}} +\def\rsubst#1{\pervyi#1\konez} +\def\tsthbox#1\hbox#2\relax{\resultfalse\ifx!#2!\else\resulttrue\fi} +\def\tstcircle#1\circle#2\relax{\resultfalse\ifx!#2!\else\resulttrue\fi} + +\def\putznak#1{% + \tstcircle#1\circle\relax + \ifresult + \put(\tx,\ty){#1} + \else + \tmx=\tx \advance\tmx by-\lx \tmy=\ty \advance\tmy by\ry + \put(\tmx,\tmy){\makebox(0,0)[lt]{#1}} + \fi} + +\def\spacer#1{\rx=0 \lx=0 \ry=0 + \tstcircle#1\circle\relax + \ifresult\else + \ifx!#1!\else %\message{ space(#1)(\the\dx,\the\dy,\the\dmode)} + \toks0={#1} \toks2={} \resultfalse + \ifnum\dmode=2 + \resulttrue + \else + \edef\gum{\the\toks0}\edef\gumx{\gum} + \expandafter\tsthbox\gumx\hbox\relax + \fi + \tmp=\dx \ifnum\tmp=0 \tmp=1 \ifnum\dy=0 \tmp=-1 \fi \fi + \ifresult\else + \ifnum\dmode=1 \tmp=-\tmp \fi + \ifnum\tmp<0 \lsubst{#1} \else \rsubst{#1} \fi %\message{ 02(\the\toks0,\the\toks2)} + \fi + \if$\the\toks0 \toks0={#1} \toks2={} \fi + \setbox0=\hbox{\the\toks0} \lx=\wd0 \divide\lx by2 + \ry=\ht0 \divide\ry by2 + \setbox0=\hbox{\the\toks2} \rx=\wd0 \advance\rx by\lx + \ifnum\tmp<0 \tmp=\lx \lx=\rx \rx=\tmp \fi %\message{->(\the\ry,\the\lx,\the\rx)} + \fi + \fi} + +\def\short#1{\ifnum\dim=0\else \ifnum\ry=0\else %\message{ short(\the\dx,\the\dy)(\the\mdx,\the\mdy)(\the\ry,\the\lx,\the\rx)} + \tmp=\dx \ifnum#1=0 \tmp=-\tmp \fi + \ifnum\tmp<0 \tmp=\lx \else \tmp=\rx \fi + \tmx=\mdx \divide\tmx by10000 \multiply\tmx by\ry + \tmy=\mdy \divide\tmy by10000 \multiply\tmy by\tmp + \ifnum\tmx<\tmy + \dimen0=1.2\ry \tmx=\mdx \mudi\tmx{\dimen0}\mdy + \ifnum\lmode<2 + \advance\mdy by-\dimen0 \advance\mdx by-\tmx + \fi + \ifodd#1 + \advzn\py{\dimen0}\dy + \advzn\px\tmx\dx + \fi + \else + \tmy=\mdy \mudi\tmy\tmp\mdx + \ifnum\lmode<2 + \advance\mdx by-\tmp \advance\mdy by-\tmy + \fi + \ifodd#1 + \advzn\px\tmp\dx + \advzn\py\tmy\dy + \fi + \fi %\message{->(\the\mdx,\the\mdy)} +\fi\fi} + +\def\chkminx{\ifnum\tmx<\minx \global\minx=\tmx \fi} +\def\chkmaxx{\ifnum\tmx>\maxx \global\maxx=\tmx \fi} +\def\chkminy{\ifnum\tmy<\miny \global\miny=\tmy \fi} +\def\chkmaxy{\ifnum\tmy>\maxy \global\maxy=\tmy \fi} +\def\adjminmax{\tmx=\tx \advance\tmx by\dx \tmy=\ty \advance\tmy by\dy + {\advance\tmx by-\lx \chkminx} \advance\tmx by\rx \chkmaxx + {\advance\tmy by-\ry \chkminy} \advance\tmy by\ry \chkmaxy} + +\def\trydiv#1#2{\tmp=#1\divide\tmp by#2\multiply\tmp by#2 + \ifnum\tmp=#1\resulttrue\else\resultfalse\fi} +\def\odin#1{\ifnum#1=0\else \ifnum#1<0 #1=-1 \else #1=1 \fi \fi} + +\newcount\psx \newcount\psy +\def\ab#1[#2]{%\toks0={#2}\message{ ab(u=\the\ugol, m=\the\toks0, um=\the\umode, b=\the\bmode)} + \tmp=#1 + \ifcase\umode\or + \advance\tmp by 18\or + \advance\tmp by 31\or + \ifnum\tmp=1 \tmp=13 \fi \ifnum\tmp=2 \tmp=13 \fi + \ifnum\tmp=4 \tmp=14 \fi \ifnum\tmp=5 \tmp=14 \fi + \ifnum\tmp=7 \tmp=15 \fi \ifnum\tmp=8 \tmp=15 \fi + \ifnum\tmp=10 \tmp=16 \fi \ifnum\tmp=11 \tmp=16 \fi + \fi \tmp=\tmp%\message{ ->(\the\tmp)} + \ifcase\tmp + \sx=0\sy=6\or \sx=3\sy=5\or \sx=5\sy=3\or + \sx=6\sy=0\or \sx=5\sy=-3\or \sx=3\sy=-5\or + \sx=0\sy=-6\or \sx=-3\sy=-5\or \sx=-5\sy=-3\or + \sx=-6\sy=0\or \sx=-5\sy=3\or \sx=-3\sy=5\or + \sx=0\sy=6\or + \sx=4\sy=4\or \sx=4\sy=-4\or \sx=-4\sy=-4\or \sx=-4\sy=4\or %13--16 + \sx=0\sy=0 \wemm=\wmode \or %17 + \sx=0\sy=6\or \sx=2\sy=6\or \sx=6\sy=2\or + \sx=6\sy=0\or \sx=6\sy=-2\or \sx=2\sy=-6\or + \sx=0\sy=-6\or \sx=-2\sy=-6\or \sx=-6\sy=-2\or + \sx=-6\sy=0\or \sx=-6\sy=2\or \sx=-2\sy=6\or %18--29 + \or %30 -- let sx,sy remain + \sx=0\sy=6\or \sx=1\sy=6\or \sx=6\sy=1\or + \sx=6\sy=0\or \sx=6\sy=-1\or \sx=1\sy=-6\or + \sx=0\sy=-6\or \sx=-1\sy=-6\or \sx=-6\sy=-1\or + \sx=-6\sy=0\or \sx=-6\sy=1\or \sx=-1\sy=6\or %31--42 + \fi %\message{ SXY(\the\sx,\the\sy)(\the\tmp)} + \dx=\sx \multiply\dx by\ue + \dy=\sy \multiply\dy by\ue + \ifnum\lmode=1 \mudi\dx53 \mudi\dy53 \fi + \ifnum\lmode=3 \mudi\dx13 \mudi\dy13 \fi + \mdx=\dx \mod\mdx \mdy=\dy \mod\mdy + \ifnum\mdx>\mdy \dim=\mdx \else \dim=\mdy \fi + \px=\tx \py=\ty %\message{ dxy(\the\dx,\the\dy)|\the\mdx,\the\mdy|\the\dim|} + \ifnum\sx=0 \odin\sy \else + \ifnum\sy=0 \odin\sx \else + \loop \resultfalse + \ifodd\sx\else \ifodd\sy\else + \divide\sx by2 \divide\sy by2 \resulttrue \fi \fi + \ifresult + \repeat %\message{ odd(\the\sx,\the\sy)} + \trydiv\sx3 \ifresult \trydiv\sy3 \fi + \ifresult \divide\sx by3 \divide\sy by3 \fi + \fi + \fi %\message{ sxy(\the\sx,\the\sy)} + \short1 + \ifnum\lmode=2 %\message{ znak(#2)(\the\dx,\the\dy)} + \divide\dx by8 \divide\dy by8 + \advance\px by\dx \advance\py by\dy + \toks0={c} \ifnum\dx>0 \toks0={l} \fi \ifnum\dx<0 \toks0={r} \fi + \toks2={c} \ifnum\dy>0 \toks2={b} \fi \ifnum\dy<0 \toks2={t} \fi + \edef\poz{[\the\toks0\the\toks2]} \def\mkbox{\makebox(0,0)} + \put(\px,\py){\expandafter\mkbox\poz{\znakf{#2}}} + \setbox0=\hbox{\znakf{#2}} + \ifnum\dy<0 \tmy=\py \advance\tmy by-\ht0 \chkminy \fi + \ifnum\dy>0 \tmy=\py \advance\tmy by\ht0 \chkmaxy \fi + \ifnum\dx<0 \tmx=\px \advance\tmx by-\wd0 \chkminx \else + \ifnum\dx>0 \tmx=\px \advance\tmx by\wd0 \chkmaxx \else + \tmp=\wd0 \divide\tmp by2 + \tmx=\px \advance\tmx by\tmp \chkmaxx + \tmx=\px \advance\tmx by-\tmp \chkminx + \fi + \fi + \else + \ifnum\bmode=9 + \tmx=\sx \multiply\tmx by\psy + \tmy=\sy \multiply\tmy by\psx + \bmode=3 \ifnum\tmx>\tmy \bmode=4 \fi + \fi + \psx=\sx \psy=\sy + \ifnum\lmode=3\else + \spacer{#2} + \short0 + \fi + \ifx!#2!\metkafalse\else\metkatrue\fi + \ifnum\dim>0 + {\lowbond} + \fi + \adjminmax + \ifnum\lmode=3\else + \advance\tx by\dx \advance\ty by\dy + \fi + \ifmetka + \ifnum\bmode=-2\else + \putznak{#2} + \fi + \fi + \fi + \sx=0 \sy=0 + \bmode=0 \lmode=0 \pmode=0 + \umode=0 \dmode=0 + \wmode=\defwmode +} %\global for use with commands + +\def\b#1{\@ifnextchar[{\ab#1}{\ab#1[]}} +\def\bt#1{\ifnum\bmode=0 \bmode=#1 \advance\bmode by-1 \fi} +\def\go{% + \ifnum\unitlength=1\else + \dimen0=1.3\unitlength \diam=\dimen0 + \sixue=\unitlength \unitlength=1sp + \ue=\sixue \divide\ue by6 + \global\minx=0 \global\miny=0 \global\maxx=0 \global\maxy=0 + \wmode=-1 + \fi + \tx=0 \ty=0} +\def\og{\unitlength=\sixue sp} + +\newcount\ang \def\rot#1{\advance\ang by#1 \ifnum\ang>11\advance\ang by-12\fi} +\def\bb#1{\bt#1\b} +\def\ph#1{{\ang=#1\rot2 {\bt4\b\ang}\rot8 \b\ang\rot2 \bt5\b\ang\rot2 + \b\ang\rot2 \bt5\b\ang\rot2 \b\ang}} +\def\six#1{{\ang=#1\rot2 {\b\ang}\rot8 \b\ang\rot2 \b\ang\rot2 + \b\ang\rot2 \b\ang\rot2 \b\ang}} +\def\6{\six} +\def\CO#1{{\bt2\b{#1}[O]}} +\def\O{\CO} +\def\COOH#1{{\ang=#1 \b\ang[C] + \ifnum\ang>6 \rot2 {\bt2\b\ang[O]} \rot8 \OH\ang + \else \rot2 \OH\ang \rot8 {\bt2\b\ang[O]} + \fi}} +\def\OH#1{{\ifnum#1>6\b{#1}[HO]\else\b{#1}[OH]\fi}} +\def\Me#1{{\ifnum#1>6\b{#1}[H$_3$C]\else\b{#1}[CH$_3$]\fi}} +\def\tbx#1{{\ang=#1 \b\ang {\b\ang} \rot3 {\b\ang} \rot6 \b\ang}} +\def\tbu#1{{\ang=#1 \b\ang \rot2 {\b\ang} \rot8 {\b\ang} \rot1 \b\ang}} +\def\ip#1{{\ang=#1 \b\ang \rot2 {\b\ang} \rot8 \b\ang}} +\def\kol#1{\bmode=-1 {\ab#1[\circle\diam]}\bmode=0} +\def\pho#1{\six#1{\kol#1}} + +\def\isdigit#1{\tmp=-1 \ifx#11\tmp=1\else\ifx#12\tmp=2\else\ifx#13\tmp=3\else +\ifx#14\tmp=4\else\ifx#15\tmp=5\else\ifx#16\tmp=6\else\ifx#17\tmp=7\else +\ifx#18\tmp=8\else\ifx#19\tmp=9\else\ifx#10\tmp=0 \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} + +%narg: 1=prefix, 2=dir, 3=label, 4=cmd, 6=sx,sy +\newif\ifminus \newcount\ugol \newcount\narg +\def\smetkoi{\b\ugol[} +\def\treelow#1{\toks0={#1}%\message{ 1=(\the\toks0)(\the\narg)} + \let\nexttree=\treelow + \ifnum\narg=0 + \ifx#1\konez \let\nexttree=\relax \narg=1 \fi + \ifx#1= \advance\bmode by1 \narg=1 \fi + \ifx#1< \bmode=3 \narg=1 \fi + \ifx#1> \bmode=4 \narg=1 \fi + \ifx#1? \bmode=9 \narg=1 \fi + \ifx#1: \advance\pmode by1 \narg=1 \fi + \ifx#1^ \pmode=2 \narg=1 \fi + \ifx#1. \bmode=-1 \lmode=2 \narg=1 \fi + \ifx#1~ \advance\bmode by-1 \narg=1 \fi + \ifx#1+ \minusfalse \sx=0 \narg=6 \fi + \ifx#1- \minustrue \sx=0 \narg=6 \fi + \ifx#1[ \begingroup \narg=1 \fi + \ifx#1] \endgroup \narg=1 \fi + \ifx#1* \advance\wmode by1 \narg=1 \fi + \ifx#1/ \advance\umode by1 \narg=1 \fi + \ifx#1, \umode=3 \narg=1 \fi + \ifx#1_ \lmode=1 \narg=1 \fi + \ifx#1' \lmode=3 \narg=1 \fi + \ifx#1` \advance\dmode by1 \narg=1 \fi + \ifx#1" \dpmode=1 \narg=1 \fi + \ifnum\narg=0 + \ifcat\noexpand#1A + \narg=3 + \else + \isdigit#1 + \ifnum\tmp<0 \narg=4 \else + \ugol=\tmp \narg=2 + \fi + \fi + \fi + \fi + \futurelet\nexttok\xnext +} +\def\xnext{%\message{ switch(\the\narg)} + \ifnum\narg=7 + \isdigit\nexttok \tmp=\tmp %\message{ tst(\meaning\nexttok)->(\the\tmp (\the\sy))} + \ifnum\tmp<0 + \ifminus \sy=-\sy \fi + \ugol=30 \narg=2 + \else + \multiply\sy by10 \advance\sy by\tmp + \fi + \fi + \ifcase\narg + \or + \narg=0 + \or %\message{ 2:dir=\the\ugol;} + \resultfalse + \ifx\nexttok\bgroup\else %\message{ !(} + \ifcat A\noexpand\nexttok \narg=3 \else %\message{ !(a} + \ifx\nexttok~ \let\nexttok=* \fi + \ifcat\relax\noexpand\nexttok \narg=4 \else %\message{ !(ac} + \resulttrue + \ifnum\ugol=1 %\message{ chk(\meaning\nexttok)} + \ifx\nexttok0 \ugol=10 \fi + \ifx\nexttok1 \ugol=11 \fi + \ifx\nexttok2 \ugol=12 \fi + \ifx\nexttok7 \ugol=17 \fi + \ifnum\ugol>1 \resultfalse \else + \ifnum\lmode=2 \narg=3 \resultfalse \fi + \fi + \else + \ifnum\lmode=2 \narg=3 \resultfalse \fi + \fi + \ifx\nexttok` \narg=0 \resultfalse \fi + \ifx\nexttok" \narg=0 \resultfalse \fi + \fi \fi \fi + \ifresult + \b\ugol[] + \narg=0 + \fi + \or %\message{ 3:label=\the\toks0;} + \expandafter\smetkoi\the\toks0] + \narg=0 + \or %\message{ 4:cmd;} + \edef\komanda{\the\toks0} + \ifx\nexttok\bgroup + \narg=5 + \else + \komanda\ugol + \bmode=0 \lmode=0 \pmode=0 \umode=0 \dmode=0 + \narg=0 + \fi + \or %5 + \def\cmdu{\komanda\ugol[} + \expandafter\cmdu\the\toks0] + \bmode=0 \lmode=0 \pmode=0 \umode=0 \dmode=0 + \narg=0 + \or %6 ( + \ifx\nexttok+ + \ifminus \sx=-\sx \fi + \minusfalse \sy=0 \narg=7 + \else + \ifx\nexttok- + \ifminus \sx=-\sx \fi + \minustrue \sy=0 \narg=7 + \else + \isdigit\nexttok + \multiply\sx by10 \advance\sx by\tmp + \fi + \fi + \fi %\message{->n(\the\narg)} + \ifnum\narg=5\else + \ifx\nexttok\bgroup\narg=3\fi + \fi + \nexttree} + +\newbox\strbox \newcount\vpos +\def\tree#1{\treelow17#1 \konez\og} +\def\astree[#1]#2{\vpos=0 \ifx#1b\vpos=1\fi \ifx#1t\vpos=2\fi + \begstr\tree{#2}\endstr} +\def\stree{%\catcode`~=12 + \@ifnextchar[{\astree}{\astree[c]}} +% +\def\begstr{\unitlength=\bondlen\setbox\strbox=\hbox\bgroup +\begin{picture}(0,0)\go} +% +\def\endstr{\end{picture}\egroup\og %\message{ x(\the\minx..\the\maxx) y(\the\miny..\the\maxy) } +\advance\maxx by-\minx \advance\maxy by-\miny \tmp=0 +\ifnum\vpos=0 \divide\maxy by2 \dimen0=0.5ex \tmp=\dimen0\fi +\ifnum\vpos=1\else \advance\miny by\maxy \advance\miny by-\tmp\fi +\setbox0\hbox to\maxx sp{\kern-\minx sp\lower\miny sp\box\strbox \hss}% +\advance\maxy by\tmp \ht0=\maxy sp\advance\maxy by-\tmp +\ifnum\vpos=1 \dp0=0pt\else\advance\maxy by-\tmp \dp0=\maxy sp\fi +\ifnum\vpos=2 \ht0=0pt\fi +\leavevmode\box0} +%\catcode`~=13} + +% +% former sprivate.sty +% +% масс-спектры ... +% +\newdimen\mzlen \mzlen=0.6pt +\newcount\@mz \newcount\@int \newcount\mzmax +\newcount\imax \imax=50 \newcount\msdir \msdir=1 +\newbox\mzbox +\def\numfnt{\small} +\def\mzlabel{ $m/z$} +\def\mzl@w#1{\dy=\@int %\message{ 1=#1; 2=#2; 3=#3 (\the\dy); } + \multiply\dy by\imax \divide\dy by100 \pul(\@mz,0,0,\msdir){\dy} + \ifodd#1 + \ifnum\msdir=1 \advance\dy by4 \puz(\@mz,\dy)bc{\numfnt\the\@mz} + \else \advance\dy by4 \puz(\@mz,-\dy)tc{\numfnt\the\@mz} \fi + \fi + \ifnum\@mz>\mzmax \global\mzmax=\@mz \fi} +\def\pr@ceed#1{\ifx#1\k@nez \mzl@w0 \let\next=\relax \else + \ifx#1- \@mz=\@int \@int=0 + \else\ifx#1, \mzl@w0 \@int=0 \advance\@mz by1 + \else\ifx#1! \mzl@w1 \@int=0 \advance\@mz by1 + \else \multiply\@int by10 \advance\@int by#1 \fi\fi\fi + \let\next=\pr@ceed \fi +\next} +\def\mass#1{\@mz=0 \@int=0 + \pr@ceed#1\k@nez + \setbox0=\hbox{\numfnt99} \tmy=\ht0 \divide\tmy by\mzlen + \ifnum\msdir>0 + \maxy=\imax \advance\maxy by4 \advance\maxy by\tmy + \miny=-7 \advance\miny by-\tmy + \else + \miny=-\imax \advance\miny by-4 \advance\miny by-\tmy + \fi + \global\miny=\miny \global\maxy=\maxy + \msdir=1} +\def\scale#1#2{% + \ifx!#2! + \divide\mzmax by10 \advance\mzmax by1 \multiply\mzmax by10 + \else + \mzmax=#1 + \fi + \global\mzmax=\mzmax + \pul(-1,0,1,0)\mzmax + \@mz=50 + \loop \ifnum\@mz<\mzmax + \pul(\@mz,0,0,-1)6 + \ifodd#1 \puz(\@mz,-7)tc{\numfnt\the\@mz} \fi + \advance\@mz by50 + \repeat + \dy=\mzmax \divide\dy by10 + \multiput(0,0)(10,0)\dy{\line(0,-1)4} + \setbox\mzbox=\hbox{\mzlabel} + \puz(\mzmax,0)cl{\box\mzbox} + \tmp=\wd\mzbox \divide\tmp by\mzlen + \advance\mzmax by\tmp +} +\def\begms{\mzmax=0 \maxy=0 \miny=0 \unitlength=\mzlen +\setbox\strbox=\hbox\bgroup\begin{picture}(0,0)} +\def\endms{\end{picture}\egroup%\message{ (\the\mzmax, \the\miny, \the\maxy) } +\advance\maxy by-\miny +\ifnum\vpos=0 \divide\maxy by2 \advance\miny by\maxy \fi +\setbox0\hbox to\mzmax\mzlen{\lower\miny\mzlen\box\strbox \hss}% +\ht0=\maxy\mzlen +\ifnum\vpos=0 \dp0=\maxy\mzlen \else \dp0=0pt\fi +\leavevmode\box0} +\def\@massp[#1]#2{\vpos=0 \ifx#1b \vpos=1 \fi + \begms\mass{#2}\scale1{}\endms} +\def\massp{\@ifnextchar[{\@massp}{\@massp[c]}} + +% +% CNMR +\newdimen\mdlen \mdlen=0.0013in +\newcount\md \newcount\mdl \newcount\py \newcount\dht \newcount\moda +\def\xxx#1#2{\vrule width#1\unitlength height#2\unitlength} +\def\pik{\tmp=5 \dht=5 + \loop\ifnum\tmp>0 + \ifnum\tmp>15 \xxx5\py \dht=-\dht \else \xxx5\tmp \fi + \advance\tmp by\dht + \repeat} +\def\onecnmr#1{\let\nextcnmr=\onecnmr %\message{ 1=(#1)(\the\moda)} + \ifnum\moda>0 + \advance\py by10 + \puz(-\mdl,\py)bc{#1} + \moda=0 + \else + \ifx#1\konez + \let\nextcnmr=\relax + \else + \py=0 + \ifx#1s \py=100 \else + \ifx#1d \py=200 \else + \ifx#1t \py=300 \else + \ifx#1q \py=400 \else + \multiply\md by10 \advance\md by#1 + \fi \fi \fi \fi %\message{ md=\the\md, ht=\the\py.} + \ifnum\py>0 + \puz(-\md,0)bc\pik \mdl=\md \md=0 + \fi + \fi + \fi + \futurelet\nexttok\tstnext} +\def\tstnext{\ifx\nexttok\bgroup \moda=1 \fi \nextcnmr} + +\def\lineika{\vrule height0.05pt width\tmx\mdlen} +\def\cnmrs{\@ifnextchar[{\@cnmrs}{\@cnmrs[c]}} +\def\@cnmrs[#1]#2#3{\unitlength=\mdlen +\vpos=0 \ifx#1b \vpos=1 \fi +\setbox0=\hbox{\numfnt99}\tmy=\ht0 \divide\tmy by\mdlen \advance\tmy by35 +\tmx=#2 \advance\tmx by50 +\setbox\strbox=\hbox{\begin{picture}(\tmx,600)(-#2,-\tmy)% +\md=0 \onecnmr#3\konez +\tmx=0 \loop\ifnum\tmx<#2 +\pul(-\tmx,0,0,-1){20} \tmp=\tmx \divide\tmp by10 +\puz(-\tmx,-35)tc{\numfnt\the\tmp}% +\advance\tmx by500\repeat +\tmx=#2 +\puz(0,100)cl{\numfnt s}\puz(0,100)br{\lineika} +\puz(0,200)cl{\numfnt d}\puz(0,200)br{\lineika} +\puz(0,300)cl{\numfnt t}\puz(0,300)br{\lineika} +\puz(0,400)cl{\numfnt q}%\puz(0,400)br{\lineika} +\advance\tmx by50 +\put(50,0){\vector(-1,0)\tmx}% +\end{picture}}% +\tmy=0 \ifnum\vpos=0 \tmy=250 \fi +\setbox0\hbox to\tmx\mdlen{\lower\tmy\mdlen\box\strbox \hss}% +\dp0=\tmy\mdlen \advance\tmy by-550 \ht0=-\tmy\mdlen +\leavevmode\box0} + +% +% rpic +\newdimen\picplus \picplus=1em % surrounds a picture +\newdimen\razmer \newdimen\dive \newdimen\divetwo +\def\@rpic[#1]#2{\setbox0=\hbox{#2}\setbox2=\hbox to \wd0{#1}% +\razmer=\ht0 \advance\razmer by\dp0 \advance\razmer by\ht2 +\advance\razmer by\picplus \divetwo=\razmer \advance\divetwo by\baselineskip +\advance\razmer by\dp2 \advance\razmer by\picplus +\tmp=\razmer \divide\tmp by\baselineskip \advance\tmp by1 +\razmer=\wd0 \advance\razmer by\picplus +\hangafter=-\tmp \hangindent=-\razmer +\razmer=-\razmer \advance\razmer by\hsize +\advance\razmer by\picplus +\setbox0=\rlap{\kern\razmer \razmer=\wd0% +\dive=\ht0\advance\dive by\baselineskip\lower\dive\box0% +\kern-\razmer\lower\divetwo\box2}% +\dp0=0pt\ht0=0pt\wd0=0pt% +{\baselineskip=0pt\lineskip=0pt\box0\penalty10000}% +} +\def\rpic{\@ifnextchar[{\@rpic}{\@rpic[]}} + +% +% local settings -- removed +%\def\рис(#1){рис.~\ref{#1}} +%\def\табл(#1){табл.~\ref{#1}} +%\def\CNMR{$^{13}$C ЯМР} +%\def\MYPC{PC AT 486 DX2-66} + +\def\longdown{{\unitlength=1em\begin{picture}(0,2)\put(0,1){\vector(0,-1){1.5}}\end{picture}}} +\def\pul(#1,#2,#3,#4)#5{\put(#1,#2){\line(#3,#4){#5}}} +\def\puz(#1,#2)#3#4#5{\put(#1,#2){\makebox(0,0)[#3#4]{#5}}} +% +\def\wider#1{\dimen255=#1\advance\hsize by\dimen255 + \advance\textwidth by\dimen255 + \divide\dimen255 by2 \advance\hoffset by-\dimen255} +\def\higher#1{\dimen255=#1\advance\vsize by\dimen255 + \advance\textheight by\dimen255 + \divide\dimen255 by2 \advance\voffset by-\dimen255} + +% +%verbatim +\def\uncatcodespecials{\def\do##1{\catcode`##1=12 }\dospecials\catcode`\ =10} +\def\sverb{\begingroup\tt\uncatcodespecials\frenchspacing\doverbatim} +\def\doverbatim#1{\def\next##1#1{##1\endgroup}\next} + +% the end diff --git a/macros/latex/contrib/streetex/stree_en.lat b/macros/latex/contrib/streetex/stree_en.lat new file mode 100644 index 0000000000..90e5718f1b --- /dev/null +++ b/macros/latex/contrib/streetex/stree_en.lat @@ -0,0 +1,959 @@ +% +% \documentstyle[12pt,stree]{article} % if LaTeX 2.09 +% +\documentclass[12pt]{article} +\usepackage{stree} +% +% WARNING: `stree' employs emTeX specials (em:lineto, etc.) +% +\begin{document} + +\def\<#1>{$\langle$#1$\rangle$} +\def\UPSILON{\char'7} +\def\XyM{X\kern-.30em\smash{\raise.50ex\hbox{\UPSILON}}\kern-.30em{M}} +\def\XyMTeX{\XyM\kern-.1em\TeX} +\def\ChemTeX{Chem\kern-0.1em\TeX} +%\def\verb{\sverb} +\def\CNMR{$^{13}$C NMR} + +\def\topfraction{.9} +\def\bottomfraction{.9} +\def\textfraction{.1} + +\font\twelvett=cmtt12 +%\def\tt{\twelvett} +\def\0{\twelvett\symbol{92}} +\def\1{\twelvett\symbol{123}} +\def\2{\twelvett\symbol{125}} +\def\4{\twelvett\symbol{36}} +\def\5{\twelvett\symbol{95}} + +\pagestyle{myheadings} +\thispagestyle{empty} + +\markright{macropackage for typesetting structural formulas with LaTeX} + +\begin{center} +\LARGE +One more macropackage for typesetting structural formul\ae\ +with \LaTeX + +\bigskip +\bigskip +\normalsize Igor Strokov$^*$ + +\bigskip +\small Novosibirsk Institute of Organic Chemistry, Siberian Division of +Russian Academy of Sciences,\\ +Lavrentiev avenue~9, Novosibirsk~90, Russia +\end{center} + +\bigskip +\noindent +A new macropackage for \LaTeX\ provides a high quality, easy and uniform +typesetting of structural formulas of almost any complexity. The use of the +new package called \treeTeX\ implies a depth-in traversal of a +structure and description of bonds and vertex labels being passed. Additional +features of \treeTeX\ include input of mass spectra and simple flow charts. + +\bigskip +\noindent +keywords: TeX, LaTeX, chemical structures + +\insert\footins{\small\rm $^*$ Tel: (3832) 354745, +E-mail: strokov@nioch.nsc.ru} + +\clearpage + +\section{Introduction} + +The choice of tools for scientific publishing is not very wide: most often it +is MS Word$^{\rm TM}$ or \TeX\ --- a typesetting language and system, +developed in the beginning of 80--th by Knuth (Knuth, 1984). Briefly saying, +\TeX\ is eminent because of the detailed account of aspects affecting +document appearance and, therefore, the perfect quality, practically +unreachable by modern word processors. From the other side, \TeX\ is not very +comfortable for working with graphics, though it lets to import either +various bitmaps (with sacrifice of device independence) or PostScript +images. The last decision can lead to almost any visual effect but it +requires special soft-- and/or hardware understanding PostScript. At the same +time, \TeX\ itself is quite a powerful program language allowing to compose +simple charts with the aid of pseudographical fonts. The most popular format +of \TeX, \LaTeX\ (Lamport, 1984), can be said to establish a standard on the +pseudographics use. Although most structural formulas of organic compounds +can be fully typeset in this way, doing it by the direct use of \LaTeX\ +drawing commands is too laborious. There are at least three macros designed +especially for chemical structures typesetting. Ramek's package (Ramek, 1990) +is rather compact and easy in use, but it is distinctive by a +formulas style which is rare in contemporary literature. +More complex packages of Haas--O'Kane (Haas \& O'Kane, 1987) and Fujita +(Fujita, 1994) are free from this drawback. Both of them have similar design +based on a set of different macrocommands, each for a specific chemical +fragment. Usually a command defines some ring system, whose inner bond types +and substituents can be altered by means of command parameters. For example, +in Fujita's \XyMTeX\ 5,5-dimethylcyclohexen-2-on-1 is entered as +\verb"\cyclohexanev[b]{1D==O;5Sb==;5Sa==}", where {\tt[b]} specifies the C=C +double bond, {\tt 1D==O} --- the carbonyl group, and {\tt 5Sb==;5Sa==} --- +two methyl substituents. Here, like in other cases, a command name +correlates to a compound's systematic notation, which facilitates +understanding of a command meaning. From the other side, description of +structures on the level of characteristic fragments has some disadvantages. +First of all, such fragments are that numerous, so any significant covering +of their set is practically unreacheable. This task is not fulfilled in both +\ChemTeX\ and \XyMTeX, nevertheless the complete description of each one forms +quite a volume book. Additionally, in cases when a formula consists of many +fragments, their disposal on one figure becomes a tiresome task of +coordinates calculation for nodes to be linked. + +Therefore, making a description on a lower level of distinct bonds (after +Ramek's steps) seems to be more appropriate. Bonds diversity compared to +that of characteristic fragments is drastically lower, therefore formulas +typesetting in terms of bonds promises to be more simple and universal. On +the back side there is a possible loss of input speed and convenience. +However, author's experience gave no such evidences. To support +this statement let us examine how exactly structural formulas are entered +in a new macropackage called {\em\treeTeX.} + +Following the \TeX\ programmers' tradition, the new package name receives the +common logo. The other part of the notation reflects the new approach +essense: a chemical \underline{s}tructure is regarded as a bond +\underline{tree} which is +traversed in a depth-first order. The complete \treeTeX\ constitutes single +file {\tt stree.sty}, whose usage is common to other style files in \LaTeX. + +%Thus, the first line in this document looks like: +%\begin{verbatim} +%\documentstyle[12pt,stree]{article} +%\end{verbatim} + +\section{Basics} + +All the input in \treeTeX\ is held through single command \verb"\stree{}". A +formula description containing inside brackets is composed in the following +way: starting from any vertex +one have to traverse all the structure moving along bonds and describing both +the passing bonds and verteces labels met on the route. For example, the +formula of 1-hydroxy-4-methylpyridine +$$ +\stree{{HO}20>242\Me>68N>10} +$$ +is entered as \verb"\stree{{HO} 2 0 >2 4 [2{CH$_3$}] >6 8N >10}". +Starting the traversal with vertex OH one have to first input +its label: \verb"{HO}". A label is embraced in figure +brackets if it contains more than one token. The next character {\tt 2} +means: draw a bond in a direction at 2 o'clock on a 12-hours +clockface. A traversal always has a current point (vertex). Setting a +direction of a bond causes the current point to be shifted to the next vertex +of this bond. E.\ g.,\ after character {\tt2} a ring vertex becomes current. +Character {\tt0} refers to the next bond at 0 o'clock (or upward). Then goes +a double bond at 2 o'clock. If a bond is not single, then one or more tokens +(so called {\em prefixes\/}) are put before its direction to specify +bond features. A double bond may be displayed in several ways. In our case it +is desirable to draw the second line to the right from the main one. This +very effect is achieved by prefix {\tt>} (the right angle bracket). + +The next single bond at 4 hours leads to a substituted vertex of the ring. +Let us describe the substituent first. Construction \verb"[2{CH$_3$}]" +fulfills this goal as follows: opening bracket {\tt[} marks a current +vertex, 2-hours bond goes to vertex CH$_3$ (\verb"{CH$_3$}" is the label +description), finally closing bracket {\tt]} retrieves the marked +vertex. A methyl group is quite common although sequence +\verb"{CH$_3$}" is not very easy to input. A shorter command +\verb"\Me" may be used instead, so that \verb"2\Me" is equivalent to +\verb"[2{CH$_3$}]" (any other number designating a bond direction may take +place of digit {\tt2} here). + +After setting a substituent the traversal may be continued. Three bonds +remain: at 6, 8, and 10 hours. The 6 and 10-hours bonds are double, drawn +inside a cycle, which is indicated by prefix {\tt>}. The 8-hours bond leads +to a vertex labelled ``N'', therefore {\tt N} follows immediately +after {\tt8}. Figure brackets are needless here because the label is composed +of a single token. + +In this example token groups related to different +bonds are separated by spaces. Though spaces are not obligatory +(\verb"\stree{{HO}20>242\Me>68N>10}" is also correct), one may use them to +make an input more readable. However, a space is illicit before a +label or a command. In our example writing \verb"8 N" (also \verb"2 {CH$_3$}" +or \verb"2 \Me") would cause an error. In one position, however, a {\sl +binding\/} space is required: between digit {\tt1} designating a 1-hour +direction and following another digit (it prevents missing, say, two ones +with eleven). + +\section{Formal description} + +Now let us try to state more rigorously the basic rules just introduced. An +argument of \verb"\stree" is composed of descriptions of distinct bonds. To +describe a bond one have to specify at least its direction --- most often it +is a number of hours on a clockface. One or more prefix(es) modifying a bond +length, degree, appearance, etc.,\ may precede a direction. If a bond leads +to a labelled vertex, then the label must follow the direction. A command (in +\TeX's terms --- something starting with {\tt\0}) may take place of a label, +allowing to shorter set the same structural fragment. +Here a label or a command is regarded as a bond attribute called {\em a +suffix\/} due to its terminal position. In contrast to prefixes, a bond may +have only one suffix. Besides, suffix is never preceded by a space. The form +\<possible prefix(es)>\<direction>\<possible suffix> may resemble a common +verbal explanation of a traversal: {\sl such-and-such\/} bond at {\sl +that\/} o'clock leads to {\sl so-and-so\/} label (only words like {\sl +such-and-such\/} are substituted by conditional tokens). + +\def\is{$\longrightarrow$ } +\def\ili{\vrule{} } + +A question may arise: how to distinguish the current bond suffix from a prefix +(or a direction) of the next bond? Spaces generally affect +only a visual perception, while a computer most often ignores them obeying the +following syntax rules given below. (The Backus--Naur form, where an arrow +\is\ means ``is defined as'' and token \ili\ means ``or'', is used.) Let us +start from definition of \<structure>, i.\ e.,\ of an argument of command +\verb"\stree". + +\begin{description} +\item[] +\<structure> \is \<none> \ili \<bond>\<structure> \ili\\ + \<structure>{\tt[}\<structure>{\tt]}\<structure> +\end{description} +% +It is just a formal way to say an argument to be composed from distinct +bonds descriptions and to contain coupled and possibly nested square +brackets. Then a definition of \<bond> itself follows: + +\begin{description}\frenchspacing + +\item[] +\<bond> \is \<possible prefix(es)>\<direction>\<possible suffix>% +\<possible space(s)> + +\item[] +\<possible prefix(es)> \is +\<prefix>\<possible prefix(es)> \ili \<none> + +\item[] +\<prefix> \is {\tt / \ili , \ili = \ili > +\ili < \ili \_ \ili ' \ili ` \ili \verb"~" \ili " \ili . \ili : \ili +* \ili \verb"^"} + +\item[] +\<possible suffix> \is \<command> \ili \<label> \ili \<none> + +\item[] +\<label> \is {\1}\<any sequence of tokens>{\2} \ili +\<any character other than digit or prefix> + +\item[] +\<direction> \is +\<hours direction> \ili \<offsets direction> + +\item[] +\<hours direction> \is {\tt 0 \ili +1\<{\rm delimiter}> \tt \ili 2 \ili +3 \ili 4 \ili 5 \ili 6 \ili 7 +\ili 8 \ili 9 \ili 10 \ili 11 \ili 12} + +\item[] +\<{\rm delimiter}> \is \<space>, if the next token is a digit, +otherwise \<none>. + +\item[] +\<offsets direction> \is \<sign>\<cardinal number>% +\<sign>\<cardinal number> + +\item[] +\<plus or minus> \is {\tt +} \ili {\tt -} + +\end{description} +% +These rules eventually expand +syntax elements in angular brackets either to definite tokens or something +seemingly requiring no further explanation. Nothing is said, however, on +meaning of prefixes or what \<offsets direction> means. Semantics of +distinct syntax elements is systematically explored in the following three +sections. + +\subsection{Prefixes} + +\begin{table}[tbh]\centering +{\bf Table 1.} Prefixes.\par +\medskip +\begin{tabular}{c|c|c|c} +prefix&feature&view&category\\ \hline\hline +\tt /&skew&\stree{/2}&\\ \cline{1-3} +\tt //&very skew&\stree{//2}&direction\\ \cline{1-3} +\tt ,&at 45$^\circ$&\stree{,2}&prefixes\\ \cline{1-3} +{\tt+} {\tt-}&\<sign> in offsets directions&&\\ +\hline\hline +\tt =&double centered&\stree{=3}\\ \cline{1-3} +\tt >&double right&\stree{>3}&\\ \cline{1-3} +\tt <&double left&\stree{<3}&bond\\ \cline{1-3} +\tt ==&triple &\stree{==3}°rees\\ \cline{1-3} +\tt ">&right delocalized&\stree{">3}&\\ \cline{1-3} +\tt "<&left delocalized&\stree{"<3}&\\ +\hline\hline +\tt \_&long ($5/3$ normal)&\stree{_3}&bond\\ \cline{1-3} +\tt '&short ($1/3$ normal)&\stree{'3}&length\\ +\hline\hline +\verb"~"&invisible &\\ \cline{1-3} +\verb"~~"&invisible label&\\ \cline{1-3} +\tt :&dotted&\stree{:3}&visual\\ \cline{1-3} +\tt *&bold&\stree{*3}&effects\\ \cline{1-3} +\verb"^"&arrow&\stree{^3}\\ \cline{1-3} +\verb"^*"&sphenoid&\stree{^*3}\\ +\hline\hline +\tt .&short invisible&\stree{C.2*}&used for marks +\end{tabular} +\end{table} + +Previously we already used prefix {\tt>} to specify double +bonds. The full list of prefixes is given in Table 1. All the prefixes are +divided into four categories due to their effect +on a bond direction, type, length, or appearance. +Prefixes of different categories can be combined with each other. For +example, a result of \verb"\stree{_/:=4}" is a long skew dotted double bond +at 4 o'clock: \stree{_=:/4}\ Let us consider, however, more helpful cases of +prefixes use. + +Prefix {\tt.}\ (point) is especially designed to set numbers or similar +symbols of vertices. E. g.,\ to obtain the following formula +with numbered vertices \stree{{HO}.01 2.02 4.03 2{OH}.04}\ one have to +enter \0stree\1\1HO\2 .01 2 .02 4 .03 2\1OH\2 .04\2\rm\ (all spaces are +dispensable here). In the full agreement with the form +\<prefix>\<direction>\<suffix> a construction like {\tt.01} means the +following: put a {\sl short invisible\/} bond at {\sl 0 hours\/} and set +label ``1''. Meantime, use of this prefix has two features: 1) +a current vertex is not changed, and 2) a direction preceded +by a point {\sl must\/} be followed by a label. Moreover, {\sl any\/} +character at this place is necessarily regarded as a label. It allows not to +take, say, digit ``1'' in figure brackets without risk of missing it with a +1-hour direction.{\sloppy\par} + +Symbols of vertices are usually smaller than other characters. +A corresponding font definition is hold in macro \verb"\numfnt" +which normally equals to \verb"\small". By changing it to, say, +\verb"\mit" one can further mark vertices with math symbols +just writing something like {\tt.0a} (evidently, a font for every label can +be specified also explicitly, e.\ g.,\ \verb".0{\bf 9}"). + +%{\samepage +\rpic{\stree{:1:3:5^*7**9*^11}} +Three other prefixes were used to typeset the dummy +stereoformula in this paragraph: \verb"\stree{:1 :3 :5 *^7 **9 *^11}" (a +result of a clockwise traversal starting from the left vertex). Here the +use of colon {\tt:} to draw dotted bonds is quite transparent. It is worth to +note the same combination \verb"*^" to produce first time a widening sphenoid +bond and second time --- a narrowing one according to a previous bond +thickness. Such a program acumen is welcome until one need to explicitly +specify a bond shape. The simplest way to get control over it is to +insert a void bond of a complementary thickness. Thus, the isolated +narrowing bond \stree{**17 *^3}\ is input as \verb"\stree{**17 *^3}", where +17 means an ``unexistent'' direction corresponding to a void bond of a null +length. + +Please note also the lower bond to be {\sl very\/} bold (input with +two {\tt*}). Merely bold bonds (introduced with one {\tt*}) are twice as +thin, and doubly bolder than common ones. The normal thickness ({\tt 0.4 pt}) +is enough for paper documents. However, such output might look too pale +on a transparent film. To obtain a more bold formula one may either use +{\tt*} before every bond or say \verb"\defwmode=1" in the beginning of a +document (\verb"\defwmode=0" returns the normal thickness). + +Prefix {\tt'} (apostrophe) allows to input short ``dashes'' +usually denoting free valences in fragments. For example, +\verb"\stree{'8'0 4'6 2N '0'4}" gives formula +\stree{'8'0 4'6 2N '0'4}. A short bond, like +short invisible one, do not alter a current vertex. + +A pure invisibility can be achieved by prefix \verb"~" +(a tilde). Invisible bonds well conform to unconnected formulas. +E. g., reaction scheme +$$\stree{{H$_2$C} =3{CH$_2$} ~6{CH$_2$} =9{H$_2$C}} +\quad\longrightarrow\quad \stree{3690}$$ can be input as +\begin{verbatim} +\stree{{H$_2$C}=3{CH$_2$} ~6{CH$_2$}=9{H$_2$C}} +\quad\longrightarrow\quad \stree{3690} +\end{verbatim} +The invisibility is also helpful for alignment purposes. The main idea is to +poise beetling substituents with their invisible counterparts. Let the +following three isomers be placed in a row: $$ \stree{O =2 [~0] 4 [~6] 2 +4{Cl}}\quad\stree{4 6\O 2 ~~0\O 4{Cl}}\quad\stree{4 ~~6\O 2 0\O 4{Cl}}$$ +Since formulas base lines pass through their +geometric centers, the right decision is +\begin{verbatim} +\stree{O =2 [~0] 4 [~6] 2 4{Cl}} \quad +\stree{4 6\O 2 ~~0\O 4{Cl}} \quad +\stree{4 ~~6\O 2 0\O 4{Cl}}" +\end{verbatim} +A small +explanation is required here. First, the new command \verb"\O" is intended +for a carbonyl group. Second, two tildes at once in clauses \verb"~~0\O" and +\verb"~~6\O" extend invisibility to both a bond and a label which ends a bond +(one tilde would leave hanging ``O''). + +Thus the combined use of prefixes gives a variety of useful effects within a +limited set of tokens. Absence of digits and letters in this set +allows to easy distinguish prefixes from other syntax elements. +Only tokens {\tt+} and {\tt-} do not suit this picture: they are used to set +\<offset directions> whose meaning will be discussed in the following +section. + +\subsection{Directions} + +\rpic{\stree{0,23,56,89,11}} +Let us systematically consider all different ways to specify bond directions. +In addition to twelve {\em straight\/} directions (agreeing with numbers of +hours) one can derive about twice as more of them with the aid of prefixes +{\tt/} or {\tt,} (see fig.\ 1). A comma applied to one of the four numbers +({\tt2}, {\tt5}, {\tt8}, or {\tt11}) produces four {\em median\/} directions +at 45$^\circ$ to the horizon (they usually appear in 8-member cycles +like one in this paragraph). + +\begin{figure}\centering +\def\znakf#1{\tt #1} +\begin{tabular}{cccc} +\stree{[0.00][1.1 1][2.22][3.33][4.44][5.55][6.66][7.77][8.88][9.99]% +[10.10{10}][11.11{1\rlap1}]}& +\stree{[,2.,2{,2}][,5.,5{,5}][,8.,8{,8}][,11.,11{,11}]}& +\stree{[:1][:2][:4][:5][:7][:8][:10][:11]% +[/1./1{/1}][/2./2{/2}][/4./4{/4}][/5./5{/5}][/7./7{/7}][/8./8{/8}]% +[/10./10{/10}][/11./11{/11}]}& +\stree{[:1][:2][:4][:5][:7][:8][:10][:11]% +[//1.//1{//1}][//2.//2{//2}][//4.//4{//4}][//5.//5{//5}][//7.//7{//7}]% +[//8.//8{//8}][//10.//10{//10}][//11.//11{//11}]}\\ +straight&median&skew&very skew +\end{tabular}\par\medskip +{\bf Figure 1.} Bond directions (dotted lines show straight directions for a +comparison with skew ones). +\end{figure} + +The other prefix {\tt/} (a slash) can precede all non-orthogonal +directions making them to decline toward the nearest +coordinate axis by $\simeq10^\circ$. These directions (let them be called +{\em skew\/}) well conform to 5-membered cycles. A pentagon is usually drawn +with one strictly vertical or horizontal side. If two bonds adjacent to that +side are made skew, then the figure becomes almost right: +$$ +\stree{/1124/79}\quad\tabcolsep=0pt +\begin{tabular}{l}\0stree\1\\\tt/11 2 4 /7 9\2\end{tabular} +\qquad +\stree{0/257/10}\quad\tabcolsep=0pt +\begin{tabular}{l}\0stree\1\\\tt0 /2 5 7 /10\2\end{tabular} +$$ + +An irregular 5-membered ring +{\bondlen3.5mm\stree{0_36810}} +may also appear in formulas. Here are no skew directions, but one bond is +$2/3$ longer than others. The extra length is set by prefix \verb"_" +(an underscore), +and the whole formula is input as +\verb"{\bondlen3.5mm\stree{0 _3 6 8 10}}" (here assignment +\verb"\bondlen3.5mm" answers for the reduced size of the formula, while the +figure brackets bound the diminution). + +To look decent, 7-membered rings require another eight directions which lie +even closer than skew ones to coordinate axes. These directions hold +notation of {\em very skew\/} and require one more slash. Their use is +illustrated below: +$$ +\stree{1//2468//1011}\quad\tabcolsep=0pt +\begin{tabular}{l}\0stree\11 //2\\\tt4 6 8 //10 11\2\end{tabular} +\qquad +\stree{531//11108//7}\quad +\begin{tabular}{l}\0stree\15 3 1\\\tt//11 10 8 //7\2\end{tabular} +$$ + +Thus twelve numbers 0--11 optionally prefixed with {\tt,} or {\tt/} can +compose $12 + 4 + 8 + 8 = 32$ different directions. Although it seems to +cover a majority of formulas, in some cases a more general device is +required. Due to it a direction is set by means of {\sl two\/} numbers +denoting horizontal and vertical bond offsets. The offset unit (called {\em +a quad\/}) equals $1/6$ of the default bond length. Each offset is a cardinal +number starting with a {\sl binding\/} sign {\tt+} or {\tt-} (the +sign allows not to miss offsets from numbers of hours) and finishing by some +non-digit. Let us comment the following example of offset directions use: + +$$ +\begin{tabular}{cc} +\stree{202/4-5-6//8-2+2 02[+1+5[=01042]+1-7]/428+2-2}& +\begin{tabular}{l} +\verb"\stree{202/4-5-6//8-2+2 "\\ +\verb"02[+1+5[=01042]+1-7]/428+2-2}" +\end{tabular} +\end{tabular} +$$ + +Having a figure of a formula is always helpful. Moreover, if it contains +bonds of nonstandard length and/or direction, one should prefer a +grid paper, one quad per a grid cell. Meanwhile preparing of such a figure +requires a bit of skill, the further description in \verb"\stree" is rather a +mechanical procedure. One should only keep in mind that bonds with the +short to long side proportion $0:6$ and $3:5$ correspond to straight, +$2:6$ --- to skew, and $1:6$ --- very skew directions and thus can be +specified via numbers of hours. + +Let us start from the left methyl group +and traverse the adjacent 5-membered ring clockwise. The first three bonds on +this way are straight (at 2, 0, and 2 hours), the next one is skew at 4 +hours. The next bond (5 quads left and 6 down) does not conform to any +``clock'' proportion and thus is wrote as {\tt-5-6}. For the last bond (6 left +and 1 down) we use notation {\tt//8}, though {\tt-6-1} is also acceptable. +The next object is the distorted hexagon around the just completed ring. Here +sequence {\tt-2+2 02} leads to the bridge across the two rings (the bridge +description is given in square brackets). The remained path to the first ring +is described by {\tt/428+2-2}, where pair {\tt28} corresponds to the methyl +group (a more general way {\tt[2]} fits too). + +In this example all optional spaces were omitted. The single space +is required only between {\tt-2+2} and {\tt02[}. Indeed, with no space +{\tt-2+202} would mean 2 quads down and 202 right --- a very long bond! The +necessity to bind numbers is not the only specialty of +offset directions. They also can not be used +before commands which draw more than one bond (an explanation of this +feature is leaved on section ``commands''). + +\subsection{Labels} + +However, before coming to commands one should stay on simpler suffixes, i.\ +e.,\ labels. Let us repeat the most significant rules. If a bond leads to a +labelled vertex, then this label must be wrote immediately after the bond +direction. No spaces are allowed before a label or a command\footnote{Since +neither label nor command can start with a digit, this rule could not +contradict with the necessity to separate numbers of quads or digit 1 +denoting a 1-hour direction.}. If a label consists of many characters, or +is a digit, or any character reserved for prefixes, then it must be taken +in figure brackets. If a label is just a letter (e.\ g.,\ C, N, O, H) then +brackets are needless (however it would not be an error to put them). + +A vertex label requires all adjacent bonds to become shorter to avoid the +mutual superposition. The main duty of \treeTeX\ just lies in +proper calculation of label dimensions to update coordinates of lines +which depict bonds. Because \TeX\ has no arrays, only one current label (its +metrics) is remembered each moment. A complete traversal of a structure +may require some vertices to be met twice. Each time a vertex is met, its +label has to be specified again. E. g.,\ if formula +$$\stree{{HO}3N3\6}$$ is traversed from vertex OH to N and along the ring +back to N, then the nitrogen label should be set twice: +\verb"\stree{{HO}3N 1 3 5 7 9 11N}". Absence of last {\tt N} would result in +crossing the first label N by the last 11-hours bond (since the fact of a +label presence here is already forgotten). Meantime, square brackets allow +almost always to avoid plural coming at a label. In our case, for example, +the following construction will do: \verb"\stree{{HO}3N [5] 1 3 5 7 9}". +Everything inside square brackets passes as if unnoticed: the closing +bracket makes vertex N to be reminded so that the next 1-hour bond is drawn +correctly. + +A careful reader may note many formulas (e.\ g.,\ the last one) to begin +just from a label instead of a prefix or a direction as the formal syntax +implies. Here a tiny trick works: number {\tt17} (i.\ e.,\ a void direction) +is always inserted at the very beginning of an argument of \verb"\stree" +before its processing. If an argument begins with a prefix or a direction, +then {\tt17} does nothing, otherwise {\tt17}\<label> will set this \<label> +in a current point. + +Another formal syntax violation belongs to justification of long labels. +Evidently a label with more than one character allows diverse +dispositions relative a vertex center. The default rule states: if a bond goes +left (i.\ e.,\ has negative horizontal offset) then the vertex center +coincides with the center of the most right character, otherwise (a +bond is vertical or goes right) --- the left one. Although it works +perfectly with most terminal moieties, ``internal'' labels may require +additional devices. + +%{\samepage +\rpic[pyrrole]{\stree{~'8/>13/>58`{NH}10}} +For example, the habitual clockwise traversal of the pyrrole structure +would imply label NH to be justified by H instead of N as it +should be. The default orientation may be altered by prefix +{\tt`} (back apostrophe): \verb"\stree{/>1 3/>5 8`{NH} 10}". Since +{\tt`} controls a behavior of a label (on contrary with the others +answering for bonds), this prefix is the only exception allowed to stay +before a label (of course, construction \verb"`8{NH}" is also true though not +as logical as \verb"8`{NH}"). +%\par} + +%{\samepage +\rpic{\stree{/>13/>58``{NH}10}} +But let us return to the pyrrole. One may find the centered label (in this +paragraph) to be more appropriate. Here the vertex center coincides with +the center of the whole label, that is achieved by doubling the same +prefix: \verb"8``{NH}". However, one can get more fine effects by means of +\TeX\ boxes, kerns, and glue (the next paragraph implies a reader to +be familiar with these things). +%\par} + +\rpic{\stree{/>1 3/>5 8``{\vtop{\baselineskip=0pt \hbox{N}\hbox{H}}}10}} +Indeed, both pyrrole formulas are not perfect, and one may try the vertical +form of label NH by means of the following long construction: +\0stree\1/>1 3/>5 +8``\1\0vtop\1\0baselineskip=0pt \0hbox\1N\2\0hbox\1H\2\2\2 +10\2\rm. Let us comment it. Two {\tt``} +before the label prevent an ``automatic'' alignment by some marginal +token --- evidently it is undesirable here. \TeX\ primitive \verb"\vtop" +makes a vertical box aligned by the topmost of contained boxes. In our case +base lines of \verb"\hbox{N}" and whole \verb"\vtop" coincide, or, in +other words, the height of \verb"\vtop" equals to the height of +\verb"\hbox{N}". As \treeTeX\ ignores a box depth while setting a label, the +vertex center will just coincide with the center of N\@. Without assignment +\verb"\baselineskip=0pt" N and H would stand from each other as far as lines +in a common paragraph. Funny, but almost the same result is achievable via a +short invisible bond at 3 quads down: +\verb"\stree{/>1 3/>5 8N [~-0-3H] 10}") +(however, in this case a gap between N and H is dependable on fonts +used for labels). {\sloppy\par} + +\subsection{Commands} + +\begin{table}\centering +{\bf Table 3.} The available commands.\par\bigskip +\begin{tabular}{rl|rl|rl} +\verb"\ph"&\stree{3\ph'9}&\verb"\tbu"&\stree{3\tbu}&{\tabcolsep=0pt +\begin{tabular}{r}\verb"\O"\\\verb"\CO"\end{tabular}}&\stree{3\O'11'7}\\ +&&&&\\ \hline &&&&\\ +\verb"\pho"&\stree{3\pho'9}&\verb"\tbx"&\stree{3\tbx}&\verb"\OH"&\stree{3\OH}\\ +&&&&\\ \hline &&&&\\ {\tabcolsep=0pt +\begin{tabular}{r}\verb"\six"\\\verb"\6"\end{tabular}}&\stree{3\6'9}& +\verb"\ip"&\stree{3\ip}&\verb"\COOH"&\stree{3\COOH}\\ +&&&&\\ \hline &&&&\\ +&&\verb"\Me"&\stree{3\Me}& +\end{tabular} +\end{table} + +A command may substitute a label in the role of a suffix. We mean a +regular \TeX\ command composed from signal character \verb"\" and either +one non-letter or a sequence of several letters. Specific commands +may be used {\sl inside\/} command \verb"\stree" to facilitate input of some +fragments (see Table 3). All the available commands do not +change a current vertex (though it is not a rule to obey). The reason of +such behavior is evident for one-valence moieties, constituting columns 2 and +3 in Table 3. Cyclic fragments allow more flexible use. Terminal cycles +require an additional bond before a command in the same direction (e.\ g.,\ +biphenyl is input as \verb"\stree{9\ph 3 3\ph}"). It might seem not very +comfortable unless it allowed to easy input condensed cycles and simple +heterocycles: $$ +\begin{tabular}{ccccc} +\stree{10\6 2\6}&\begin{tabular}{l}\verb"\stree{"\\ +\verb"10\6 2\6}"\end{tabular}& & +\stree{N3\6 9\Me}&\begin{tabular}{l}\verb"\stree{"\\ +\verb"N3\6 9\Me}"\end{tabular} +\end{tabular} +$$ + +A fragment is drawn in a direction which precedes a command (all figures +in table 3 correspond to 3 o'clock). Sometimes a direction affects a label +view or a whole fragment ``chirality''. +An example is command \verb"\COOH" which always places the carbonyl oxygen on +top (try to ascertain in it). +The definition of \verb"\COOH" worth to be considered fully: +% +\begin{verbatim} +\def\COOH#1{{ % argument #1 = direction in hours + \ang=#1 % remember the initial direction + \b\ang[C] % draw a bond ending with label C + \ifnum\ang>6 % if more than 6 hours then + \rot2 % turn 2 hours right, + {\bt2\b\ang[O]} % put the carbonyl =O, + \rot8 % turn 8 hours right (= 4 left), + \OH\ang % draw -OH + \else % otherwise + \rot2 % turn 2 hours right, + \OH\ang % draw -OH, + \rot8 % turn 8 hours right, + {\bt2\b\ang[O]} % draw =O + \fi}} +\def\OH#1{{\ifnum#1>6\b{#1}[HO]\else\b{#1}[OH]\fi}} +\end{verbatim} +% +Let us explain three new commands used in this listing. The most important +one is \verb"\b" which does draw a bond in a given direction (the first +binding parameter) and set an optional label taken in square brackets. Use +of variable \verb"\ang" instead of an absolute value makes a description +dependable on an initial direction handed via the first parameter. After +assignment \verb"\ang=#1" this variable undergoes only relative increment +corresponding to a rotation on a cardinal number of hours. Use of special +command \verb"\rot" for this purpose guarantees the resulting value to be +kept within 11 hours. Evidently, that simple arithmetic is applicable only to +directions expressed in numbers of hours. It explains why offset directions +are not allowed before commands drawing more than one bond. + +Command \verb"\bt2" changes the character of a bond to double +centered (equivalent to the action of prefix {\tt=}). Other +bond attributes (visibility, thickness, etc.)\ can be altered too by means +of some control variables which however are not listed here. These +specific data, if required, can be obtained from the source file {\tt +stree.sty}. + +Additional figure brackets in definitions of \verb"\COOH" and \verb"\OH" +involve the common grouping mechanism of \TeX\ to restore a current vertex +after the command action. Let us +also note a simpler command \verb"\OH" to be used inside +\verb"\COOH". The logic of \verb"\OH" itself is limited to the choice of +either label OH or HO depending on a bond direction. + +The set of commands to draw fragments may seem poor and inrepresentative. Its +further extension, however, is in question, since the description on the +level of bonds and labels is laconic enough to expect big advantages +from broad use of internal commands. The optimal case assumes a few simple +commands, easy to be used and kept in mind. It does not mean, however, that +defining of new commands is always senseless. So, authors of math papers +often draw graphs with ``shot'' vertexes, e.\ g. +$$ +\def\*#1{\b{#1}[$\bullet$]} +\stree{\*5\*[7\*]3\*1\*3\*5\*7\*9\*11\*} +$$ +Bearing in mind \TeX\ notation \verb"$\bullet$", one might honestly +input the graph as \verb"{$\bullet$} 5{$\bullet$} [7{$\bullet$}" \ldots\ but +there is no better way: to define command \verb"\*" for setting a bullet in +a given direction (\verb"\def\*#1{\b{#1}[$\bullet$]}") and then describe +everything much shorter as \verb"\stree{\*5\*[7\*]3\*1\*3\*5\*7\*9\*11\*}". + +Indeed, suffix commands may have an additional parameter which must +immediately follow a command and be in figure brackets. Accidentally this +feature can be applied for input of flow charts composed from standard +polygons, e.\ g., + +$$ +\def\(#1,#2){\sx#1\sy#2\ab30[]} +\def\com#1[#2]{\(15,0)\(0,-6)\(-3,-3)\(-27,0)\(0,6)\(3,3)\(12,0) + \bmode-1 \dmode2 \sy-5 \ab30[#2]\bmode-1 \(0,-4)} +\stree{0\com{sugar}-0-3+20-0[+20-0-0+3~-0+9 0\com{milk}] +::-0-3 0\com{coffee}::-0-3} +$$ + +After defining a polygon by means of command \verb"\com" +% +\begin{verbatim} +\def\(#1,#2){\sx#1\sy#2\ab30[]} % draw a bond offset (#1,#2) +\def\com#1[#2]{\(15,0)\(0,-6)\(-3,-3)\(-27,0)\(0,6)\(3,3) + \(12,0)\bmode-1 \dmode2 \sy-5 \ab30[#2]\bmode-1 \(0,-4)} +\end{verbatim} +% +one can input the whole scheme as kind of a chemical formula: +\begin{verbatim} +\stree{0\com{sugar}-0-3+20-0 +[+20-0-0+3~-0+9 0\com{milk}] +::-0-3 0\com{coffee}::-0-3} +\end{verbatim} + +Let us make necessary comments. Variables \verb"\sx" and \verb"\sy" contain +offsets used for a bond if its direction equals a conditional value of 30 +hours. Assignment \verb"\bmode-1" makes a bond invisible while +\verb"\dmode2" answers for a centered label (equivalent to {\tt``}). + +This example completes +the systematic consideration of +all the components in a bond description. +Now a bit else remains: how to use \verb"\stree" inside other \LaTeX\ +constructions, i.\ e.,\ alignment modes. + +\section{Alignment} + +By default, \verb"\stree" with the aid of \LaTeX\ environment \verb"picture" +produces \verb"\hbox" whose height slightly (by {\tt1ex}) exceeds its depth. +This small difference makes structures to conform with math symbols in +displayed formulas. E.~g.,\ the following equation +$$ +\stree{9\6 3\OH}+\stree{9\OH 1\O +5\Me}\longrightarrow\ \stree{9\6 3O 3 1\O 5\Me}+\stree{{H$_2$O}} +$$ +is input just as +\begin{verbatim} +\stree{9\63\OH}+\stree{9\OH1\O5\Me}\longrightarrow +\stree{9\63O31\O5\Me}+\stree{{H$_2$O}} +\end{verbatim} + +Vertical alignment may also be specified explicitly with the aid of a token +in square brackets put immediately after \verb"\stree". In agreement with +the \LaTeX\ conventions {\tt[t]} means top alignment and {\tt[b]} --- bottom +(a centered box is obtained by default, making use of {\tt[c]} +obsolete). Parameter {\tt[u]} (no alignment) leads to a box with null +dimensions at the place of a starting vertex. This is useful if \verb"\stree" +itself is a part of another picture whose elements are bind to vertices. +Since all vertices are situated in nodes of a one quad sized grid, knowing of +exact coordinates of one vertex allows all the others to be easy +calculated. Use of {\tt[u]} guarantees this knowledge for a starting vertex, +whereas other parameters --- do not, since a box produced by \verb"\stree" in +these cases accurately bounds everything found in a formula: labels, marks, +etc. + +On the other hand, variant {\tt[u]} makes a user himself to monitor +sizes of a formula. There is still a way deprived of this drawback: +instead of \verb"\stree{" \<description> {\tt\2} one can write +\verb"\begstr \tree{" \<description> \verb"} \endstr". +Before \verb"\endstr" or after \verb"\begstr" any \LaTeX\ +commands for \verb"\picture" environment are allowed as if +coordinates (0,0) belong to a starting vertex and +unit of measure \verb"\unitlength" equals +the standard bond length \verb"\bondlen". +In the following example this method is used to +mark a fragment with a dashed box: +$$\begstr +\tree{9\OH1//2[~/7{$R_1$}]4[0~2][6]/2539>760/108[-4-5/118~9{$F_1$}]//1011} +\put(-2,-2){\dashbox{0.2}(4.8,3.8){}} +\endstr +$$ +This figure is input as +\begin{verbatim} +\begstr +\tree{9\OH1//2[~/7{$R_1$}]4[0~2][6]/2539>760/108 + [-4-5/118~9{$F_1$}]//1011} +\put(-2,-2){\dashbox{0.2}(4.8,3.8){}} +\endstr +\end{verbatim} + +\section{Additional features} + +Chemical character of this work allows us to note also the +ability to input mass and \CNMR\ spectra with \treeTeX. For example, the +spectrum +$$ +\massp{220-18!187-33!135-26!133-25,121-100!14,2,107-38!43-35,41-41!} +$$ +is obtained in result of +\begin{verbatim} +\massp{220-18!187-33!135-26!133-25,121-100!14,2, + 107-38!43-35,41-41!} +\end{verbatim} +Here is just a sequence of numbers divided by punctuation marks: +a mass number is ended by a dash, a relative intensity (in percents) --- by +either comma or exclamation. The last makes an $m/z$ value to be +set over a peak. Several intensities following one mass number (e.\ g.,\ {\tt +121-100!14,2,}) correspond to neighbor peaks with increasing +$m/z$. A comma may be omitted if it is the last token in a \verb"\massp" +argument. + +The four parameters control a mass spectrum view: +\begin{itemize} +\item +\verb"\mzlen" --- the horizontal distance corresponding to 1 $m/z$\\ +(default \verb"\mzlen=0.6pt"), +\item +\verb"\imax" --- the height of the maximal peak in units of \verb"\mzlen"\\ +(default \verb"\imax=50"), +\item +\verb"\numfnt" --- the font used to set numbers on a figure\\ +(default \verb"\def\numfnt{\small}"), +\item +\verb"\msdir" --- the direction of peaks. +\end{itemize} +% +The last parameter is rarely used. Default \verb"\msdir=1" means the common +direction --- upward; any other value make peaks to be oriented downward. The +last case may be useful for visual comparison of two spectra: +$$ +\begms +\mass{39-11,0,21,51-5,7,15,64-5,35,7,77-10,5,91-4,74!27,104-6, +119-26,132-42,4,159-26,81!8,176-15,187-93!12,204-4,232-100!14} +\put(-1,0){\line(1,0){250}}\msdir=-1 +\mass{39-16,51-7,6,15,65-11,8,77-5,92-73!24,104-9,119-15, +132-21!159-26,100!14,176-16,187-83!14,204-3,232-70!}\vpos=1 +\endms +$$ +This figure is input in the following way: +% +\begin{verbatim} +\begms +\mass{39-11,0,21,51-5,7,15,64-5,35,7,77-10,5,91-4,74!27,104-6, +119-26,132-42,4,159-26,81!8,176-15,187-93!12,204-4,232-100!14} +\put(-1,0){\line(1,0){250}}\msdir=-1 +\mass{39-16,51-7,6,15,65-11,8,77-5,92-73!24,104-9,119-15, +132-21!159-26,100!14,176-16,187-83!14,204-3,232-70!}\vpos=1 +\endms +\end{verbatim} +% +By analogy with \verb"\stree", instead of +\verb"\massp{" \<argument> \verb"}" one can write +\verb"\begms \mass{" \<argument> \verb"} \scale1{} \endms" and insert +any commands from the \LaTeX\ {\tt picture} environment +after \verb"\begms" or before \verb"\endms". In our example a common scale +drawn by \verb"\scale1{}" is substituted by the plain horizontal (its length +is the rounded maximal mass number in the spectrum), and then another +spectrum is drawn contrariwise since it is preceded by \verb"\msdir=-1". +Finally, assignment \verb"\vpos=1" switches on the bottom alignment (i.\ e.,\ +the box depth equals zero). Though command \verb"\massp" itself presumes the +common alignment control with the aid of parameters {\tt[b]}, {\tt[c]}, or +{\tt[t]}, on the lower level there acts variable \verb"\vpos" (it is true +also for the decomposition of \verb"\stree" onto \verb"\begstr", +\verb"\tree", and \verb"\endstr"). Value 0 means center alignment (same as +parameter {\tt[c]}), 1 --- bottom ({\tt[b]}), 2 --- top ({\tt[t]}), and 3 --- +no alignment (valid only for structural formulas and corresponds to {\tt[u]}). + +\treeTeX\ also allows to input simple figures of \CNMR\ spectra like the +following (a peak height reflects its multiplicity): +$$ +\cnmrs{2000}{1912s1645s354d1041s{\llap{$^b\searrow$}}% +901s138q1576s1703s575q912d1047d{$*$}566q1696s1956s571q953s395t} +$$ +The corresponding text is: +% +\begin{verbatim} +\cnmrs{2000}{1912s1645s354d1041s{\llap{$^b\searrow$}}% +901s138q1576s1703s575q912d1047d{$*$}% +566q1696s1956s571q953s395t} +\end{verbatim} +% +Command \verb"\cnmrs" has two binding parameters: first is the scale length +(in $\hbox{p.\,p.\,m.}*10$), and second --- a spectrum description which +contains for each signal its chemical shift value (multiplied by 10) and +multiplicity, where {\tt s} means singlet, {\tt d} --- doublet, {\tt t} --- +triplet, and {\tt q} --- quartet. A peak label may be set in figure brackets +after a multiplicity token (in our case construction +\verb"\llap{$^b\searrow$}" is used to shift the label left and prevent its +interference with the neighbor doublet marked by a star). + +Both kinds of spectra are input in quite a similar way: as a +sequence of numbers with delimiters. However, there are small differences. So, +long command \verb"\massp" can be broken in strings at any places, though in +\verb"\cnmrs" end of line should be commented by \verb"%". +Besides, in \verb"\cnmrs" the scale (and so whole figure) length is set +implicitly, while for a mass spectrum the total length depends on a largest +$m/z$ value (to obtain a mass spectrum with a given length one could +just specify a void peak with null intensity and corresponding $m/z$). + +\section{Conclusion} + +An apparent question might arise during acquaintance with this work: does +somebody need to study another ``bird language'' to input chemical +formulas if a plenty of convenient programs for visual +editing exist? Essentially it is an old +dispute {\sl pro et contra\/} a command interface vs.\ graphic one. +Professional programmers know very well that a command language provides a +faster and more flexible control though it requires more time for studying. +Indeed there is no contradiction between these modes of interaction, and the +optimal case should include both abilities. Anyhow, in preparation of +scientific manuscripts words do play the main role, i.\ e.,\ a writer +basically remains in the verbal mode of thinking. If numerous +chemical formulas in a text are input by a graphic editor then a +writer will frequently switch from one program to another. Even if the +switching is fast and elegant (a case rarely met in practice), the change of +the interface mode will still require some psychological adaptation. In this +case an ability to input a formula just in text without tackling a mouse and +becoming a designer could save you a lot of time and mind energy. + +\section*{References} +\frenchspacing\parindent=0pt +\parskip=2ex + +Knuth D. (1984) +\sl The \TeX book.\/ +\rm Addison-Wesley, Reading. + +Lamport L. (1984) +\sl \LaTeX: A Document Preparation System.\/ +\rm Addison-Wesley, Reading. + +Ramek M. (1990) +\sl \TeX: Applications, Uses, Methods. +\rm ed. Clark M., p. 227. +Ellis Horwood, London. +%227--258 + +Haas R. T. \& O'Kane K. C. (1987) +%Typesetting Chemical Equations Using \LaTeX. +\sl Comput. Chem.\/,\bf\ 11,\rm\ 251 +%251--271 + +Fujita S. (1994) +%Typesetting Structural Formulas with the Text Formatter \TeX/\LaTeX. +\sl Comput. Chem.\/,\bf\ 18,\rm\ 109 +%109--116 + +\end{document}
\ No newline at end of file diff --git a/macros/latex/contrib/streetex/stree_en.pdf b/macros/latex/contrib/streetex/stree_en.pdf Binary files differnew file mode 100644 index 0000000000..b3f86a71e8 --- /dev/null +++ b/macros/latex/contrib/streetex/stree_en.pdf diff --git a/macros/latex/contrib/streetex/stree_ru.lat b/macros/latex/contrib/streetex/stree_ru.lat new file mode 100644 index 0000000000..18877a412f --- /dev/null +++ b/macros/latex/contrib/streetex/stree_ru.lat @@ -0,0 +1,1141 @@ +\documentstyle[12pt,stree,sprivate,russian,chemstr,carom]{article} +\begin{document} + +\def\<#1>{$\langle$#1$\rangle$} +%\def\UPSILON{\char'7} +%\def\XyM{X\kern-.30em\smash{\raise.50ex\hbox{\UPSILON}}\kern-.30em{M}} +%\def\XyMTeX{\XyM\kern-.1em\TeX} +\def\ChemTeX{Chem\kern-0.1em\TeX} +\def\verb{\sverb} + +\def\topfraction{.9} +\def\bottomfraction{.9} +\def\textfraction{.1} + +\def\0{\tt\symbol{92}} +\def\1{\tt\symbol{123}} +\def\2{\tt\symbol{125}} +\def\4{\tt\symbol{36}} +\def\5{\tt\symbol{95}} + +\author{Строков Игорь Иванович} +\title{Еще один макропакет для набора структурных формул в системе \LaTeX} +\maketitle + +\section{Введение} + +Если вы хотите готовить научные статьи или книги типографского качества, то +выбор инструментов обычно невелик: это либо Word, либо \TeX\ --- язык и +система набора документов, созданные на рубеже 70--80-х годов Д. Кнутом [1]. +Если говорить кратко, то главное достоинство \TeX а --- скурпулезный учет +всех мелочей, которые влияют на внешний вид документа и, как следствие, --- +безупречное качество набора, практически недостижимое другими средствами +(особенно если в тексте есть символы математики). С другой стороны, в \TeX е +не очень удобно работать с графикой, хотя в него можно +импортировать растровые изображения (обычно формата {\tt PCX}), при чем +теряется независимость от печатающего устройства, или +документы на языке PostScript. Последнее решение позволяет +получать практически любые визуальные эффекты, однако в среде DOS/Windows до +последнего времени было трудно найти программы, которые бы корректно понимали +PostScript. В то же время \TeX\ сам является своеобразным языком +программирования, который позволяет с помощью псевдографических шрифтов +получать простые векторные диаграммы и рисунки. Наиболее известный вариант +\TeX а, \LaTeX\ [2], практически установил стандарт на применение +псевдографики. В большинстве случаев структурные формулы, встречающиеся в +химических статьях, можно полностью набирать средствами \LaTeX а. Однако +делать это непосредственно с помощью примитивных команд рисования линий и +кругов, конечно, слишком неудобно. Специально для набора химических формул +разными авторами созданы более и менее сложные пакеты макрокоманд. Макрос +Рамека [3] достаточно прост и удобен, но формулы в нем получаются не такие, к +каким привыкли химики-органики. Этого недостатка лишены более сложные +макропакеты \ChemTeX\ Хааса--о'Кейна [4] и \XyMTeX\ Фуджиты [5]. Оба +последних пакета устроены примерно одинаково: каждому характерному элементу +рисунка (обычно такой элемент относится к связной системе циклов) в них +отвечает отдельная макрокоманда, параметры которой позволяют менять вид +заместителей и связей этого элемента. + +Возмем для примера более развитый и упорядоченный +макрос Фуджиты. Например, 5,5-диметилциклогексен-2-он-1 +$$\begin{picture}(800,0)\put(-100,-200){\cyclohexanev[b]{1D==O;5Sb==;5Sa==}} +\end{picture}\quad\stree[b]{3[7]020\O4>6810}$$ +в нем получается по команде +\verb"\cyclohexanev[b]{1D==O;5Sb==;5Sa==}" (для сравнения справа нарисована +та же структура, введенная с помощью нового пакета). В этом, как и в других +случаях, мнемоника команды коррелирует с названием соединения, что может +позволить опытному пользователю по виду команды представить себе, какая в ней +зашифрована структура. С другой стороны, описание формул на уровне крупных +структурных фрагментов влечет за собой ряд недостатков. Прежде всего, таких +фрагментов, которые обычно рассматриваются как целое, в органической химии +очень много, и охватить их полностью практически невозможно. Эта задача не +решается и в пакетах \ChemTeX\ и \XyMTeX, при том, что полное описание +каждого представляет собой довольно солидную книгу. Кроме того, в случаях, +когда большая формула состоит из нескольких фрагментов, их объединение на +одном рисунке может превратиться в утомительную задачу по вычислению +координат стыкуемых узлов. + +В связи с этим оправданным кажется описание формул на более простом +уровне --- с помощью отдельных связей, подобно тому, как это сделано у Рамека +[3]. Разнообразие связей по сравнению с характерными фрагментами структур +значительно меньше, поэтому набор формул в терминах связей должен быть более +универсальным и простым в освоении. Из общих соображений можно предположить, +что сравнительно примитивный уровень описания чреват потерей скорости и +удобства набора, однако субъективный опыт автора говорит о том, что этого не +происходит. Чтобы поддержать это утверждение, рассмотрим, как именно вводятся +структурные формулы в предлагаемом вашему вниманию макропакете \treeTeX. + +По традиции программистов на \TeX е, новый пакет получил название, включающее +общий логотип \TeX. Первая часть названия, ``tree'', отражает способ описания +структурных формул в виде дерева связей. Весь \treeTeX\ реализован в виде +одного небольшого файла {\tt stree.sty}. Как обычно, имя файла без +расширения включается в аргумент команды \verb"\documentstyle". Например, +первая строка в этом документе выглядит так: +\begin{verbatim} +\documentstyle[12pt,stree,russian]{article} +\end{verbatim} + +\section{Основные правила} + +Для набора структурных формул в \treeTeX е используется единственная команда +\verb"\stree{}". Описание формулы содержится в фигурных скобках и получается +так: начав с какой-либо вершины (не важно, с какой), следут обойти всю +структуру, двигаясь по связям и описывая как сами проходимые связи, так и +метки вершин, если они встретятся по пути. Например, формула +1-гидрокси-4-метилпиридина$$\stree{{HO}20?242\Me?68N?10}$$ +вводится как \verb"\stree{{HO} 2 0 >2 4 [2{CH$_3$}] >6 8N +>10}". Начиная в данном примере обход с вершины HO, мы должны поставить в +код ее метку: \verb"{HO}". Метка обязательно заключается в фигурные скобки, +если в ней более одного символа. Следующий символ {\tt 2} означает: +<<провести связь в направлении на 2 часа>> (по циферблату часов). При обходе +формулы всегда есть текущая точка (вершина). Указывая направление связи, мы +перемещаемся из текущей точки в данном направлении (на расстояние, равное +длине связи) и попадаем в другую вершину. Таким образом, после символа {\tt +2} текущей становится вершина кольца (номер 1 по нумерации ИЮПАК). Символ +{\tt 0} описывает следующую связь в направлении на 0 часов (вертикально +вверх). Далее (если продолжать обход кольца по часовой стрелке) следует +двойная связь на два часа. Если связь отличается от простой, то {\sl перед\/} +ее направлением ставится один или несколько символов (так называемых {\em +префиксов\/}), отражающих особенности связи. Двойную связь можно изображать +по разному. В нашем случае желательно, чтобы второй штрих связи был внутри +цикла, {\sl справа\/} от основного. Для достижения этого эффекта перед +двойкой ставится префикс {\tt >} (правая угловая скобка). + +Следующая простая связь на четыре часа приводит к замещенной вершине кольца. +Давайте вначале опишем заместитель, а потом продолжим обход кольца. +Конструкция \verb"[2{CH$_3$}]" содержит описание заместителя и +интерпретируется так: открывающая скобка {\tt [} запоминает текущую +вершину; связь на два часа (символ {\tt 2}) приводит к вершине CH$_3$ +(\verb"{CH$_3$}" --- это описание метки), после чего скобка {\tt ]} +закрывается и возвращает нас к вершине кольца, от которой отходит +заместитель. Последовательность символов \verb"{CH$_3$}" довольно неудобно +набирать на клавиатуре. В то же время метильная группа (CH$_3$) встречается +часто, поэтому для нее был предусмотрен более простой метод ввода с +помощью команды \verb"\Me" так, что конструкция \verb"2\Me" эквивалентна +\verb"[2{CH$_3$}]" (вместо цифры {\tt 2} здесь может стоять любое число, +отвечающее направлению связи). + +После того, как заместитель задан, можно продолжить обход кольца. Остались +три связи: на 6, 8 и 10 часов. Связи на 6 и 10 часов двойные и нарисованы +внутри цикла, что указывается с помощью префикса {\tt +>}. Связь на 8 часов приводит к вершине с меткой N, поэтому символ {\tt N} +стоит сразу за символом {\tt 8}. В данном случае фигурные +скобки вокруг {\tt N} ставить не обязательно, поскольку эта метка состоит из +одного символа. В этом примере для наглядности +группы символов, относящиеся к разным связям, мы разделили пробелами. +Вообще говоря, ставить их не обязательно (команда +\verb"\stree{{HO}20>242\Me>68N>10}" тоже является правильной), но вы +можете использовать пробелы, чтобы визуально структурировать содержимое +команды \verb"\stree". При расстановке пробелов действует только один +запрет: их {\sl нельзя\/} ставить между направлением и меткой или +направлением и командой. Например, в приведенном выше примере написать +\verb"8 N" (а также \verb"2 {CH$_3$}" или \verb"2 \Me") было бы ошибкой. Есть +также один случай, когда пробел нужен {\sl обязательно:\/} между цифрой {\tt +1}, если она обозначает направление на один час, и следующей за ней другой +цифрой.\footnote{Строго говоря, если следующая цифра --- не {\tt 0} или {\tt +1}, то пробел и в этом случае необязателен.} + +\section{Формальное описание} + +Теперь попробуем суммировать и изложить более строго основные правила, +рассмотренные на данном примере. Аргумент команды \verb"\stree" состоит из +описаний отдельных связей. Чтобы описать связь, достаточно задать ее +направление --- чаще всего это число часов от 0 до 11 на 12-часовом +циферблате. {\sl Перед\/} направлением можно поместить один или несколько +префиксов, которые модифицируют длину, кратность, внешний вид или само +направление связи. {\sl После\/} направления может ставится метка вершины, к +которой приводит связь, или команда (имеется в виду команда в терминах \TeX а +--- то, что начинается с сигнального символа~\verb"\"). +Команда --- это средство более краткого описания некоторых часто +встречающихся структурных фрагментов. Метка или команда здесь +рассматриваются как атрибут связи, и, поскольку они ставятся после +направления, их называют также {\em суффиксами.\/} Суффикс, в отличие от +префиксов, может быть только один, и, кроме того, перед суффиксом {\sl +никогда\/} не ставится пробел. Описание связи в форме \<возможные +префиксы>\<направление>\<возможный суффикс>\ отвечает тому, как если бы вы +объясняли обход структуры словами: <<{\sl такая-то\/} связь на {\sl +столько-то\/} часов приводит к {\sl такой-то\/} метке>> --- только вместо +слов {\sl такой-то\/} и {\sl столько-то\/} ставятся условные символы. + +\def\is{$\longrightarrow$ } +\def\ili{\vrule{} } + +Может возникнуть вопрос --- как отличить, например, суффикс текущей связи от +направления или префикса следующей? Для визуального различения, как уже +отмечалось, после описания каждой +связи можно вставлять пробел (если вас не очень заботит избыточный объем +текста). Машина, однако, не обращает внимания на пробелы, а +действует в соответствии с правилами, которые далее приводятся +в записи Бэкуса--Нора (стрелка \is\ обозначает <<определяется как>>, а +вертикальная черта \ili\ значит <<или>>). Начнем с определения аргумента +команды \verb"\stree" (который здесь обозначен как \<структура>): + +\begin{description}%\flushleft +\item[] +\<структура> \is \<пусто> \ili \<связь>\<структура> \ili\protect\\ + \<структура>{\tt[}\<структура>{\tt]}\<структура> +\end{description} +% +Это просто формальный способ сказать, что аргумент состоит из описаний +отдельных связей и может содержать парные квадратные скобки, +возможно вложенные. Далее +определяется, какой вид имеет описание связи. + +\begin{description}\frenchspacing%\flushleft + +\item[] +\<связь> \is \<возможные префиксы>\<направление>\<возможный суффикс> +\<возможные пробелы> + +\item[] +\<возможные префиксы> \is +\<префикс> \<возможные префиксы> \ili \<пусто> + +\item[] +\<префикс> \is {\tt / \ili , \ili = \ili > +\ili < \ili ? \ili \_ \ili ' \ili ` \ili " \ili . \ili : \ili * \ili +\verb"^"} + +\item[] +\<возможный суффикс> \is \<команда> \ili \<метка> \ili \<пусто> + +\item[] +\<метка> \is {\1}\<любая последовательность символов>{\2} \ili +\<любой символ, если это не префикс> + +\item[] +\<направление> \is +\<направление в часах> \ili \<направление в смещениях> + +\item[] +\<направление в часах> \is {\tt 0 \ili +1\<{\rm возможный пробел после единицы}> \ili 2 \ili +3 \ili 4 \ili 5 \ili 6 \ili 7 +\ili 8 \ili 9 \ili 10 \ili 11 \ili 12} + +\item[] +\<{\rm возможный пробел после единицы}> \is \<пробел>, если +следующий символ в описании --- {\tt 0} или {\tt 1}, иначе --- \<пусто> + +\item[] +\<направление в смещениях> \is \<плюс или +минус> \<натуральное число> \<плюс или минус> \<натуральное число> + +\item[] +\<плюс или минус> \is {\tt +} \ili {\tt -} + +\end{description} + +В этих правилах любой синтаксический элемент (конструкция в угловых скобках +\< >) раскрывается в конечном итоге либо в конкретные символы, либо в +элементы, которые не требуют, как кажется, дальнейшего объяснения (например +\<любая последовательность символов>, \<пусто>, \<натуральное число>). +Приведенные правила, однако, ничего не говорят о том, что значит тот или иной +префикс или какой смысл имеет, например, конструкция \<направление в +смещениях>. Семантика отдельных элементов команды \verb"\stree" +систематически рассматривается в трех следующих разделах. + +\section{Префиксы} + +\begin{table}[tbh]\centering +{\bf Таблица 1.} Префиксы.\par +\medskip +\begin{tabular}{c|c|c|c} +префикс&название особенности&пример&категория\\ \hline\hline +\tt /&косая&\stree{/2}&\\ \cline{1-3} +\tt //&очень косая&\stree{//2}&префиксы\\ \cline{1-3} +\tt ,&под 45$^\circ$&\stree{,2}&направлений\\ \cline{1-3} +{\tt+} и {\tt-}&задают направление в смещениях&&\\ +\hline\hline +\tt =&центрированная двойная&\stree{=3}\\ \cline{1-3} +\tt >&двойная справа&\stree{>3}&\\ \cline{1-3} +\tt <&двойная слева&\stree{<3}&кратности\\ \cline{1-3} +\tt ==&тройная &\stree{==3}&связей\\ \cline{1-3} +\tt ">&делокализованная справа&\stree{">3}&\\ \cline{1-3} +\tt "<&делокализованная слева&\stree{"<3}&\\ +\hline\hline +\tt \_&длинная ($5/3$ от обычной)&\stree{_3}&длины\\ \cline{1-3} +\tt '&короткая ($1/3$ от обычной)&\stree{'3}&связей\\ +\hline\hline +\verb"~"&невидимая &\\ \cline{1-3} +\verb"~~"&и связь, и метка невидимы&\\ \cline{1-3} +\tt :&пунктирная&\stree{:3}&визуальные\\ \cline{1-3} +\tt *&жирная&\stree{*3}&эффекты\\ \cline{1-3} +\verb"^"&стрелка&\stree{^3}\\ \cline{1-3} +\verb"^*"&клиновидная&\stree{^*3}\\ +\hline\hline +\tt .&очень короткая невидимая&\stree{C.2*}&для меток +\end{tabular} +\end{table} + +Выше мы уже познакомились с одним префиксом {\tt >}, который испоьзовался для +задания двойных связей. +Полный список префиксов приводится в табл. 1. +Префиксы делятся на четыре категории по влиянию на направление, +кратность, длину или внешний вид связи. Префиксы разных категорий можно +комбинировать друг с другом: например, в результате +\verb"\stree{_=:/4}" получится длинная двойная пунктирная косая связь на 4 +часа: \stree{_=:/4}\ Рассмотрим далее более полезные случаи использования +префиксов и их сочетаний. + +Префикс {\tt .} (точка) --- особенный. Он +влияет и на длину, и на внешний вид связи и используется для того, чтобы +ставить номера или другие метки при вершинах. Например, чтобы +ввести этиленгликоль с нумерацией вершин (\stree[b]{{HO}.01 2.02 4.03 +2{OH}.04}), нужно сказать: \verb"\stree{{HO} .01 2 .02 4 .03 2{OH} .04}" +(все пробелы здесь необязательны). Конструкция {\tt .01} (и аналогичные ей +{\tt .02}, {\tt .03}, {\tt .04}) в полном соответствии с формой \<возможные +префиксы>\<направление>\<возможный суффикс> буквально означает следующее: +провести {\sl короткую невидимую\/} связь {\sl на ноль часов\/} и поставить +метку <<1>>. Однако здесь есть две особенности. Если префикс связи --- +точка, то, во-первых, после такой связи текущая вершина не меняется (как если +бы описание связи было взято в квадратные скобки), и, во-вторых, после +направления {\sl обязательно\/} должна следовать метка. Более того, {\sl +любой\/} символ (или группа символов, заключенная в фигурные скобки) после +направления с префиксом {\tt .} воспринимается как метка. Поэтому в этом +случае мы можем просто поставить после направления на 0 часов +цифру 1, не опасаясь, что она может быть спутана с направлением на 1 час. +Обратите внимание, что номера вершин набраны в меньшем размере, чем +метки вершин и весь остальной текст. Размер и шрифт можно менять с помощью +соответствующих команд, например \verb"\stree{{HO} .0{\tiny1} 2 .02 4 +.0{\large3} 2{OH} .0{\LARGE4}}" дает такой результат: \stree{{HO} .0{\tiny1} +2 .02 4 .0{\large3} 2{OH} .0{\LARGE4}}. Чаще, однако, бывает нужно, чтобы все +номера вершин (или другие метки при вершинах) были в одном стиле. Этот +стиль задается командой \verb"\znakf". Исходно эта команда определена так: +\verb"\def\znakf#1{\small #1}" --- то есть печатать метки размером +\verb"\small". Определение \verb"\znakf" можно изменить (прямо в +своем тексте), чтобы получить жедаемый вид меток по умолчанию: например, после +\verb"\def\znakf#1{#1}" метки станут получаться обычного размера, а после +\verb"\def\znakf#1{$#1$}" --- набираться в математической моде. + +\rpic{\stree{:1:3:5^*7**9*^11}} +Прокомментируем также назначение других префиксов (исключая префиксы +направлений, которые рассматриваются в следующем разделе). Пунктирные, +очень жирные и клиновидные связи, очевидно, нужны для набора +стереоформул. Например, приведенная в этом абзаце формула была введена как +\verb"\stree{:1 :3 :5 *^7 **9 *^11}" (обход велся по часовой стрелке начиная +с самой левой вершины). +Этот пример не имеет практической ценности и только иллюстрирует +особенности использования \verb"^" и {\tt *}. Так, в первом случае +сочетание \verb"^*" обозначает связь {\sl расширяющуюся\/} (\stree{*^3}), +поскольку предыдущая связь была узкой, а во втором --- {\sl сужающуюся\/} +(\stree{**17*^3}), так как перед ней шла жирная связь. Хорошо, когда машина +пытается проявить сообразительность, но иногда необходимо указать явно, в +какую сторону должна расширяться клиновидная связь. +Простой способ добиться желаемого --- задать псевдо-связь нулевой длины и +подходящей толщины, тогда следующая клиновидная связь получится нужного вида. +Например сужающаяся одиночная связь (\stree{**17*^3}) была сейчас введена как +\verb"\stree{**17 *^3}". Для подобных случаев нужно запомнить, что связи +нулевой длины отвечает псевдо-направление на 17 часов. Отметим заодно, что +связь перед плоскостью вводится как {\sl очень\/} жирная (два префикса +{\tt *}). Один префикс {\tt *} отвечает просто жирным связям, которые +примерно в два раза \'уже очень жирных и вдвое толще обычных (опустим вопрос, +для чего они могут пригодиться). + +Префикс {\tt '} (апостроф) позволяет вводить короткие связи, которые обычно +обозначают свободные валентности во фрагментах. Например, формула +\stree{'8'0 4'6 2N '0'4}\ была набрана как +\verb"\stree{'8'0 4'6 2N '0'4}". После короткой связи, как и после +короткой невидимой, текущая вершина не меняется. + +Просто невидимости можно добиться с помощью префикса \verb"~" (тильда). +Невидимые связи удобно использовать для того, чтобы получить формулу, +отдельные части которой не связаны между собой. Например, схему +реакции $$\stree{{H$_2$C} =3{CH$_2$} ~6{CH$_2$} =9{H$_2$C}} +\quad\longrightarrow\quad \stree{3690}$$ можно задать как +\begin{verbatim} +\stree{{H$_2$C} =3{CH$_2$} ~6{CH$_2$} =9{H$_2$C}} +\quad\longrightarrow\quad \stree{3690} +\end{verbatim} +Невидимость также +полезна, если требуется выровнять несколько формул разного размера. Пусть +нужно напечатать рядом три формулы: $$ \stree{O =2 [~0] 4 [~6] 2 +4{Cl}}\quad\stree{4 6\O 2 ~~0\O 4{Cl}}\quad\stree{4 ~~6\O 2 0\O 4{Cl}}$$ +Если просто перечислить их: \verb"\stree{O =2 4 2 +4{Cl}} \quad \stree{4 6\O 2 4{Cl}} \quad \stree{4 2 0\O 4{Cl}}", то +главная цепь в этих формулах окажется на разных уровнях: $$ +\stree{O=2424{Cl}}\quad\stree{46\O24{Cl}}\quad\stree{420\O4{Cl}} \quad,$$ что +не очень красиво. Выход состоит в том, чтобы везде поставить +невидимые заместители, расположенные в противоположном направлении от +видимых: \verb"\stree{O =2 [~0] 4 [~6] 2 4{Cl}} \quad \stree{4 6\O 2 ~~0\O +4{Cl}} \quad \stree{4 ~~6\O 2 0\O 4{Cl}}". И те, и другие имеют одинаковый +размер, поэтому формулы окажутся выровненными относительно главной цепи. +Здесь следует кое-что объяснить. Во-первых, появилась новая команда +\verb"\O", которая рисует карбонильную группу (первую структуру тоже можно +было задать с ее помощью: \verb"\stree{8\O 4 2 4{Cl}}"). Во вторых, в +конструкциях \verb"~~0\O" и \verb"~~6\O" стоят сразу две тильды: это делает +невидимой не только связь, но и метку на ее конце (нетрудно догадаться, что с +одной тильдой получился бы повисший в воздухе символ <<O>>)\@. Наконец, хотя +в первой формуле нет заместителей, смотрящих вверх или вниз, она тоже не +центрирована относительно главной цепи --- мешают метки вершин, поэтому и +здесь пришлось поставить две невидимые связи для того, чтобы скрыть объем +меток. + +Таким образом, совместное использование префиксов позволяет получить много +дополнительных полезных эффектов, обходясь сравнительно +небольшим набором знаков. Ни один из них не является +буквой или цифрой, что позволяет легко отличать префиксы +от меток и направлений. Только знаки {\tt +} и {\tt -} выпадают из этой +картины: они используются, чтобы задавать \<направление в смещениях>, +смысл и назначение которого обсуждается в следующем разделе. + +\clearpage + +\subsection{Направления} + +\begin{figure}\centering +\def\znakf#1{\tt #1} +\begin{tabular}{cccc} +\stree{[0.00][1.1 1][2.22][3.33][4.44][5.55][6.66][7.77][8.88][9.99]% +[10.10{10}][11.11{1\rlap1}]}& +\stree{[,2.,2{,2}][,5.,5{,5}][,8.,8{,8}][,11.,11{,11}]}& +\stree{[:1][:2][:4][:5][:7][:8][:10][:11]% +[/1./1{/1}][/2./2{/2}][/4./4{/4}][/5./5{/5}][/7./7{/7}][/8./8{/8}]% +[/10./10{/10}][/11./11{/11}]}& +\stree{[:1][:2][:4][:5][:7][:8][:10][:11]% +[//1.//1{//1}][//2.//2{//2}][//4.//4{//4}][//5.//5{//5}][//7.//7{//7}]% +[//8.//8{//8}][//10.//10{//10}][//11.//11{//11}]}\\ +прямые&получасовые&косые&очень косые +\end{tabular}\par\medskip +{\bf Рисунок 1.} Направления связей (для сравнения рядом с косыми и +очень косыми пунктиром показаны соответствующие прямые направления). +\end{figure} + +\rpic{\stree{0,23,56,89,11}} +Давайте систематически рассмотрим в этом разделе все разные способы задания +направлений. Кроме двенадцати {\em прямых\/} направлений, отвечающих целому +числу часов на циферблате, есть еще множество других, которые задаются как +число часов с префиксами {\tt /} или {\tt ,} (см.\ рис.\ 1). +Четыре направления под углом 45$^\circ$ к горизонту (на пол-второго, +пол-пятого, пол-восьмого и пол-одинадцатого) задаются с помощью префикса {\tt +,} (запятая) перед числом {\tt 2}, {\tt 5}, {\tt 8} или {\tt 11} (считайте, +что запятая здесь отвечает приставке {\sl пол-\/}). Такие направления +(называемые {\em получасовыми\/}) можно использовать при задании +восьмичленных циклов. Например, цикл в этом абзаце был введен как +\verb"\stree{0 ,2 3 ,5 6 ,8 9 ,11}" в результате обхода по часовой стрелке, +начиная с самой левой нижней вершины. + +Другие +восемь направлений можно получить с помощью префикса {\tt /} (косая черта) +перед одним из чисел {\tt 1}, {\tt 2}, {\tt 4}, {\tt 5}, {\tt 7}, {\tt 8}, +{\tt 10} или {\tt 11} (см.\ рис.\ 1). Такие направления (назовем их {\em +косыми\/}) используются, например, для ввода пятичленных циклов. Пятиугольник +в химических формулах обычно рисуют так, что одна из его сторон получается +строго вертикальной или горизонтальной. Если две связи, смежные такой +стороне, сделать косыми, то пятиугольник получится довольно близким к +правильному: $$ +\begin{tabular}{cl|cl} +\multicolumn{2}{c}{<<вертикальные>> формы}& +\multicolumn{2}{c}{<<горизонтальные>> формы}\\&&&\\ +\stree{/1 3/5810}&\verb"\stree{/1 3/5810}"& +\stree{0/257/10}&\verb"\stree{0/257/10}"\\&&&\\ +\stree{24/79/11}&\verb"\stree{24/79/11}"& +\stree{1/46/811}&\verb"\stree{1/46/811}" +\end{tabular}$$ +% +Пятичленное кольцо в формулах иногда изображают и так: +{\bondlen=3.5mm\stree{0_36810}} (похоже на правильный +шестиугольник с одним обрезанным углом). +Здесь нет косых направлений, но одна связь (на месте обрезанного угла) +примерно на $2/3$ длиннее других. Длинная связь получается с помощью +префикса \verb"_" (подчерк), а вся формула вводится следующим образом: +\verb"{\bondlen=3.5mm \stree{0 _3 6 8 10}}" (здесь присваивание +\verb"\bondlen=3.5mm" позволяет получить формулу, размер которой примерно в +два раза меньше обычного, специально для вставки в текст, а фигурные скобки +локализуют эффект уменьшения). + +Рассмотрим теперь циклы из семи вершин. Для того, чтобы их рисунки получились +сравнительно приличными, ранее рассмотренных направлений недостаточно: +понадобятся восемь других, которые еще более, чем косые, отклоняются от +соответствующих прямых направлений в сторону осей координат. Такие +направления называются {\em очень косыми\/} и вводятся с помощью двух +префиксов {\tt /} (см.\ рис.\ 1). С использованием очень косых +связей получаются такие семичленные циклы: +\begin{center}\tabcolsep=0.2em +\begin{tabular}{clcl} +\stree{//1 24//57911}&\verb"\stree{//1 24//57911}"\ & +\stree{1//2468//1011}&\verb"\stree{1//2468//1011}"\\\\ +\stree{1 35//7810//11}&\verb"\stree{1 35//7810//11}"\ & +\stree{02//457//810}&\verb"\stree{02//457//810}" +\end{tabular} +\end{center} + +Таким образом, с помощью чисел 0--11 и префиксов {\tt ,} и {\tt /} можно +задавать $12 + 4 + 8 + 8 = 32$ разных направления. В большинстве случаев +(если учесть еще длинные связи) для описания формул этого достаточно, однако +иногда может понадобиться другой, более общий способ. Согласно +ему, направление задается не одним числом (как угол в часах), а двумя: +смещением связи по вертикали и по горизонтали. Смещение измеряется в +так называемых {\em квадратах,\/} где квадрат --- это условная единица, +равная $1/6$ длины обычной связи.\footnote{Строго говоря, если она +вертикальна или горизонтальна. Все другие связи чуть длиннее или чуть +короче.} Каждое смещение задается как целое число с {\sl обязательным\/} +знаком {\tt +} или {\tt -} (знак говорит о том, что следующее за ним число +--- это смещение, а не направление в часах). Все направления, выражаемые в +часах, можно задать с помощью смещений (см.\ табл. 2). Обратное же не верно: +например, при наборе следующей формулы $$ \stree{202/4-5-6-6-1-2+2 +02[+1+5[=01042]+1-7]/428+2-2} $$ без смещений обойтись нельзя: формула +вводится как +\begin{verbatim} +\stree{202/4-5-6-6-1-2+2 02[+1+5[=01042]+1-7]/428+2-2} +\end{verbatim} + +\begin{table} +{\bf Таблица 2.} Соответствие смещений направлениям в часах.\par\medskip +\leavevmode +\vtop{\nointerlineskip\halign{\tt\hfil# \strut&#\vrule&\ \tt#\cr +\multispan3 \hfil прямые\hfil\cr +0&&-0+6\cr +1&&+3+5\cr +2&&+5+3\cr +3&&+6-0\cr +4&&+5-3\cr +5&&+3-5\cr +6&&-0-6\cr +7&&-3-5\cr +8&&-5-3\cr +9&&-6-0\cr +10&&-5+3\cr +11&&-3+5\cr +}}\quad +\vtop{\nointerlineskip\halign{\tt\hfil# \strut&#\vrule&\ \tt#\cr +\multispan3 полуторные\hidewidth\cr +,2&&+4+4\cr +,5&&+4-4\cr +,8&&-4-4\cr +,11&&-4+4\cr +}}\quad +\vtop{\nointerlineskip\halign{\tt\hfil# \strut&#\vrule&\ \tt#\cr +\multispan3 \hfil косые\hfil\cr +/1&&+2+6\cr +/2&&+6+2\cr +/4&&+6-2\cr +/5&&+2-6\cr +/7&&-2-6\cr +/8&&-6-2\cr +/10&&-6+2\cr +/11&&-2+5\cr +}}\quad +\vtop{\nointerlineskip\halign{\tt\hfil//# \strut&#\vrule&\ \tt#\cr +\multispan3 очень косые\hidewidth\cr +1&&+1+6\cr +2&&+6+1\cr +4&&+6-1\cr +5&&+1-6\cr +7&&-1-6\cr +8&&-6-1\cr +10&&-6+1\cr +11&&-1+6\cr +}} +\end{table} + +Рассмотрим подробнее процесс набора для этого случая. Прежде всего, всегда +полезно иметь перед глазами рисунок набираемой формулы. Если она к тому же +содержит связи необычной длины и/или направления, то лучше, если рисунок +будет на бумаге в клетку, в масштабе 6 клеток на связь обычной длины. При +проведении связей желательно, чтобы соотношение короткой и длинной проекций +связи на оси координат составляло или $3/5$, что отвечает {\sl прямым\/} +связям, или $2/6$ (косым), или $1/6$ (очень косым). Во-первых, такие связи +можно задавать более кратким образом (как число часов), а во-вторых (что +важнее) --- рисунок формулы, скорее всего, при этом получится строже (эти +рассуждения больше относятся к случаю, когда общепринятого +изображения формулы не существует, и можно рассмотреть разные варианты). +Если же имеется красивый рисунок на клетчатой бумаге, то описать его в +команде \verb"\stree" (при известном навыке) не составит труда. Давайте +начнем с нижней метильной группы и примыкающего к ней пятичленного цикла +(последний, как обычно, обходится по часовой стрелке). Первые три связи на +этом пути (на 2, 0 и опять 2 часа) являются прямыми, следующая, на 4 часа --- +косая. Двум следующим связям, заканчивающим цикл, отвечает +последовательность {\tt -5-6-6-1} (если есть сомнения в том, как описать +связь --- в часах или в смещениях, то можно справиться с табл.\ 2 или, +что проще, запомнить соотношение проекций для направлений в часах). +После пятичленного цикла опишем снаружи от него +неправильный шестичленный цикл. Здесь последовательность {\tt -2+2 02} +доводит до мостика, который соединяет два цикла, а описание этого мостика +содержится в квадратных скобках. Оставшиеся символы {\tt /428+2-2} +описывают конец пути до пятичленного цикла. Два символа {\tt 28} здесь +служат для ввода метильной группы, которую можно было задать и более +привычным способом, как {\tt [2]}. + +В данном примере, опять-таки для +иллюстрации, были опущены все необязательные пробелы. {\sl Необходимый\/} +пробел понадобился только в одном месте: {\tt -2+2 02[}, так как +без него получилось бы {\tt -2+202[} --- две клетки вниз и 202 +вправо --- очень длинная связь! Почти все направления в часах (кроме 10 и 11) +--- однозначные числа, поэтому пробел нужен только там, где можно спутать +пару чисел 1 и 0 или 1 и 1 с 10 и 11 соответственно. В отличие от +часов, смещения не ограничены по величине, поэтому каждое число, которое +начинается с {\tt -} или {\tt +}, должно заканчиваться справа какой-нибудь +не-цифрой, например, пробелом. Но есть еще одно, более важное, отличие +направления в смещениях --- его нельзя использовать перед командами, которые +рисуют более одной связи. Последнее ограничение может показаться +таинственным, пока вы не узнаете о внутреннем устройстве команд. + +\section{Метки вершин}\label{Labels} + +Однако перед тем, как перейти к командам, следует остановиться на суффиксах +более простого вида --- на метках вершин, и отметить все особенности их +использования. Повторим вначале наиболее важные правила. +Если вершина, к которой приводит связь, имеет метку, то эта метка +записывается {\sl сразу\/} после направления связи. Пробел между направлением +и меткой (или командой) недопустим (заметим, что это правило не может войти в +противоречие с правилами об обязательных пробелах между числом и следующей +цифрой: ведь ни метка, ни команда никогда не начинаются с цифры). Если метка +состоит более чем из одного символа, то она заключается в фигурные скобки. +Скобки также обязательны, если метка является цифрой или одним из символов, +используемых в качестве префикса.\footnote{Строго говоря, сюда следует отнести +еще один случай: если метка закодирована с помощью команды. Например, вам +может надоесть часто набирать какую-нибудь длинную метку, и вы напишете +простую макрокоманду, скажем \0def\0бз\1C\4\56\4H\4\55\4\2\rm, чтобы вместо +\tt C\4\56\4H\4\55\4\rm\ можно было везде писать \0бз\rm. При использовании +внутри \0stree\rm\ команду \0бз\rm\ придется брать в +фигурные скобки, чтобы она обрабатывалась как обычная метка, а не как +команда.} Очень часто метки вершин +состоят из одной буквы, например, C, N, O, H --- и в этом случае скобки не +нужны, хотя, если их поставить, ошибки не будет. + +Когда ставится метка, то связи, которые ведут к ней и от нее, становятся +короче, чтобы не произошло наложения связи на метку. Основная работа по +рисованию формул как раз и заключается в том, чтобы правильно вычислять +размеры меток и в соответствии с ними адаптировать координаты отрезков, +изображающих связи. К сожалению, в \TeX е нет чего-нибудь, похожего на +массивы, и запомнить можно размеры только одной метки, относящейся к текущей +вершине. Поэтому, когда при обходе формулы вершина попадается еще раз, то ее +метку следует задавать снова. Если, например, обход формулы +$$\stree{{HO}3N3\6}$$ ведется от вершины OH к N и далее по часовой стрелке с +возвратом к N, то метка азота должна появиться в описании дважды: +\verb"\stree{{HO}3N 1 3 5 7 9 11N}". Если не поставить последний {\tt N}, то +связь на 11 часов наложится на первую метку азота, ибо тот факт, что в этом +месте стоит метка, давно забыт. Впрочем, с помощью квадратных скобок почти +любую формулу можно обойти так, чтобы метки вершин встретились только +однократно. В нашем случае, например, подействует такая конструкция: +\verb"\stree{{HO}3N [5] 1 3 5 7 9}". То, что заключено в квадратных скобках, +как бы проходит незамеченным: после закрывающей скобки вспоминается вершина +с меткой N и размеры этой метки, так что следующая связь на 1 час рисуется +правильно. + +Внимательный читатель может заметить, что многие формулы в +наших примерах (например, предыдущая) начинаются прямо с описания метки, а не +с направления связи, что противоречит формальному синтаксису команды +\verb"\stree". Здесь срабатывает маленький трюк: перед аргументом +этой команды до начала его обработки ставится число {\tt 17} --- то есть +направление фиктивной связи нулевой длины. Если первым в \verb"\stree" +стоит направление или префикс, то {\tt 17} не произведет никакого +действия, а если метка, то {\tt 17}\<метка> нарисует эту метку в текущей +точке. + +Отметим еще один случай нарушения формального синтаксиса на примере +выравнивания длинных меток. Метки, в которых более одного символа, можно по +разному располагать относительно геометрического центра вершины. По умолчанию +действует такое правило: если связь имеет наклон {\sl влево\/} (смещение +связи по горизонтали меньше нуля), то с центром вершины совмещается центр +самого правого символа метки, иначе (если связь вертикальна или имеет +наклон вправо) --- самого левого. Это дает правильный результат в большинстве +случаев, но все же не всегда. + +{\samepage +\rpic[$\!$пиррол]{\stree{~'8/>13/>58`{NH}10}} +Например, в гетероцикле пиррола, если обходить +его от самой левой вершины по часовой стрелке, метка NH по умолчанию окажется +выровненной по H, а не по N, как должно быть. Изменить вид выравнивания +метки на противоположный можно префиксом {\tt `} (обратный апостроф): +\verb"\stree{/>1 3/>5 8`{NH} 10}". Здесь есть нарушение правил: префикс {\tt +`} стоит не перед направлением, а {\sl после\/} него (перед меткой). В этом +случае нарушение оправдано, поскольку префикс {\tt `}, в отличие от +остальных, влияет не на связь, а на метку, и значит его логичнее ставить +перед меткой. Конструкция \verb"`8{NH}", конечно, тоже правильна, но менее +очевидна, чем \verb"8`{NH}". Кроме того, особый статус префикса {\tt `} +позволяет применять его, если описание структуры начинается с метки (в этом +случае по умолчанию метка выравнивается по правому символу). +Заметим, что право стоять +после направления связи распространяется только на префикс {\tt `} --- любой +же другой в этом положении будет считаться началом описания следующей связи. + +\rpic{\stree{/>13/>58``{NH}10}} +Но вернемся к формуле пиррола. Возможно, вам покажется, что центрированная +метка NH (как в этом абзаце) выглядит лучше. Такой эффект +достигается за счет {\sl двух\/} префиксов {\tt `}: \ldots\ +\verb"8``{NH}"\ \ldots\ (в этом случае метка рассматривается как единое +целое, и ее центр совмещается с центром вершины). На самом деле можно +получить и более тонкие эффекты, если воспользоваться \TeX овскими боксами, +кернами и клеем (дальнейшие объяснения в этом разделе расчитаны на то, что вы +знакомы с этими понятиями). + +\rpic{\stree{/>1 3/>5 8``{\vtop{\baselineskip=0pt \hbox{N}\hbox{H}}}10}} +На самом деле обе ранее приведенные формулы +пиррола не очень хороши. Метка NH слишком широкая, и, вероятно, ее лучше +расписать по вертикали, как здесь. Чтобы поставить N на H потребовалась +следующая довольно длинная конструкция: +\0stree\1/>1 3/>5 +8``\1\0vtop\1\0baselineskip=0pt \0hbox\1N\2\0hbox\1H\2\2\2 +10\2\rm.\par} + +Сделаем необходимые объяснения. Два апострофа перед меткой +нужны для того, чтобы предотвратить центрирование по первому или последнему +символу --- в данном случае ничего хорошего из этого бы не +вышло.\footnote{Процесс выделения первого или последнего символа ({\sl +токена\/}, если быть точным) несколько грубоват, поэтому если вы сами строите +метку из боксов, то его лучше отключать. Вообще говоря, предусмотрено и +<<автоматическое>> отключение, если в метке находится примитив \TeX а +\0hbox\rm, или любая макрокоманда, при раскрытии которой получается +\0hbox\rm\ (например, \0rlap\rm\ или \0llap\rm). Предполагается, что если вы +ставите внутри метки \0hbox\rm\ или то, что в него раскрывается, то, значит, +вы сами хотите управлять размещением метки. Этот метод угадывания мыслей +небезупречен: так, \0hbox\rm\ обнаруживается только в том случае, если он +находится на самом внешнем уровне вложенности. В нашем примере \0hbox\rm\ +спрятан внутри \0vtop\rm, поэтому остается два варианта избежать выделения +крайнего токена: задать перед \0vtop\rm\ пустой \0hbox\rm\ или, +что проще, поставить два апострофа.} +Примитив \TeX а \verb"\vtop" делает вертикальный бокс, выровненный по самому +верхнему из составляющих его боксов, в нашем случае --- по \verb"\hbox{N}" +(то есть базовые линии \verb"\hbox{N}" и всего \verb"\vtop" совпадут). Иными +словами, высота метки, заключенной в бокс \verb"\vtop", совпадет с высотой +\verb"\hbox{N}", а глубину метки составят глубина \verb"\hbox{N}" плюс +глубина и высота \verb"\hbox{H}". При расположении метки ее глубина +игнорируется, поэтому центр вершины как раз совпадет с центром символа N\@. +Присваивание \verb"\baselineskip=0pt" здесь нужно для того, чтобы +расстояние между N и H не получилось, как между строками в обычном тексте. +Интересно, что практически тот же результат можно получить с помощью +невидимой связи длиной три квадрата (\verb"\stree{/>1 3/>5 8N [~-0-3H] 10}"), +но с одним различием: при смене шрифта расстояние между N и H +может измениться. + +Вот теперь про метки сказано действительно все! + +\section{Команды} + +\begin{table}\centering +{\bf Таблица 3.} Значения имеющихся команд.\par\bigskip +\begin{tabular}{rl|rl|rl} +\verb"\ph"&\stree{3\ph'9}&\verb"\tbu"&\stree{3\tbu}&{\tabcolsep=0pt +\begin{tabular}{r}\verb"\O"\\\verb"\CO"\end{tabular}}&\stree{3\O'11'7}\\ +&&&&\\ \hline &&&&\\ +\verb"\pho"&\stree{3\pho'9}&\verb"\tbx"&\stree{3\tbx}&\verb"\OH"&\stree{3\OH}\\ +&&&&\\ \hline &&&&\\ {\tabcolsep=0pt +\begin{tabular}{r}\verb"\six"\\\verb"\6"\end{tabular}}&\stree{3\6'9}& +\verb"\ip"&\stree{3\ip}&\verb"\COOH"&\stree{3\COOH}\\ +&&&&\\ \hline &&&&\\ +&&\verb"\Me"&\stree{3\Me}& +\end{tabular} +\end{table} + +Вместо метки в качестве суффикса может стоять команда. Напомним, что командой +в \TeX е считается последовательность из сигнального символа \verb"\" и либо +одной не-буквы, либо нескольких букв, после которых должна идти не-буква +(например, команда \LaTeX а \verb"\\" относится к первому случаю, а +\verb"\section" --- ко второму). В макросе \treeTeX\ особые команды могут +использоваться {\sl внутри\/} общей команды \verb"\stree" для того, чтобы +упростить ввод некоторых фрагментов (см.\ табл.\ 3). Все фрагменты в +этой таблице, кроме трех циклических из первой колонки, являются +одновалентными заместителями, поэтому соответствующие команды устроены так, +что после них текущая вершина не меняется. Вообще-то, последнее верно и для +циклических фрагментов, хотя их и нельзя считать одновалентными. Не совсем +очевидно, например, что для получения цикла +<<на ножке>> нужно вначале задать связь, а потом и команду в том же +направлении (так, бифенил {\bondlen=3.5mm\stree{9\ph 33\ph}} +вводится как \verb"\stree{9\ph 33\ph}"). С другой стороны, такая трактовка +циклов дает некоторые удобства, ибо позволяет легко вводить структуры с +конденсированными циклами и циклы с одним гетероатомом: +$$ +\begin{tabular}{cc} +\stree{10\6 2\6}&\stree{N3\6 9\Me}\\ +\verb"\stree{10\6 2\6}"&\verb"\stree{N3\6 9\Me}" +\end{tabular} +$$ + +Фрагмент, отвечающий команде, рисуется в направлении, которое +стоит перед ней (все рисунки в таблице 3 получены для направления +на 3 часа). Иногда от направления зависит и вид метки (например, если +сказать \verb"\stree{9\OH}", то получится \stree{9\OH}, а если +\verb"\stree{3\OH}" --- то \stree{3\OH}) или даже взаимная ориентация меток, +как в случае с командой \verb"\COOH", при использовании которой кислород +карбонильной группы всегда оказывается сверху (пример --- кислота +$$\stree{10\COOH 2\COOH},$$ которая вводится как \verb"\stree{10\COOH +2\COOH}"). + +Определение команды +\verb"\COOH" полезно рассмотреть полностью, +если вы хотите узнать, что происходит внутри \treeTeX а: +\begin{verbatim} +\def\COOH#1{{% аргумент #1 = направление (в часах) + \ang=#1 % запомнить направление + \b\ang[C] % провести связь с меткой C на конце + \ifnum\ang>6 % если больше шести часов (наклон влево), то + \rot2 % поворот на два часа вправо по часовой стрелке, + {\bt2\b\ang[O]} % вначале рисуем карбонильную группу =O, + \rot8 % поворот на 8 часов вправо (= 4 влево), + \OH\ang % и рисуем группу OH + \else % а иначе делаем наоборот: + \rot2 % поворот на два часа вправо, + \OH\ang % вначале группа OH, + \rot8 % затем поворот, + {\bt2\b\ang[O]} % и потом =O + \fi}} +\def\OH#1{{\ifnum#1>6\b{#1}[HO]\else\b{#1}[OH]\fi}} +\end{verbatim} +% +Три макрокоманды, использованные в данном примере, необходимо объяснить. +Самая главная из них --- \verb"\b", которая собственно и рисует связи и имеет +два параметра: первый, направление связи --- обязательный, а второй --- метка +вершины, заключаемая в квадратные скобки --- может отсутствовать. +В качестве первого параметра обычно выступает +целая переменная \verb"\ang", означающая текущее направление связи. +Использование переменной, а не абсолютных значений для этой цели +позволяет сделать описание фрагмента зависящим от исходного направления, +которое передается с первым аргументом команды. После присваивания +\verb"\ang=#1" эта переменная далее только увеличивается или уменьшается, что +соответствует вращению текущего направления на целое число часов. Эти +операции обычно выполняются не явно, а с помощью +команды \verb"\rot", которая гарантирует, что результирующее значение +\verb"\ang" останется в пределах 11-ти. То, что связи фрагмента проводятся +не в абсолютных, а относительных направлениях, объясняет, почему перед +командой нельзя задавать направление в смещениях: его не так просто повернуть +на целое число часов. Строго говоря, это ограничение не относится к +фрагментам с одной связью (в этом случае единственная связь рисуется в +исходном направлении, без всяких поворотов). + +%Например, можно получить такой +%интересный результат: $\stree{-0-3\OH 3 -0+3\OH 3 -0-3\OH +9-0\Me}$, если +%сказать \verb"\stree{-0-3\OH 3 -0+3\OH 3 -0-3\OH +9-0\Me}". + +В определении \verb"\COOH" осталась необъясненной еще +команда \verb"\bt2", которая используется для рисования группы +\stree[b]{=3O}\ и означает, что следующая связь должна быть двойной +центрированной (это соответствует действию префикса {\tt =}). На самом деле +можно влиять и на другие атрибуты связи (видимость, толщина, и т.\ д.) с +помощью нескольких управляющих переменных. Сами эти переменные и смысл их +значений здесь не приводятся: это слишком специальные сведения, и при +необходимости их можно узнать, обратившись к файлу-источнику {\tt stree.sty}. + +Приведенные здесь определения команд \verb"\COOH" и \verb"\OH" заключены в +дополнительные фигурные скобки, что обеспечивает вспоминание текущей вершины +после того, как команда отработает. Отметим также, что внутри \verb"\COOH" +используется более простая команда \verb"\OH". Логика последней достаточно +проста и заключается только в выборе метки OH или HO в зависимости от +направления связи. + +Набор команд для рисования фрагментов может показаться бедным и +непредставительным. Действительно, это верно, но кажется, что этот список и +не стоит расширять. Описание структур на уровне отдельных связей и так +является достаточно лаконичным, чтобы применение макрокоманд могло дать +заметные преимущества в краткости или простоте. Польза от макрокоманд +остается максимальной, пока их немного, все они простые и часто +используются. В этом случае команды легко удержать +в голове и применять, почти не задумываясь. + +Сказанное выше не значит, однако, что +создание новых команд (кроме уже имеющихся) для \verb"\stree" совсем лишено +смысла. Следующий пример поясняет, о чем может идти речь. Пусть требуется +нарисовать некий граф, вершины которого отмечены жирными +точками:$$\def\*#1{\b{#1}[$\bullet$]} +\stree{\*5\*[7\*]3\*1\*3\*5\*7\*9\*11\*}$$ Точке отвечает математический +символ \verb"$\bullet$", и вы можете, конечно, честно +начать набирать все это как +\verb"{$\bullet$} 5{$\bullet$} [7{$\bullet$}" \ldots, однако проще +сначала определить команду \verb"\*" для рисования жирной точки в данном +направлении таким образом, +\begin{verbatim} +\def\*#1{\b{#1}[$\bullet$]} +\end{verbatim} +чтобы потом всю структуру набрать короче: +\begin{verbatim} +\stree{\*5\*[7\*]3\*1 \*3\*5\*7\*9\*11\*}. +\end{verbatim} + +На самом деле команды-суффиксы могут иметь не один параметр +(направление), а два: если сразу после команды стоит открывающая +фигурная скобка, то все, что находится до закрывающей скобки, рассматривается +как второй параметр. Покажем одно довольно неожиданное и далекое от химии +использование этого факта. Если следующим образом +% +\begin{verbatim} +\def\(#1,#2){\sx#1\sy#2\ab30[]} % связь со смещением (#1,#2) +\def\dB#1[#2]{\(15,0)\(0,-6)\(-3,-3)\(-27,0)\(0,6)\(3,3) + \(12,0)\bmode-1 \dmode2 \sy-5 \ab30[#2]\bmode-1 \(0,-4)} +\end{verbatim} +% +определить команду \verb"\dB" для рисования +прямоугольника с двумя срезанными углами и с надписью внутри, то потом можно +будет легко вводить блок-схемы типа +$$ +\def\(#1,#2){\sx#1\sy#2\ab30[]} +\def\dB#1[#2]{\(15,0)\(0,-6)\(-3,-3)\(-27,0)\(0,6)\(3,3)\(12,0) + \bmode-1 \dmode2 \sy-5 \ab30[#2]\bmode-1 \(0,-4)} +\stree{::-0-3 0\dB{база данных} ::-0-3 [-20-0::-0-3 0\dB{структуры}-0-3] + +20-0::-0-3 0\dB{спектры}-0-3} +$$ +набирая их как химические формулы: +\begin{verbatim} +\stree{::-0-3 0\dB{база данных} + ::-0-3 [-20-0::-0-3 0\dB{структуры}-0-3] + +20-0::-0-3 0\dB{спектры}-0-3} +\end{verbatim} + +Сделаем необходимые комментарии: переменные \verb"\sx" и \verb"\sy" содержат +смещения, которые используются при проведении связи, если ее +направление равно условному значению 30 часов. Присвоение \verb"\bmode-1" +позволяет получить невидимую связь, а в результате \verb"\dmode2" метка +вершины получается центрированной. + +Упоминанием такого необычного приклада команды \verb"\stree" мы закончили +рассмотрение всех трех компонент (\<префикс>, \<направление>, \<суффикс>) в +описании отдельных связей. Далее осталось совсем немного: отметить +особенности \verb"\stree" в целом: способы выравнивания и использования в +других конструкциях \LaTeX а. + +\section{Выравнивание} + +Команда \verb"\stree" (с помощью окружения \LaTeX а \verb"picture") +производит \verb"\hbox", высота которого немного (на {\tt 1ex}) больше +глубины. Чаще всего это срабатывает правильно, особенно если несколько +структур являются частью выделенной математической формулы, как в +следующем примере $$ \stree{9\6 3\OH}+\stree{9\OH 1\O +5\Me}\longrightarrow\ \stree{9\6 3O 3 1\O 5\Me}+\stree{{H$_2$O}}\ ,$$ +который вводится как +\begin{verbatim} +$$ +\stree{9\63\OH}+\stree{9\OH1\O5\Me}\longrightarrow +\stree{9\63O31\O5\Me}+\stree{{H$_2$O}} +$$ +\end{verbatim} +Все формулы в этом примере +оказались вертикально выровнены по своим центрам. На самом деле способ +выравнивания можно задать явно, если ввести одну из букв {\tt t}, {\tt b}, +{\tt c} или {\tt u} в квадратных скобках сразу после команды \verb"\stree" (и +перед ее обязательным аргументом). В соответствии с соглашениями \LaTeX а, +{\tt [t]} означает выравнивание по верхушке, {\tt [b]} --- по дну, а {\tt +[c]} --- по центру бокса. По умолчанию действует выравнивание по центру +(поэтому {\tt [c]} задавать не обязательно). Другие способы (по верхушке и +дну) обычно пригождаются при составлении таблиц. Параметр {\tt [u]} означает +отсутствие выравнивания: команда \verb"\stree[u]{"\<описание>\verb"}" дает +бокс нулевых размеров, точка привязки которого сопрадает с исходной вершиной +в описании структуры. Это полезно для случая, когда \verb"\stree" сама +является частью другого рисунка, отдельные элементы которого должны быть +привязаны к координатам вершин структуры. Если известны координаты хотя бы +одной вершины, то их можно легко вычислить и для всех остальных, учитывая то, +что вершины расположены в узлах сетки с шагом 1 квадрат ($1/6$ расстояния +\verb"\bondlen"). Параметр {\tt [u]} гарантирует знание места начальной +вершины, а другие параметры --- не всегда, так как при +выравнивании бокс, который дает \verb"\stree", включает в себя целиком метки +вершин и вообще все символы, имеющиеся в формуле. Использование {\tt [u]}, +однако, не всегда удобно, поскольку появляется необходимость самому следить +за размерами формулы. + +Существует способ, избавленный от этого недостатка. Вместо одной команды +\verb"\stree" с описанием внутри можно написать \verb"\begstr +\tree{" \<описание> \verb"} \endstr", а перед \verb"\endstr" (или после +\verb"\begstr") вставить любые команды \LaTeX а с учетом того, что координата +(0,0) отвечает начальной вершине, а единица измерения \verb"\unitlength" +совпадает с длиной связи \verb"\bondlen" (иными словами, равна 6 квадратов). +В следующем примере такой способ использован для того, чтобы выделить +пунктирным прямоугольником фрагмент структуры: $$ \begstr +\tree{9\OH1//2[~/7{$R_1$}]4[0~2][6]/2539>760/108[-4-5/118~9{$F_1$}]//1011} +\put(-2,-2){\dashbox{0.2}(4.8,3.8){}} +\endstr +$$ +Это изображение вводится следующим образом: +\begin{verbatim} +\begstr +\tree{9\OH1//2[~/7{$R_1$}]4[0~2][6]/2539>760/108 + [-4-5/118~9{$F_1$}]//1011} +\put(-2,-2){\dashbox{0.2}(4.8,3.8){}} +\endstr +\end{verbatim} + +\section{Другие возможности} + +Поскольку настоящее изложение связано с химией, отметим возможность ввода в +\treeTeX е масс-спектров и спектров \CNMR. Например, спектр +$$ +\massp{220-18!187-33!135-26!133-25,121-100!14,2,107-38!43-35,41-41!} +$$ +получается в результате +\begin{verbatim} +\massp{220-18!187-33!135-26!133-25,121-100!14,2, + 107-38!43-35,41-41!} +\end{verbatim} +Это просто последовательность чисел, разделенных знаками препинания. +Если после числа стоит тире, то оно воспринимается как массовое число +($m/z$) пика, иначе --- как его интенсивность (в процентах к максимальному +пику). Восклицательный знак отличается от запятой тем, что в первом случае +над пиком на рисунке будет написано значение его $m/z$. Если после +одного масового числа стоит несколько чисел, означающих интенсивности (в +нашем примере --- {\tt 121-100!14,2,}), то имеется в виду последовательность +пиков с возрастающими $m/z$. Это позволяет +экономить место, не вводя массовое число, если оно на единицу больше +предыдущего. Если последний знак во вводе --- запятая, то ее ставить не +обязательно. + +Вид рисунка масс-спектра управляется четырьмя параметрами: +\begin{itemize} +\item +\verb"\mzlen" --- расстояние между соседними линиями, $m/z$ которых +отличается на 1 (по умолчанию \verb"\mzlen=0.6pt"), +\item +\verb"\imax" --- высота максимального пика в единицах \verb"\mzlen" +(по умолчанию \verb"\imax=50"), +\item +\verb"\numfnt" --- шрифт, которым набираются все цифры на рисунке +(по умолчанию \verb"\def\numfnt{\small}"), +\item +\verb"\msdir" --- направление, в котором рисовать пики спектра. +\end{itemize} +% +Послендий параметр используется редко. По умолчанию \verb"\msdir=1", +что означает обычное направление --- вверх; при любом другом значении пики +будут направлены вниз. Иногда для визуального сравнения двух масс-спектров их +удобно расположить зеркально относительно общей шкалы: +$$ +\begms +\mass{39-11,0,21,51-5,7,15,64-5,35,7,77-10,5,91-4,74!27,104-6, +119-26,132-42,4,159-26,81!8,176-15,187-93!12,204-4,232-100!14} +\put(-1,0){\line(1,0){250}}\msdir=-1 +\mass{39-16,51-7,6,15,65-11,8,77-5,92-73!24,104-9,119-15, +132-21!159-26,100!14,176-16,187-83!14,204-3,232-70!}\vpos=1 +\endms +$$ +Этот реальный пример сравнения экспериментального (сверху) и предсказанного +спектров был введен следующим образом: +% +\begin{verbatim} +\begms +\mass{39-11,0,21,51-5,7,15,64-5,35,7,77-10,5,91-4,74!27,104-6, +119-26,132-42,4,159-26,81!8,176-15,187-93!12,204-4,232-100!14} +\put(-1,0){\line(1,0){250}}\msdir=-1 +\mass{39-16,51-7,6,15,65-11,8,77-5,92-73!24,104-9,119-15, +132-21!159-26,100!14,176-16,187-83!14,204-3,232-70!}\vpos=1 +\endms +\end{verbatim} +% +По аналогии с командой \verb"\stree", вместо +\verb"\massp{" \<аргумент> \verb"}" можно писать +\verb"\begms \mass{" \<аргумент> \verb"} \scale1{} \endms", а между +\verb"\begms" и \verb"\endms" вставлять любые команды \LaTeX овского +окружения {\tt picture}. В нашем примере вместо \verb"\scale1{}", которая +рисует обычную шкалу с рисками и числами, мы провели просто горизонтальную +линию (ее длина --- округленное в большую сторону значение наибольшего +массового числа в спектре), а затем нарисовали еще один масс-спектр, который +получился вверх ногами, потому что перед ним стояло \verb"\msdir=-1". Наконец, +последнее присваивание \verb"\vpos=1" означает, что весь рисунок должен +выравниваться по низу (то есть глубина бокса равна нулю). Конечно, при +использовании самой команды \verb"\massp" выравниванием можно управлять +обычным способом с помощью необязательного параметра в квадратных скобках +({\tt b}, {\tt c} или {\tt t}, по умолчанию {\tt c}), но на +на немного более низком уровне, на который пришлось спуститься в последнем +примере, действует переменная \verb"\vpos" (это же относится и к разложению +\verb"\stree" на \verb"\begstr", \verb"\tree" и \verb"\endstr"). Она может +принимать три значения: 0 --- выравнивание по центру (соответствует параметру +{\tt [c]}), 1 --- по дну ({\tt [b]}), 2 --- по верхушке ({\tt [t]}) и 3 --- +без выравнивания (действует только для структурных формул и отвечает +параметру {\tt [u]}). + +В \treeTeX е можно также вводить очень упрощенные схематические рисунки +спектров \CNMR\ наподобие следующего (высота пиков здесь отражет +мультиплетности сигналов): +$$ +\cnmrs{2000}{1912s1645s354d1041s{\llap{$^b\searrow$}}% +901s138q1576s1703s575q912d1047d{$*$}566q1696s1956s571q953s395t} +$$ +Приведем соответствующий исходный текст: +% +\begin{verbatim} +\cnmrs{2000}{1912s1645s354d1041s{\llap{$^b\searrow$}}% +901s138q1576s1703s575q912d1047d{$*$}% +566q1696s1956s571q953s395t} +\end{verbatim} +% +Команда \verb"\cnmrs" имеет два обязательных параметра: первый --- длина +шкалы (в десятых от м.\ д.),\ а второй --- описание спектра, в котором для +каждого сигнала задается значение химического сдвига, умноженное на 10 +(должно быть целое число) и мультиплетность (одна из букв {\tt s} --- +синглет, {\tt d} --- дублет, {\tt t} --- триплет и {\tt q} --- квартет). +После знака мультиплетности в фигурных скобках можно поставить метку пика (в +нашем случае конструкция \verb"\llap{$^b\searrow$}" понадобилась для того, +чтобы метка пришлась слева от синглета 104.1 м.\ д.\ и не наложилась на +соседний дублет, помеченный звездочкой). + +Способы ввода рассмотренных двух видов спектров немного похожи (по +сути дела, и здесь, и там --- последовательность чисел с разделителями), +однако есть и отличия. Так, длинную команду \verb"\massp" можно в любом месте +разбить на строки, а внутри \verb"\cnmrs" конец строки нежелателен, и его +(как в приведенном случае) надо маскировать +знаком комментария (символом \verb"%"). +Кроме того, в \verb"\cnmrs" длина шкалы (и, значит, всего рисунка) всегда +задается явно, но этого нельзя сделать при вводе масс-спектра. Его размер +вычисляется по наибольшему массовому числу спектра. Если необходимо получить +несколько рисунков масс-спектров одинакового размера, можно обмануть машину, +указав при вводе пик нулевой интенсивности с нужным значением $m/z$. +Например, закончив ввод масс-спектра выражением \verb"250-0}", вы +получите шкалу длиной 250 $m/z$ (если, конечно, в спектре не было пика с +б\'ольшим массовым числом). + +\section{Обсуждение результатов} + +Один из вопросов, который может возникнуть при знакомстве с настоящей +работой, формулируется примерно так: зачем изучать какой-то <<птичий язык>> +для ввода структурных формул, когда есть много удобных программ для +наглядного редактирования, почти не требующих освоения? По сути дела, это +старый спор о преимуществах и недостатках командного интерфейса по сравнению +с графическим. Опытные программисты хорошо знают, что с помощью языка команд +всегда можно работать быстрее и эффективнее. +На самом деле, однако, противоречия между двумя способами работы не +существует, и в идеале хорошо всегда иметь обе возможности (замечательный +пример их удачного совмещения --- оболочка Norton Commander). При подготовке +научных публикаций обычно приходится иметь дело в основном со словами +и символами. Структурные же формулы в химических статьях, подобно +математическим формулам, чаще тоже удобнее рассматривать просто как элемент +текста. Если вводить их всегда с помощью химического редактора, то придется +часто переключаться из одной программы в другую. Даже если предположить, что +это происходит быстро и непринужденно (в реальности редко достижимый идеал), +то изменение интерфейса с тектового на графический и обратно все равно +потребует определенной психологической адаптации. В этом случае возможность +ввести формулу прямо в тексте, не берясь за мышь и не превращаясь временно в +чертежника, может сэкономить вам немало времени и нервной энергии. + +\begin{thebibliography} +\frenchspacing + +\item +Knuth, D. The \TeX book. Addison-Wesley, Reading (1984). Русский перевод: +Дональд Е. Кнут. Все про \TeX. + +\item +Lamport, L. \LaTeX: A Document Preparation System. +Addison-Wesley, Reading (1984). По \LaTeX у вышло много книжек на русском +языке. Вот часть из них: + +\item +Ramek, M. In book: Clark, M. (ed.) \TeX: Applications, Uses, Methods. +Ellis Horwood, London (1990), 277-- + +\item +Haas, R. T.; O'Kane, K. C. +Typesetting Chemical Equations Using \LaTeX. +Comput. Chem., 11 (1987), + +\item +Fujita, S. +Typesetting Structural Formulas with the Text Formatter \TeX/LaTeX. +Comput. Chem., 11 (1993), + +\end{thebibliography} + +\end{document}
\ No newline at end of file |