%
% 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<type>
%
/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
}