diff options
author | Karl Berry <karl@freefriends.org> | 2012-07-26 22:44:44 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2012-07-26 22:44:44 +0000 |
commit | 5c7e88f6bc0ed19c94fd9c49311ee63a90ebab7c (patch) | |
tree | c581f45a650247ba22a11319699127daa2472992 /Master/texmf-dist | |
parent | 6de23ba3ea913fe19bef0226096c339ec2c81e78 (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/README | 32 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/substances/substances-examples.sub | 301 | ||||
-rw-r--r-- | Master/texmf-dist/doc/latex/substances/substances_en.pdf | bin | 0 -> 791771 bytes | |||
-rw-r--r-- | Master/texmf-dist/doc/latex/substances/substances_en.tex | 605 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/substances/substances-default.def | 80 | ||||
-rw-r--r-- | Master/texmf-dist/tex/latex/substances/substances.sty | 442 |
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 Binary files differnew file mode 100644 index 00000000000..da9d3aa1764 --- /dev/null +++ b/Master/texmf-dist/doc/latex/substances/substances_en.pdf 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 |