summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/cnltx/cnltx-base.sty
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/tex/latex/cnltx/cnltx-base.sty')
-rw-r--r--Master/texmf-dist/tex/latex/cnltx/cnltx-base.sty713
1 files changed, 713 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/cnltx/cnltx-base.sty b/Master/texmf-dist/tex/latex/cnltx/cnltx-base.sty
new file mode 100644
index 00000000000..1d648e44de7
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/cnltx/cnltx-base.sty
@@ -0,0 +1,713 @@
+% --------------------------------------------------------------------------
+% the CNLTX bundle
+%
+% LaTeX source code and output
+%
+% --------------------------------------------------------------------------
+% Clemens Niederberger
+% Web: https://github.com/cgnieder/cnltx/
+% E-Mail: contact@mychemistry.eu
+% --------------------------------------------------------------------------
+% Copyright 2013 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.
+% --------------------------------------------------------------------------
+% If you have any ideas, questions, suggestions or bugs to report, please
+% feel free to contact me.
+% --------------------------------------------------------------------------
+\def\cnltx@@date{2013/10/04}
+\def\cnltx@@version{v0.7a}
+\def\cnltx@@info{LaTeX tools and documenting facilities (CN)}
+\ProvidesPackage{cnltx-base}[\cnltx@@date\space \cnltx@@version\space \cnltx@@info]
+\RequirePackage{pgfopts,etoolbox,ltxcmds}
+
+% --------------------------------------------------------------------------
+% error messaging
+
+% messages with a common detailed error message:
+% * : star: class, nostar: package
+% #1: prefix
+% #2: package/class name
+% #3: message type
+% #4: extended error message
+\newcommand*\cnltx@create@generic@message{%
+ \@ifstar
+ {\cnltx@create@generic@message@aux{Class}}
+ {\cnltx@create@generic@message@aux{Package}}%
+}
+
+% #1: Class|Package
+% #2: prefix
+% #3: package/class name
+% #4: message type
+% #5: extended error message
+\newcommand\cnltx@create@generic@message@aux[5]{%
+ \ifstrequal{#4}{Error}
+ {%
+ \lowercase{\csdef{#2@#4}}##1{%
+ \csuse{#1#4}{#3}{##1}{#5}}%
+ }{%
+ \lowercase{\csdef{#2@#4}}##1{%
+ \csuse{#1#4}{#3}{##1}}%
+ }}
+
+% messages where the detailed error message must be specified as second
+% argument:
+% * : star: class, nostar: package
+% #1: prefix
+% #2: package/class name
+% #3: message type
+\newcommand*\cnltx@create@message{%
+ \@ifstar
+ {\cnltx@create@message@aux{Class}}
+ {\cnltx@create@message@aux{Package}}%
+}
+
+% #1: Class|Package
+% #2: prefix
+% #3: package/class name
+% #4: message type
+\newcommand\cnltx@create@message@aux[4]{%
+ \ifstrequal{#4}{Error}
+ {%
+ \lowercase{\csdef{#2@#4}}##1##2{%
+ \csuse{#1#4}{#3}{##1}{##2}}%
+ }{%
+ \lowercase{\csdef{#2@#3}}##1{%
+ \csuse{#1#4}{#3}{##1}}%
+ }}
+
+% message handling for the cnltx bundle:
+\newcommand*\cnltx@error@message{%
+ For details have a look at the `cnltx' manual.}
+
+% * : star: class, nostar: package
+% #1: bundle module
+% #2: message type
+\newcommand*\cnltx@create@bundle@message{%
+ \@ifstar
+ {\cnltx@create@bundle@message@aux{Class}}
+ {\cnltx@create@bundle@message@aux{Package}}%
+}
+
+\newcommand\cnltx@create@bundle@message@aux[3]{%
+ \cnltx@create@generic@message@aux
+ {#1}
+ {cnltx@#2}
+ {cnltx-#2}
+ {#3}
+ {\cnltx@error@message}%
+}
+
+\cnltx@create@bundle@message{base}{Error}
+\cnltx@create@bundle@message{base}{Warning}
+\cnltx@create@bundle@message{base}{WarningNoLine}
+\cnltx@create@bundle@message{base}{Info}
+
+% --------------------------------------------------------------------------
+% setup command
+\newrobustcmd\setcnltx[1]{\pgfqkeys{/cnltx}{#1}}
+
+\def\cnltx@par{\par}
+
+% --------------------------------------------------------------------------
+% generic conditionals
+% those two are in the spirit of etoolbox's \ifbool and \notbool and provide
+% the same functionalty as the `test' directive in `\ifboolexpr':
+\newcommand\iftest[1]{%
+ #1%
+ \expandafter\@firstoftwo
+ \else
+ \expandafter\@secondoftwo
+ \fi
+}
+
+\newcommand\nottest[1]{%
+ #1%
+ \expandafter\@secondoftwo
+ \else
+ \expandafter\@firstoftwo
+ \fi
+}
+
+\newrobustcmd*\cnltx@ifsym[2]{\@ifnextchar#1{\@firstoftwo{#2}}}
+\newcommand*\cnltx@ifdash{\cnltx@ifsym{-}}
+\newcommand*\cnltx@ifbang{\cnltx@ifsym{!}}
+
+% an idea by Herbert Voß (http://tex.stackexchange.com/a/7183/5049):
+\newcommand*\cnltx@ifisnum[1]{%
+ \iftest{\if!\ifnum9<1#1!\else_\fi}%
+}
+
+% --------------------------------------------------------------------------
+% expansion helper
+% \cnltx@expandargs(<spec>)
+% this is heavily inspired by expl3's \exp_args:N<spec>; in fact the code
+% they use is very clever so it is basically just copied and renamed -- I'm
+% sorry for that but I couldn't've done better.
+\def\cnltx@expandargs@internal{}
+
+% auxiliary macros:
+\long\def\cnltx@getnext@braced#1#2#3{#2\cnltx@firstofone{#3{#1}}}
+\long\def\cnltx@getnext@unbraced#1#2#3{#2\cnltx@firstofone{#3#1}}
+\long\def\cnltx@firstofone#1{#1}
+
+% the argument macros:
+% n:
+\long\def\cnltx@braced@unexpanded#1\cnltx@firstofone#2#3{%
+ #1\cnltx@firstofone{#2{#3}}%
+}
+% N:
+\long\def\cnltx@unbraced@unexpanded#1\cnltx@firstofone#2#3{%
+ #1\cnltx@firstofone{#2#3}%
+}
+% c:
+\long\def\cnltx@braced@csname#1\cnltx@firstofone#2#3{%
+ \expandafter\cnltx@getnext@unbraced\csname#3\endcsname{#1}{#2}%
+}
+% o:
+\long\def\cnltx@braced@expanded@once#1\cnltx@firstofone#2#3{%
+ \expandafter\cnltx@getnext@braced\expandafter{#3}{#1}{#2}%
+}
+% f:
+\long\def\cnltx@braced@expanded@fully#1\cnltx@firstofone#2#3{%
+ \expandafter\cnltx@getnext@braced
+ \expandafter{\romannumeral-`0#3}{#1}{#2}%
+}
+% x:
+\protected\long\def\cnltx@braced@expanded@exhaustively#1\cnltx@firstofone#2#3{%
+ \edef\cnltx@expandargs@internal{{#3}}%
+ \expandafter\cnltx@getnext@braced\cnltx@expandargs@internal{#1}{#2}%
+}
+
+% the actual expansion helper macro:
+\protected\def\cnltx@expandargs(#1){%
+ \def\cnltx@expandargs@aux{#1\cnltx@firstofone}%
+ \cnltx@replace@all\cnltx@expandargs@aux{N}{\cnltx@unbraced@unexpanded}%
+ \cnltx@replace@all\cnltx@expandargs@aux{n}{\cnltx@braced@unexpanded}%
+ \cnltx@replace@all\cnltx@expandargs@aux{c}{\cnltx@braced@csname}%
+ \cnltx@replace@all\cnltx@expandargs@aux{o}{\cnltx@braced@expanded@once}%
+ \cnltx@replace@all\cnltx@expandargs@aux{f}{\cnltx@braced@expanded@fully}%
+ \cnltx@replace@all\cnltx@expandargs@aux{x}{\cnltx@braced@expanded@exhaustively}%
+ \cnltx@expandargs@aux
+}
+
+% \exp_args:Nx
+\newcommand\cnltx@fullexpand@arg{\cnltx@expandargs(x)}
+
+% \exp_args:Nxx
+\newcommand\cnltx@fullexpand@twoargs{\cnltx@expandargs(xx)}
+
+% \exp_args:NV
+\newcommand\cnltx@expand@arg{\cnltx@expandargs(o)}
+
+% expanding an environment argument or something:
+\newcommand\cnltx@fullexpand@afterarg{\cnltx@expandargs(nx)}
+
+% --------------------------------------------------------------------------
+% tokenlist manipulation
+\newcommand*\cnltx@stripbs{\expandafter\@gobble\string}
+
+% \cnltx@if@in{tokenlist}{search}{true}{false}
+\newrobustcmd\cnltx@if@in[2]{%
+ \def\cnltx@ifin@tmp##1#2{}%
+ \expandafter\ifblank\expandafter{\cnltx@ifin@tmp#1{}{}#2}
+ {\@secondoftwo}
+ {\@firstoftwo}%
+}
+
+% \cnltx@replace@once{macro}{search}{replace}
+\newrobustcmd\cnltx@long@replace@once{\cnltx@replace@once@longorshort\long}
+\newrobustcmd*\cnltx@replace@once{\cnltx@replace@once@longorshort\@empty}
+
+\newrobustcmd\cnltx@replace@once@longorshort[4]{%
+ \expandafter\cnltx@if@in\expandafter{#2}{#3}
+ {%
+ #1\def\cnltx@ro@tmp##1#3##2\q@stop{%
+ #1\def#2{##1#4##2}%
+ }%
+ \expandafter\cnltx@ro@tmp#2\q@stop
+ }
+ {}%
+}
+
+% \cnltx@replace@all{macro}{search}{replace}
+\newrobustcmd\cnltx@replace@all[3]{%
+ \cnltx@replace@once#1{#2}{#3}%
+ \expandafter\cnltx@if@in\expandafter{#1}{#2}
+ {\cnltx@replace@all#1{#2}{#3}}
+ {}%
+}
+
+\newrobustcmd\cnltx@long@replace@all[3]{%
+ \cnltx@long@replace@once#1{#2}{#3}%
+ \expandafter\cnltx@if@in\expandafter{#1}{#2}
+ {\cnltx@long@replace@all#1{#2}{#3}}
+ {}%
+}
+
+% \cnltx@remove@once{macro}{search}
+\newrobustcmd\cnltx@remove@once[2]{\cnltx@replace@once#1{#2}{}}
+\newrobustcmd\cnltx@long@remove@once[2]{\cnltx@long@replace@once#1{#2}{}}
+
+% \cnltx@remove@all{macro}{search}
+\newrobustcmd\cnltx@remove@all[2]{\cnltx@replace@all#1{#2}{}}
+\newrobustcmd\cnltx@long@remove@all[2]{\cnltx@long@replace@all#1{#2}{}}
+
+% --------------------------------------------------------------------------
+% an equivalent of \newcommand that where the macro with the optional argument
+% is expandable. For this to work the newly defined macro /needs/ to eat the
+% first following token!
+\def\cnltx@num@to@args#1{%
+ \ifnum#1>1
+ \cnltx@num@to@args@aux{2}{#1}{####}%
+ \fi
+}
+\def\cnltx@num@to@args@aux#1#2#3{%
+ \ifnum#1<\numexpr#2+1\relax
+ #3#1%
+ \expandafter\cnltx@num@to@args@aux
+ \expandafter{\number\numexpr#1+1}{#2}{#3}%
+ \fi
+}
+
+% \newexpandablecmd*<cs>[<num mand>][<default opt>]{<definition>}
+\newrobustcmd*\newexpandablecmd{%
+ \@star@or@long\cnltx@newexpcmd
+}
+\newrobustcmd*\renewexpandablecmd{%
+ \@star@or@long\cnltx@renewexpcmd
+}
+\newrobustcmd*\provideexpandablecmd{%
+ \@star@or@long\cnltx@provideexpcmd
+}
+
+\def\cnltx@dummy{}
+
+\newrobustcmd*\cnltx@provideexpcmd[1]{%
+ \ifdef{#1}
+ {\cnltx@renewexpcmd\cnltx@dummy}
+ {\cnltx@newexpcmd#1}%
+}
+
+\newrobustcmd*\cnltx@newexpcmd{%
+ \cnltx@new@expcmd
+}
+
+\newrobustcmd*\cnltx@renewexpcmd[1]{%
+ \ifdef{#1}
+ {%
+ \let\@ifdefinable\@rc@ifdefinable
+ \cnltx@newexpcmd#1%
+ }
+ {\@latex@error{\noexpand#1undefined}\@ehc}%
+}
+
+\def\cnltx@new@expcmd#1{%
+ \@ifnextchar[%]
+ {\cnltx@newexpcmd@i{#1}}
+ {\cnltx@newexpcmd@i{#1}[0]}%
+}
+\def\cnltx@newexpcmd@i#1[#2]{%
+ \@ifnextchar[%]
+ {\cnltx@newexpcmd@ii{#1}{#2}}
+ {\new@command#1[#2]}%
+}
+
+\def\cnltx@newexpcmd@ii#1#2[#3]{%
+ \edef\cnltx@newexpcmd@args{\cnltx@num@to@args{#2}}%
+ \expandafter\cnltx@defexpcmd\expandafter{\cnltx@newexpcmd@args}{#2}[#3]#1%
+}
+
+\long\def\cnltx@defexpcmd#1#2[#3]#4#5{%
+ \@ifdefinable#4{%
+ \long\def#4##1{%
+ \cnltxnewexpcmd@ifisopt
+ {#2}
+ {##1}
+ {\csuse{\@backslashchar\cnltx@stripbs#4}}
+ {#3}%
+ }%
+ }%
+ \l@ngrel@x\csdef{\@backslashchar\cnltx@stripbs#4}[##1]#1{#5}%
+}
+\newcommand\cnltxnewexpcmd@ifisopt[4]{%
+ \cnltxnewexpcmd@ifisopt@aux#2\q@marker[\q@marker
+ {#3#2}
+ {\iftest{\ifnum#1>1 }{#3[#4]{#2}}{#3[#4]#2}}%
+}
+\long\def\cnltxnewexpcmd@ifisopt@aux#1[#2\q@marker#3#{%
+ \ifstrempty{#1#2}%
+}
+
+% --------------------------------------------------------------------------
+% looking for trailing punctuation:
+%
+% list parser with no separator:
+\DeclareListParser*\cnltx@add@punctuation{}
+
+% the list that holds the punctuation marks:
+\def\cnltx@punctuation@list{}
+
+% set the punctuation list (the parser does not like blank lists):
+\newrobustcmd*\cnltx@set@punctuation[1]{%
+ \def\cnltx@punctuation@list{}%
+ \ifblank{#1}
+ {}
+ {\cnltx@add@punctuation{\listadd\cnltx@punctuation@list}{#1}}%
+}
+
+% set default list:
+\cnltx@set@punctuation{,.!?;:}
+
+\pgfkeys{
+ cnltx/.cd ,
+ set-trail-punct/.code = \cnltx@set@punctuation{#1}
+}
+
+% --------------------------------------------------------------------------
+% small helper if we gobbled \par:
+\newcommand*\cnltx@punctuation@ifpar{%
+ \iftest{\expandafter\ifx\cnltx@trailpunct\par}%
+}
+% \def\cnltx@punctuation@ifpar{%
+% \expandafter\ifx\cnltx@trailpunct\par
+% \expandafter\@firstoftwo
+% \else
+% \expandafter\@secondoftwo
+% \fi
+% }
+
+% --------------------------------------------------------------------------
+% per case list:
+\newrobustcmd*\cnltx@set@punctuation@default{%
+ \ifx\cnltx@punctuation@list\cnltx@tmp@punctuation
+ \else
+ \let\cnltx@punctuation@list\cnltx@tmp@punctuation
+ \fi
+}
+
+\newrobustcmd*\cnltx@set@punctuation@option[1]{%
+ \let\cnltx@tmp@punctuation\cnltx@punctuation@list
+ \ifblank{#1}{}{\cnltx@set@punctuation{#1}}%
+}
+
+% --------------------------------------------------------------------------
+% check for punctuation mark and gobble it if present:
+\newrobustcmd\cnltx@ifpunctuation@gobble[3][]{%
+ \cnltx@set@punctuation@option{#1}%
+ \ltx@ifnextchar{ }
+ {\cnltx@ifpunctuation@gobble@aux{#2}{#3}{ }}
+ {\cnltx@ifpunctuation@gobble@aux{#2}{#3}}%
+}
+
+\newrobustcmd\cnltx@ifpunctuation@gobble@aux[3]{%
+ \edef\cnltx@trailpunct{\unexpanded{#3}}%
+ \ifblank{#3}{#2}{%
+ \ifinlist{#3}{\cnltx@punctuation@list}
+ {#1}
+ {#2\cnltx@punctuation@ifpar{}{#3}}%
+ \cnltx@punctuation@ifpar{\par}{}%
+ }%
+ \cnltx@set@punctuation@default
+}
+
+% --------------------------------------------------------------------------
+% check for punctuation mark but leave it where it is:
+\newrobustcmd\cnltx@ifpunctuation@nogobble[3][]{%
+ \cnltx@set@punctuation@option{#1}%
+ \ltx@ifnextchar{ }
+ {\cnltx@ifpunctuation@nogobble@aux{#2}{#3}{}}
+ {\cnltx@ifpunctuation@nogobble@aux{#2}{#3}}%
+}
+
+\newrobustcmd\cnltx@ifpunctuation@nogobble@aux[3]{%
+ \ifblank{#3}{#2}{%
+ \ifinlist{#3}{\cnltx@punctuation@list}
+ {#1}
+ {#2}%
+ }%
+ \cnltx@set@punctuation@default
+ #3%
+}
+
+% --------------------------------------------------------------------------
+% the main command:
+\newrobustcmd\cnltx@ifpunctuation{%
+ \@ifstar
+ \cnltx@ifpunctuation@nogobble
+ \cnltx@ifpunctuation@gobble
+}
+
+% --------------------------------------------------------------------------
+% counter representation commands
+% error messages
+\newcommand*\cnltx@base@error@unknown@user@representation[1]{%
+ \cnltx@base@error{Unknown counter representation \string#1}}
+
+\newcommand*\cnltx@base@error@unknown@internal@representation[1]{%
+ \cnltx@base@error{Unknown internal counter representation #1}}
+
+\newcommand*\cnltx@base@error@already@user@representation[1]{%
+ \cnltx@base@error{Counter representation \string#1 already exists}}
+
+\newcommand*\cnltx@base@error@already@internal@representation[1]{%
+ \cnltx@base@error{Internal counter representation \expandonce{#1} already exists}}
+
+% --------------------------------------------------------------------------
+% conditionals
+% test for user commands like \arabic
+\newcommand*\cnltx@if@user@representation{\ifdef}
+
+% test for internal commands like \@arabic; we will assume they're /always/
+% the same as the corresponding user command but with a leading @:
+\newcommand*\cnltx@if@internal@representation[1]{%
+ \ifcsdef{@\cnltx@stripbs#1}%
+}
+
+% --------------------------------------------------------------------------
+% the main command
+\newrobustcmd*\cnltx@new@counter@representation[2]{%
+ \edef#1##1{%
+ \noexpand\expandafter
+ \expandonce{\csname @\cnltx@stripbs#1\endcsname}%
+ \noexpand\csname c@##1\noexpand\endcsname
+ }%
+ \csdef{@\cnltx@stripbs#1}##1{#2}%
+}
+
+% --------------------------------------------------------------------------
+% the user commands
+\newrobustcmd*\newcounterrepresentation[2]{%
+ \cnltx@if@user@representation{#1}
+ {\cnltx@base@error@already@user@representation{#1}}
+ {}%
+ \cnltx@if@internal@representation{#1}
+ {%
+ \cnltx@base@error@already@internal@representation
+ {\csname @\cnltx@stripbs#1\endcsname}%
+ }
+ {}%
+ \cnltx@new@counter@representation{#1}{#2}%
+}
+
+\newrobustcmd*\renewcounterrepresentation[2]{%
+ \cnltx@if@user@representation{#1}
+ {}
+ {\cnltx@base@error@unknown@user@representation{#1}}%
+ \cnltx@if@internal@representation{#1}
+ {}
+ {%
+ \cnltx@base@error@unknown@internal@representation
+ {\csname @\cnltx@stripbs#1\endcsname}%
+ }%
+ \cnltx@new@counter@representation{#1}{#2}%
+}
+
+\newrobustcmd*\providecounterrepresentation[2]{%
+ \cnltx@if@user@representation{#1}{}{%
+ \cnltx@if@internal@representation{#1}{}{%
+ \cnltx@new@counter@representation{#1}{#2}%
+ }%
+ }%
+}
+
+\newrobustcmd*\DeclareCounterRepresentation[2]{%
+ \cnltx@new@counter@representation{#1}{#2}%
+}
+
+% --------------------------------------------------------------------------
+% the following definitions are redundant, the LaTeX2e kernel provides them
+% already. They're provided as an overview:
+
+% \arabic:
+\providecounterrepresentation\arabic{\number#1}
+% \roman:
+\providecounterrepresentation\roman{\romannumeral#1}
+% \Roman:
+\providecounterrepresentation\Roman{%
+ \expandafter\@slowromancap\romannumeral#1@}
+%\alph:
+\providecounterrepresentation\alph{%
+ \ifcase#1%
+ \or a\or b\or c\or d\or e\or f%
+ \or g\or h\or i\or j\or k\or l%
+ \or m\or n\or o\or p\or q\or r%
+ \or s\or t\or u\or v\or w\or x%
+ \or y\or z%
+ \else
+ \@ctrerr
+ \fi
+}
+% \Alph:
+\providecounterrepresentation\Alph{%
+ \ifcase#1%
+ \or A\or B\or C\or D\or E\or F%
+ \or G\or H\or I\or J\or K\or L%
+ \or M\or N\or O\or P\or Q\or R%
+ \or S\or T\or U\or V\or W\or X%
+ \or Y\or Z%
+ \else
+ \@ctrerr
+ \fi
+}
+% \fnsymbol:
+% this is the definition of \fnsymbol in `latex.ltx'; a redefinition like in
+% `fixltx2e.sty' would be preferable but \TextOrMath is not defined per
+% default and we don't want to require `fixltx2e.sty'
+\providecounterrepresentation\fnsymbol{%
+ \ensuremath{%
+ \ifcase#1%
+ \or *%
+ \or \dagger
+ \or \ddagger
+ \or \mathsection
+ \or \mathparagraph
+ \or \|%
+ \or **%
+ \or \dagger\dagger
+ \or \ddagger\ddagger
+ \else
+ \@ctrerr
+ \fi
+ }%
+}
+
+% --------------------------------------------------------------------------
+% colors definitions:
+\RequirePackage{xcolor}
+\RequirePackage{trimspaces}
+
+\xdefinecolor{cnltxbrown}{rgb}{0.60,0.25,0.15}
+\xdefinecolor{cnltxblue}{rgb}{0.02,0.04,0.48}
+\xdefinecolor{cnltxred}{rgb}{0.65,0.04,0.07}
+\xdefinecolor{cnltxgreen}{rgb}{0.06,0.44,0.08}
+\xdefinecolor{cnltxgray}{gray}{0.5}
+\colorlet{cnltxyellow}{yellow!40!brown}
+\xdefinecolor{cnltxformalblue}{rgb}{0,0.2,0.6}
+\xdefinecolor{cnltxformalred}{rgb}{0.8,0.1,0.2}
+
+% set a color-scheme for the manual:
+\newrobustcmd\definecolorscheme{%
+ \cnltx@define@colorscheme
+}
+\newrobustcmd*\cnltx@define@colorscheme[2]{%
+ \csgdef{cnltx@color@scheme@#1}{}%
+ \forcsvlist{\cnltx@get@color{#1}}{#2}%
+}
+\newcommand*\cnltx@get@color[2]{\cnltx@get@color@aux{#1}#2\q@stop}
+\def\cnltx@get@color@aux#1#2=>#3\q@stop{%
+ \listcsgadd{cnltx@color@scheme@#1}{%
+ \colorlet{\trim@spaces{#2}}{\trim@spaces{#3}}%
+ }%
+}
+
+\newcommand*\cnltx@use@colorscheme[1]{%
+ \forlistcsloop{\@firstofone}{cnltx@color@scheme@#1}%
+}
+
+\pgfkeys{
+ cnltx/.cd,
+ color-scheme/.code = \cnltx@use@colorscheme{#1}
+}
+
+% predefined color-schemes:
+\definecolorscheme{default}{
+ cs => cnltxbrown ,
+ option => cnltxyellow ,
+ module => cnltxblue ,
+ comment => cnltxgray ,
+ beginend => red ,
+ env => black ,
+ argument => black ,
+ meta => black!80 ,
+ cnltx => cnltxred ,
+ cnltxbg => white ,
+ link => black!90 ,
+ versionnote => black!75 ,
+ bibentry => cnltxgreen ,
+ bibentryfield => black ,
+ expandable => red ,
+ unexpandable => black ,
+ makeidxkey => cnltxgreen ,
+ makeidxstring => black
+}
+
+\definecolorscheme{blue}{
+ cs => cnltxbrown ,
+ option => cnltxgreen ,
+ module => cnltxred ,
+ comment => cnltxgray ,
+ beginend => red ,
+ env => black ,
+ argument => black ,
+ meta => black!80 ,
+ cnltx => cnltxblue ,
+ cnltxbg => yellow!10 ,
+ link => cnltx ,
+ versionnote => black!75 ,
+ bibentry => cnltxyellow ,
+ bibentryfield => black ,
+ expandable => red ,
+ unexpandable => black ,
+ makeidxkey => cnltxyellow ,
+ makeidxstring => black
+}
+
+\definecolorscheme{formal}{
+ cs => black ,
+ option => cnltxformalblue ,
+ module => cnltxblue ,
+ comment => cnltxgray ,
+ beginend => red ,
+ env => black ,
+ argument => black ,
+ meta => black!80 ,
+ cnltx => cnltxformalblue ,
+ cnltxbg => white ,
+ link => black!90 ,
+ versionnote => black!75 ,
+ bibentry => black ,
+ bibentryfield => black ,
+ expandable => red ,
+ unexpandable => black ,
+ makeidxkey => black ,
+ makeidxstring => black
+}
+
+% set the default:
+\setcnltx{color-scheme=default}
+
+\endinput
+
+% --------------------------------------------------------------------------
+HISTORY:
+
+2013/09/08 v0.1 - first working version
+2013/09/10 v0.2 - added `cnltx-tools' to the bundle
+ - extended the messaging creation to class messages
+2013/09/12 v0.3 - added index style file `cnltx.ist'
+ - added color `module'
+ - added \cnltx@remove@once and \cnltx@remove@all
+ - added long versions of tokenlist manipulation macros
+2013/09/14 v0.4 - added \cnltx@fullexpand@afterarg
+ - new colors `bibentry' and `bibentryfield'
+2013/09/20 v0.5 - added colors `expandable' and `unexpandable'
+ - added \definecolorscheme
+2013/09/24 v0.6 - added \cnltx@ifisnum
+2013/09/30 v0.7 - added functionality to look for trailing punctuation
+ - added colors `makeidxkey' and `makeidxstring'
+ - added counter representation command facilities
+ - generalized expansion helpers (by copying expl3's
+ \exp_arg:N<spec> idea)
+ - \iftest and \nottest