summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/chemcompounds
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /macros/latex/contrib/chemcompounds
Initial commit
Diffstat (limited to 'macros/latex/contrib/chemcompounds')
-rw-r--r--macros/latex/contrib/chemcompounds/README8
-rw-r--r--macros/latex/contrib/chemcompounds/chemcompounds.dtx748
-rw-r--r--macros/latex/contrib/chemcompounds/chemcompounds.ins24
-rw-r--r--macros/latex/contrib/chemcompounds/chemcompounds.pdfbin0 -> 127051 bytes
4 files changed, 780 insertions, 0 deletions
diff --git a/macros/latex/contrib/chemcompounds/README b/macros/latex/contrib/chemcompounds/README
new file mode 100644
index 0000000000..974a01680e
--- /dev/null
+++ b/macros/latex/contrib/chemcompounds/README
@@ -0,0 +1,8 @@
+The chemcompounds package allows for a simple consecutive numbering of
+chemical compounds. Optionally, it is possible to supply a custom name for
+each compound. By default the compound numbering follows the order of
+their appearance in the text.
+
+This material is subject to the LaTeX Project Public License. See
+http://www.ctan.org/tex-archive/help/Catalogue/licenses.lppl.html for the
+details of that license. \ No newline at end of file
diff --git a/macros/latex/contrib/chemcompounds/chemcompounds.dtx b/macros/latex/contrib/chemcompounds/chemcompounds.dtx
new file mode 100644
index 0000000000..33788af1fa
--- /dev/null
+++ b/macros/latex/contrib/chemcompounds/chemcompounds.dtx
@@ -0,0 +1,748 @@
+% \iffalse
+%%
+%% File: chemcompounds.dtx Copyright (C) 2005-2007 Stephan Schenk
+%% $Id: chemcompounds.dtx,v 1.8 2006/12/01 15:21:58 schenk Exp $
+%%
+%% Stephan Schenk (mail@schenk-stephan.de)
+%%
+% This program may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either version 1.3
+% of this license or (at your option) any later version.
+% The latest version of this license is in
+% http://www.latex-project.org/lppl.txt
+%
+% This package consists of the files chemcompounds.dtx and chemcompounds.ins
+%
+%%
+%% To produce the documentation, do the following:
+%%
+%% latex chemcompounds.dtx
+%% latex chemcompounds.dtx
+%% makeindex -s gglo.ist -o chemcompounds.gls chemcompounds.glo
+%% latex chemcompounds.dtx
+%%
+
+%<*driver>
+\ProvidesFile{chemcompounds.dtx}
+%</driver>
+%<package>\NeedsTeXFormat{LaTeX2e}
+%<package>\ProvidesPackage{chemcompounds}
+%<*package>
+ [2006/12/01 v1.1.3 Dictionary for compound numbering]
+%</package>
+%
+%<*driver>
+\documentclass{ltxdoc}
+\GetFileInfo{chemcompounds.dtx}
+\RecordChanges
+\begin{document}
+ \DocInput{\filename}
+ \PrintChanges
+\end{document}
+%</driver>
+% \fi
+%
+% \CheckSum{198}
+%
+% \CharacterTable
+% {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
+% Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
+% Digits \0\1\2\3\4\5\6\7\8\9
+% Exclamation \! Double quote \" Hash (number) \#
+% Dollar \$ Percent \% Ampersand \&
+% Acute accent \' Left paren \( Right paren \)
+% Asterisk \* Plus \+ Comma \,
+% Minus \- Point \. Solidus \/
+% Colon \: Semicolon \; Less than \<
+% Equals \= Greater than \> Question mark \?
+% Commercial at \@ Left bracket \[ Backslash \\
+% Right bracket \] Circumflex \^ Underscore \_
+% Grave accent \` Left brace \{ Vertical bar \|
+% Right brace \} Tilde \~}
+%
+%
+%
+% \changes{1.1.3}{2006/12/01}{Updated documentation.}
+% \changes{1.1.2}{2005/10/24}{Posted on CTAN on 2005/10/24.}
+% \changes{1.0.0}{2005/07/21}{First version posted on CTAN.}
+%
+% \title{The \textsf{chemcompounds} package\thanks{This file describes
+% version \fileversion\ and has been last revised \filedate.}}
+% \author{Stephan Schenk\\mail (at) schenk-stephan.de}
+% \maketitle
+%
+% \setcounter{tocdepth}{1}
+%
+% \begin{abstract}
+% The \texttt{\filename} package allows for a simple consecutive numbering of
+% chemical compounds. Optionally, it is possible to supply a custom name for
+% each compound. By default the compounds are numbered following the order of
+% their appearance in the text.
+% \end{abstract}
+%
+% \tableofcontents
+%
+% \section{Introduction}
+%
+% In chemical publications it is often necessary to consecutively number every
+% compound mentioned in the text. Although this can be simply accomplished by
+% manually inserting the corresponding numbers into the text, it is generally
+% much more tedious work since the numbering scheme tends to change several
+% times during the evolvement of the manuscript. For this reason it would be
+% nice to have an automaticism which will take care of every change.
+%
+% Being myself a chemist, I've been using the \texttt{chemcono} package by
+% Stefan Schulz for this purpose quite successfully over several years. This
+% package creates a library very similar to |thebibliography|. Users can now
+% refer to entries in the library by a command very similar to |\cite|. Thus,
+% once you change the library entry every reference to it will be updated
+% automatically upon running \LaTeX\ on the file. There is only one issue
+% associated with this package: You get a list of all declared compounds
+% inside your document wich at least looks odd. I therefore decided to write a
+% new package \texttt{chemcompounds} described in this document to address
+% this problem.
+%
+% When taking a closer look at the \texttt{chemcono} package, I realised that
+% the only thing one has to do is to get rid of everything which produces
+% text. Thus, as a basis I used the mechanism of |\bibitem| and |\cite| in
+% pretty much the same way as \texttt{chemcono} does by extracting the
+% corresponding code from |article.cls| and |latex.ltx| but deleting any
+% unnecessary commands producing output. I also introduced several lines of
+% code to make the printing of the compound names more customisable.
+%
+% Currently, the packages knows two different modes of operation. In
+% the default |implicit| mode, a compound name is created automatically as a
+% consecutive number when the compound is referenced for the first time by
+% |\compound|. Thus, all compounds will be numbered
+% consecutively in the order they appear in the text. If the automatically
+% generated name is not appropriate, a custom name can be given to a compound
+% by means of the |\declarecompound| command described below.
+%
+% In |noimplicit| mode names are not generated fully automatically. Instead, for
+% every compound a |\declarecompound| must be issued. This will again create a
+% subsequent number and a custom name can be given as an optional argument. The
+% main difference to |implicit| mode is that thus compounds will be
+% numbered in the order of the corresponding |\declarecompound| commands rather
+% than in the order of their appearance in the text.
+%
+%
+% \section{The user interface}
+%
+% Because of the way the implementation works, two \LaTeX\ runs are required
+% to get everything right. This should not be a problem since you have to run
+% \LaTeX\ twice anyway to get the table of contents and references right. The
+% package will issue a ``labels have changed'' warning if you have to rerun
+% \LaTeX. For every unknown compound name the package will issue a warning, too.
+%
+% \subsection{Package options}
+%
+% \begin{list}{}{\leftmargin=0pt \labelsep=0pt}
+%
+% \item
+% \DescribeMacro{implicit}
+% This option causes the package to operate in |implicit| mode. This is the
+% default.
+%
+% \item
+% \DescribeMacro{noimplicit}
+% This option is the opposite of |implicit| and causes the package to operate in
+% |noimplicit| mode.
+%
+% \end{list}
+%
+% \subsection{Assigning and accessing compound names}
+%
+% \begin{list}{}{\leftmargin=0pt \labelsep=0pt}
+%
+% \item
+% \DescribeMacro{\declarecompound}
+% |\declarecompound[|\meta{optional name}|]{|\meta{label}|}|\\
+% assigns a name to a compound.
+% If the optional argument is omitted, a consecutive number is automatically
+% taken as compound name. This command can only occur in the preamble.
+% A personal recommendation is to keep all |\declarecompound|s together in a
+% separate file and |\input| this file in the preamble.
+%
+% In |implicit| mode, if no optional argument is given, the command does nothing
+% since the automatic compound name will be generated by |\compound|.
+%
+% \item
+% \DescribeMacro{\compound}
+% |\compound{|\meta{label1}|,|\meta{label2}|,|\dots|}|\\
+% prints the name of a compound. If a list of labels is given as argument, a
+% list of names separated by |\compoundseparator| is created. In |implicit| mode
+% this command also creates a new compound name if the label is used for the
+% first time and a custom name has not already been assigned to this compound.
+%
+% \item
+% \DescribeMacro{\compound*}
+% The starred version works in almost exactly the same way as |\compound|. The
+% only difference is that it does not create any output at all. However, it
+% still creates the label in |implicit| mode. It can thus be used to create
+% ``hidden'' compounds in |implicit| mode. This, i.e., can be useful if some
+% compounds are depicted in an illustration or scheme which are only later or
+% even never mentioned in the text but the numbering scheme should take care of
+% them.
+%
+% \item
+% \DescribeMacro{\compound+}
+% The version with a '|+|' really prints only the name of a compound. In
+% |implicit| mode, no label is created. Thus, it is the opposite of the starred
+% command.
+%
+% \end{list}
+%
+%
+%
+% \subsection{Customization}
+%
+% The commands in this section can be used to fine-tune the appearance of the
+% compound names. In order to change the default behaviour you have to
+% |\renewcommand| the corresponding commands. The defaults for every command
+% are given in parentheses.
+%
+% \begin{list}{}{\leftmargin=0pt \labelsep=0pt}
+%
+% \item
+% \DescribeMacro{\compoundseparator}
+% |\compoundseparator| (\verb*<,\penalty\@m\ <)\\
+% defines the separator in a list of compound names.
+%
+% \item
+% \DescribeMacro{\compoundglobalprefix}
+% |\compoundglobalprefix| ()\\
+% defines the prefix for a list of compound names. This will be printed also in
+% case the list has length one.
+%
+% \item
+% \DescribeMacro{\compoundglobalsuffix}
+% |\compoundglobalsuffix| ()\\
+% defines the suffix for a list of compound names. This will be printed also in
+% case the list has length one.
+%
+% \item
+% \DescribeMacro{\compoundprefix}
+% |\compoundprefix| ()\\
+% defines the prefix for every compound.
+%
+% \item
+% \DescribeMacro{\compoundsuffix}
+% |\compoundsuffix| ()\\
+% defines the suffix for every compound.
+%
+% \item
+% \DescribeMacro{\compoundstyle}
+% |\compoundstyle| (|\textbf|)\\
+% defines the style of each name.
+%
+% \item
+% \DescribeMacro{\printcompound}
+% |\printcompound|
+% (|{\compoundprefix}{\compoundstyle{#1}}{\compoundsuffix}|)\\
+% is used to actually format the name of each compound. If the previous
+% possibilities are not sufficient to meet your formatting demands the thing
+% you should redefine is this one.
+%
+% \end{list}
+%
+%
+%
+% \subsection{Examples}
+%
+% The following examples using
+% \begin{verbatim}
+% \declarecompound{label1}
+% \declarecompound{label2}
+% \declarecompound[5b]{label3}
+% \compound{label1} and \compound{label1,label2,label3}
+% \end{verbatim}
+% should clarify the meaning of the above commands. The first two
+% |\declarecommand|s could be omitted in |implicit| mode.
+%
+% \begin{itemize}
+%
+% \item
+% Using the defaults results in \textbf{1} and \textbf{1}, \textbf{2},
+% \textbf{5b}.
+%
+% \item
+% \begin{verbatim}
+% \renewcommand{\compoundstyle}{\underbar}
+% \end{verbatim}
+% gives \underbar 1 and \underbar 1, \underbar 2, \underbar{5b}.
+%
+% \item
+% \begin{verbatim}
+% \renewcommand{\compoundseparator}{;}
+% \end{verbatim}
+% gives \textbf{1} and \textbf{1}; \textbf{2}; \textbf{5b}.
+%
+% \item
+% \begin{verbatim}
+% \renewcommand{\compoundglobalprefix}{(}
+% \renewcommand{\compoundglobalsuffix}{)}
+% \end{verbatim}
+% gives (\textbf{1}) and (\textbf{1}, \textbf{2}, \textbf{5b}).
+%
+% \item
+% \begin{verbatim}
+% \renewcommand{\compoundprefix}{(}
+% \renewcommand{\compoundsuffix}{)}
+% \end{verbatim}
+% gives (\textbf{1}) and (\textbf{1}), (\textbf{2}), (\textbf{5b}).
+%
+% \item
+% \begin{verbatim}
+% \renewcommand{\compoundglobalprefix}{\textbf{[}}
+% \renewcommand{\compoundglobalsuffix}{\textbf{]}}
+% \renewcommand{\compoundprefix}{\ensuremath{\langle}}
+% \renewcommand{\compoundsuffix}{\ensuremath{\rangle}}
+% \renewcommand{\compoundstyle}{\emph}
+% \end{verbatim}
+% gives \textbf{[}$\langle$\emph{1}$\rangle$\textbf{]} and
+% \textbf{[}$\langle$\emph{1}$\rangle$,
+% $\langle$\emph{2}$\rangle$, $\langle$\emph{5b}$\rangle$\textbf{]}.
+%
+% \end{itemize}
+%
+% \noindent
+% As shown above customization is not limited solely to parentheses etc.\
+% but can include formating commands, too.
+%
+%
+%
+% \StopEventually{}
+%
+% \section{The implementation}
+%
+%\iffalse
+%<*package>
+%\fi
+%
+% \subsection{Identification}
+% The package identifies itself at the top using something like
+% \iffalse
+% Identification is already done on top of the file. Thus the following
+% code should be printed in the documentation but should not be included
+% in the package.
+%</package>
+%<*!package>
+% \fi
+% \begin{macrocode}
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{chemcompounds}
+ [\filedate\space \fileversion\space Dictionary for compound numbering]
+% \end{macrocode}
+% \iffalse
+%</!package>
+%<*package>
+% \fi
+%
+% \subsection{Package options}
+%
+% \begin{macro}{\ifchemcompounds@implicit}
+% \changes{1.1.0}{2005/10/06}{New.}
+% Define a new boolean variable defining whether |implicit| mode is enabled.
+% \begin{macrocode}
+\newif\ifchemcompounds@implicit
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{implicit}
+% \changes{1.1.0}{2005/10/07}{New option.}
+% \begin{macro}{noimplicit}
+% \changes{1.1.0}{2005/10/06}{New option.}
+% The following package options set |ifchemcompounds@implicit| either to true or
+% false. The default is |implicit| mode.
+% \begin{macrocode}
+\DeclareOption{implicit}{\chemcompounds@implicittrue}
+\DeclareOption{noimplicit}{\chemcompounds@implicitfalse}
+\ExecuteOptions{implicit}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+%
+% Process options.
+% \changes{1.1.0}{2005/10/06}{Added code to process options.}
+% \begin{macrocode}
+\ProcessOptions
+% \end{macrocode}
+%
+%
+% \subsection{User interface}
+%
+% The work flow for creating and accessing compound names was borrowed from the
+% definition of |\bibitem| and |\cite|.
+%
+% \begin{macro}{\compoundseparator}
+% \changes{1.1.0}{2005/10/06}{Changed default value to include trailing
+% space.}
+% \begin{macro}{\compoundglobalprefix}
+% \begin{macro}{\compoundglobalsuffix}
+% \begin{macro}{\compoundprefix}
+% \begin{macro}{\compoundsuffix}
+% \begin{macro}{\compoundstyle}
+% \begin{macro}{\printcompound}
+% \changes{1.1.2}{2005/10/18}{New. Previous \cs{@compound}
+% command.}
+% The following definitions define the default layout of the names in the text
+% (no surrounding parentheses, multiple compound names separated by comma,
+% names in bold face). |\printcompound| defines the way each name is
+% printed.
+% \begin{macrocode}
+\def\compoundseparator{,\penalty\@m\ }
+\let\compoundglobalprefix\@empty
+\let\compoundglobalsuffix\@empty
+\let\compoundprefix\@empty
+\let\compoundsuffix\@empty
+\def\compoundstyle{\textbf}
+\def\printcompound#1{{\compoundprefix}{\compoundstyle{#1}}{\compoundsuffix}}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+% \begin{macro}{\declarecompound}
+% \changes{1.1.0}{2005/10/07}{Only in preamble.}
+% This command is used to assign a name to a compound.
+% It just looks ahead whether an optional argument was given
+% and calls the appropriate internal command. To avoid problems with the
+% creation of the labels, this command is only allowed in the preamble.
+% \begin{macrocode}
+\def\declarecompound{\@ifnextchar[\@ldeclarecompound\@declarecompound}
+\@onlypreamble\declarecompound
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifchemcompounds@print}
+% \changes{1.1.2}{2005/10/18}{New.}
+% Define a new boolean variable indicating whether the starred version of
+% |\compound| was used.
+% \begin{macrocode}
+\newif\ifchemcompounds@print
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ifchemcompounds@create}
+% \changes{1.1.3}{2006/12/01}{New.}
+% Define a new boolean variable indicating whether a label name shall be
+% created automatically in |implicit| mode.
+% \begin{macrocode}
+\newif\ifchemcompounds@create
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\compound}
+% \changes{1.1.3}{2006/12/01}{Abandon use of \cs{@ifstar} since this breaks
+% compatibility with amsmath (reported by J. Ryan).}
+% \changes{1.1.3}{2006/12/01}{Set chemcompounds@create appropriately.}
+% \changes{1.1.2}{2005/10/18}{Only check for starred version and call internal
+% command. Functionality moved to \cs{@compound}.}
+% \changes{1.1.1}{2005/10/11}{Changed label prefix to 'comp'.}
+% \changes{1.1.0}{2005/10/07}{Changed definition of
+% \cs{compoundseparator}. Inserted \cs{@createcompoundhook}.}
+% \changes{1.0.1}{2005/10/05}{Replaced \cs{hbox} by \cs{mbox}
+% to work around some spacing issues when printing the compound name.}
+% \begin{macro}{\compound*}
+% \changes{1.1.2}{2005/10/18}{New.}
+% \begin{macro}{\compound+}
+% \changes{1.1.3}{2006/12/01}{New (suggested by J. Hooper).}
+% This command will finally print the name associated with a compound label.
+% The starred version just creates the label (in |implicit| mode) without
+% printing the value.
+% The command itself just checks whether the starred or plussed version is used,
+% sets the internal flags appropriately and calls the internal command
+% |\@compound|.
+% \begin{macrocode}
+\DeclareRobustCommand{\compound}{%
+ \chemcompounds@createtrue
+ \chemcompounds@printtrue
+ \@ifnextchar *{\chemcompounds@printfalse\@firstoftwo\@compound}
+ {%
+ \@ifnextchar +{\chemcompounds@createfalse\@firstoftwo\@compound}
+ {\@compound}
+ }
+}
+% \end{macrocode}
+% \end{macro}
+% \end{macro}
+% \end{macro}
+%
+%
+%
+% \subsection{Internal commands}
+%
+% \begin{macro}{\@compound}
+% \changes{1.1.2}{2005/10/18}{New. Previous functionality moved to
+% \cs{printcompound}.}
+% This command retrieves the name associated with a compound and prints it
+% in the text using the previously defined format. The code is a modified
+% version of the definition of |\cite| in |latex.ltx|.
+% If this command is invoked by |\compound*|, |\ifchemcompounds@print| will be
+% false and all output will be suppressed.
+% \begin{macrocode}
+\def\@compound#1{%
+% \end{macrocode}
+% Print optional prefix to a list of compounds.
+% \begin{macrocode}
+ \ifchemcompounds@print
+ \compoundglobalprefix
+ \fi
+% \end{macrocode}
+% Now loop over every label in the argument list.
+% \begin{macrocode}
+ \let\@compounda\@empty
+ \@for\@compoundb:=#1\do{%
+ \edef\@compoundb{\expandafter\@firstofone\@compoundb}%
+% \end{macrocode}
+% Print separator. Note that it is empty for the first entry and
+% |\compoundseparator| otherwise.
+% \begin{macrocode}
+ \ifchemcompounds@print
+ \@compounda
+ \def\@compounda{{\compoundseparator}}%
+ \fi
+% \end{macrocode}
+% If compound is undefined, print '\textbf{?}' and raise a warning.
+% \begin{macrocode}
+ \@ifcompoundundefined{\@compoundb}{%
+ \ifchemcompounds@print
+ \mbox{\reset@font\bfseries ?}%
+ \fi
+ \G@refundefinedtrue
+ \@latex@warning
+ {compound `\@compoundb' on page \thepage\space undefined}%
+ }{%
+% \end{macrocode}
+% If compound is known print formatted name.
+% \begin{macrocode}
+ \ifchemcompounds@print
+ \mbox{\printcompound{\@nameuse{comp@\@compoundb}}}%
+ \fi
+ }%
+% \end{macrocode}
+% In |implicit| mode |\@createcompoundhook| will generate a new name if this has
+% not been done before. In |noimplicit| mode this does nothing.
+% \begin{macrocode}
+ \@createcompoundhook{\@compoundb}%
+ }%
+% \end{macrocode}
+% Print optional suffix to a list of compounds.
+% \begin{macrocode}
+ \ifchemcompounds@print
+ \compoundglobalsuffix
+% \end{macrocode}
+% Although nothing is printed, under certain conditions an additional
+% space is created. Remove it.
+% \begin{macrocode}
+ \else
+ \unskip
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\chemcompounds@counter}
+% Define a new counter which will be used for generating the compound names.
+% \begin{macrocode}
+\newcounter{chemcompounds@counter}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\chemcompounds@label}
+% \changes{1.1.1}{2005/10/11}{Changed label prefix to 'comp' since 'c' is
+% already in use.}
+% \changes{1.1.0}{2005/10/06}{Labels are now prefixed with 'c' making them
+% hopefully unique.}
+% The next command will be used in the |.aux| file and defines a new label for
+% every compound.
+% \begin{macrocode}
+\def\chemcompounds@label{\@newl@bel {comp}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\chemcompounds@writelabel}
+% \changes{1.1.2}{2005/10/18}{Added \cs{ignorespaces}.}
+% \changes{1.1.1}{2005/10/10}{\cs{noexpand} the label value. Required
+% for improved robustness.}
+% \changes{1.1.0}{2005/10/06}{New.}
+% Write the label and its value to the |aux| file.
+% \begin{macrocode}
+\def\chemcompounds@writelabel#1#2{%
+ \if@filesw
+ \begingroup
+ \def\protect{\noexpand}%
+ \immediate\write\@auxout{
+ \string\chemcompounds@label{#1}{#2}
+ }%
+ \endgroup
+ \fi
+ \ignorespaces
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@ldeclarecompound}
+% \changes{1.1.0}{2005/10/06}{Completly rewritten.}
+% The next command gets called if an additional argument was supplied to
+% |\declarecompound|. It creates the compound with the given name as soon as
+% the |aux| file is writeable. This command can only be used in the preamble.
+% \begin{macrocode}
+\def\@ldeclarecompound[#1]#2{%
+ \AtBeginDocument{\@createcompound[#1]{#2}}
+}
+\@onlypreamble\@ldeclarecompound
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@declarecompound}
+% \changes{1.1.0}{2005/10/06}{Completely rewritten.}
+% In |implicit| mode this command does nothing since default names are created
+% automatically by |\compound|.
+% \begin{macrocode}
+\ifchemcompounds@implicit
+ \let\@declarecompound\@gobble
+% \end{macrocode}
+% In |noimplicit| mode this simply creates the compound as soon as
+% the |aux| file is writeable.
+% \begin{macrocode}
+\else
+ \def\@declarecompound#1{%
+ \AtBeginDocument{\@createcompound{#1}}
+ }
+\fi
+\@onlypreamble\@declarecompound
+% \end{macrocode}
+% This command can only be used in the preamble.
+% \end{macro}
+%
+% \begin{macro}{\@ifcompoundundefined}
+% \changes{1.1.1}{2005/10/11}{Changed label prefix to 'comp'.}
+% \changes{1.1.0}{2005/10/06}{New.}
+% Test whether a compound has already been defined by testing the associated
+% label.
+% \begin{macrocode}
+\def\@ifcompoundundefined#1{%
+ \@ifundefined{comp@#1}
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@createcompound}
+% \changes{1.1.0}{2005/10/06}{New.}
+% This command is used to create a new compound name. It just looks ahead
+% whether an optional argument was given and calls the appropriate command.
+% \begin{macrocode}
+\def\@createcompound{%
+ \@ifnextchar[\@@lcreatecompound\@@createcompound
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@createcompound}
+% \changes{1.1.0}{2005/10/06}{New.}
+% If a compound name has not yet been created this command increments
+% |chemcompounds@counter| and takes the new value as the compound name.
+% The new compound name is written to the |aux| file and a flag is set to
+% indicate that a name for this compound has already been created.
+% \begin{macrocode}
+\def\@@createcompound#1{%
+ \@ifnotcompoundcreated{#1}{%
+ \stepcounter{chemcompounds@counter}%
+ \chemcompounds@writelabel{#1}{\the\value{chemcompounds@counter}}
+ \@compoundcreated{#1}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@@lcreatecompound}
+% \changes{1.1.0}{2005/10/06}{New.}
+% This command creates a compound name from the first parameter and writes it
+% to the |aux| file. A flag is set to indicate that a name for this compound has
+% already been created.
+% \begin{macrocode}
+\def\@@lcreatecompound[#1]#2{%
+ \chemcompounds@writelabel{#2}{#1}
+ \@compoundcreated{#2}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@compoundcreated}
+% \changes{1.1.1}{2005/10/11}{Changed label prefix to 'compc'.}
+% \changes{1.1.0}{2005/10/06}{New.}
+% Set a flag indicating that the compound name has been created. This is done by
+% defining an appropriate label in |implicit| mode.
+% \begin{macrocode}
+\ifchemcompounds@implicit
+ \def\@compoundcreated#1{%
+ \global\@namedef{compc@#1}{}%
+ }
+% \end{macrocode}
+% In |noimplicit| mode this is unnecessary, thus just gobble the argument.
+% \begin{macrocode}
+\else
+ \let\@compoundcreated\@gobble
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@ifnotcompoundcreated}
+% \changes{1.1.1}{2005/10/11}{Changed label prefix to 'compc'.}
+% \changes{1.1.0}{2005/10/07}{New.}
+% Check whether a new compound name has already been created.
+% In |implicit| mode existence of the corresponding label (flag) is checked.
+% If it does not exist, the code given as the second argument is executed.
+% \begin{macrocode}
+\ifchemcompounds@implicit
+ \def\@ifnotcompoundcreated#1#2{%
+ \@ifundefined{compc@#1}{#2}{}%
+ }
+% \end{macrocode}
+% In |noimplicit| mode the label (flag) is unused and a new name will always be.
+% created. Therefore just execute the code given as second argument.
+% \begin{macrocode}
+\else
+ \let\@ifnotcompoundcreated\@secondoftwo
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\@createcompoundhook}
+% \changes{1.1.3}{2006/12/01}{Implicit definition now checks for
+% chemcompounds@create}
+% \changes{1.1.0}{2005/10/07}{New.}
+% This command gets called everytime a compound name is printed.
+% In |implicit| mode this command creates a new compound name if
+% |\ifchemcompounds@create| is true. The |\compound+| command sets
+% this boolean to false.
+% \begin{macrocode}
+\ifchemcompounds@implicit
+ \def\@createcompoundhook#1{%
+ \ifchemcompounds@create
+ \@createcompound{#1}%
+ \fi
+ }
+% \end{macrocode}
+% In |noimplicit| mode this is unnecessary. Therefore just gobble the argument.
+% \begin{macrocode}
+\else
+ \let\@createcompoundhook\@gobble
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\endinput
+% \end{macrocode}
+%
+%\iffalse
+%</package>
+%\fi
+%
+% \Finale \ No newline at end of file
diff --git a/macros/latex/contrib/chemcompounds/chemcompounds.ins b/macros/latex/contrib/chemcompounds/chemcompounds.ins
new file mode 100644
index 0000000000..aee273065f
--- /dev/null
+++ b/macros/latex/contrib/chemcompounds/chemcompounds.ins
@@ -0,0 +1,24 @@
+%%
+%% File: chemcompounds.ins Copyright (C) 2005-2007 Stephan Schenk
+%% $Id: chemcompounds.ins,v 1.3 2006/12/01 15:21:58 schenk Exp $
+%%
+%% Stephan Schenk,
+%% e-mail: mail@schenk-stephan.de
+%%
+%% This program may be distributed and/or modified under the
+%% conditions of the LaTeX Project Public License, either version 1.3
+%% of this license or (at your option) any later version.
+%% The latest version of this license is in
+%% http://www.latex-project.org/lppl.txt
+%%
+%% This program consists of the files chemcompounds.dtx and chemcompounds.ins
+%%
+%% To produce the LaTeX package `chemcompounds.sty' process this file with
+%% latex.
+
+\input docstrip
+\keepsilent
+\generate{
+ \file{chemcompounds.sty}{\from{chemcompounds.dtx}{package}}
+}
+\endbatchfile
diff --git a/macros/latex/contrib/chemcompounds/chemcompounds.pdf b/macros/latex/contrib/chemcompounds/chemcompounds.pdf
new file mode 100644
index 0000000000..f08171a96c
--- /dev/null
+++ b/macros/latex/contrib/chemcompounds/chemcompounds.pdf
Binary files differ