% % OCHEM.STY - Stilfile zum Erzeugen von chemischen Formeln in LaTeX % (c) 1993-1996,1999-2000 by Ingo Kloeckl % % 11.09.1993 error handling improved % 09.12.1993 neue befehle fuer orbitallappen und geb. bindungen % 04.10.1994 griechische symbole in texten % 14.02.1996 environment ochem ersetzt durch \ochem-Befehl % 15.02.1996 supermini eingefuehrt, die gfbox in htshow... geloescht % 20.09.1996 zentrierungsmoeglichkeit durch ochem als \hbox, wertet nun % bounding box info aus. % 21.09.1996 Trennung zwischen fixen und gleitfaehigen Objekten, verursachen % nun keine Verwirrungen mehr. % 20.10.1996 Korrekte Bestimmung der BBox (/erg), npr ok % 21.10.1996 Verbesserung BBox der Glasgeraete % ------------------- % 22.03.1999 Version 3 beta release: schema compiler in Perl % 11.04.1999 Version 3 consolidation % 02.05.1999 fshow (PS command) removed due to interference with MetaPost % 09.01.2000 new bond shapes >> and >. and b % 19.01.2000 new bond shape ~ % 19.04.2000 undesired spaces inhibited (thanks to B. Seckinge) % 10.04.2001 option 'separate' added to easily produce EPS figures % \newcommand{\chemversion}{OCHEM Version 3-0e 2001-04-10 } \typeout{package \chemversion} \typeout{(c) 1993-1996, 1999 -- 2001 Ingo Kloeckl} \RequirePackage[dvips]{color} \RequirePackage{verbatim} \RequirePackage{ifthen} \newboolean{separate}\setboolean{separate}{false} \DeclareOption{separate}{% \setboolean{separate}{true} \newwrite\verb@chemnames \immediate\openout\verb@chemnames \jobname.names } \ProcessOptions\relax % user command for chem font setting \newcommand{\chemfont}[1] {\renewcommand{\chemfontname}{#1}} % default font is sans serif \newcommand{\chemfontname}{\sffamily} % % Erzeugt gleitfaehiges Reaktionsschema mit ldf. Nummer und Labelmoeglichkeit % \begin{schema[*]} % \ochem, \caption, \label... % \end{schema[*]} % \@ifundefined{chapter} {\newcounter{schema} \renewcommand{\theschema}{\arabic{schema}}} {\newcounter{schema}[chapter] \renewcommand{\theschema}{\thechapter--\arabic{schema}}} \newcommand{\fps@schema}{htbp} \newcommand{\ftype@schema}{5} \newcommand{\ext@schema}{lor} \newcommand{\fnum@schema}{\schemaname~\theschema} \newcommand{\schemaname}{Schema} \newcommand{\lorname}{Die Reaktionsschemata} \newcommand{\l@schema}{\@dottedtocline{1}{1.5em}{2.3em}} \newcommand{\tableofschemes} {\@restonecolfalse \if@twocolumn\@restonecoltrue\onecolumn\fi \chapter*{\lorname\@mkboth{\lorname}{\lorname}} {\parindent\z@\@starttoc{lor}} \if@restonecol\twocolumn\fi } \newenvironment{schema} {\@float{schema}} {\end@float} \newenvironment{schema*} {\@dblfloat{schema}} {\end@dblfloat} % % open .chm output file for chemistry environments and install % font for chemical text % \newwrite\verb@chem \immediate\openout\verb@chem \jobname.chm \AtBeginDocument {{\chemfontname\immediate\write\verb@chem{font(\string" \string\usefont\string{\f@encoding\string}\string{\f@family\string} \string{\f@series\string}\string{\f@shape\string} \string\fontsize\string{\f@size\string}\string{\f@baselineskip\string}\string\selectfont \string")}} \ifthenelse{\boolean{separate}}{\pagestyle{empty}}{} } \AtEndDocument {\immediate\closeout\verb@chem \ifthenelse{\boolean{separate}}{\immediate\closeout\verb@chemnames}{} } % % chemistry environment for placing scheme descriptions in % use #1 as name of TeX fragment (-> #1.ctx) % \newcounter{chemcnt} \newenvironment{chemistry}[1][\arabic{chemcnt}] {\ifthenelse{\boolean{separate}}{\newpage}{}% \ifthenelse{\boolean{separate}}{\immediate\write\verb@chemnames{#1}}{}% \InputIfFileExists{#1.ctx}{}{\typeout{ochem: cannot find #1.ctx}}% \immediate\write\verb@chem{schema(\string"#1.ctx\string")}% \@bsphack \let\do\@makeother\dospecials \catcode`\^^M\active \catcode`\^^I=12 \def\verbatim@processline{% \immediate\write\verb@chem{\the\verbatim@line}}% \verbatim@start} {\@esphack \immediate\write\verb@chem{endschema}% \stepcounter{chemcnt}} \newenvironment{chemspecial} {\@bsphack \let\do\@makeother\dospecials \catcode`\^^M\active \catcode`\^^I=12 \def\verbatim@processline{% \immediate\write\verb@chem{\the\verbatim@line}}% \verbatim@start} {\@esphack } % % ------------------------------------------ % auxiliary functions and macros % ------------------------------------------ % \special{! /\par {} def /posx 10 dict def posx begin /c -.5 def /bl 0 def /b -.5 def /br -1 def /r -1 def /tr -1 def /t -.5 def /tl 0 def /l 0 def end /posy 10 dict def posy begin /c -.5 def /bl 0 def /b 0 def /br 0 def /r -.5 def /tr -1 def /t -1 def /tl -1 def /l -.5 def end % x y pos text ftshow - /ftshow { /t exch def cvn /p exch def gs translate t stringwidth exch posx p get mul exch posy p get mul moveto t show gr} def % % abbreviations % /tr { translate } def /sc { scale }def /ro { rotate } def /l { lineto } def /s { stroke } def /m { moveto } def /np { newpath } def /gs { gsave } def /gr { grestore } def % % different bond types % phi x y len s0..s12 % /sb__ { currentlinewidth .7 mul setlinewidth } def /b0 { /bl exch def gsave translate rotate newpath 0 0 moveto bl 0 lineto stroke grestore } def /b1 { /bl exch def gsave translate rotate gsave 1 setgray newpath lw lw 1.5 mul moveto bl lw 2 mul sub 0 rlineto stroke newpath lw lw -1.5 mul moveto bl lw 2 mul sub 0 rlineto stroke grestore currentlinewidth 2 mul setlinewidth newpath 0 0 moveto bl 0 lineto stroke grestore } def /b2 { /bl exch def gsave translate rotate newpath 0 lw -.5 mul moveto bl bw -.5 mul lineto 0 bw rlineto 0 lw .5 mul lineto closepath fill grestore } def /b3 { /bl exch def gsave translate rotate newpath 0 lw -.5 mul moveto bl bw -.5 mul lineto 0 bw rlineto 0 lw .5 mul lineto closepath clip [ bd dup ] 0 setdash bw setlinewidth newpath 0 0 moveto bl 0 lineto stroke grestore } def /b4 { /bl exch def gsave translate rotate newpath 0 bw -.15 mul moveto bl bw -.15 mul lineto 0 bw .3 mul rlineto 0 bw .15 mul lineto closepath clip [ bd dup ] 0 setdash bw setlinewidth newpath 0 0 moveto bl 0 lineto stroke grestore } def /b5 { /bl exch def gsave translate rotate newpath 0 bw .5 mul moveto bl 0 rlineto 0 bw -.5 mul moveto bl 0 rlineto stroke grestore } def /b6 { /bl exch def gsave translate rotate newpath 0 0 moveto bl 0 rlineto stroke sb__ .1 bl mul bw moveto .8 bl mul 0 rlineto stroke grestore } def /b7 { /bl exch def gsave translate rotate newpath 0 0 moveto bl 0 rlineto stroke sb__ .1 bl mul bw neg moveto .8 bl mul 0 rlineto stroke grestore } def /b8 { /bl exch def gsave translate rotate newpath 0 0 moveto bl 0 rlineto stroke sb__ .1 bl mul bw neg moveto .8 bl mul 0 rlineto .1 bl mul bw moveto .8 bl mul 0 rlineto stroke grestore } def /b9 { /bl exch def gsave translate rotate currentlinewidth 2 mul setlinewidth 1 setlinecap newpath 0 0 moveto bl 0 lineto stroke grestore } def /b10 { /bl exch def gsave translate rotate newpath 0 0 moveto bl 0 rlineto stroke newpath bl 0 moveto bw neg bw neg rlineto 0 bw dup add rlineto closepath fill grestore } def /b11 { /bl exch def gsave translate rotate newpath 0 0 moveto bl 0 rlineto stroke newpath 0 0 moveto bw bw neg rlineto 0 bw dup add rlineto closepath fill grestore } def /b12 { pop pop pop pop} def /b13 { /bl exch def gsave translate rotate newpath 0 bw -.5 mul moveto bl lw -.5 mul lineto 0 lw rlineto 0 bw .5 mul lineto closepath fill grestore } def /b14 { /bl exch def gsave translate rotate newpath 0 bw -.5 mul moveto bl lw -.5 mul lineto 0 lw rlineto 0 bw .5 mul lineto closepath clip [ bd dup ] 0 setdash bw setlinewidth newpath 0 0 moveto bl 0 lineto stroke grestore } def /b15 { /bl exch def gsave translate rotate bw setlinewidth 1 setlinecap newpath 0 0 moveto bl 0 lineto stroke grestore } def /b16 { /bl exch def gsave translate rotate newpath 0 0 moveto 3 dict begin /n bl bw 2 mul div cvi 1 add def /blt bl n div def /bwt bw bl blt div mul .5 mul def n {bwt 0.3 mul bw bwt 0.7 mul bw neg bwt 0 rcurveto} repeat end stroke grestore } def % % arrow types % len phi x y ar0..ar7 % /ar0 { gsave translate rotate 0 0 moveto 0 lineto stroke grestore} def /ar1 { gsave translate rotate 0 0 moveto dup 0 lineto stroke newpath 0 moveto aw neg dup rlineto 0 aw dup add rlineto closepath fill grestore} def /ar2 { gsave translate rotate 0 0 moveto 0 lineto stroke newpath 0 0 moveto aw aw rlineto 0 aw dup add neg rlineto closepath fill grestore} def /ar3 { gsave translate rotate 0 aw 2 div moveto dup 0 rlineto 0 aw -.5 mul moveto dup 0 rlineto stroke newpath aw 2 div moveto aw neg aw rlineto 0 aw neg rlineto closepath fill newpath 0 aw -.5 mul moveto aw 0 rlineto 0 aw neg rlineto closepath fill grestore} def /ar4 { gsave translate rotate 0 0 moveto dup 0 lineto stroke newpath 0 moveto aw neg dup rlineto 0 aw dup add rlineto closepath fill newpath 0 0 moveto aw aw lineto 0 aw -2 mul rlineto closepath fill grestore} def /ar5 { gsave translate rotate 0 0 moveto dup 0 lineto stroke newpath dup 0 moveto aw neg dup rlineto 0 aw dup add rlineto closepath fill newpath 2 div dup aw moveto aw -2 mul dup rlineto aw neg moveto aw dup add dup rlineto stroke grestore} def /ar6 { gsave translate rotate 0 0 moveto dup 0 lineto stroke newpath 0 0 moveto aw aw rlineto 0 aw dup add neg rlineto closepath fill newpath 2 div dup aw moveto aw -2 mul dup rlineto aw neg moveto aw dup add dup rlineto stroke grestore} def % phi x y arrow tip /atip { gsave translate rotate /maw aw 2 div def newpath 0 0 moveto maw neg maw rlineto 0 maw -2 mul rlineto closepath fill grestore } def % % marker types: size x y m % /slw { .035 setlinewidth }def /m0 { gsave translate slw dup scale 0 0 .5 0 360 arc closepath stroke grestore } def /m1 { gsave translate slw dup scale 0 0 .5 0 360 arc closepath fill grestore } def /m2 { gsave translate slw dup scale -.5 -.5 moveto 1 0 rlineto 0 1 rlineto -1 0 rlineto closepath stroke grestore } def /m3 { gsave translate slw dup scale -.5 -.5 moveto 1 0 rlineto 0 1 rlineto -1 0 rlineto closepath fill grestore } def /m4 { gsave translate slw dup scale 0 -.5 moveto .5 0 lineto 0 .5 lineto -.5 0 lineto closepath stroke grestore } def /m5 { gsave translate slw dup scale 0 -.5 moveto .5 0 lineto 0 .5 lineto -.5 0 lineto closepath fill grestore } def /m6 { gsave translate slw dup scale -.5 -.5 moveto 1 0 rlineto -.5 1 rlineto closepath stroke grestore } def /m7 { gsave translate slw dup scale -.5 -.5 moveto 1 0 rlineto -.5 1 rlineto closepath fill grestore } def /m8 { gsave translate slw dup scale -.5 0 moveto 1 0 rlineto 0 -.5 moveto 0 1 rlineto stroke grestore } def /m9 { gsave translate slw dup scale -.5 -.5 moveto .5 .5 lineto -.5 .5 moveto .5 -.5 lineto stroke grestore } def /m10 { gsave translate slw dup scale -.5 -.5 moveto .5 .5 lineto -.5 .5 moveto .5 -.5 lineto 0 -.5 moveto 0 .5 lineto stroke grestore } def /m11 { } def }