summaryrefslogtreecommitdiff
path: root/Master/texmf-dist
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2012-07-26 22:44:44 +0000
committerKarl Berry <karl@freefriends.org>2012-07-26 22:44:44 +0000
commit5c7e88f6bc0ed19c94fd9c49311ee63a90ebab7c (patch)
treec581f45a650247ba22a11319699127daa2472992 /Master/texmf-dist
parent6de23ba3ea913fe19bef0226096c339ec2c81e78 (diff)
substances (22jul12)
git-svn-id: svn://tug.org/texlive/trunk@27182 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist')
-rw-r--r--Master/texmf-dist/doc/latex/substances/README32
-rw-r--r--Master/texmf-dist/doc/latex/substances/substances-examples.sub301
-rw-r--r--Master/texmf-dist/doc/latex/substances/substances_en.pdfbin0 -> 791771 bytes
-rw-r--r--Master/texmf-dist/doc/latex/substances/substances_en.tex605
-rw-r--r--Master/texmf-dist/tex/latex/substances/substances-default.def80
-rw-r--r--Master/texmf-dist/tex/latex/substances/substances.sty442
6 files changed, 1460 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/latex/substances/README b/Master/texmf-dist/doc/latex/substances/README
new file mode 100644
index 00000000000..e0936ece139
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/substances/README
@@ -0,0 +1,32 @@
+--------------------------------------------------------------------------
+the SUBSTANCES package
+
+ A Chemical Database
+
+2012/07/22 v0.1
+--------------------------------------------------------------------------
+Clemens Niederberger
+Web: https://bitbucket.org/cgnieder/substances/
+E-Mail: contact@mychemistry.eu
+--------------------------------------------------------------------------
+Copyright 2012 Clemens Niederberger
+
+This work 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.
+
+This work has the LPPL maintenance status `maintained'.
+
+The Current Maintainer of this work is Clemens Niederberger.
+--------------------------------------------------------------------------
+The substances package consists of the files
+ - substances.sty, substances-default.def, substances-examples.sub,
+ substances_en.tex, substances_en.pdf, README
+--------------------------------------------------------------------------
+If you have any ideas, questions, suggestions or bugs to report, please
+feel free to contact me.
+-------------------------------------------------------------------------- \ No newline at end of file
diff --git a/Master/texmf-dist/doc/latex/substances/substances-examples.sub b/Master/texmf-dist/doc/latex/substances/substances-examples.sub
new file mode 100644
index 00000000000..e7aa9a9fe7d
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/substances/substances-examples.sub
@@ -0,0 +1,301 @@
+% --------------------------------------------------------------------------
+% the SUBSTANCES package
+%
+% A Chemical Database
+%
+% --------------------------------------------------------------------------
+% Clemens Niederberger
+% Web: https://bitbucket.org/cgnieder/substances/
+% E-Mail: contact@mychemistry.eu
+% --------------------------------------------------------------------------
+% Copyright 2012 Clemens Niederberger
+%
+% This work 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.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is Clemens Niederberger.
+% --------------------------------------------------------------------------
+% The substances package consists of the files
+% - substances.sty, substances-default.def, substances-examples.sub,
+% substances_en.tex, substances_en.pdf, README
+% --------------------------------------------------------------------------
+% If you have any ideas, questions, suggestions or bugs to report, please
+% feel free to contact me.
+% --------------------------------------------------------------------------
+%
+% example database to the package `substances'
+%
+\DeclareChemIUPAC\normal{\textit{n}}
+\DeclareSubstance{NaCl}{
+ name = Sodium\|chloride ,
+ sort = Sodiumchloride ,
+ formula = NaCl ,
+ CAS = 7647-14-5,
+ mass = 58.44 ,
+ mp = 801 ,
+ bp = 1465 ,
+ phase = solid ,
+ density = 2.17
+}
+
+\DeclareSubstance{HCl}{
+ name = Hydro\|chloric Acid ,
+ formula = HCl ,
+ CAS = 7647-01-0 ,
+ pictograms = {acid,exclam} ,
+ H = {314,335} ,
+ P = {260,301+330+331,303+361+353,305+351+338,405,501} ,
+ mass = 36.46 ,
+ density = 1.19 ,
+ mp = -30
+}
+
+\DeclareSubstance{HNO3}{
+ name = Nitric Acid ,
+ sort = Nitric Acid ,
+ formula = HNO3 ,
+ CAS = 7697-37-2 ,
+ PubChem = 944 ,
+ mass = 63.01 ,
+ density = 1.51 ,
+ mp = -42 ,
+ bp = 86 ,
+ pKa = -1.37 ,
+ pictograms = {flame-O,acid} ,
+ H = {272,314} ,
+ P = {220,280,305+351+338,310}
+}
+
+\DeclareSubstance{H2SO4}{
+ name = Sulfuric Acid ,
+ sort = Sulfuric Acid ,
+ formula = H2SO4 ,
+ structure = {H-[:30]\Lewis{26,O}-S(=[2]\Lewis{13,O})(=[6]\Lewis{57,O})-\Lewis{26,O}-[:-30]H} ,
+ CAS = 7664-93-9 ,
+ PubChem = 1118 ,
+ mass = 98.08 ,
+ density = 1.8356 ,
+ mp = 10.38 ,
+ bp = 279.6 ,
+ phase = liquid ,
+ pKa = -3.0 ,
+ pKa1 = -3.0 ,
+ pKa2 = 1.9 ,
+ pictograms = acid ,
+ H = 314 ,
+ P = {280,301+330+331,309,310,305+351+338} ,
+ LD50 = 510
+}
+
+\DeclareSubstance{methane}{
+ name = Methane ,
+ sort = Methane ,
+ formula = CH4 ,
+ structure = H-C(-[2]H)(-[6]H)-H ,
+ CAS = 74-82-8 ,
+ PubChem = 297 ,
+ pictograms = {flame,bottle} ,
+ H = 220 ,
+ P = {210,377,381,410+403} ,
+ mass = 16.04 ,
+ density = 0.72e-3 ,
+ mp = -182 ,
+ bp = -162 ,
+ phase = gaseous
+}
+
+\DeclareSubstance{ethane}{
+ name = Ethane ,
+ sort = Ethane ,
+ formula = C2H6 ,
+ structure = H-C(-[2]H)(-[6]H)-C(-[2]H)(-[6]H)-H ,
+ CAS = 74-84-0 ,
+ PubChem = 6324 ,
+ pictograms = {flame,bottle} ,
+ H = 220 ,
+ P = {210,377,381,403} ,
+ mass = 30.07 ,
+ density = 0.72e-3 ,
+ mp = -183 ,
+ bp = -89 ,
+ phase = gaseous
+}
+
+\DeclareSubstance{propane}{
+ name = Propane ,
+ sort = Propane ,
+ formula = C3H8 ,
+ structure = H-C(-[2]H)(-[6]H)-C(-[2]H)(-[6]H)-C(-[2]H)(-[6]H)-H ,
+ CAS = 74-98-6 ,
+ pictograms = {flame,bottle} ,
+ H = 220 ,
+ P = {201,377,381,403} ,
+ mass = 44.10 ,
+ density = 2.01e-3 ,
+ mp = -188 ,
+ bp = -42 ,
+ phase = gaseous
+}
+
+\DeclareSubstance{butane}{
+ name = Butane ,
+ sort = Butane ,
+ alt = \normal\-Butane ,
+ altsort = n-Butane ,
+ formula = C4H10 ,
+ structure = H-C(-[2]H)(-[6]H)-C(-[2]H)(-[6]H)-C(-[2]H)(-[6]H)-C(-[2]H)(-[6]H)-H ,
+ CAS = 106-97-8 ,
+ PubChem = 7843 ,
+ pictograms = {flame,bottle} ,
+ H = {220,280} ,
+ P = {201,377,381,403} ,
+ mass = 58.12 ,
+ density = 2.71e-3 ,
+ mp = -138.3 ,
+ bp = -0.5 ,
+ phase = gaseous
+}
+
+\DeclareSubstance{pentane}{
+ name = Pentane ,
+ sort = Pentane ,
+ alt = \normal\-Pentane ,
+ altsort = n-Pentane ,
+ formula = C5H12 ,
+ structure = H-C(-[2]H)(-[6]H)-C(-[2]H)(-[6]H)-C(-[2]H)(-[6]H)-C(-[2]H)(-[6]H)-C(-[2]H)(-[6]H)-H ,
+ CAS = 109-66-0 ,
+ PubChem = 8003 ,
+ pictograms = {flame,health,exclam,aqpol} ,
+ H = {225,304,336,411} ,
+ EUH = 066 ,
+ P = {273,301+310,331,403+235} ,
+ mass = 72.15 ,
+ density = 0.63 ,
+ mp = -130 ,
+ bp = 36 ,
+ phase = liquid
+}
+
+\DeclareSubstance{hexane}{
+ name = Hexane ,
+ sort = Hexane ,
+ alt = \normal\-Hexane ,
+ altsort = n-Hexane ,
+ formula = C6H14 ,
+ structure = -[:30]-[:-30]-[:30]-[:-30]-[:30] ,
+ CAS = 110-54-3 ,
+ PubChem = 8058 ,
+ pictograms = {flame,health,exclam,aqpol} ,
+ H = {225,361f,304,373,315,336,411} ,
+ P = {210,240,273,301+310,331,302+352,403+235} ,
+ mass = 86.18 ,
+ density = 0.66 ,
+ mp = -95 ,
+ bp = 69 ,
+ phase = liquid
+}
+
+\DeclareSubstance{heptane}{
+ name = Heptane ,
+ sort = Heptane ,
+ alt = \normal\-Heptane ,
+ altsort = n-Heptane ,
+ formula = C7H16 ,
+ structure = -[:30]-[:-30]-[:30]-[:-30]-[:30]-[:-30] ,
+ CAS = 142-82-5 ,
+ PubChem = 8900 ,
+ pictograms = {flame,health,exclam,aqpol} ,
+ H = {225,304,315,336,410} ,
+ P = {210,273,301+310,331,302+352,403+235} ,
+ mass = 100.21 ,
+ density = 0.68 ,
+ mp = -91 ,
+ bp = 98 ,
+ phase = liquid
+}
+
+\DeclareSubstance{octane}{
+ name = Octane ,
+ sort = Octane ,
+ alt = \normal\-Octane ,
+ altsort = n-Octane ,
+ formula = C8H18 ,
+ structure = -[:30]-[:-30]-[:30]-[:-30]-[:30]-[:-30]-[:30] ,
+ CAS = 111-65-9 ,
+ PubChem = 356 ,
+ pictograms = {flame,health,exclam,aqpol} ,
+ H = {225,304,315,336,410} ,
+ P = {210,273,301+330+331,302+352} ,
+ mass = 114.23 ,
+ density = 0.70 ,
+ mp = -56.8 ,
+ bp = 126 ,
+ phase = liquid
+}
+
+\DeclareSubstance{nonane}{
+ name = Nonane ,
+ sort = Nonane ,
+ alt = \normal\-Nonane ,
+ altsort = n-Nonane ,
+ formula = C9H20 ,
+ structure = -[:30]-[:-30]-[:30]-[:-30]-[:30]-[:-30]-[:30]-[:-30] ,
+ CAS = 111-84-2 ,
+ PubChem = 8141 ,
+ pictograms = {flame,exclam,health} ,
+ H = {226,304,315,319,332,336,413} ,
+ P = {261,301+310,305+351+338,331} ,
+ mass = 128.26 ,
+ density = 0.72 ,
+ mp = -54 ,
+ bp = 151 ,
+ phase = liquid
+}
+
+\DeclareSubstance{decane}{
+ name = Decane ,
+ sort = Decane ,
+ alt = \normal\-Decane ,
+ altsort = n-Decane ,
+ formula = C10H22 ,
+ structure = -[:30]-[:-30]-[:30]-[:-30]-[:30]-[:-30]-[:30]-[:-30]-[:30] ,
+ CAS = 124-18-5 ,
+ PubChem = 15600 ,
+ pictograms = {flame,health} ,
+ H = {226,304} ,
+ P = {210,260,262,301+310,331} ,
+ mass = 142.29 ,
+ density = 0.73 ,
+ mp = -29.7 ,
+ bp = 174 ,
+ phase = liquid
+}
+
+\DeclareSubstance{acetone}{
+ name = Propanone ,
+ sort = Propanone ,
+ alt = Acetone ,
+ altsort = Acetone ,
+ formula = C3H6O ,
+ structure = {-[:30](=[2]\Lewis{13,O})-[:-30]} ,
+ CAS = 67-64-1 ,
+ PubChem = 180 ,
+ mass = 58.08 ,
+ density = 0.79 ,
+ mp = -95 ,
+ bp = 56 ,
+ pictograms = {flame,exclam} ,
+ H = {225,319,336} ,
+ EUH = {066} ,
+ P = {210,233,305+351+338} ,
+ LD50 = 5800
+}
+
+\endinput \ No newline at end of file
diff --git a/Master/texmf-dist/doc/latex/substances/substances_en.pdf b/Master/texmf-dist/doc/latex/substances/substances_en.pdf
new file mode 100644
index 00000000000..da9d3aa1764
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/substances/substances_en.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/substances/substances_en.tex b/Master/texmf-dist/doc/latex/substances/substances_en.tex
new file mode 100644
index 00000000000..2484e6c1527
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/substances/substances_en.tex
@@ -0,0 +1,605 @@
+% arara: pdflatex: { shell: on }
+% arara: pdflatex: { shell: on }
+% --------------------------------------------------------------------------
+% the SUBSTANCES package
+%
+% A Chemical Database
+%
+% --------------------------------------------------------------------------
+% Clemens Niederberger
+% Web: https://bitbucket.org/cgnieder/substances/
+% E-Mail: contact@mychemistry.eu
+% --------------------------------------------------------------------------
+% Copyright 2012 Clemens Niederberger
+%
+% This work 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.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is Clemens Niederberger.
+% --------------------------------------------------------------------------
+% The substances package consists of the files
+% - substances.sty, substances-default.def, substances-examples.sub,
+% substances_en.tex, substances_en.pdf, README
+% --------------------------------------------------------------------------
+% If you have any ideas, questions, suggestions or bugs to report, please
+% feel free to contact me.
+% --------------------------------------------------------------------------
+%
+% if you want to compile this documentation you'll need the document class
+% `cnpkgdoc' which you can get here:
+% https://bitbucket.org/cgnieder/cnpkgdoc/
+% the class is licensed LPPL 1.3 or later
+%
+\documentclass[DIV10,toc=index,toc=bib]{cnpkgdoc}
+\docsetup{
+ pkg = {[index]substances} ,
+ code-box = {
+ backgroundcolor = gray!7!white ,
+ skipbelow = .6\baselineskip plus .5ex minus .5ex ,
+ skipabove = .6\baselineskip plus .5ex minus .5ex ,
+ roundcorner = 3pt ,
+ } ,
+ gobble = 0
+}
+\LoadSubstances{substances-examples}
+\addcmds{
+ @CAS,
+ @EC,
+ ac,
+ AllSubstancesClist,
+ AllSubstancesSequence,
+ arraybackslash,
+ bottomrule,
+ CAS,
+ celsius,
+ ch,
+ chem,
+ chemfig,
+ chemsetup,
+ cmc,
+ DeclareChemIUPAC,
+ DeclareSubstance,
+ DeclareSubstanceProperty,
+ EC,
+ endinput,
+ ForAllSubstancesDo,
+ GetSubstanceProperty,
+ gram,
+ IfSubstanceExistF,
+ IfSubstanceExistT,
+ IfSubstanceExistTF,
+ IfSubstanceFieldF,
+ IfSubstanceFieldT,
+ IfSubstanceFieldTF,
+ IfSubstancePropertyF,
+ IfSubstancePropertyT,
+ IfSubstancePropertyTF,
+ iupac,
+ Lewis,
+ LoadSubstances,
+ midrule,
+ MolMass,
+ NewDocumentCommand,
+ newindex,
+ normal,
+ num,
+ per,
+ printindex,
+ RetrieveSubstanceProperty,
+ SI,
+ sisetup,
+ SubstanceIndexAltEntry,
+ SubstanceIndexNameAltEntry,
+ SubstanceIndexNameEntry,
+ toprule
+}
+
+% Layout:
+\usepackage[osf]{libertine}
+\cnpkgcolors{
+ main => cnpkgred ,
+ key => yellow!40!brown ,
+ module => cnpkgblue ,
+ link => black!90
+}
+\usepackage{booktabs}
+\renewcommand*\othersectionlevelsformat[3]{%
+ \textcolor{main}{#3\autodot}\enskip}
+\renewcommand*\partformat{%
+ \textcolor{main}{\partname~\thepart\autodot}}
+\usepackage{fnpct}
+\usepackage{embrac}[2012/06/29]% option biblatex, falls Bibliography dazu kommt
+\ChangeEmph{[}[,.02em]{]}[.055em,-.08em]
+\ChangeEmph{(}[-.01em,.04em]{)}[.04em,-.05em]
+
+\usepackage{acro}
+\DeclareAcronym{CAS}{CAS,}{Chemical Abstract Service,}
+\DeclareAcronym{EC}{EC}{European Commission Number}
+\DeclareAcronym{LD50}{LD50,}{Median Lethal Dose}
+\DeclareAcronym{IUPAC}{IUPAC,}{International Union of Pure and Applied Chemistry,}
+\DeclareAcronym{ghs}{GHS,}{Globally Harmonized System of Classification and
+ Labelling of Chemicals,}
+
+% bibliography:
+% \usepackage[style=alphabetic,backend=biber]{biblatex}
+
+% index:
+\usepackage{imakeidx,filecontents}
+\begin{filecontents*}{\jobname.ist}
+ heading_prefix "{\\bfseries "
+ heading_suffix "\\hfil}\\nopagebreak\n"
+ headings_flag 1
+ delim_0 "\\dotfill "
+ delim_1 "\\dotfill "
+ delim_2 "\\dotfill "
+ delim_r "\\textendash"
+ suffix_2p "\\nohyperpage{\\,f.}"
+ suffix_3p "\\nohyperpage{\\,ff.}"
+\end{filecontents*}
+
+% \indexsetup{noclearpage}
+\makeindex[options=-sl \jobname.ist,intoc,title=Package Index]
+\makeindex[name=\jobname-chem,title=Index of Chemicals,intoc,columns=3]
+
+% abstract:
+\TitlePicture{\parbox{.7\linewidth}{%
+ The \substances package allows you to create a database like file that contains
+ data of various chemicals. These data can be retrieved in the document. An index
+ creation of the chemicals used in the document is directly supported.}}
+
+\ExplSyntaxOn
+\NewDocumentCommand \Default {g}
+ {
+ \hfill\llap
+ {
+ \IfNoValueTF { #1 }
+ {(initially~empty)}
+ {Default:~\code{#1}}
+ }
+ \newline
+ }
+\NewDocumentCommand \required {}
+ { \hfill \llap { required } \newline }
+\NewDocumentCommand \optional {}
+ { \hfill \llap { optional } \newline }
+\ExplSyntaxOff
+\begin{document}
+
+\section{Licence and Requirements}
+Permission is granted to copy, distribute and/or modify this software under the
+terms of the \LaTeX{} Project Public License, version 1.3 or later
+(\url{http://www.latex-project.org/lppl.txt}). The package has the status
+``maintained.''
+
+\substances loads and needs the following packages: \paket{expl3},
+\paket{xparse}, \paket{xtemplate} and \paket{l3keys2e}. It also needs the
+chemistry package \paket{chemmacros}.
+
+\section{About}
+The \substances package allows you to create a database like file that contains
+data of various chemicals. These data can be retrieved in the document. An index
+creation of the chemicals used in the document is directly supported.
+
+\section{Options}
+\substances has only a few options:
+\begin{beschreibung}
+ \Option{draft}{\default{true}|false}\Default{false}
+ If set to true all warnings will be errors.
+ \Option{final}{\default{true}|false}\Default{true}
+ The opposite of \key{draft}.
+ \Option{index}{\default{true}|false}\Default{false}
+ Add index entries when \cmd{chem} is called, see section~\ref{sec:index}.
+ \Option{style}{<style>}\Default{default}
+ Load specific style, see section~\ref{ssec:styles}.
+ \Option{strict}{\default{true}|false}\Default{false}
+ If set to true all warnings will be errors. This option overwrites any
+ \key{draft} or \key{final} option that is passed on by the document class.
+\end{beschreibung}
+
+\section{The Database}
+\subsection{Declaring the Chemicals}
+The data about substances are stored via the command
+\begin{beschreibung}
+ \Befehl{DeclareSubstance}{<id>}\ma{<list of properties>}
+\end{beschreibung}
+An entry could look like this:
+\begin{beispiel}[code only]
+\DeclareSubstance{NaCl}{
+ name = Sodiumchloride ,
+ sum = NaCl ,
+ CAS = 7647-14-5,
+ mass = 58.44 ,
+ mp = 801 ,
+ bp = 1465 ,
+ phase = solid ,
+ density = 2.17
+}
+\end{beispiel}
+
+Such entries can either be declared in the document preamble or probably
+more useful in a file with the ending \code{.sub}. Such a file can be input in
+the document via
+\begin{beschreibung}
+ \befehl{LoadSubstances}{<filename>} input the file \emph{without} specifying
+ the file ending.
+\end{beschreibung}
+Suppose you have the file \code{mysubstances.sub} then you input it in the
+document preamble via \cmd{LoadSubstances}{mysubstances}.
+
+\subsection{Available Fields}
+\subsubsection{Always Defined Fields}
+Below all fields defined by \substances are listed\footnote{Look in the file
+\code{substances-examples.sub} which is part of this package and
+should be in the same place as this documentation for example uses.}.
+\begin{beschreibung}
+ \Option{name}\required The \acs{IUPAC} name of the substance. This is the only
+ field that \emph{has} to be used. The field's input is parsed with
+ \paket{chemmacros}' command \cmd{iupac}.
+ \Option{sort}\optional If you plan to use the \key{index} option you
+ should specify this field to get the sorting of the index right. This then
+ creates index entries \cmd{index}{<sort field>\@<name field>}.
+ \Option{alt}\optional An alternative name. The field's input is parsed with
+ \paket{chemmacros}' command \cmd{iupac}.
+ \Option{altsort}\optional This is the same as the \key{sort} field but for the
+ alternative name.
+ \Option{CAS}\optional The \ac{CAS} number. The input needs to be input in the
+ form \code{<num>-<num>-<num>}.
+ \Option{PubChem}\optional The PubChem number.
+\end{beschreibung}
+
+The \key{CAS} field processes the number using the macro \cmd{CAS}{<number>}
+which is defined like this:
+\begin{beispiel}[code only]
+ \def\@CAS#1-#2-#3{\iupac{#1\-#2\-#3}}
+ \NewDocumentCommand\CAS{m}{\@CAS#1}
+\end{beispiel}
+You're free to redefine it to your needs.
+
+\subsubsection{Style-dependend Fields}
+\substances defines the style `default' which is loaded if no other style has
+been specified. It defines the following additional fields and loads the
+packages \paket{chemfig} and \paket{siunitx}.
+\begin{beschreibung}
+ \Option{formula}\optional The molecular formula of the substance. The field's
+ input is parsed with \paket{chemmacros}' command
+ \cmd{ch}.
+ \Option{structure}\optional The structural formula of the substance. The field's
+ input is parsed with \paket{chemfig}'s command \cmd{chemfig}.
+ \Option{mp}\optional The boiling point. The field's entry is input into
+ the \paket{siunitx} command \cmd{SI} in the following way:
+ \cmd{SI}{<field>}\ma{\cmd{celsius}}.
+ \Option{bp}\optional The melting point. The field's entry is input into
+ the \paket{siunitx} command \cmd{SI} in the following way:
+ \cmd{SI}{<field>}\ma{\cmd{celsius}}.
+ \Option{density}\optional The density. The field's entry is input into
+ the \paket{siunitx} command \cmd{SI} in the following way:
+ \cmd{SI}{<field>}\ma{\cmd{gram}\cmd{per}\cmd{cmc}}.
+ \Option{phase}\optional The state of aggregation.
+ \Option{pKa}\optional The \pKa\ value. The field's entry is input into the
+ \paket{siunitx} command \cmd{num}.
+ \Option{pKa1}\optional The first of several \pKa\ values. The field's entry is
+ input into the \paket{siunitx} command \cmd{num}.
+ \Option{pKa2}\optional The second of several \pKa\ values. The field's entry is
+ input into the \paket{siunitx} command \cmd{num}.
+ \Option{pKb}\optional The \pKb\ values. The field's entry is input into the
+ \paket{siunitx} command \cmd{num}.
+ \Option{pKb1}\optional The first of several \pKb\ values. The field's entry is
+ input into the \paket{siunitx} command \cmd{num}.
+ \Option{pKb2}\optional The second of several \pKb\ values. The field's entry is
+ input into the \paket{siunitx} command \cmd{num}.
+ \Option{pictograms}\optional The GHS pictograms. This field takes a list
+ of pictogram names as they're input into \paket{chemmacros}' command
+ \cmd{ghspic}.
+ \Option{H}\optional The H statements. This field takes a list
+ of numbers as they're input into \paket{chemmacros}' command
+ \cmd{ghs}{h}\ma{<number>}.
+ \Option{P}\optional The P statements. This field takes a list
+ of pictogram names as they're input into \paket{chemmacros}' command
+ \cmd{ghs}{p}\ma{<number>}.
+ \Option{EUH}\optional The EUH statements. This field takes a list
+ of pictogram names as they're input into \paket{chemmacros}' command
+ \cmd{ghs}{h}\ma{<number>}.
+ \Option{LD50}\optional The \ac{LD50} in \si{\milli\gram\per\kilo\gram}. The
+ field's entry is input into the \paket{siunitx} command \cmd{SI} in the
+ following way: \cmd{SI}{<field>}\ma{\cmd{milli}\cmd{gram}\cmd{per}\cmd{kilo}\cmd{gram}}.
+\end{beschreibung}
+
+\subsection{Define Custom Styles}\label{ssec:styles}
+\subsubsection{Background}
+You might have other needs for fields than the ones defined by \substances and
+the `default' style. You can easily define your own style which means that you
+save a file with the name \code{substances-<style>.def}. In it you save the
+commands you need and use the command \cmd{DeclareSubstanceProperty}, which is
+explained in the next section, to declare your own fields.
+
+Please beware that this style file is loaded by the package when the \code{expl3}
+namespace is active. This means that all spaces are ignored and you need to use
+\code{\textasciitilde} if you need a space. It also means that \code{\_} and
+\code{:} are letters (as is \code{{\makeatletter @}}). Should you ever decide to
+call \cmd{ExplSyntaxOff} to turn off the \code{expl3} namespace \emph{don't} forget
+to use \cmd{ExplSyntaxOn} at the end of the file!
+
+\subsubsection{Declare New Fields or Change Existing Fields}
+You might want other fields or change the definition of the predefined ones.
+For this there's
+\begin{beschreibung}
+ \Befehl{DeclareSubstanceProperty}*{<field name>}\oa{<pre code>}\oa{<post code>}
+\end{beschreibung}
+This command declares a new property field for a substance. The star makes the
+property a required one which means an error will be issued if a substance is
+declared without it. The optional arguments \code{<pre code>} and \code{<post code>}
+specify any code that should be input directly before or after the field entry,
+respectively. The \code{<pre code>} may end with a command that takes one mandatory
+argument. In this case the field entry will be its argument.
+
+The following example would define a field \key{EC} which uses a custom command
+to parse the field entry. The \ac{EC} is assigned to chemical substances
+for regulatory purposes within the European Union by the regulatory authorities.
+\begin{beispiel}[code only]
+ \makeatletter
+ \def\@EC#1-#2-#3{#1-#2-#3}
+ \newcommand*\EC[1]{\@EC#1}
+ \makeatother
+ \DeclareSubstanceProperty{EC}[\EC]
+\end{beispiel}
+For further examples of the usage of pre and post code look at the definition of
+the \key{name} and the \key{mp} field:
+\begin{beispiel}[code only]
+ \DeclareSubstanceProperty*{name}[\iupac]
+ \DeclareSubstanceProperty{mp}[\SI][{\celsius}]
+\end{beispiel}
+
+
+\section{Retrieving the Data}
+There are two commands defined by \substances that allow the retrieving of the
+data. The command \cmd{chem} is intended as user command, the command
+\cmd{GetSubstanceProperty} can be used to define your own user command (perhaps
+in your own style file, see section~\ref{ssec:styles}).
+\begin{beschreibung}
+ \Befehl{chem}*[<pre>]\oa{<post>}\ma{<id>}\oa{<property>}
+ \Befehl{GetSubstanceProperty}{<id>}\ma{<property>}
+\end{beschreibung}
+If the command \cmd{chem} is called without the \oa{<property>} argument the
+\code{name} entry will be called. The starred version calls the \code{alt} entry
+if it is defined and the \code{name} entry otherwise. The arguments \oa{<pre>}
+and \oa{<post>} add arbitrary input before or after the output, respectively.
+
+All of the next examples use the data defined in the file \code{substances-examples.sub}
+that is part of this package, see section~\ref{sec:examples}.
+\begin{beispiel}
+ \chem{H2SO4}[structure] \newline
+ \chem{H2SO4} has the boiling point \(\chem[T_b =]{H2SO4}[bp]\) and a
+ density of \(\chem[\rho =]{H2SO4}[density]\).
+
+ Compare the melting points of methane and ethane,
+ \(\chem[T_m=]{methane}[mp]\) and \(\chem[T_m=]{ethane}[mp]\),
+ with the boiling points \(\chem[T_b=]{methane}[bp]\) and
+ \(\chem[T_b=]{ethane}[bp]\).
+
+ \chem{NaCl} has the \ac{CAS} number \chem{NaCl}[CAS].
+
+ \chem{acetone} (\chem*{acetone}) is the most simple ketone:
+
+ \chem{acetone}[structure]
+\end{beispiel}
+
+The following code creates table~\ref{tab:methane}.
+\begin{beispiel}[code and float]
+\begin{table}[htp]
+\centering\chemsetup[ghsystem]{hide}
+\sisetup{scientific-notation=fixed,fixed-exponent=0,per-mode=symbol}
+\begin{tabular}{l>{\raggedright\arraybackslash}p{.6\linewidth}}
+ \toprule
+ name & \chem{methane} \\
+ formula & \chem{methane}[formula] \\
+ & \chem{methane}[structure] \\
+ \midrule
+ CAS & \chem{methane}[CAS] \\
+ PubChem & \chem{methane}[PubChem] \\
+ \midrule
+ boiling point & \chem{methane}[bp] \\
+ melting point & \chem{methane}[mp] \\
+ density & \chem{methane}[density] \\
+ molar mass & \chem{methane}[mass] \\
+ \midrule
+ & \chem{methane}[pictograms] \\
+ H statements & \chem{methane}[H] \\
+ P statements & \chem{methane}[P] \\
+ \bottomrule
+\end{tabular}
+\caption{\label{tab:methane}All properties of \chem{methane} that have been
+saved in the example database.}
+\end{table}
+\end{beispiel}
+
+\section{Additional Commands}
+\substances provides a few commands that maybe are useful in building custom
+macros for styles. A field exists if it has been defined with
+\cmd{DeclareSubstanceProperty} regardless if it has been used or not. A substance
+exists if it has been defined with \cmd{DeclareSubstance}.
+\begin{beschreibung}
+ \Befehl{GetSubstanceProperty}{<id>}\ma{<field>} \cnpkgdocarrow\ You know that
+ already: retrieve the property specified in \code{<field>} for a given substance.
+ This command is \emph{not} expandable.
+ \Befehl{RetrieveSubstanceProperty}{<id>}\ma{<field>} \cnpkgdocarrow\ Same as
+ \cmd{GetSubstanceProperty} but expandable.
+ \befehl{ForAllSubstancesDo}{<code>} Loops through all existing substances.
+ Inside \code{<code>} \code{\#1} may be used to refer to the \code{<id>} of the
+ current substance. This command is expandable.
+ \befehl{AllSubstancesSequence} A sequence of all substances. This is a sequence
+ of balanced groups each containing the \code{<id>} of a substance. This command
+ is expandable.
+ \befehl{AllSubstancesClist} A comma separated list of all substances. Every
+ \code{<id>} is separated from the next with a comma. This command is expandable.
+ \Befehl{IfSubstancePropertyTF}{<id>}\ma{<field>}\ma{<true code>}\ma{<false code>}
+ \cnpkgdocarrow\ Tests if the property \code{<field>} is defined for the
+ substance \code{<id>} and returns either \code{<true code>} or \code{<false code>}.
+ This command is expandable.
+ \Befehl{IfSubstancePropertyT}{<id>}\ma{<field>}\ma{<true code>} \cnpkgdocarrow\
+ Tests if the property \code{<field>} is defined for the substance \code{<id>}
+ and returns \code{<true code>} if it is. This command is expandable.
+ \Befehl{IfSubstancePropertyF}{<id>}\ma{<field>}\ma{<false code>} \cnpkgdocarrow\
+ Tests if the property \code{<field>} is defined for the substance \code{<id>}
+ and returns \code{<false code>} if it isn't. This command is expandable.
+ \Befehl{IfSubstanceFieldTF}{<field>}\ma{<true code>}\ma{<false code>}
+ \cnpkgdocarrow\ Tests if the property \code{<field>} exists and returns either
+ \code{<true code>} or \code{<false code>}. This command is expandable.
+ \Befehl{IfSubstanceFieldT}{<field>}\ma{<true code>} \cnpkgdocarrow\
+ Tests if the property \code{<field>} exists and returns \code{<true code>} if
+ it does. This command is expandable.
+ \Befehl{IfSubstanceFieldF}{<field>}\ma{<false code>} \cnpkgdocarrow\
+ Tests if the property \code{<field>} exists and returns \code{<false code>} if
+ it doesn't. This command is expandable.
+ \Befehl{IfSubstanceExistTF}{<id>}\ma{<true code>}\ma{<false code>}
+ \cnpkgdocarrow\ Tests if the property \code{<field>} exists and returns either
+ \code{<true code>} or \code{<false code>}. This command is expandable.
+ \Befehl{IfSubstanceExistT}{<id>}\ma{<true code>} \cnpkgdocarrow\
+ Tests if the substance \code{<id>} exists and returns \code{<true code>} if
+ it does. This command is expandable.
+ \Befehl{IfSubstanceExistF}{<id>}\ma{<false code>} \cnpkgdocarrow\
+ Tests if the substance \code{<id>} exists and returns \code{<false code>} if
+ it doesn't. This command is expandable.
+\end{beschreibung}
+
+\begin{beispiel}
+Just to demonstrate how these commands can be used. And to get
+our demonstration index filled.\par
+\newcounter{substances}
+\ForAllSubstancesDo{%
+ \ifnum0=\value{substances}\relax
+ \else, \fi
+ \stepcounter{substances}%
+ \chem{#1}%
+ \IfSubstancePropertyT{#1}{alt}{
+ (\chem*{#1})}}
+\end{beispiel}
+
+\section{Create an Index}\label{sec:index}
+When \substances is called with \key{index}{true} the command \cmd{chem} will
+add index entries each time it is used. In this case the entries of the fields
+\key{name}, \key{sort}, \key{alt} and \key{altsort} will be expanded during the
+process. You should keep that in mind if some error arises. It might be due to
+a \cmd{textbf} or similar in your database. In this case you either need to
+replace it with some robust command or put a \cmd{noexpand} in front of it.
+
+Alternative names as specified in the \key{alt} also get an index entry with a
+reference to the one of the corresponding \key{name} field. The entry of the
+\key{name} field in this case gets the \key{alt} name appended in braces.
+
+This behaviour is not customizable for the time being. It is planned for future
+versions of this package, though.
+
+As a demonstration an index for all chemicals used in this documentation is
+created with the help of the package \paket{imakeidx}.
+
+\subsection{Formatting Commands}
+The index entries are formatted with the following commands. You can redefine
+them to your needs. If you do make sure they have the same number of required
+arguments and are expandable!
+\begin{beschreibung}\makeatletter
+ \Befehl{SubstanceIndexNameEntry}\code{\#1\#2}\ma{\#1@\#2} \cnpkgdocarrow\
+ Formats the name if no \key{alt} field is given. \code{\#1} refers to the
+ \key{sort} field entry and \code{\#2} refers to the \key{name} field entry.
+ \Befehl{SubstanceIndexNameAltEntry}\code{\#1\#2\#3}\ma{\#1@\#2 (\#3)}
+ \cnpkgdocarrow\ Formats the name if also the \key{alt} field is given.
+ \code{\#1} refers to the \key{sort} field entry, \code{\#2} refers to the
+ \key{name} field entry, and \code{\#3} to the \key{alt} field entry.
+ \Befehl{SubstanceIndexAltEntry}\code{\#1\#2\#3}\ma{\#1@\#3|see\#2} \cnpkgdocarrow\
+ Formats the entry for the \key{alt} field. \code{\#1} refers to the \key{altsort}
+ field entry, \code{\#2} refers to the \key{name} field entry, and \code{\#3}
+ to the \key{alt} field entry.
+\end{beschreibung}
+
+\subsection{Using makeidx}
+Using the option \key{index}{true} with the standard way to create an index will
+add the entries \cmd{index}{<name>} to the index. This means you would mix them
+with other entries if you have any. Below a sample document is shown that needs
+to be compiled with \code{pdflatex}, \code{makeindex} and again with \code{pdflatex}.
+\begin{beispiel}[code only]
+\documentclass{article}
+\usepackage[T1]{fontenc}
+\usepackage[index]{substances}
+\LoadSubstances{substances-examples}
+
+\usepackage{makeidx}
+\makeindex
+\begin{document}
+
+\newcounter{substances}
+\ForAllSubstancesDo{%
+ \ifnum0=\value{substances}\relax
+ \else, \fi
+ \stepcounter{substances}\chem{#1}}
+
+\printindex
+\end{document}
+\end{beispiel}
+
+\subsection{Using splitidx}
+Maybe a seperate index for the chemicals will make more sense. In this case you
+could use the package \paket{splitidx}. \substances will recognize this and
+create \cmd{sindex}[\cmd{jobname}-chem]{<name>} entries each time \cmd{chem} is
+used. The sample document below needs to be compiled with \code{pdflatex},
+\code{splitindex} and again with \code{pdflatex}.
+\begin{beispiel}[code only]
+\documentclass{article}
+\usepackage[T1]{fontenc}
+\usepackage[index]{substances}
+\LoadSubstances{substances-examples}
+
+\usepackage{splitidx}
+\makeindex
+\newindex[Chemicals]{\jobname-chem}
+\begin{document}
+
+\newcounter{substances}
+\ForAllSubstancesDo{%
+ \ifnum0=\value{substances}\relax
+ \else, \fi
+ \stepcounter{substances}\chem{#1}}
+
+\printindex[\jobname-chem]
+\end{document}
+\end{beispiel}
+
+\subsection{Using imakeidx}
+Another way to create multiple indexes is the package \paket{imakeidx}. \substances
+recognizes its usage and creates index entries \cmd{index}[\cmd{jobname}-chem]{<name>}.
+The sample document below needs to be compiled with \code{pdflatex -{}-shell-escape}.
+\begin{beispiel}[code only]
+\documentclass{article}
+\usepackage[T1]{fontenc}
+\usepackage[index]{substances}
+\LoadSubstances{substances-examples}
+
+\usepackage{imakeidx}
+\makeindex[name=\jobname-chem,title=Chemicals]
+\begin{document}
+
+\newcounter{substances}
+\ForAllSubstancesDo{%
+ \ifnum0=\value{substances}\relax
+ \else, \fi
+ \stepcounter{substances}\chem{#1}}
+
+\printindex[\jobname-chem]
+\end{document}
+\end{beispiel}
+
+\section{The Example Database}\label{sec:examples}
+The following code shows the example database \code{substances-examples.sub}
+that is part of this package.
+
+\lstinputlisting[basicstyle=\ttfamily\footnotesize]{substances-examples.sub}
+
+\appendix
+\printindex[\jobname-chem]
+\printindex
+\end{document} \ No newline at end of file
diff --git a/Master/texmf-dist/tex/latex/substances/substances-default.def b/Master/texmf-dist/tex/latex/substances/substances-default.def
new file mode 100644
index 00000000000..f802dbc00c5
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/substances/substances-default.def
@@ -0,0 +1,80 @@
+% --------------------------------------------------------------------------
+% the SUBSTANCES package
+%
+% A Chemical Database
+%
+% --------------------------------------------------------------------------
+% Clemens Niederberger
+% Web: https://bitbucket.org/cgnieder/substances/
+% E-Mail: contact@mychemistry.eu
+% --------------------------------------------------------------------------
+% Copyright 2012 Clemens Niederberger
+%
+% This work 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.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is Clemens Niederberger.
+% --------------------------------------------------------------------------
+% The substances package consists of the files
+% - substances.sty, substances-default.def, substances-examples.sub,
+% substances_en.tex, substances_en.pdf, README
+% --------------------------------------------------------------------------
+% If you have any ideas, questions, suggestions or bugs to report, please
+% feel free to contact me.
+% --------------------------------------------------------------------------
+% substances: default style
+\RequirePackage { chemfig , siunitx }
+
+% ----------------------------------------------------------------------------
+% helper functions for the GHS properties:
+\cs_new:Npn \substances_get_pics:n #1
+ {
+ \int_zero:N \l_tmpa_int
+ \clist_map_inline:nn { #1 }
+ {
+ \int_incr:N \l_tmpa_int
+ \int_compare:nF { \l_tmpa_int = 1 } { ~ }
+ \ghspic{##1}
+ }
+ }
+
+\cs_new:Npn \substances_get_ghs:nn #1#2
+ {
+ \int_zero:N \l_tmpa_int
+ \clist_map_inline:nn { #2 }
+ {
+ \int_incr:N \l_tmpa_int
+ \int_compare:nF { \l_tmpa_int = 1 }
+ { \bool_if:NT \l_ghsystem_hide_statement_bool { , } ~ }
+ \ghs{#1}{##1}
+ }
+ }
+
+% ----------------------------------------------------------------------------
+\DeclareSubstanceProperty { formula } [\ch]
+\DeclareSubstanceProperty { structure } [\chemfig]
+\DeclareSubstanceProperty { mass } [\SI][{\MolMass}]
+\DeclareSubstanceProperty { bp } [\SI][{\celsius}]
+\DeclareSubstanceProperty { mp } [\SI][{\celsius}]
+\DeclareSubstanceProperty { density } [\SI][{\gram\per\cmc}]
+\DeclareSubstanceProperty { phase }
+\DeclareSubstanceProperty {pKa} [\num]
+\DeclareSubstanceProperty {pKa1} [\num]
+\DeclareSubstanceProperty {pKa2} [\num]
+\DeclareSubstanceProperty {pKb} [\num]
+\DeclareSubstanceProperty {pKb1} [\num]
+\DeclareSubstanceProperty {pKb2} [\num]
+\DeclareSubstanceProperty { pictograms } [\substances_get_pics:n]
+\DeclareSubstanceProperty { H } [\substances_get_ghs:nn{H}]
+\DeclareSubstanceProperty { P } [\substances_get_ghs:nn{P}]
+\DeclareSubstanceProperty { EUH } [\substances_get_ghs:nn{EUH}]
+\DeclareSubstanceProperty {LD50} [\SI][{\milli\gram\per\kilo\gram}]
+
+\tex_endinput:D \ No newline at end of file
diff --git a/Master/texmf-dist/tex/latex/substances/substances.sty b/Master/texmf-dist/tex/latex/substances/substances.sty
new file mode 100644
index 00000000000..e9406055d2b
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/substances/substances.sty
@@ -0,0 +1,442 @@
+% --------------------------------------------------------------------------
+% the SUBSTANCES package
+%
+% A Chemical Database
+%
+% --------------------------------------------------------------------------
+% Clemens Niederberger
+% Web: https://bitbucket.org/cgnieder/substances/
+% E-Mail: contact@mychemistry.eu
+% --------------------------------------------------------------------------
+% Copyright 2012 Clemens Niederberger
+%
+% This work 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.
+%
+% This work has the LPPL maintenance status `maintained'.
+%
+% The Current Maintainer of this work is Clemens Niederberger.
+% --------------------------------------------------------------------------
+% The substances package consists of the files
+% - substances.sty, substances-default.def, substances-examples.sub,
+% substances_en.tex, substances_en.pdf, README
+% --------------------------------------------------------------------------
+% If you have any ideas, questions, suggestions or bugs to report, please
+% feel free to contact me.
+% --------------------------------------------------------------------------
+\RequirePackage{ expl3 , xparse , l3keys2e , xtemplate , chemmacros }
+\ProvidesExplPackage
+ {substances}
+ {2012/07/22}
+ {0.1}
+ {A Chemical Database}
+
+% ----------------------------------------------------------------------------
+% variables:
+\prop_new:N \l_substances_properties_pre_prop
+\prop_new:N \l_substances_properties_post_prop
+
+\seq_new:N \l_substances_required_seq
+\seq_new:N \l_substances_chemicals_seq
+
+\clist_new:N \l_substances_chemicals_clist
+
+\bool_new:N \l_substances_strict_bool
+\bool_new:N \l_substances_index_entry_bool
+\bool_new:N \l_substances_imakeidx_bool
+\bool_new:N \l_substances_multind_bool
+\bool_new:N \l_substances_splitidx_bool
+
+\tl_new:N \l_substances_style_tl
+\tl_set:Nn \l_substances_style_tl { default }
+
+\AtBeginDocument
+ {
+ \@ifpackageloaded { imakeidx }
+ { \bool_set_true:N \l_substances_imakeidx_bool } {}
+ \@ifpackageloaded { splitidx }
+ { \bool_set_true:N \l_substances_splitidx_bool } {}
+ \@ifpackageloaded { multind }
+ { \bool_set_true:N \l_substances_multind_bool } {}
+ }
+
+% ----------------------------------------------------------------------------
+% messages:
+\cs_new:Npn \substances_msg:nnn #1#2#3
+ {
+ \bool_if:NTF \l_substances_strict_bool
+ { \msg_error:nnxx { substances } { #1 } { #2 } { #3 } }
+ { \msg_warning:nnxx { substances } { #1 } { #2 } { #3 } }
+ }
+
+\msg_new:nnnn { substances } { property-missing }
+ { Property~`#2'~not~defined~for~substance~`#1'~\msg_line_context:. }
+ {
+ You~called~property~`#2'~for~substance~`#1'.~It~seems~though~that~you~
+ haven't~defined~it,~yet.
+ }
+
+\msg_new:nnnn { substances } { field-missing }
+ { Property~`#2'~is~not~defined~\msg_line_context:. }
+ {
+ You~called~property~`#2'~for~substance~`#1'.~This~property~has~not~been~
+ declared,~though.~Perhaps~you've~mispelled?
+ }
+
+\msg_new:nnnn { substances } { dadabase-missing }
+ { I~can't~find~the~database~file~`#1'~\msg_line_context:. }
+ {
+ You~requested~the~database~file~`#1',~but~apparently~it~is~missing.~Maybe~
+ you've~mispelled?
+ }
+
+\msg_new:nnnn { substances } { required-field }
+ { The~field~`#1'~is~missing~for~substance~`#2'~\msg_line_context:. }
+ {
+ You~declared~the~the~substance~`#2'~but~forgot~to~add~the~required~
+ property~`#1'.
+ }
+
+\msg_new:nnnn { substances } { style-missing }
+ { I~can't~find~the~file~`substances_#1.def'. }
+ {
+ You~specified~the~style~`#1'~which~means~you~want~me~to~load~the~file~
+ `substances_#1.def'~but~I~can't~find~it.~Perhaps~you've~mispelled?~
+ Anyway~I'm~loading~the~`default'~style~instead.
+ }
+
+% ----------------------------------------------------------------------------
+% options
+\keys_define:nn { substances / options }
+ {
+ strict .bool_set:N = \l_substances_strict_bool ,
+ draft .code:n = \bool_set_true:N \l_substances_strict_bool ,
+ final .code:n = \bool_set_false:N \l_substances_strict_bool ,
+ index .bool_set:N = \l_substances_index_entry_bool ,
+ style .tl_set:N = \l_substances_style_tl
+ }
+
+\ProcessKeysOptions { substances / options }
+
+% ----------------------------------------------------------------------------
+% define new property fields:
+\cs_new:Npn \substances_define_property_field:nnnn #1#2#3#4
+ {
+ \IfBooleanT { #1 }
+ { \seq_put_right:Nn \l_substances_required_seq { #2 } }
+ \prop_if_exist:cF { l_substances_#2_prop }
+ { \prop_new:c { l_substances_#2_prop } }
+ \IfNoValueTF { #3 }
+ { \prop_put:Nnn \l_substances_properties_pre_prop { #2 } { } }
+ {
+ \tl_if_blank:nTF { #3 }
+ { \prop_put:Nnn \l_substances_properties_pre_prop { #2 } { } }
+ { \prop_put:Nnn \l_substances_properties_pre_prop { #2 } { #3 } }
+ }
+ \IfNoValueTF { #4 }
+ { \prop_put:Nnn \l_substances_properties_post_prop { #2 } { } }
+ { \prop_put:Nnn \l_substances_properties_post_prop { #2 } { #4 } }
+ }
+
+\NewDocumentCommand \DeclareSubstanceProperty { smoo }
+ { \substances_define_property_field:nnnn { #1 } { #2 } { #3 } { #4 } }
+\@onlypreamble\DeclareSubstanceProperty
+
+% ----------------------------------------------------------------------------
+% declare new substance entry:
+\cs_new:Npn \substances_declare_substance:nn #1#2
+ {
+ \seq_put_right:Nn \l_substances_chemicals_seq { #1 }
+ \clist_put_right:Nn \l_substances_chemicals_clist { #1 }
+ \prop_map_inline:Nn \l_substances_properties_pre_prop
+ {
+ \tl_set:Nn \l_tmpa_tl { ##2 }
+ \prop_get:NnN \l_substances_properties_post_prop { ##1 } \l_tmpb_tl
+ \substances_add_property:nnVV { #1 } { ##1 } \l_tmpa_tl \l_tmpb_tl
+ }
+ \keys_set:nn { substances / #1 } { #2 }
+ \seq_map_inline:Nn \l_substances_required_seq
+ {
+ \group_begin:
+ \bool_set_true:N \l_substances_strict_bool
+ \prop_if_in:cnF { l_substances_##1_prop } { #1 }
+ { \substances_msg:nnn { required-field } { ##1 } { #1 } }
+ \group_end:
+ }
+ \prop_if_in:NnTF \l_substances_sort_prop { #1 }
+ {
+ \substances_remove_braces:xN
+ { \prop_get:Nn \l_substances_sort_prop { #1 } } \l_tmpa_tl
+ }
+ {
+ \prop_get:NnN \l_substances_properties_pre_prop { name } \l_tmpa_tl
+ \substances_remove_str_x:VnnN
+ \l_tmpa_tl
+ { #1 }
+ { name }
+ \l_tmpa_tl
+ }
+ \prop_put:NnV \l_substances_sort_prop { #1 } \l_tmpa_tl
+ \prop_if_in:NnT \l_substances_alt_prop { #1 }
+ {
+ \prop_if_in:NnTF \l_substances_altsort_prop { #1 }
+ {
+ \substances_remove_braces:xN
+ { \prop_get:Nn \l_substances_altsort_prop { #1 } } \l_tmpa_tl
+ }
+ {
+ \prop_get:NnN \l_substances_properties_pre_prop { alt } \l_tmpa_tl
+ \substances_remove_str_x:VnnN
+ \l_tmpa_tl
+ { #1 }
+ { alt }
+ \l_tmpa_tl
+ }
+ \prop_put:NnV \l_substances_altsort_prop { #1 } \l_tmpa_tl
+ }
+ \bool_new:c { g_substances_#1_alt_index_entry_bool }
+ }
+
+\cs_new:Npn \substances_add_property:nnnn #1#2#3#4
+ {
+ \keys_define:nn { substances / #1 }
+ {
+ #2 .code:n = \prop_put:cnn
+ { l_substances_#2_prop } { #1 } { #3{##1}#4 }
+ }
+ }
+\cs_generate_variant:Nn \substances_add_property:nnnn { nnVV }
+
+\NewDocumentCommand \DeclareSubstance { mm }
+ { \substances_declare_substance:nn { #1 } { #2 } }
+\@onlypreamble\DeclareSubstance
+
+% ----------------------------------------------------------------------------
+% recover values:
+\cs_new:Npn \substances_get_property:nn #1#2
+ {
+ \IfSubstanceFieldTF { #2 }
+ {
+ \IfSubstancePropertyTF { #1 } { #2 }
+ { \prop_get:cn { l_substances_#2_prop } { #1 } }
+ { {??} \substances_msg:nnn { property-missing } { #1 } { #2 } }
+ }
+ { {??} \substances_msg:nnn { field-missing } { #1 } { #2 } }
+ }
+
+% ----------------------------------------------------------------------------
+% some commands for creating user macros or whatever:
+\NewDocumentCommand \GetSubstanceProperty { mm }
+ { \substances_get_property:nn { #1 } { #2 } }
+
+\DeclareExpandableDocumentCommand \RetrieveSubstanceProperty { mm }
+ { \substances_get_property:nn { #1 } { #2 } }
+
+\DeclareExpandableDocumentCommand \IfSubstanceFieldTF { mmm }
+ { \cs_if_exist:cTF { l_substances_#1_prop } { #2 } { #3 } }
+
+\DeclareExpandableDocumentCommand \IfSubstanceFieldT { mm }
+ { \cs_if_exist:cT { l_substances_#1_prop } { #2 } }
+
+\DeclareExpandableDocumentCommand \IfSubstanceFieldF { mm }
+ { \cs_if_exist:cF { l_substances_#1_prop } { #2 } }
+
+\DeclareExpandableDocumentCommand \IfSubstanceExistTF { mmm }
+ { \seq_if_in:NnTF \l_substances_chemicals_seq { #1 } { #2 } { #3 } }
+
+\DeclareExpandableDocumentCommand \IfSubstanceExistT { mm }
+ { \seq_if_in:NnT \l_substances_chemicals_seq { #1 } { #2 } }
+
+\DeclareExpandableDocumentCommand \IfSubstanceExistF { mm }
+ { \seq_if_in:NnF \l_substances_chemicals_seq { #1 } { #2 } }
+
+\DeclareExpandableDocumentCommand \IfSubstancePropertyTF { mmmm }
+ {
+ \cs_if_exist:cTF { l_substances_#2_prop }
+ { \prop_if_in:cnTF { l_substances_#2_prop } { #1 } { #3 } { #4 } }
+ { #4 }
+ }
+
+\DeclareExpandableDocumentCommand \IfSubstancePropertyT { mmm }
+ {
+ \cs_if_exist:cT { l_substances_#2_prop }
+ { \prop_if_in:cnT { l_substances_#2_prop } { #1 } { #3 } }
+ }
+
+\DeclareExpandableDocumentCommand \IfSubstancePropertyF { mmm }
+ {
+ \cs_if_exist:cTF { l_substances_#2_prop }
+ { \prop_if_in:cnF { l_substances_#2_prop } { #1 } { #3 } }
+ { #3 }
+ }
+
+\DeclareExpandableDocumentCommand \ForAllSubstancesDo {}
+ { \seq_map_inline:Nn \l_substances_chemicals_seq }
+
+\AtBeginDocument
+ {
+ \tl_new:N \AllSubstancesSequence
+ \seq_map_inline:Nn \l_substances_chemicals_seq
+ { \tl_put_right:Nn \AllSubstancesSequence { {#1} } }
+ \cs_new_eq:NN \AllSubstancesClist \l_substances_chemicals_clist
+ }
+
+% ----------------------------------------------------------------------------
+% user command:
+\NewDocumentCommand \chem { soomo }
+ {
+ \IfNoValueF { #2 } { #2 }
+ \IfNoValueTF { #5 }
+ {
+ \IfBooleanTF { #1 }
+ {
+ \IfSubstancePropertyTF { #4 } { alt }
+ { \RetrieveSubstanceProperty { #4 } { alt } }
+ { \RetrieveSubstanceProperty { #4 } { name } }
+ }
+ { \RetrieveSubstanceProperty { #4 } { name } }
+ }
+ { \substances_get_property:nn { #4 } { #5 } }
+ \IfNoValueF { #3 } { #3 }
+ \bool_if:NT \l_substances_index_entry_bool
+ { \substances_index_entry:n { #4 } }
+ }
+
+% ----------------------------------------------------------------------------
+% index command to add an entry to the chemicals list if the option
+% `index=true' is used:
+\cs_new:Npn \substances_index:nn #1#2
+ {
+ \bool_if:NTF \l_substances_imakeidx_bool
+ { \index [ #1 ] { #2 } }
+ {
+ \bool_if:NTF \l_substances_splitidx_bool
+ { \sindex [ #1 ] { #2 } }
+ {
+ \bool_if:NTF \l_substances_multind_bool
+ { \index { #1 } { #2 } }
+ { \index { #2 } }
+ }
+ }
+ }
+\cs_generate_variant:Nn \substances_index:nn { no,nx }
+
+\cs_new:Npn \substances_index_entry:n #1
+ { \UseInstance { substances-index } { default } { #1 } }
+
+\cs_new:Npn \substances_remove_braces:xN #1#2
+ { \exp_last_unbraced:NNx \tl_set:Nn #2 { #1 } }
+\cs_generate_variant:Nn \exp_last_unbraced:NNo { NNx }
+
+\cs_new:Npn \substances_remove_str_x:nnnN #1#2#3#4
+ {
+ \tl_set:Nx #4
+ { \prop_get:cn { l_substances_#3_prop } { #2 } }
+ \tl_remove_all:Nn #4 { #1 }
+ \substances_remove_braces:xN { #4 } #4
+ }
+\cs_generate_variant:Nn \substances_remove_str_x:nnnN { V }
+
+% let's use xtemplate's features for possible customization later:
+\DeclareObjectType { substances-index } { 1 }
+
+\DeclareTemplateInterface { substances-index } { standard } { 1 }
+ {
+ alternative-entry : boolean = true ,
+ alternative-name : boolean = true
+ }
+
+\DeclareTemplateCode { substances-index } { standard } { 1 }
+ {
+ alternative-entry = \l_substances_index_alternative_entry_bool ,
+ alternative-name = \l_substances_index_alternative_name_bool ,
+ }
+ {
+ \AssignTemplateKeys
+ \bool_if:nTF
+ {
+ \l_substances_index_alternative_name_bool &&
+ \prop_if_in_p:Nn \l_substances_alt_prop { #1 }
+ }
+ {
+ \substances_index:nx { \c_job_name_tl -chem }
+ {
+ \SubstanceIndexNameAltEntry
+ { \prop_get:Nn \l_substances_sort_prop { #1 } }
+ { \GetSubstanceProperty { #1 } { name } }
+ { \GetSubstanceProperty { #1 } { alt } }
+ }
+ }
+ {
+ \substances_index:nx { \c_job_name_tl -chem }
+ {
+ \SubstanceIndexNameEntry
+ { \prop_get:Nn \l_substances_sort_prop { #1 } }
+ { \GetSubstanceProperty { #1 } { name } }
+ }
+ }
+ \bool_if:nT
+ {
+ \l_substances_index_alternative_entry_bool &&
+ \l_substances_index_alternative_name_bool &&
+ \prop_if_in_p:Nn \l_substances_alt_prop { #1 }
+ }
+ {
+ \bool_if:cF { g_substances_#1_alt_index_entry_bool }
+ {
+ \substances_index:nx { \c_job_name_tl -chem }
+ {
+ \SubstanceIndexAltEntry
+ { \prop_get:Nn \l_substances_altsort_prop { #1 } }
+ { \GetSubstanceProperty { #1 } { name } }
+ { \GetSubstanceProperty { #1 } { alt } }
+ }
+ \bool_gset_true:c { g_substances_#1_alt_index_entry_bool }
+ }
+ }
+ }
+
+\DeclareInstance { substances-index } { default } { standard } { }
+
+\cs_new:Npn \SubstanceIndexNameEntry #1#2 { #1@#2 }
+\cs_new:Npn \SubstanceIndexNameAltEntry #1#2#3 { #1@#2~(#3) }
+\cs_new:Npn \SubstanceIndexAltEntry #1#2#3 { #1@#3|see{#2} }
+% ----------------------------------------------------------------------------
+% define some default fields:
+
+\cs_new_nopar:Npn \@CAS #1-#2-#3 { \iupac{#1\-#2\-#3} }
+\NewDocumentCommand \CAS { m } { \@CAS #1 }
+
+\DeclareSubstanceProperty* { name } [\iupac]
+\DeclareSubstanceProperty { sort }
+\DeclareSubstanceProperty { alt } [\iupac]
+\DeclareSubstanceProperty { altsort }
+\DeclareSubstanceProperty { CAS } [\CAS]
+\DeclareSubstanceProperty { PubChem }
+
+% ----------------------------------------------------------------------------
+% load style file
+\file_if_exist:nTF { substances- \l_substances_style_tl .def }
+ { \file_input:n { substances- \l_substances_style_tl .def } }
+ {
+ \substances_msg:nnn { style-missing } { \l_substances_style_tl } { }
+ \file_input:n { substances-default.def }
+ }
+
+\NewDocumentCommand \LoadSubstances { m }
+ {
+ \file_if_exist:nTF { #1.sub }
+ { \file_input:n { #1.sub } }
+ { \substances_msg:nnn { database-missing } { #1.sub } { } }
+ }
+\@onlypreamble\LoadSubstances
+
+\tex_endinput:D
+
+% HISTORY:
+2012/07/22 v0.1 - first release to CTAN \ No newline at end of file