summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/chemsec
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/chemsec
Initial commit
Diffstat (limited to 'macros/latex/contrib/chemsec')
-rw-r--r--macros/latex/contrib/chemsec/README.md48
-rw-r--r--macros/latex/contrib/chemsec/chemsec.dtx1127
-rw-r--r--macros/latex/contrib/chemsec/chemsec.ins55
-rw-r--r--macros/latex/contrib/chemsec/chemsec.pdfbin0 -> 251241 bytes
-rw-r--r--macros/latex/contrib/chemsec/example1.tex47
-rw-r--r--macros/latex/contrib/chemsec/example2.tex36
-rw-r--r--macros/latex/contrib/chemsec/example3.tex49
-rw-r--r--macros/latex/contrib/chemsec/example4.tex49
-rw-r--r--macros/latex/contrib/chemsec/example5.tex49
9 files changed, 1460 insertions, 0 deletions
diff --git a/macros/latex/contrib/chemsec/README.md b/macros/latex/contrib/chemsec/README.md
new file mode 100644
index 0000000000..09d3d6f888
--- /dev/null
+++ b/macros/latex/contrib/chemsec/README.md
@@ -0,0 +1,48 @@
+# chemsec
+
+LaTeX style for automated creation of numeric chemical
+labels for scientific documents.
+
+For documentation run
+
+ latex chemsec.dtx
+
+To generate style file run
+
+ latex chemsec.ins
+
+The style file in this directory should always be identical
+to the file generated by `latex chemsec.ins`
+
+# Examples
+
+Several examples accompany the CTAN package in the `chemsec`
+directory. You can compile these by processing the files twice
+using a latex program.
+
+ <latex command> example1
+ <latex command> example1
+
+If you obtain the package from the GitHub repository you can run
+the examples by changing to the `test` subdirectory and using the
+supplied makefile. For example to process the `example1.tex` file
+use:
+
+ make clean example1
+
+or
+ make LATEX=latex clean example1
+
+if you want to use a latex program other than `pdflatex`.
+
+## Note
+
+* The examples use the chemsec.sty file in the base
+directory, this is not updated by the make program.
+
+* The make program copies the example latex files and the
+style file into the test directory. Dependency tracking
+should keep these up to date.
+
+* The clean target should remove everything but the
+makefile from the test directory.
diff --git a/macros/latex/contrib/chemsec/chemsec.dtx b/macros/latex/contrib/chemsec/chemsec.dtx
new file mode 100644
index 0000000000..8f8c8777a6
--- /dev/null
+++ b/macros/latex/contrib/chemsec/chemsec.dtx
@@ -0,0 +1,1127 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2018 by Justin Finnerty <jfinn24985@gmail.com>
+%
+% This file 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
+%
+% and version 1.3 or later is part of all distributions of LaTeX version
+% 2005/12/01 or later.
+%
+% \fi
+%
+% \iffalse
+%<*driver>
+\ProvidesFile{chemsec.dtx}
+%</driver>
+%<package>\NeedsTeXFormat{LaTeX2e}[1994/06/01]
+%<package>\ProvidesPackage{chemsec}
+%<*package>
+ [2018/02/01 v1.12 .dtx chemsec file]
+%</package>
+%<package>\RequirePackage{ifthen}[1994/06/01]
+%<*driver>
+\documentclass{ltxdoc}
+\usepackage{chemsec}[2018/02/01]
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+\begin{document}
+ \DocInput{chemsec.dtx}
+ \PrintChanges
+ \PrintIndex
+\end{document}
+%</driver>
+% \fi
+%
+% \CheckSum{418}
+%
+% \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{v1.0}{1996/06/05}{Initial version}
+%
+% \GetFileInfo{chemsec.dtx}
+%
+% \DoNotIndex{\newcommand,\newenvironment}
+%
+%
+% \title{The \textsf{chemsec} package\thanks{This document
+% corresponds to \textsf{chemsec}~\fileversion, dated \filedate.}}
+% \author{Justin Finnerty \\ \textsf{jfinn24985@gmail.com}}
+%
+% \maketitle
+%
+% \section{Abstract}
+%
+% A cross-reference system designed for an arbitrary set of items.
+% Generates a document-order set of consecutive number labels that can
+% be cross-referenced anywhere in the document. The motivating example
+% is labeling chemical structures in a scientific document.
+%
+% \section{Usage}
+%
+% This package solves the problem of providing a sequence of numeric
+% labels to represent entities in a document. The motivating example is
+% labels for chemical structures in a scientific document. In such a
+% document you want the full chemical name and a label to appear in the
+% typeset document for each chemical structure the first time the
+% structure is referenced in the document text. Subsequent references to
+% the structure should only use the label. These labels should form a
+% numeric sequence, with the first chemical structure being labeled
+% \textbf{1}, the second \textbf{2} and so on.
+%
+% These labels share similar features to numeric bibliographic reference
+% styles, both use numbers to represent something, the numbers form a
+% single sequence starting from one and incrementing as references or
+% structures appear in the document. Furthermore these labels or
+% citations can appear in multiple places in the text but must retain a
+% single unique numeric label.
+%
+% However there are a couple of differences to a bibliography. Firstly
+% the name of the chemical structure generally appears where it is first
+% used in the document along with its label rather than in a
+% bibliography or footnote. Secondly it is common to use a single
+% numeric label for closely related structures, appending a sub-label to
+% denote individual structures, usually lower-case letters. For example
+% we might have ``\textsf{methyl acetate (\textbf{1a})}'' and
+% ``\textsf{ethyl acetate (\textbf{1b})}'' being specific examples of an
+% ``\textsf{acetic acid ester (\textbf{1})}'' structure. Lastly, you may
+% need to separate the logical and actual first occurrence of a label,
+% allowing use of labels in abstracts and captions before a defining
+% macro call that sets the actual number of the label in the main
+% document sequence.
+%
+% The solution presented here uses keys to identify structures, in a
+% similar way to the BibTeX, with a special format that allows
+% associating related structures to an exemplar structure. This is
+% achieved by using keys that contain an exclamation mark
+% (|main-key!sub-key|) to separate the key for an exemplar structure
+% from a sub-key for the related structures. Following our example above
+% we might have keys |acetate!methyl|, |acetate!ethyl| and |acetate| as
+% the keys for ``methyl acetate'', ``ethyl acetate'' and ``acetic acid
+% ester'' respectively. Using such keys with this package would
+% automatically give the labels ``\textsf{\textbf{1a}}'',
+% ``\textsf{\textbf{1b}}'' and ``\textsf{\textbf{1}}''. Alternatively
+% in chemistry we want the sub-labels to be more meaningful, for example
+% denoting isomeric structures or an abbreviation for different
+% substituents. This package allows you to manually provide such a more
+% meaningful sub-label for each sub-key, for example leading to
+% ``\textsf{methyl acetate (\textbf{1-Me})}'' and ``\textsf{ethyl
+% acetate (\textbf{1-Et})}'' and ``\textsf{acetic acid ester
+% (\textbf{1})}'' in the output document.
+
+% However, using sub-keys is entirely optional and you can write a
+% complete document without using the sub-key feature. Keys with
+% sub-keys can be freely mixed in a document with keys that do not have
+% sub-keys. We suggest you generally want to provide an exemplar key
+% without sub-key for each set of keys which have sub-keys. This allows
+% you to refer in the document to the group of related chemicals as well
+% as the specific structures, ``\textsf{acetic acid ester
+% (\textbf{1})}'' in our example above. Hopefully the most difficult
+% part of using the \textsf{chemsec} package is choosing keys for your
+% structures.
+%
+% \subsection{Known Issues}
+%
+% \subsection{Capitalization of names}
+%
+% The package cannot capitalize the name of an entity, for example if an
+% entity name appears at the beginning of a sentence. For example the
+% capitalization of a chemical name requires parsing and understanding
+% the complete chemical nomenclature, something well beyond the scope of
+% this package. It is also hard to automatically detect when
+% capitalization should occur. Currently, the solutions are to avoid
+% using the macros that might produce entity names at the start of a
+% sentence or to manually type the entity name and use a macro that only
+% outputs a label. A possible future extension of this package may allow
+% the specification of two names for a compound, one capitalized and one
+% not, as well as macros to select between them.
+%
+% \subsubsection{Failure to issue warning}
+%
+% \emph{Note} that any labeling issue arising from this package is
+% always resolved when the document is processed twice in a row. It is
+% therefore recommended that, after making an edit, the user always
+% processes the document twice to ensure correct labeling.
+%
+% The user should get a warning if the for some reason the labels
+% typeset in the document are incorrect and the document processing
+% needs to be repeated. This can happen when using a macro that
+% requests the value of a label but does not set it. These macros use
+% current values or values set in the \textsl{aux} file. If the values
+% from the \textsl{aux} file need to be used they may either not be present
+% or differ from values set later in the document. When this happens
+% the user should get a warning message, however a number of issues may
+% prevent this and it is always recommended to process the document twice
+% after editing to ensure the correct labeling.
+%
+% Known cases of failure to get a warning message are:
+% \begin{itemize}
+% \item Use of macros before the document begins, for example in the
+% \textsf{abstract} environment, may fail to issue a warning about
+% incorrect labels. (I think this is due to the boolean variable that
+% signals an error being reset at the beginning of the document.)
+% \item Automatic sub-labels. Currently we cannot check to see if
+% sub-labels change during document processing. This is because
+% sub-labels are stored as text rather than numbers and text comparison
+% is surprisingly difficult in LaTeX.
+% \item User-defined sub-labels. We do not detect if a user-defined
+% sub-label is defined after a request for the sub-label. This is only
+% an issue the first time a document is processed or when a
+% |\DefineChemical| macro command is added to the document.
+% \end{itemize}
+%
+% \subsection{Defining structure names and sub-labels}
+%
+% \DescribeMacro{\DefineChemical} You define the names and optional
+% sub-label of a compound or entity using the |\DefineChemical|
+% \marg{key} \marg{name} \marg{sub-label} macro. This command does not
+% display any output in the document nor does it define the first part
+% of the label. This means you can define all the chemicals used in the
+% document in a single place rather than as they appear in the document.
+% The list can even be placed in a separate file included in the main
+% file, facilitating the reuse of keys and names in other documents. No
+% matter where this macro is placed in the document the \textsf{chemsec}
+% package will use the information wherever needed.
+%
+% Leaving the \marg{sub-label} argument empty for a |main!sub| key turns
+% on automatic sub-labeling for this key. By default this generates
+% sequential alphabetic labels for each |sub| key with the same |main|
+% key for which there is no user defined sub-label. This means that you
+% can manually supply labels for some |main!sub| keys and also have
+% |main!sub| keys without a defined label. This is advanced usage and
+% this package does not check to see if the automatically generated
+% labels match any of the user-defined labels.
+%
+% The \textsl{name} parameter can contain many LaTeX formatting
+% commands, including the use of |$$| math-mode.
+%
+% \subsection{\textsf{ChemCite} Macros}
+%
+% The package provides a range of macros that tailor what information
+% about a structure is output into the typeset document. These are the
+% |ChemCite| family of macros. All of these macros can have a ``|*|''
+% (star) suffix. This suffix indicates this use of the macro should act
+% as a cross-reference for the label and not as a possible defining
+% reference. This means that the star form can be used in abstracts,
+% captions and anywhere in the document you need to use a label where it
+% might appear before it appears in the main document text where you
+% want the numeric label to be defined.
+%
+% \DescribeMacro{\ChemCite\marg{key}} Output the label for the given
+% key. If this is the first time the key is used and the non-star form
+% is used the full name precedes the label, with a star no full name is used. For example
+% |\ChemCite{acetate!methyl}| could give ``methyl acetate (\textbf{1a})''
+% the first time it appeared and ``\textbf{1a}'' elsewhere.
+% The non-star form also sets the value of the numeric label at the
+% point it first appears in the document. The star form uses in order;
+% the current label if defined or a value stored in the \textsl{aux}
+% file from the previous time the document was processed or a
+% dummy value. The star form also never outputs the full name. For example
+% |\ChemCite*{acetate!methyl}| could give ``\textbf{1a}'' if it can
+% determine the labels or output a dummy value ``\textbf{0??}'' (or
+% less likely ``\textbf{0a}'' or ``\textbf{1??}'').
+%
+% \DescribeMacro{\ChemFCite\marg{key}} This macro always displays the
+% structure name as well as the label for the given key. The |F| is a
+% mnemonic for \textsf{full}, indicating the full entry of the name and
+% label is always used. For example |\ChemFCite{acetate!methyl}| would
+% give ``methyl acetate (\textbf{1a})'' the first time it appeared as well
+% as elsewhere. The non-star form also
+% sets the value of the numeric label at the point it first appears in
+% the document. The star form uses in order; the current label if
+% defined or a value stored in the \textsl{aux} file from the previous
+% time the document was processed or a dummy value. For example
+% |\ChemFCite*{acetate!methyl}| could give ``methyl acetate
+% (\textbf{1a})'' if it can determine the labels or output a dummy value
+% ``?? (\textbf{0??})'' or similar.
+%
+% \DescribeMacro{\ChemSCite\marg{key}} In counterpoint to the
+% |\ChemFCite| macro, this always only outputs the label for the given
+% key. The |S| is a mnemonic for \textsf{short}, indicating the short
+% entry of just the label is always used. For example
+% |\ChemSCite{acetate!methyl}| would give ``\textbf{1a}'' the first time
+% it appeared as well as ``\textbf{1a}'' elsewhere. The non-star form
+% also sets the value of the numeric label at the point it first appears
+% in the document. The star form uses in order; the current label if
+% defined or a value stored in the \textsl{aux} file from the previous
+% time the document was processed or a dummy value. For example
+% |\ChemSCite*{acetate!methyl}| could give ``\textbf{1a}'' if it can
+% determine the labels or output a dummy value ``\textbf{0??}'' (or less
+% likely ``\textbf{0a}'' or ``\textbf{1??}'').
+%
+% \DescribeMacro{\ChemMFCite\marg{key}} This macro always displays the
+% structure name of the main part of the key with the label for the
+% given key. The |MF| is a mnemonic for \textsf{main full} or
+% \textsf{mixed full}, indicating the full entry of the \textit{main}
+% (exemplar) name is used with the label and sub-label for the key. For
+% example |\ChemMFCite{acetate!methyl}| would give ``acetic acid ester
+% (\textbf{1a})'' wherever it was used. The non-star form also sets the
+% value of the numeric label at the point it first appears in the
+% document. The star form uses in order; the current label if defined or
+% a value stored in the \textsl{aux} file from the previous time the
+% document was processed or a dummy value. For example
+% |\ChemMFCite*{acetate!methyl}| could give ``acetic acid ester
+% (\textbf{1a})'' if it can determine the labels or output a dummy value
+% ``?? (\textbf{0??})'' or similar.
+%
+% \DescribeMacro{\ChemMSCite\marg{key}} This macro always displays just
+% the label from the main part of the key. The |MS| is a mnemonic for
+% \textsf{main short} or \textsf{mixed short}, indicating the short
+% entry of just the \textit{main} (exemplar) label for the key. For
+% example |\ChemMSCite{acetate!methyl}| would give ``\textbf{1}''
+% wherever it was used. While this macro always gives exactly the same
+% result as |\ChemSCite| with just the main part of a key
+% (e.g. |\ChemSCite{acetate}|), it is included here because it allows
+% the document writer to include more context in the document as it is
+% being written. The non-star form also sets the value of the numeric
+% label at the point it first appears in the document. The star form
+% uses in order; the current label if defined or a value stored in the
+% \textsl{aux} file from the previous time the document was processed or
+% a dummy value. For example |\ChemMSCite*{acetate!methyl}| could give
+% ``\textbf{1}'' if it can determine the label or output a dummy value
+% ``\textbf{0}''.
+%
+% \DescribeMacro{\NoCite\marg{key}} This macro outputs nothing in the
+% document but sets the numeric value of the label for the key in the
+% document ordered sequence.
+%
+% \subsection{Possible Future extensions}
+%
+% \DescribeMacro{\ChemEntityTable} Output a table of entity names,
+% labels and keys. This is intended to be used for creating a useful
+% reference table when creating and editing a document rather than for
+% final output.
+%
+% \subsection{Internal macros that control style}
+%
+% Style macros can be overridden by the user to control the style of the
+% label and accompanying text.
+%
+% \DescribeMacro{\ChemLabelStyle} Internal macro that formats a
+% label. It is used by the other two style macros for this purpose.
+% Users may redefine this macro to change the label formatting.
+%
+% \DescribeMacro{\ChemFullLabelStyle} Internal macro used to format a
+% label and its full name text. Users may redefine this macro to change
+% the name and label formatting, particularly when you wish to format
+% the label and sub-label separately.
+%
+% \DescribeMacro{\ChemShortLabelStyle} Internal macro used to formats a
+% label without name text. Users may redefine this macro to change the
+% name and label formatting, particularly when you wish to format the
+% label and sub-label separately.
+%
+% \DescribeMacro{\ChemMainCounterStyle} Internal macro that converts the
+% counter used for main key label into a number or letter. The default
+% implementation uses |\arabic| to generate a number. Users may redefine
+% this macro to output letters instead of numbers.
+%
+% \DescribeMacro{\ChemSubCounterStyle} Converts the counter used for the
+% sub-key label into a number or letter. The default implementation uses
+% |\alph| to generate a letter. Users may redefine this macro to output
+% numbers instead of letters.
+%
+% \section{Design brief}
+%
+% This section contains a description of what this package sets out to
+% achieve.
+% The package should be able to consistently label an entity throughout
+% the document based on a user-defined key. The label can be either a
+% consecutive number or a user-defined label. These labels can be
+% combined with a sub-label, which can also be consecutive or
+% user-defined.
+%
+% When sub-labels are used a user-supplied key and sub-key are
+% required. Any entity associated with the key without a sub-key is
+% considered to be a generic entity for any entities defined with the
+% same key and a sub-key.
+%
+% \subsection{Limits}
+%
+% \begin{itemize}
+% \item The package can provide consecutive labels or user-defined
+% labels but not both.
+%
+% \item Unless user-defined labels are used, consecutive labels are
+% numeric for labels and alphabetic for sub-labels.
+%
+% \item The package can provide only a single set of consecutive labels.
+%
+% \item The package can provide consecutive sub-labels or user-defined
+% sub-labels but not both for each label.
+% \end{itemize}
+%
+% \subsection{Actions}
+%
+% \begin{itemize}
+% \item The first time the |\ChemCite| macros appear in the latex document
+% with a given key is where the consecutive number label for the key
+% is defined (unless user-defined label are being used).
+%
+% \item Using macros |\ChemCite*| provides the label without defining the
+% consecutive number label. This allows the label to appear, for
+% example in a table, abstract or figure, before the desired defining
+% location of the label.
+%
+% \item The names of entities can be defined anywhere in the document
+% and appear in a user-controlled manner.
+%
+% \item The basic macros typeset the entity name and label at the first
+% defining reference position and only the label in other places.
+%
+% \item A range of advanced macros allow greater control over the
+% display of the entity name and label. For example the user can
+% output a label and sub-label but use the name of the generic entity.
+% A chemistry example of this with ``ethyl acetate (1b)'' and its
+% generic entity ``acetic acid ester (1)'' appearing as ``\dots{}gives
+% the second acetic acid ester (1b)\dots{}''.
+%
+% \item The label will be typeset in a particular, user configurable,
+% style. The label should be consistently formatted, even in
+% math-mode.
+%
+% \item The label can be used transparently by other packages. For
+% example it can be used with the \textsf{psfrag} package to inject
+% the correct labels into figures at documentation preparation time
+% rather than having to recreate new figures whenever the label
+% numbering changes.
+%
+% \end{itemize}
+%
+% \section{Package options}
+%
+% The package has two options. Both options are intended to be used
+% when debugging the package or its usage. Control of the style used
+% when typesetting names and labels is optionally done manually by
+% redefining the style control macros described elsewhere.
+%
+% \begin{description}
+% \item[|draft|] Output structure/entity key as a superscript before
+% any name and/or label output. This can be useful during document
+% preparation.
+% \item[|debug|] Output extra information in the processing log to do
+% with the operation of the package and turn on |draft| mode.
+% \end{description}
+%
+% \section{Implementation}
+%
+% The package creates a virtual mapping of keys to a name and a
+% label. The key is stored as |Main!Sub| if the key has a sub-key. This
+% mapping is stored into the \textsf{aux} file where it is read at the
+% start of each document processing. If the mapping is altered during
+% processing the user gets a warning to reprocess the document, similar
+% to other automatically created indices.
+%
+% The package has several sets of macros. The public macros are used to
+% define the key to name mapping and to lookup and output the names and
+% labels based on the key during document processing. One set of
+% internal macros defines the style used to display the name and
+% labels. These macros can be redefined by the user. A second set of
+% internal macros controls the definition and management of the map
+% data. A third set controls logging information and extra output that
+% might be used during testing.
+%
+% This uses a simple first cited first numbered algorithm to generate a
+% unique sequential label for a set of compounds. It relies on a set of
+% chemical definitions that can appear anywhere in the text and are
+% stored in the ``aux'' file at program termination and read in at
+% program start up.
+%
+% Note on programming style. All the functions are declared using LaTeX
+% commands unless using TeX functions |edef|, |gdef| and |xdef| were
+% required. The public functions have been defined using LaTeX2e's
+% |DeclareRobustCommand*{}|.
+%
+% \StopEventually{}
+%
+% \subsection{Output Style Macros}
+%
+% \begin{macro}{\ChemLabelStyle} \marg{label} The default implementation
+% formats the label in a sloping bold font.
+% \begin{macrocode}
+\DeclareRobustCommand*{\ChemLabelStyle}[1]{%
+ \textsl{\bfseries{}#1}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ChemFullLabelStyle}
+% \marg{full name} \marg{main label} \marg{sub-label} Formats the full
+% entity name and label. The default implementation does not format
+% the entity name, simply forwarding the argument as-is. The default
+% implementation appends the sub-key label to the main label and uses
+% the |\ChemLabelStyle| to format them together.
+% \begin{macrocode}
+\DeclareRobustCommand*{\ChemFullLabelStyle}[3]{%
+ \ifthenelse{\equal{}{#3}}{%
+ #1 (\ChemLabelStyle{#2})%
+ }{%
+ #1 (\ChemLabelStyle{#2#3})%
+ }%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ChemShortLabelStyle}
+% \marg{main label} \marg{sub-label} Formats the labels when they
+% appear without the entity name. The default implementation appends
+% the sub-key label to the main label and uses the |\ChemLabelStyle|
+% to format them together.
+% \begin{macrocode}
+\DeclareRobustCommand*{\ChemShortLabelStyle}[2]{%
+ \ifthenelse{\equal{}{#2}}{%
+ \ChemLabelStyle{#1}%
+ }{%
+ \ChemLabelStyle{#1#2}%
+ }%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ChemMainCounterStyle}\marg{counter}
+% Converts the counter used for the main key label into a number or
+% letter. The default implementation uses |\arabic| to generate a
+% number.
+% \begin{macrocode}
+\DeclareRobustCommand*{\ChemMainCounterStyle}[1]{%
+ \arabic{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ChemSubCounterStyle}\marg{counter}
+% Converts the counter used for the sub-key label into a number or
+% letter. The default implementation uses |\alph| to generate a
+% letter.
+% \begin{macrocode}
+\DeclareRobustCommand*{\ChemSubCounterStyle}[1]{%
+ \alph{#1}}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Macros for Debugging and Draft Output}
+%
+% Several macros are defined to implement the |draft| and |debug|
+% package options. When these options are not used these macros fall
+% back on default implementations that mostly do nothing. These macros
+% are redefined when the options are used.
+%
+% \begin{macro}{\CN@DEBUG}
+% Internal macro used to suppress debugging messages when not
+% debugging. This is redefined if the |debug| package option is used
+% to output debugging messages in the processing log.
+% \begin{macrocode}
+\makeatletter
+\gdef\CN@DEBUG #1#2{}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\CN@WARN}
+% Internal macro used to output errors and warnings as information
+% messages when not debugging. This is redefined if the |debug| option
+% is used to promote these messages to warning messages in the
+% processing log.
+% \begin{macrocode}
+\gdef\CN@WARN #1#2{\PackageInfo{#1}{#2}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\CN@DRAFT}
+% Internal macro used to suppress draft only output when not in draft
+% mode. This is redefined if the |debug| or |draft| option is used to
+% add superscript text in the output document.
+% \begin{macrocode}
+\gdef\CN@DRAFT #1{}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Options for Debugging and Draft Output}
+%
+% The package has several options to help with using the package.
+%
+% \begin{itemize}
+% \item The \textsf{debug} option generates more error and warning
+% messages as well as outputting draft data. It does this by redefining
+% the |\CN@DEBUG|, |\CN@WARN| and |\CN@DRAFT| macros.
+% \begin{macrocode}
+\DeclareOption{debug}{%
+ \gdef\CN@DEBUG #1#2{\PackageInfo{#1}{#2}}%
+ \gdef\CN@WARN #1#2{\PackageWarning{#1}{#2}}%
+ \gdef\CN@DRAFT #1{$^{[#1]}$}%
+}
+% \end{macrocode}
+% \item The \textsf{draft} option outputs some draft data. It does this
+% by redefining the |\CN@DRAFT| macro.
+% \begin{macrocode}
+\DeclareOption{draft}{%
+ \gdef\CN@DRAFT #1{$^{[#1]}$}%
+} \ProcessOptions
+% \end{macrocode}
+% \end{itemize}
+%
+% \subsection{Counters}
+%
+% Several counters are used internally for generating the label
+% values. They should not be manually altered by the user.
+%
+% \begin{itemize}
+% \item |CN@MaxLabelIndex| tracks the maximum label index.
+% \begin{macrocode}
+\newcounter{CN@MaxLabelIndex}
+\setcounter{CN@MaxLabelIndex}{0}
+% \end{macrocode}
+% \item |CN@LabelIndex| is the number of the current label.
+% \begin{macrocode}
+\newcounter{CN@LabelIndex}
+% \end{macrocode}
+% \item |CN@SubLabelIndex| is the number of the current sub-key label
+% \begin{macrocode}
+\newcounter{CN@SubLabelIndex}
+% \end{macrocode}
+% \end{itemize}
+%
+% \subsection{Internal Variables}
+%
+% \begin{itemize}
+% \item |\CN@@label| is a dummy value used when no label is found for a
+% particular key. This is a guard value for erroneous usage.
+% \begin{macrocode}
+\expandafter\def\csname CN@@label\endcsname{999}
+% \end{macrocode}
+% \item |\CN@@name| is a dummy name used when no name is found for a
+% particular key. This is a guard value for erroneous usage.
+% \begin{macrocode}
+\expandafter\def\csname CN@@name\endcsname{X}
+% \end{macrocode}
+% \item |\CN@@sublabel| is a dummy sub-label used when no label is found
+% for a particular key/sub-key. This is a guard value for erroneous
+% usage.
+% \begin{macrocode}
+\expandafter\def\csname CN@@sublabel\endcsname{X}
+% \end{macrocode}
+% \item |CN@KeyFound| is a boolean to signal whether the key was found
+% in the key list. Failure to be found indicates that this is the first
+% time this key was cited.
+% \begin{macrocode}
+\newboolean{CN@KeyFound}
+% \end{macrocode}
+% \item |CN@ScanList| is a boolean to signal whether the key was found
+% in the last loop of the map scan.
+% \begin{macrocode}
+\newboolean{CN@ScanList}
+% \end{macrocode}
+% \item |CN@Star| is a boolean that signals that a macro was called
+% using the star form of the command. This alters |CN@getLabel| and
+% |CN@getSubLabel| to use predefined labels (if any) instead of labels
+% defined in the regular document flow.
+% \begin{macrocode}
+\newboolean{CN@Star}
+\setboolean{CN@Star}{false}
+% \end{macrocode}
+% \item |CN@Warning| is a boolean that signals that the document has
+% possible incorrect labels and needs to be reprocessed. This is
+% similar to other places where LaTeX generates warnings
+% for automatically generated labels.
+% \begin{macrocode}
+\newboolean{CN@Warning}
+\setboolean{CN@Warning}{false}
+\AtEndDocument{%
+ \ifthenelse{\boolean{CN@Warning}}{%
+ \PackageWarningNoLine{chemsec}{Chemsec-label(s) were used before they were
+ defined or were never defined. Rerun to get chemsec-labels right. If
+ this warning message persists check that all names and labels have been
+ defined in the text}%
+ }{%else
+ % do nothing
+ }%end if
+}%end def
+% \end{macrocode}
+% \end{itemize}
+%
+% \subsection{Internal Macros}
+%
+% \begin{macro}{\CN@mainpartofkey}
+% Splits the representation of a key as |Main!Sub|, returning only the
+% |Main| part.
+% \begin{macrocode}
+\gdef\CN@mainpartofkey (#1!#2){#1}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\CN@MainKey}
+% Acts as a driver macro for |\CN@mainpartofkey| macro.
+% \begin{macrocode}
+\gdef\CN@MainKey (#1){\CN@mainpartofkey(#1!)}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\CN@definenewchemical}\marg{main!sub
+% key}\marg{name}\marg{sub-label}
+% Associate a key with a chemical name and sub-label. The instances of
+% this macro written in the \textsf{aux} file are what define the
+% current mapping of key to names and sub-labels. There is a check to
+% make sure the key is unique but there is no check that the sub-label
+% is unique.
+%
+% This macro is the main macro that creates the table of key name and
+% labels that is used by the other macros to generate output in the
+% document.
+% \begin{macrocode}
+\DeclareRobustCommand*{\CN@definenewchemical}[3]{%key, name, label
+ % check for previous definition of name
+ \ifcsname CN@#1@label\endcsname%ifdef
+ % previous definition, do nothing
+ \CN@DEBUG{chemsec}{Attempt to redefine key "#1" ignored.}%
+ \else%
+ % label not defined
+ \CN@DEBUG{chemsec}{Defining new compound with key "#1". Name is "#2", sub-label is "#3".}%
+ \expandafter\gdef\csname CN@#1@label\endcsname{0}%
+ \expandafter\gdef\csname CN@#1@name\endcsname{#2}%
+ \ifthenelse{\equal{#3}{-}}{%if no sub-label
+ }{%else
+ \ifthenelse{\equal{#3}{}}{%if no sub-label
+ }{%else
+ \expandafter\gdef\csname CN@#1@sublabel\endcsname{#3}%
+ }%end if
+ }%end if
+ \fi%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\CN@defineLabelUsed} \marg{main!sub key} \marg{label
+% index} Associate a label with a |main| key. The instances of this
+% macro written in the \textsf{aux} file are what define the mapping
+% of key to label used to typeset a label before a macro call that
+% defines the position of the key in document order, and hence its
+% true label.
+% \begin{macrocode}
+\DeclareRobustCommand*{\CN@defineLabelUsed}[2]{%key, label
+ % check for previous definition of name
+ \ifcsname CN@#1@labelUsed\endcsname%ifdef
+ \CN@DEBUG{chemsec}{Attempt to redefine label for key "#1" ignored.}%
+ \else
+ % label not defined
+ \expandafter\gdef\csname CN@#1@labelUsed\endcsname{#2}%
+ \CN@DEBUG{chemsec}{defineLabelUsed: Presetting label of key "#1" to "#2" -> "\csname CN@#1@labelUsed\endcsname"}%
+ \fi%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\CN@defineSublabelUsed} \marg{main!sub key}
+% \marg{label value}
+% Associate a sublabel with a |main!sub| key. The instances of this macro written in
+% the \textsf{aux} file are what define the mapping of key to sublabel
+% used to typeset a sublabel before a macro call that defines the position
+% of the key in document order, and hence its true sublabel.
+% \begin{macrocode}
+\DeclareRobustCommand*{\CN@defineSublabelUsed}[2]{%key, sublabel
+ % check for previous definition of name
+ \ifcsname CN@#1@sublabelUsed\endcsname%ifdef
+ \CN@DEBUG{chemsec}{Attempt to redefine sublabel for key "#1" ignored.}%
+ \else
+ % label not defined
+ \expandafter\gdef\csname CN@#1@sublabelUsed\endcsname{#2}%
+
+ \CN@DEBUG{chemsec}{defineLabelUsed: Presetting sublabel of key "#1" to "#2" -> "\csname CN@#1@sublabelUsed\endcsname"}%
+ \fi%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\CN@GetFullName}
+% Check that a name is defined for the given key. If no name exists
+% then check using only the |Main| part of a |Main!Sub| key. If still no
+% name is found then output ``|??|'' and print an error message to the
+% processing log.
+% \begin{macrocode}
+\DeclareRobustCommand*{\CN@GetFullName}[1]{%
+ \ifcsname CN@#1@name\endcsname%if name
+ % use my own name
+ \csname CN@#1@name\endcsname%
+ \else%
+ \ifcsname CN@\CN@MainKey(#1)@name\endcsname%if main key name
+ % Use main key name
+ \csname CN@\CN@MainKey(#1)@name\endcsname%
+ \else%
+ \CN@WARN{chemsec}{Attempt to find name for key "#1" failed.}%
+ \setboolean{CN@Warning}{true}%
+ ??%
+ \fi%endif main
+ \fi%endif full key
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\CN@GetLabel}
+% Check that a label is defined for the given key. If no label exists
+% then check using only the |Main| part of a |Main!Sub| key. If still
+% no label is found then if the star form is used output the value of
+% the label from the previous time the document was processed
+% (actually the value from |\CN@defineLabelUsed| calls in the
+% \textsl{aux} file) or |0| (zero). If the not a star form then the
+% label is calculated by incrementing the
+% \textsf{CN\@{}MaxLabelIndex}. This also writes a call to
+% |\CN@defineLabelUsed| in the \textsl{aux} for the next processing
+% run.
+% \begin{macrocode}
+\DeclareRobustCommand*{\CN@GetLabel}[3]{% key, foundbool,
+ % indexcount
+ \setboolean{#2}{true}%
+ \CN@DEBUG{chemsec}{GetLabel: looking for '#1'}%
+ \setcounter{#3}{\csname CN@#1@label\endcsname}%
+ \CN@DEBUG{chemsec}{GetLabel: Label count is \arabic{#3}}%
+ \CN@DEBUG{chemsec}{GetLabel: Star form is {\ifCN@Star true\else false\fi}}%
+ \ifthenelse{\value{#3} = 0}{%
+ %% label has NOT been defined
+ \CN@DEBUG{chemsec}{GetLabel: No local label for key '#1' is defined.}%
+ \ifthenelse{\boolean{CN@Star}}{%
+ %% Star form means can only use predefined value
+ \ifcsname CN@#1@labelUsed\endcsname% have predefined value
+ \CN@DEBUG{chemsec}{GetLabel: Predefined label for key '#1' is \csname CN@#1@labelUsed\endcsname.}%
+ \setcounter{#3}{\csname CN@#1@labelUsed\endcsname}%
+ \else% no predefined, set warning
+ \setboolean{CN@Warning}{true}%
+ \CN@DEBUG{chemsec}{GetLabel: No predefined label for key '#1'.}%
+ \fi%
+ }{%
+ %% Non-star form means calculate value
+ \CN@DEBUG{chemsec}{GetLabel: MaxLabelIndex is \arabic{CN@MaxLabelIndex}}%
+ \stepcounter{CN@MaxLabelIndex}%
+ \CN@DEBUG{chemsec}{GetLabel: Increment MaxLabelIndex to \arabic{CN@MaxLabelIndex}}%
+ \expandafter\xdef\csname CN@#1@label\endcsname{\arabic{CN@MaxLabelIndex}}%
+ \write\@auxout{\string\CN@defineLabelUsed{#1}{\csname CN@#1@label\endcsname}}%
+ \setcounter{#3}{\csname CN@#1@label\endcsname}%
+ \setboolean{#2}{false}%
+ %% Check that @labelUsed matches @label or set @Warning
+ \ifcsname CN@#1@labelUsed\endcsname%
+ \ifthenelse{\equal{\csname CN@#1@labelUsed\endcsname}{\csname CN@#1@label\endcsname}}{% predefined label matches label - do nothing
+ }{% predefined does not match.
+ \CN@DEBUG{chemsec}{GetLabel: Local label does not match predefined label}
+ \setboolean{CN@Warning}{true}%
+ }%
+ \fi
+ }%
+ }{%else
+ % do nothing
+ }%end if def to 0
+ \CN@DEBUG{chemsec}{GetLabel: Result counter \arabic{#3}}%
+}%end def
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\CN@GetSubLabel}
+% Check that a sublabel is defined for the given key. If the star form
+% is used output the value of the label from the previous time the
+% document was processed (actually the value from
+% |\CN@defineSubLabelUsed| calls in the \textsl{aux} file) or |??|. If
+% not a star form and no sublabel exists then try and calculate a
+% value based on the number of keys having the same |Main| part of the
+% |Main!Sub| key. This also writes a call to |\CN@defineSubLabelUsed|
+% in the \textsl{aux} for the next processing run.
+% \begin{macrocode}
+\DeclareRobustCommand*{\CN@GetSubLabel}[3]{% key, found?, return-element
+ \setboolean{#2}{true}%
+ \CN@DEBUG{chemsec}{GetSubLabel: looking for sublabel of '#1'}%
+ \ifthenelse{\equal{\CN@MainKey(#1)}{#1}}{%if a main key
+ \CN@DEBUG{chemsec}{GetSubLabel: '#1' is a main key .: no sublabel}%
+ \xdef#3{}%
+ }{%else
+ \ifcsname CN@#1@sublabel\endcsname%if defined
+ \CN@DEBUG{chemsec}{GetSubLabel: Sublabel previously defined as '\csname
+ CN@#1@sublabel\endcsname'}%
+ \xdef#3{\csname CN@#1@sublabel\endcsname}%
+ \else% else need to define sublabel
+ \setboolean{#2}{false}%
+ \ifthenelse{\boolean{CN@Star}}{%
+ % Star form means can only use predefined value
+ \ifcsname CN@#1@sublabelUsed\endcsname% have predefined value
+ \CN@DEBUG{chemsec}{GetSubLabel: Predefined sublabel for key '#1' is \csname CN@#1@sublabelUsed\endcsname.}%
+ \xdef#3{\csname CN@#1@sublabelUsed\endcsname}%
+ \else% no predefined, set warning
+ \setboolean{CN@Warning}{true}%
+ \CN@DEBUG{chemsec}{GetSubLabel: No predefined sublabel for key
+ '#1'.}%
+ \xdef#3{??}%
+ \fi%
+ }{%
+ \CN@DEBUG{chemsec}{GetSubLabel: Sublabel not previously defined}%
+ \ifcsname CN@\CN@MainKey(#1)@sublabel\endcsname%if
+ % main key def
+ \setcounter{CN@SubLabelIndex}{\csname CN@\CN@MainKey(#1)@sublabel\endcsname}%
+ \else%
+ \setcounter{CN@SubLabelIndex}{0}%
+ \fi%
+ \CN@DEBUG{chemsec}{GetSubLabel: Highest label for these keys is
+ \arabic{CN@SubLabelIndex}.}%
+ \stepcounter{CN@SubLabelIndex}%
+ \expandafter\xdef\csname CN@\CN@MainKey(#1)@sublabel\endcsname{\arabic{CN@SubLabelIndex}}%
+ \expandafter\xdef\csname CN@#1@sublabel\endcsname{\ChemSubCounterStyle{CN@SubLabelIndex}}%
+ \write\@auxout{\string\CN@defineSublabelUsed{#1}{\csname CN@#1@sublabel\endcsname}}%
+ \CN@DEBUG{chemsec}{GetSubLabel: Sublabel now defined as '\csname
+ CN@#1@sublabel\endcsname'}%
+ \xdef#3{\csname CN@#1@sublabel\endcsname}%
+ }%
+ \fi%end if
+ }%end if
+}% enddef
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\CN@RealCite}
+% Search for the label and sublabel for a given key.
+% \begin{macrocode}
+\DeclareRobustCommand*{\CN@RealCite}[4]{%key,
+ % found, index-counter,
+ % sub
+ \CN@DRAFT{#1}%
+ \CN@DEBUG{chemsec}{In RealCite}%
+ \setcounter{#3}{0}%
+ \setcounter{CN@SubLabelIndex}{0}%
+ \setboolean{#2}{false}%
+ \xdef#4{}%
+ \CN@DEBUG{chemsec}{Real: calling GetLabel for '\CN@MainKey(#1)', the main
+ part of '#1'}%
+ \CN@GetLabel{\CN@MainKey(#1)}{#2}{#3}%
+ \CN@DEBUG{chemsec}{Real: calling GetSubLabel for "#1"}%
+ \CN@GetSubLabel{#1}{CN@ScanList}{#4}%
+}%end def
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\NoCite}
+% Search for the label and sublabel for a given key without producing
+% any output. This can be used to define the label associated with a
+% key without anything being typeset in the document.
+% \begin{macrocode}
+\DeclareRobustCommand*{\NoCite}[1]{%
+ \CN@RealCite{#1}{CN@KeyFound}{CN@LabelIndex}{\CN@SubLabel}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\CN@ChemCite}
+% Output name, label and sublabel for a given key. The name is output
+% only if |CN@KeyFound| is \textsf{false} which occurs the first time
+% a key is cited.
+% \begin{macrocode}
+\DeclareRobustCommand*{\CN@ChemCite}[1]{%
+ % \CN@DEBUG{chemsec}{in Chemcite}%
+ \CN@RealCite{#1}{CN@KeyFound}{CN@LabelIndex}{\CN@SubLabel}%
+ % \CN@DEBUG{chemsec}{Cite: called Real}%
+ \ifthenelse{\boolean{CN@KeyFound}}{%
+ % \CN@DEBUG{chemsec}{Cite: key found, use Short}%
+ \ChemShortLabelStyle{\ChemMainCounterStyle{CN@LabelIndex}}{\CN@SubLabel}%
+ }{%else
+ % \CN@DEBUG{chemsec}{Cite: key not found, use Long}%
+ \ChemFullLabelStyle{\CN@GetFullName{#1}}{\ChemMainCounterStyle{CN@LabelIndex}}{\CN@SubLabel}%
+ }%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\CN@ChemFCite}
+% Output name, label and sublabel for a given key. The name is always
+% output.
+% \begin{macrocode}
+\DeclareRobustCommand*{\CN@ChemFCite}[1]{%
+ % \CN@DEBUG{chemsec}{in ChemFullCite}%
+ \CN@RealCite{#1}{CN@KeyFound}{CN@LabelIndex}{\CN@SubLabel}%
+ % \CN@DEBUG{chemsec}{Cite: called Real}%
+ \ChemFullLabelStyle{\CN@GetFullName{#1}}{\ChemMainCounterStyle{CN@LabelIndex}}{\CN@SubLabel}%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\CN@ChemSCite}
+% Output label and sublabel for a given key. The name is never output.
+% \begin{macrocode}
+\DeclareRobustCommand*{\CN@ChemSCite}[1]{%
+ % \CN@DEBUG{chemsec}{in ChemShortCite}%
+ \CN@RealCite{#1}{CN@KeyFound}{CN@LabelIndex}{\CN@SubLabel}%
+ % \CN@DEBUG{chemsec}{SCite: called Real}%
+ \ChemShortLabelStyle{\ChemMainCounterStyle{CN@LabelIndex}}{\CN@SubLabel}%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\CN@ChemMFCite}
+% Output name associated with the |Main| part of the |Main!Sub| key as
+% well as the label \textit{and} sublabel.
+% \begin{macrocode}
+\DeclareRobustCommand*{\CN@ChemMFCite}[1]{%
+ % \CN@DEBUG{chemsec}{in ChemMainFullCite}%
+ \CN@RealCite{\CN@MainKey(#1)}{CN@KeyFound}{CN@LabelIndex}{\CN@SubLabel}%
+ % \CN@DEBUG{chemsec}{Cite: called Real}%
+ \ChemFullLabelStyle{\CN@GetFullName{\CN@MainKey(#1)}}{\ChemMainCounterStyle{CN@LabelIndex}}{\CN@SubLabel}%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\CN@ChemMSCite}
+% Output the label for the |Main| part of the |Main!Sub| key.
+% \begin{macrocode}
+\DeclareRobustCommand*{\CN@ChemMSCite}[1]{%
+ % \CN@DEBUG{chemsec}{in ChemMainShortCite}%
+ \CN@RealCite{\CN@MainKey{#1}}{CN@KeyFound}{CN@LabelIndex}{\CN@SubLabel}%
+ % \CN@DEBUG{chemsec}{SCite: called Real}%
+ \ChemShortLabelStyle{\ChemMainCounterStyle{CN@LabelIndex}}{\CN@SubLabel}%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\CN@ChemCiteStar}
+% Set |CN@Star| boolean before calling base |\CN@ChemCite|.
+% \begin{macrocode}
+\DeclareRobustCommand*{\CN@ChemCiteStar}[1]{%
+ % \CN@DEBUG{chemsec}{in Chemcite}%
+ \setboolean{CN@Star}{true}%
+ \CN@ChemCite{#1}%
+ \setboolean{CN@Star}{false}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\CN@ChemFCiteStar}
+% Set |CN@Star| boolean before calling base |\CN@ChemFCite|.
+% \begin{macrocode}
+\DeclareRobustCommand*{\CN@ChemFCiteStar}[1]{%
+ % \CN@DEBUG{chemsec}{in ChemFullCite}%
+ \setboolean{CN@Star}{true}%
+ \CN@ChemFCite{#1}%
+ \setboolean{CN@Star}{false}%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\CN@ChemSCiteStar}
+% Set |CN@Star| boolean before calling base |\CN@ChemSCite|.
+% \begin{macrocode}
+\DeclareRobustCommand*{\CN@ChemSCiteStar}[1]{%
+ % \CN@DEBUG{chemsec}{in ChemShortCite}%
+ \setboolean{CN@Star}{true}%
+ \CN@ChemSCite{#1}%
+ \setboolean{CN@Star}{false}%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\CN@ChemMFCiteStar}
+% Set |CN@Star| boolean before calling base |\CN@ChemMFCite|.
+% \begin{macrocode}
+\DeclareRobustCommand*{\CN@ChemMFCiteStar}[1]{%
+ % \CN@DEBUG{chemsec}{in ChemMainFullCite}%
+ \setboolean{CN@Star}{true}%
+ \CN@ChemMFCite{#1}%
+ \setboolean{CN@Star}{false}%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\CN@ChemMSCiteStar}
+% Set |CN@Star| boolean before calling base |\CN@ChemMSCite|.
+% \begin{macrocode}
+\DeclareRobustCommand*{\CN@ChemMSCiteStar}[1]{%
+ % \CN@DEBUG{chemsec}{in ChemMainShortCite}%
+ \setboolean{CN@Star}{true}%
+ \CN@ChemMSCite{#1}%
+ \setboolean{CN@Star}{false}%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Public Interface Macros}
+%
+% \begin{macro}{\ChemCite}
+% Delegate to |\CN@ChemCiteStar| or |\CN@ChemCite| depending on
+% whether ``|*|'' was used. \changes{1.10}{1999/12/10}{This version
+% provides star forms of the standard commands (except for
+% |NoCite|). The star forms use in order; the current label if defined
+% or a value stored in the \textsl{aux} file from the previous time
+% the document was processed if defined or a dummy value. As these
+% files are read in before the document, but in order they should
+% provide the author with greater flexibility in defining the
+% numbering order. Either the author should define a sublabel for all
+% compounds using the (no-longer) optional sublabel field to disable
+% auto-numbering or use the |NoCite| and |Chem?Cite*| commands to get
+% the desired numbering.}
+% \begin{macrocode}
+\DeclareRobustCommand*{\ChemCite}{%
+ \@ifstar{\CN@ChemCiteStar}{\CN@ChemCite}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ChemFCite}
+% Delegate to |\CN@ChemFCiteStar| or |\CN@ChemFCite| depending on
+% whether ``|*|'' was used.
+% \begin{macrocode}
+\DeclareRobustCommand*{\ChemFCite}{%
+ \@ifstar{\CN@ChemFCiteStar}{\CN@ChemFCite}%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ChemSCite}
+% Delegate to |\CN@ChemSCiteStar| or |\CN@ChemSCite| depending on
+% whether ``|*|'' was used.
+% \begin{macrocode}
+\DeclareRobustCommand*{\ChemSCite}{%
+ \@ifstar{\CN@ChemSCiteStar}{\CN@ChemSCite}%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ChemMFCite}
+% Delegate to |\CN@ChemMFCiteStar| or |\CN@ChemMFCite| depending on
+% whether ``|*|'' was used.
+% \begin{macrocode}
+\DeclareRobustCommand*{\ChemMFCite}{%
+ \@ifstar{\CN@ChemMFCiteStar}{\CN@ChemMFCite}%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ChemMSCite}
+% Delegate to |\CN@ChemMSCiteStar| or |\CN@ChemMSCite| depending on
+% whether ``|*|'' was used.
+% \begin{macrocode}
+\DeclareRobustCommand*{\ChemMSCite}{%
+ \@ifstar{\CN@ChemMSCiteStar}{\CN@ChemMSCite}%
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\DefineChemical}\marg{main!sub key}\marg{name}\marg{label}
+% Associate a key with a chemical name and sub-label by inserting a
+% |\CN@definenewchemical| macro call into the \textsf{aux} file.
+% \begin{macrocode}
+\DeclareRobustCommand*{\DefineChemical}[3]{%
+ \CN@definenewchemical{#1}{#2}{#3}%
+ \write\@auxout{\string\CN@definenewchemical{#1}{#2}{#3}}%
+}%end def
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+\makeatother
+% \end{macrocode}
+%
+% \Finale
+\endinput
diff --git a/macros/latex/contrib/chemsec/chemsec.ins b/macros/latex/contrib/chemsec/chemsec.ins
new file mode 100644
index 0000000000..00cad58a88
--- /dev/null
+++ b/macros/latex/contrib/chemsec/chemsec.ins
@@ -0,0 +1,55 @@
+%%
+%% Copyright (C) 2018 by Justin Finnerty <jfinn24985@gmail.com>
+%%
+%% This file 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
+%%
+%% and version 1.3 or later is part of all distributions of LaTeX version
+%% 2005/12/01 or later.
+%%
+
+\input docstrip.tex
+\keepsilent
+
+\usedir{tex/latex/chemsec}
+
+\preamble
+
+This is a generated file.
+
+Copyright (C) 2018 by Justin Finnerty <jfinn24985@gmail.com>
+
+This file 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
+
+and version 1.3 or later is part of all distributions of LaTeX version
+2005/12/01 or later.
+
+\endpreamble
+
+\generate{\file{chemsec.sty}{\from{chemsec.dtx}{package}}}
+
+\obeyspaces
+\Msg{*************************************************************}
+\Msg{* *}
+\Msg{* To finish the installation you have to move the following *}
+\Msg{* file into a directory searched by TeX: *}
+\Msg{* *}
+\Msg{* chemsec.sty *}
+\Msg{* *}
+\Msg{* To produce the documentation run the file chemsec.dtx *}
+\Msg{* through LaTeX. *}
+\Msg{* *}
+\Msg{* Happy TeXing! *}
+\Msg{* *}
+\Msg{*************************************************************}
+
+\endbatchfile
diff --git a/macros/latex/contrib/chemsec/chemsec.pdf b/macros/latex/contrib/chemsec/chemsec.pdf
new file mode 100644
index 0000000000..839a177d78
--- /dev/null
+++ b/macros/latex/contrib/chemsec/chemsec.pdf
Binary files differ
diff --git a/macros/latex/contrib/chemsec/example1.tex b/macros/latex/contrib/chemsec/example1.tex
new file mode 100644
index 0000000000..6319a2a536
--- /dev/null
+++ b/macros/latex/contrib/chemsec/example1.tex
@@ -0,0 +1,47 @@
+% !TEX TS-program = pdflatex
+% !TEX encoding = UTF-8 Unicode
+
+% This is a simple template for a LaTeX document using the "article" class.
+% See "book", "report", "letter" for other types of document.
+
+\documentclass[11pt]{article} % use larger type; default would be 10pt
+
+\usepackage[utf8]{inputenc} % set input encoding (not needed with XeLaTeX)
+
+\usepackage[debug]{chemsec}
+
+\title{Brief Article}
+\author{The Author}
+%\date{} % Activate to display a given date or no date (if empty),
+ % otherwise the current date is printed
+
+\begin{document}
+
+\maketitle
+
+\DefineChemical{act!me}{methyl acetate}{}
+\DefineChemical{act!et}{ethyl acetate}{}
+\DefineChemical{act!tbu}{{\textit{t}}-butyl acetate}{}
+\DefineChemical{act}{acetic acid ester}{}
+\DefineChemical{meoh}{methanol}{}
+\DefineChemical{etoh}{ethanol}{}
+\DefineChemical{accl}{acyl chlroide}{}
+\DefineChemical{tbuoh}{2,2-dimethylpropanol}{}
+
+\begin{abstract}
+We discuss the reaction of \ChemFCite*{accl} with various alcohols to form \ChemFCite*{act}.
+\end{abstract}
+
+\section{Introduction}
+
+Reacting \ChemCite{meoh} and \ChemCite{accl} together gives the expected \ChemFCite{act!me}.
+Similarly \ChemCite{etoh} and \ChemCite{accl} together gives \ChemFCite{act!et}; \ChemCite{tbuoh}
+and \ChemCite{accl} gives \ChemFCite{act!tbu}. What is different between these reactions is the
+yield of the product.
+
+\subsection{A subsection}
+
+More text.
+
+
+\end{document}
diff --git a/macros/latex/contrib/chemsec/example2.tex b/macros/latex/contrib/chemsec/example2.tex
new file mode 100644
index 0000000000..3b0a2c9ad4
--- /dev/null
+++ b/macros/latex/contrib/chemsec/example2.tex
@@ -0,0 +1,36 @@
+% !TEX TS-program = pdflatex
+% !TEX encoding = UTF-8 Unicode
+
+% This is a simple template for a LaTeX document using the "article" class.
+% See "book", "report", "letter" for other types of document.
+
+\documentclass[11pt]{article} % use larger type; default would be 10pt
+
+\usepackage[utf8]{inputenc} % set input encoding (not needed with XeLaTeX)
+
+\usepackage[debug]{chemsec}
+
+\title{Brief Article}
+\author{The Author}
+%\date{} % Activate to display a given date or no date (if empty),
+ % otherwise the current date is printed
+
+\begin{document}
+
+\maketitle
+
+\DefineChemical{act}{acetic acid ester}{}
+\DefineChemical{meoh}{methanol}{}
+\DefineChemical{etoh}{ethanol}{}
+\DefineChemical{accl}{acyl chlroide}{}
+\DefineChemical{tbuoh}{2,2-dimethylpropanol}{}
+
+\begin{abstract}
+We discuss the reaction of \ChemFCite*{accl} with various alcohols to form \ChemFCite*{act}.
+\end{abstract}
+
+\section{Introduction}
+
+Reacting \ChemCite{meoh} and \ChemCite{accl} together gives the expected \ChemFCite{act}.
+
+\end{document}
diff --git a/macros/latex/contrib/chemsec/example3.tex b/macros/latex/contrib/chemsec/example3.tex
new file mode 100644
index 0000000000..7348e6b864
--- /dev/null
+++ b/macros/latex/contrib/chemsec/example3.tex
@@ -0,0 +1,49 @@
+% !TEX TS-program = pdflatex
+% !TEX encoding = UTF-8 Unicode
+
+% This is a simple template for a LaTeX document using the "article" class.
+% See "book", "report", "letter" for other types of document.
+
+\documentclass[11pt]{article} % use larger type; default would be 10pt
+
+\usepackage[utf8]{inputenc} % set input encoding (not needed with XeLaTeX)
+
+\usepackage[debug]{chemsec}
+
+\title{Brief Article}
+\author{The Author}
+%\date{} % Activate to display a given date or no date (if empty),
+ % otherwise the current date is printed
+
+\begin{document}
+
+\maketitle
+
+\DefineChemical{act!me}{methyl acetate}{}
+\DefineChemical{act!et}{ethyl acetate}{}
+\DefineChemical{act!tbu}{{\textit{t}}-butyl acetate}{}
+\DefineChemical{act}{acetic acid ester}{}
+\DefineChemical{meoh}{methanol}{}
+\DefineChemical{etoh}{ethanol}{}
+\DefineChemical{accl}{acyl chlroide}{}
+\DefineChemical{tbuoh}{2,2-dimethylpropanol}{}
+
+\begin{abstract}
+We discuss the reaction of \ChemFCite*{accl} with \ChemFCite*{meoh} to form
+\ChemFCite*{act!me} in comparison to the reaction of \ChemCite*{accl} with
+other alcohols.
+\end{abstract}
+
+\section{Introduction}
+
+Reacting \ChemCite{meoh} and \ChemCite{accl} together gives the expected \ChemFCite{act!me}.
+Similarly \ChemCite{etoh} and \ChemCite{accl} together gives \ChemFCite{act!et}; \ChemCite{tbuoh}
+and \ChemCite{accl} gives \ChemFCite{act!tbu}. What is different between these reactions is the
+yield of the product.
+
+\subsection{A subsection}
+
+More text.
+
+
+\end{document}
diff --git a/macros/latex/contrib/chemsec/example4.tex b/macros/latex/contrib/chemsec/example4.tex
new file mode 100644
index 0000000000..0970b2bd8f
--- /dev/null
+++ b/macros/latex/contrib/chemsec/example4.tex
@@ -0,0 +1,49 @@
+% !TEX TS-program = pdflatex
+% !TEX encoding = UTF-8 Unicode
+
+% This is a simple template for a LaTeX document using the "article" class.
+% See "book", "report", "letter" for other types of document.
+
+\documentclass[11pt]{article} % use larger type; default would be 10pt
+
+\usepackage[utf8]{inputenc} % set input encoding (not needed with XeLaTeX)
+
+\usepackage{chemsec}
+
+\title{Brief Article}
+\author{The Author}
+%\date{} % Activate to display a given date or no date (if empty),
+ % otherwise the current date is printed
+
+\begin{document}
+
+\maketitle
+
+\DefineChemical{act!me}{methyl acetate}{}
+\DefineChemical{act!et}{ethyl acetate}{}
+\DefineChemical{act!tbu}{{\textit{t}}-butyl acetate}{}
+\DefineChemical{act}{acetic acid ester}{}
+\DefineChemical{meoh}{methanol}{}
+\DefineChemical{etoh}{ethanol}{}
+\DefineChemical{accl}{acyl chlroide}{}
+\DefineChemical{tbuoh}{2,2-dimethylpropanol}{}
+
+\begin{abstract}
+We discuss the reaction of \ChemFCite*{accl} with \ChemFCite*{meoh} to form
+\ChemFCite*{act!me} in comparison to the reaction of \ChemCite*{accl} with
+other alcohols.
+\end{abstract}
+
+\section{Introduction}
+
+Reacting \ChemCite{meoh} and \ChemCite{accl} together gives the expected \ChemFCite{act!me}.
+Similarly \ChemCite{etoh} and \ChemCite{accl} together gives \ChemFCite{act!et}; \ChemCite{tbuoh}
+and \ChemCite{accl} gives \ChemFCite{act!tbu}. What is different between these reactions is the
+yield of the product.
+
+\subsection{A subsection}
+
+More text.
+
+
+\end{document}
diff --git a/macros/latex/contrib/chemsec/example5.tex b/macros/latex/contrib/chemsec/example5.tex
new file mode 100644
index 0000000000..e9b568861d
--- /dev/null
+++ b/macros/latex/contrib/chemsec/example5.tex
@@ -0,0 +1,49 @@
+% !TEX TS-program = pdflatex
+% !TEX encoding = UTF-8 Unicode
+
+% This is a simple template for a LaTeX document using the "article" class.
+% See "book", "report", "letter" for other types of document.
+
+\documentclass[11pt]{article} % use larger type; default would be 10pt
+
+\usepackage[utf8]{inputenc} % set input encoding (not needed with XeLaTeX)
+
+\usepackage{chemsec}
+
+\title{Brief Article}
+\author{The Author}
+%\date{} % Activate to display a given date or no date (if empty),
+ % otherwise the current date is printed
+
+\begin{document}
+
+\maketitle
+
+\DefineChemical{act!me}{methyl acetate}{-Me}
+\DefineChemical{act!et}{ethyl acetate}{-Et}
+\DefineChemical{act!tbu}{{\textit{t}}-butyl acetate}{-tBu}
+\DefineChemical{act}{acetic acid ester}{}
+\DefineChemical{meoh}{methanol}{}
+\DefineChemical{etoh}{ethanol}{}
+\DefineChemical{accl}{acyl chlroide}{}
+\DefineChemical{tbuoh}{2,2-dimethylpropanol}{}
+
+\begin{abstract}
+We discuss the reaction of \ChemFCite*{accl} with \ChemFCite*{meoh} to form
+\ChemFCite*{act!me} in comparison to the reaction of \ChemCite*{accl} with
+other alcohols.
+\end{abstract}
+
+\section{Introduction}
+
+Reacting \ChemCite{meoh} and \ChemCite{accl} together gives the expected \ChemFCite{act!me}.
+Similarly \ChemCite{etoh} and \ChemCite{accl} together gives \ChemFCite{act!et}; \ChemCite{tbuoh}
+and \ChemCite{accl} gives \ChemFCite{act!tbu}. What is different between these reactions is the
+yield of the product.
+
+\subsection{A subsection}
+
+More text.
+
+
+\end{document}