summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/ccool
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2020-04-16 03:01:17 +0000
committerNorbert Preining <norbert@preining.info>2020-04-16 03:01:17 +0000
commit7412eb57b148d2ecd77d0291c97fb05bea8efbb0 (patch)
treeed628b0a7a0eb72a835f5462808f900e850d2dc8 /macros/latex/contrib/ccool
parente768cc604852d6fe8821592cea67835f67eab0db (diff)
CTAN sync 202004160301
Diffstat (limited to 'macros/latex/contrib/ccool')
-rw-r--r--macros/latex/contrib/ccool/README.md7
-rw-r--r--macros/latex/contrib/ccool/ccool.dtx1692
-rw-r--r--macros/latex/contrib/ccool/ccool.pdfbin0 -> 722772 bytes
3 files changed, 1699 insertions, 0 deletions
diff --git a/macros/latex/contrib/ccool/README.md b/macros/latex/contrib/ccool/README.md
new file mode 100644
index 0000000000..79ddcae18f
--- /dev/null
+++ b/macros/latex/contrib/ccool/README.md
@@ -0,0 +1,7 @@
+----------------------------------------------------------------
+##### ccool --- A tool for encoding mathematical notation
+- Source repository: https://github.com/rogard/ccool
+- Released under the LaTeX Project Public License v1.3c or later
+- See http://www.latex-project.org/lppl.txt
+----------------------------------------------------------------
+
diff --git a/macros/latex/contrib/ccool/ccool.dtx b/macros/latex/contrib/ccool/ccool.dtx
new file mode 100644
index 0000000000..4dd2d47e22
--- /dev/null
+++ b/macros/latex/contrib/ccool/ccool.dtx
@@ -0,0 +1,1692 @@
+% \iffalse meta-comment
+% !TEX program = pdfLaTeX
+%<*internal>
+\iffalse
+%</internal>
+%<*readme>
+----------------------------------------------------------------
+##### ccool --- A tool for encoding mathematical notation
+- Source repository: https://github.com/rogard/ccool
+- Released under the LaTeX Project Public License v1.3c or later
+- See http://www.latex-project.org/lppl.txt
+----------------------------------------------------------------
+
+%</readme>
+%<*internal>
+\fi
+\def\nameofplainTeX{plain}
+\ifx\fmtname\nameofplainTeX\else
+\expandafter\begingroup
+\fi
+%</internal>
+%<*install>
+\input docstrip.tex
+\keepsilent
+\askforoverwritefalse
+\preamble
+----------------------------------------------------------------------------
+ccool --- A tool for encoding mathematical notation
+Released under the LaTeX Project Public License v1.3c or later
+See http://www.latex-project.org/lppl.txt
+----------------------------------------------------------------------------
+
+\endpreamble
+\postamble
+
+Copyright (C) 2020 by Erwann Rogard
+
+This work may be distributed and/or modified under the
+conditions of the LaTeX Project Public License (LPPL), either
+version 1.3c of this license or (at your option) any later
+version. The latest version of this license is in the file:
+
+http://www.latex-project.org/lppl.txt
+
+This work is "maintained" (as per LPPL maintenance status) by
+Erwann Rogard.
+
+This work consists of the file ccool.dtx and the derived files:
+ccool.sty, and ccool.pdf.
+
+\endpostamble
+\generate{
+ \file{\jobname.sty}{\from{\jobname.dtx}{package}}
+}
+%</install>
+%<install> \endbatchfile
+%<*internal>
+\generate{
+ \file{\jobname.ins}{\from{\jobname.dtx}{install}}
+}
+\nopreamble\nopostamble
+\generate{
+ \file{README.md}{\from{\jobname.dtx}{readme}}
+}
+\ifx\fmtname\nameofplainTeX
+\expandafter\endbatchfile
+\else
+\expandafter\endgroup
+\fi
+%</internal>
+%<package> \NeedsTeXFormat{LaTeX2e}[2020/02/02]
+%<package> \RequirePackage{etoolbox}[2019/09/21]
+%<package> \RequirePackage{l3keys2e}[2020/03/06]
+%<package> \RequirePackage{xparse}[2020/03/06]
+%<package> \ProvidesExplPackage
+%<package> {ccool} % Package name
+%<package> {2020/04/15} % Release date
+%<package> {2.0} % Release version
+%<package> {cool --- A tool for encoding mathematical notation} % Description
+%
+%<*driver>
+\documentclass[full]{l3doc}
+\listfiles
+\usepackage{amsmath, amssymb}
+\usepackage[english]{babel}
+\usepackage{bookmark}
+\usepackage{ccool}
+\usepackage{fancyvrb}
+\usepackage{fvextra}% csquotes should be loaded after fvextra
+\usepackage[T1]{fontenc}% \char`[
+\usepackage{pdfpages}
+\usepackage{tabto}
+\usepackage{tcolorbox}
+\tcbuselibrary{listings, breakable}
+\makeatletter
+\newcommand*{\docsetnameref}{\def\@currentlabelname}%https://tex.stackexchange.com/questions/537751
+\makeatother
+\ExplSyntaxOn
+\tl_gset:Nn \partname {Part}
+\ExplSyntaxOff
+\EnableCrossrefs
+\CodelineIndex
+\RecordChanges
+% ^^A\AtEndDocument { \PrintChanges \PrintIndex }
+\ExplSyntaxOn
+\providecommand\docarg[1]{\texttt{#1}} % fun[param] (macro) vs fun[arg] (eval)
+\providecommand\docargnoval{\c_novalue_tl}
+\providecommand\docassign[2]{#1~$\leftarrow$~#2}
+\providecommand\docccept[1]{\textit{#1}}
+\providecommand\doccceptbool{boolean}
+\providecommand\doccceptcode{code}
+\providecommand\doccceptint{integer}
+\providecommand\doccceptgroup{local~group}
+\providecommand\doccceptkvl{keyval~list}
+\providecommand\doccceptpath{path}
+\providecommand\doccceptpre{preamble}
+\providecommand\docccepttok{token}
+\providecommand\docenvdoc{\env{document}}
+\providecommand\docdefaultfor{default~for~}
+\providecommand\doceval[1]{\texttt{\char`\{}#1\texttt{\char`\}}}
+\providecommand\docfillblank{\begin{minipage}[t]{\linewidth}\end{minipage}}
+\providecommand\docissuedo{Do: }
+\providecommand\docissuedont{Don't: }
+\providecommand\docissuesymp{Symptom: }
+\providecommand\doclist[1]{Listing~\autoref{listing:#1}}
+\providecommand\docopto[1]{\texttt{[}#1\texttt{]}}
+\providecommand\docopte[2]{\texttt{#1}\doceval{#2}}
+\providecommand\docoptd[1]{\texttt{\textless}#1\texttt{\textgreater}}
+\providecommand\docpipe{\textbar}
+\cs_new:Nn \__ccool_docu:n{\MakeUppercase #1}
+\providecommand\docstep[1]{step~\ref{step:#1}}
+\providecommand\docsee{See:~}
+\providecommand\docccepttl{token~list}
+\providecommand\doctip{\noindent\textbf{Tip}:~}
+\providecommand\docU[1]{\exp_args:Nx \__ccool_docu:n{#1}}
+\providecommand\docvers[2]{v#1.#2}
+\providecommand\docwarn{\noindent\textbf{Warning}:~}
+\providecommand\pkgparde{kvl$_{1}$}%Adef
+\providecommand\pkgparhe{tl$_{2}$}%head
+\providecommand\pkgparin{code$_{1}$}%inner
+\providecommand\pkgparna{tl$_{1}$}%name
+\providecommand\pkgparou{code$_{2}$}%outer
+\providecommand\pkgpars{\Arg{\pkgparsi}\docpipe\Arg{\pkgparsi}\Arg{\pkgparsii}\docpipe\Arg{\pkgparsi}\Arg{\pkgparsii}\Arg{\pkgparsiii}}%separ
+\providecommand\pkgparsi{tl$_{3}$}
+\providecommand\pkgparsii{tl$_{4}$}
+\providecommand\pkgparsiii{tl$_{5}$}
+\providecommand\pkgparta{tl$_{6}$}%tail
+\providecommand\pkgkey{key$_{i}$}
+\providecommand\pkgval{val$_{i}$}
+\providecommand\pkgoptex{\docarg{Expans}}
+\providecommand\pkgoptfi{\docarg{File}}
+\providecommand\pkgoptin{\docarg{Inner}}
+\providecommand\pkgoptna{\docarg{Name}}
+\providecommand\pkgoptnad{\docarg{Math}}%default
+\providecommand\pkgoptou{\docarg{Outer}}
+\providecommand\pkgoptwr{\docarg{Write}}
+\providecommand\pkgoptse{\docarg{Separ}}
+\providecommand\pkgobj[1]{object identified by #1}
+\providecommand\pkgoptions{kvl0}
+\providecommand\pkgsep[1]{\Arg{#1}}
+\providecommand\pkgwrite{\cs{Ccool}\docarg{\meta{\pkgparna}}\docopte{i}{\meta{\pkgparin}}\Arg{\pkgparde}}
+\ExplSyntaxOff
+\begin{document}
+\DocInput{\jobname.dtx}
+\end{document}
+%</driver>
+% \fi
+%
+% \GetFileInfo{\jobname.sty}
+%^^A\begin{documentation}
+% \title{The \pkg{ccool} package\thanks{^^A
+% This file describes version \fileversion, last revised \filedate.^^A
+% }^^A
+% }
+% \author{Erwann Rogard\thanks{firstname dot lastname AusTria gmail dot com}}
+%
+% \date{Released \filedate}
+%
+% \maketitle
+%
+% \begin{abstract} \pkg{ccool} stands for Custom COntent Oriented for \LaTeX,
+% a concept pioneered by \pkg{cool}\cite{cool}\footnote{Whereas \pkg{cool} provided predefined macros, \pkg{ccool} is tool for making macros, hence ``custom''.}.
+% This is done using a minimalist interface built upon \pkg{xparse}\cite{xparse}.\nobreak
+% ~Specifically, \nameref{usage:cs:ccool}\docoptd{\meta{name}} begins a series of instructions
+% alternating between `text' and macro definitions, that themselves optionally expand using predefined or inline rules.
+% For example,\begin{Verbatim}[breaklines=true]
+% \Ccool<Math>[Let~]
+% i{\mathbb{#1}}{ Nat = N, Real = R }*s{{~\rm{and}~}}
+% [~denote the natural and real numbers.]{}
+% \end{Verbatim}
+% expands to: ``\Ccool<Math>[Let~]i{\mathbb{#1}}{Nat = N, Real = R}*s{{~\rm{and}~}}[~denote the natural and real numbers.]{}''
+% As a side effect, |$\Nat<Math>$|~encodes~``$\Nat<Math>$'' (and likewise for |\Real|).
+% \pkgoptnad~being the default for \meta{name}, |<Math>| can be dropped. In conjunction with
+% lamba expressions, this tool allows for encoding the way certain mathematical objects, such as functions, should be formatted.
+% Optionally, the macros can be written to a file, and read, which
+% can be useful for typesetting documents sharing the same notation.
+% \end{abstract}
+%
+% \tableofcontents
+%
+% \part{Usage}\label{part:usage}
+% \VerbatimFootnotes
+%
+% \setcounter{section}{0}
+% \label{usage:conv}
+% \addcontentsline{toc}{section}{\protect\numberline{\thesection}Convention}
+% \section*{Convention}
+% \begin{enumerate}
+% \item Loosely, those of \cite{interface3} and \cite{xparse}, for example as to the meaning of \meta{\docccepttl}.
+% \item If unspecified, the environment in which a macro must be declared is \docenvdoc.
+% \end{enumerate}
+%
+% \refstepcounter{section}
+% \label{usage:load}
+% \addcontentsline{toc}{section}{\protect\numberline{\thesection}Loading the package}
+%
+% \begin{function}{\usepackage}
+% \begin{syntax}
+% \cs{usepackage}\doceval{\pkg{ccool}}
+% \end{syntax}
+% \begin{description}
+% \item[Requirement]\docfillblank
+% \begin{enumerate}
+% \item \file{ccool.sty} is in the path of the \LaTeX~engine. See \autoref{part:other}, \autoref{other:support}.
+% \item Declare it in the~\docccept{\doccceptpre}
+% \end{enumerate}
+% \end{description}
+% \end{function}
+%
+% \leavevmode
+% \refstepcounter{section}
+% \docsetnameref{\cs{Ccool}}
+% \label{usage:cs:ccool}
+% \addcontentsline{toc}{section}{\protect\numberline{\thesection}\cs{Ccool}}
+% \setcounter{subsection}{0}
+% \begin{function}{\Ccool}
+% \begin{syntax}
+% \cs{Ccool}\docoptd{\meta{\pkgparna}}
+% \docopto{\meta{\pkgparhe}}
+% \docopte{i}{\meta{\pkgparin}}
+% \Arg{\pkgparde}
+% |+|
+% |*|
+% \docopte{s}{\pkgpars}
+% \docopte{o}{\meta{\pkgparou}}
+% \docopto{\meta{\pkgparta}}
+% \end{syntax}
+% \begin{description}
+% \item[Requirement] \meta{\pkgparde} is specified (all others optional).
+% \end{description}
+% \end{function}
+%
+% \leavevmode
+% \refstepcounter{subsection}
+% \docsetnameref{\meta{\pkgparna}}
+% \label{usage:par:na}
+% \addcontentsline{toc}{subsection}{\protect\numberline{\thesubsection}\docoptd{\meta{\pkgparna}}}
+% \DescribeOption{\meta{\pkgparna}}
+% \begin{description}
+% \item[Default] \nameref{usage:opt:na}
+% \item[Example] \pkgoptnad, |ModelA|, |ModelB|
+% \item[Semantics] Identifies a group of macros
+% \end{description}
+%
+% \leavevmode
+% \refstepcounter{subsection}
+% \docsetnameref{\meta{\pkgparhe}}
+% \label{usage:par:he}
+% \addcontentsline{toc}{subsection}{\protect\numberline{\thesubsection}\docopto{\meta{\pkgparhe}}}
+% \DescribeOption{\meta{\pkgparhe}}
+% \begin{description}
+% \item[Example]|Let~|
+% \item[Semantics] Expands~\meta{\pkgparhe}
+% \end{description}
+%
+% \leavevmode
+% \refstepcounter{subsection}
+% \docsetnameref{\meta{\pkgparin}}
+% \label{usage:par:in}
+% \phantomsection\addcontentsline{toc}{subsection}{\protect\numberline{\thesubsection}\docopte{i}{\meta{\pkgparin}}}
+% \DescribeOption{\meta{\pkgparin}}
+%
+% \begin{description}
+% \item[Default] \nameref{usage:opt:in}
+% \item[Example] |\mathbb{#1}|
+% \item[Semantics] \docfillblank
+% \begin{enumerate}[label=\emph{\arabic*)}]
+% \item \docassign{\meta{\pkgval} }
+% { \meta{\pkgparin} applied to \meta{\pkgval} }\label{step:val}
+% \end{enumerate}
+% \end{description}
+%
+% \leavevmode
+% \refstepcounter{subsection}
+% \docsetnameref{\meta{\pkgparde}}
+% \label{usage:par:de}
+% \phantomsection\addcontentsline{toc}{subsection}{\protect\numberline{\thesubsection}\Arg{\pkgparde}}
+% \DescribeOption{\meta{\pkgparde}}
+% \begin{description}
+% \item[Example] |Elems={\omega_1, \dots, \omega_n}, Sample=\Omega|
+% \item[Semantics]\docfillblank
+% \begin{enumerate}[label=\emph{\arabic*)}]
+% \setcounter{enumi}{1}
+% \item \docassign{ \cs{\meta{\pkgkey}}\docoptd{\meta{\pkgparna}}}{\meta{val_i}} defined in \docstep{val},
+% using \nameref{usage:opt:ex} for expansion. \label{step:key}
+% \item If \nameref{usage:opt:wr}, writes the input used by \docstep{key} to \nameref{usage:opt:fi}\label{step:write}
+% \end{enumerate}
+% \end{description}
+%
+% \leavevmode
+% \refstepcounter{subsection}
+% \docsetnameref{parameter \docarg{+}}
+% \label{usage:par:appto}
+% \phantomsection\addcontentsline{toc}{subsection}{\protect\numberline{\thesubsection}\docarg{+}}
+% \DescribeOption{+}
+% \begin{description}
+% \item[Semantics] Appends \docstep{key} and \docstep{write} to \nameref{usage:cs:hook}
+% \footnote{Needed inside a \docccept{\doccceptgroup}, for the side effect of \cs{Ccool} to persist thereafter.}
+% \end{description}
+%
+% \leavevmode
+% \refstepcounter{subsection}
+% \docsetnameref{parameter \docarg{*}}
+% \label{usage:par:expand}
+% \phantomsection\addcontentsline{toc}{subsection}{\protect\numberline{\thesubsection}\docarg{*}}
+% \DescribeOption{*}
+%
+% \begin{description}
+% \item[Semantics]\docfillblank
+% \begin{enumerate}
+% \setcounter{enumi}{3}
+% \item Expands~\nameref{usage:par:ou} applied to the list created in \docstep{val},
+% using the separator specified by \nameref{usage:par:si}, \nameref{usage:par:sii}, \nameref{usage:par:siii}.
+% \end{enumerate}
+% \end{description}
+%
+% \leavevmode
+% \refstepcounter{subsection}
+% \docsetnameref{separators' parameter}
+% \label{usage:par:s}
+% \phantomsection\addcontentsline{toc}{subsection}{\protect\numberline{\thesubsection}\docopte{s}{\pkgpars}}
+%
+% \leavevmode
+% \refstepcounter{subsubsection}
+% \docsetnameref{\meta{\pkgparsi}}
+% \label{usage:par:si}
+% \DescribeOption{\meta{\pkgparsi}}
+% \begin{description}
+% \item[Default] \nameref{usage:opt:se}
+% \item[Example] |{~\in~}|
+% \end{description}
+%
+% \leavevmode
+% \refstepcounter{subsubsection}
+% \docsetnameref{\meta{\pkgparsii}}
+% \label{usage:par:sii}
+% \DescribeOption{\meta{\pkgparsii}}
+% \begin{description}
+% \item[Default] \nameref{usage:opt:se}
+% \item[Example] |{,~}|
+% \end{description}
+%
+% \leavevmode
+% \refstepcounter{subsubsection}
+% \docsetnameref{\meta{\pkgparsiii}}
+% \label{usage:par:siii}
+% \DescribeOption{\meta{\pkgparsiii}}
+% \begin{description}
+% \item[Default] \nameref{usage:opt:se}
+% \item[Example] |{~\&~}|
+% \end{description}
+%
+% \leavevmode
+% \refstepcounter{subsection}
+% \docsetnameref{\meta{\pkgparou}}
+% \label{usage:par:ou}
+% \phantomsection\addcontentsline{toc}{subsection}{\protect\numberline{\thesubsection}\docopte{o}{\meta{\pkgparou}}}
+% \DescribeOption{\meta{\pkgparou}}
+% \begin{description}
+% \item[Default] \nameref{usage:opt:ou}
+% \item[Example] |$\left\{#1\right\}$|
+% \end{description}
+%
+% \leavevmode
+% \refstepcounter{subsection}
+% \docsetnameref{\meta{\pkgparta}}
+% \label{usage:par:ta}
+% \phantomsection\addcontentsline{toc}{subsection}{\protect\numberline{\thesubsection}\docopto{\meta{\pkgparta}}}
+% \DescribeOption{\meta{\pkgparta}}
+% \begin{description}
+% \item[Semantics]
+% \nameref{usage:cs:ccool}\docoptd{\meta{\pkgparna}}\docopto{\meta{\pkgparta}}
+% \end{description}
+%
+% \leavevmode
+% \refstepcounter{section}
+% \docsetnameref{Other}
+% \label{usage:other}
+% \addcontentsline{toc}{section}{\protect\numberline{\thesection}Other}
+% \section*{Other}
+% Continued in \autoref{part:impl}, \autoref{impl:frontend}.
+%
+% \leavevmode
+% \refstepcounter{section}
+% \docsetnameref{Do's and dont's}
+% \label{usage:dosdont}
+% \addcontentsline{toc}{section}{\protect\numberline{\thesection}Do's and dont's}
+% \section*{Do's and dont's}
+%
+% \begin{enumerate}
+% \item \docfillblank
+% \begin{itemize}
+% \item[\docissuedont] |\Ccool{ A = a, B = b }[Hello, world!]|.
+% \item[\docissuedo] |\Ccool{ A = a, B = b }[Hello, world!]{}|, or \\|\Ccool{ A = a, B = b } Hello, world!|
+% \end{itemize}
+% \item \docfillblank
+% \begin{itemize}
+% \item[\docissuedont] |$|\cs{\meta{\pkgkey}}|<x$|.
+% \item[\docissuedo] |$|\cs{\meta{\pkgkey}}|{<}x$|
+% \end{itemize}
+% \item\docfillblank
+% \begin{itemize}
+% \item[\docissuedont] |[a, b)|
+% \item[\docissuedo] |{[}a, b{)}|
+% \end{itemize}
+% \item \docfillblank
+% \begin{itemize}
+% \item[\docissuedont] |\Ccool{ F = \cal F }|.
+% \item[\docissuedo] | \Ccool{ F = \cal{F} } | or | \Ccool{ F = \mathcal{F} } |
+% \end{itemize}
+% \item \docfillblank
+% \begin{itemize}
+% \item[\docissuedont] |[x_0,x]|
+% \item[\docissuedo] |\left[x_0,x\right]|
+% \end{itemize}
+% \item Also see \autoref{part:other}, \autoref{other:issue}
+% \end{enumerate}
+%
+% \clearpage
+% \part{Listing}\label{part:listing}
+%
+% \newtcblisting[auto counter]
+% {listing}[2][]{
+% noparskip,
+% breakable,
+% colback=white,
+% colframe=black,
+% opacitybacktitle=.8,%
+% fonttitle=\bfseries,
+% title={Listing~\thetcbcounter. #1},
+% arc=0pt,
+% outer arc=0pt,
+% boxrule=1pt,
+% listing and text,
+% #2
+% }
+%
+% \phantomsection\addcontentsline{toc}{section}{\doclist{vers}. Version.}
+% \begin{listing}[]
+% {label=listing:vers}
+% \CcoolVers
+% \end{listing}
+%
+% \phantomsection\addcontentsline{toc}{section}{\doclist{pre}. Preamble.}
+% \begin{listing}[Preamble\footnote{These are the settings to replicate the listings.
+% For exhaustivity, check the \env{documentation} section of \pkg{ccool}\texttt{.dtx}.}]
+% {label=listing:pre, listing only}
+% \usepackage{amsmath, amsthm, commath}
+% \usepackage[T1]{fontenc}% \char`[
+% \end{listing}
+%
+% \phantomsection\addcontentsline{toc}{section}{\doclist{test:i}. Separators.}
+% \begin{listing}[Separators]
+% {label=listing:test:i}
+% \CcoolOption{
+% ^^A% spaces betw. inner and outer brackets matter!->
+% Separ={{\ \char`@\ }{\ \%\ }{\ \char`@\ }}}
+% \Ccool<Test>{ X = x, Y = y }*[\\]
+% { X = x, Y = y, Z = z }*[\\]
+% { X = x, Y = y }*s{{\ \&\ }}[\\]
+% { X = x, Y = y }*s{{\ \&\ }{,\ }}[\\]
+% { X = x, Y = y, Z = z }*s{{\ \&\ }}[\\]
+% { X = x, Y = y, Z = z }*s{{\ \&\ }{,\ }}[\\]
+% { X = x, Y = y, Z = z }*s{{\ \&\ }{,\ }{\ \&\ }}\\
+% \end{listing}
+%
+% \phantomsection\addcontentsline{toc}{section}{\doclist{test:ii}. Hello, world!}
+% \begin{listing}[Hello, world!\footnote{If this looks arcane, it's for the purpose of testing.}]
+% {label=listing:test:ii}
+% \CcoolOption{ Separ = {{}{.}{.}}, Outer = { ####1 } }
+% \CcoolOption{ Write = \BooleanTrue }
+% \Ccool<Test>
+% { KeyA = {.}, KeyB = {!}, KeyC = {\%} }[]
+% { KeyD = {d}, KeyE = {\%} }[]i{\{#1\}}
+% { KeyF = {H}, KeyG = {e}, KeyH = {l} }*[]
+% { KeyI = {\%}, KeyJ = {\%}, KeyK = {\%} }[.\{l\}.\{o\}]
+% { KeyL = {l}, KeyM = {\char`[}, KeyN = {\char`]} }[]
+% { KeyO = {o}, KeyP = {\%}, KeyQ = {\%} }[{,\ }]
+% { KeyR = {w}, KeyS = {o}, KeyT = {r} }*s{{}{}{}}o{{\char`[}#1}[]
+% { KeyU = {\%}, KeyV = {\%}, KeyW = {\%} }[]
+% { KeyX = {\%}, KeyY = {\%}, KeyZ = {\KeyB<Test>} }\nobreak
+% \KeyL<Test>\KeyD<Test>\KeyZ<Test>\KeyN<Test>\\
+% \CcoolOption{ Write = \BooleanFalse }
+% \end{listing}
+%
+% \phantomsection\addcontentsline{toc}{section}{\doclist{test:iii}. \doclist{test:ii} read from file.}
+% \begin{listing}[\doclist{test:ii} read from file.]
+% {label=listing:test:iii}
+% \CcoolRead
+% \KeyF<Test>\KeyA<Test>\nobreak
+% \KeyG<Test>\KeyA<Test>\nobreak
+% \KeyH<Test>\KeyA<Test>\nobreak
+% \KeyH<Test>\KeyA<Test>\nobreak
+% {\{}\nobreak\KeyO<Test>{\}},{\ }\nobreak
+% \KeyM<Test>\KeyR<Test>\nobreak
+% \KeyO<Test>\nobreak
+% \KeyT<Test>\nobreak
+% \KeyL<Test>\nobreak
+% \KeyD<Test>\nobreak
+% \KeyZ<Test>\nobreak
+% \KeyN<Test>\nobreak
+% \end{listing}
+%
+% \phantomsection\addcontentsline{toc}{section}{\doclist{proba:i}. Probability space.}
+% \begin{listing}[Probability space]
+% {label=listing:proba:i}
+% \CcoolOption{ Write = \BooleanTrue }
+% \Ccool[Let~]
+% { Space = \Omega, Field = \mathcal{F}, Meas = \mathcal{P} }
+% *s{{,}}o{$\{#1\}$}
+% [~denote the probability space, where~]{ PowerSet = { 2^{\Space} } }
+% [$\Field\subset \PowerSet$.]
+% {}
+% \CcoolOption{ Write = \BooleanFalse }
+% \end{listing}
+%
+% \phantomsection\addcontentsline{toc}{section}{\doclist{proba:ii}. \doclist{proba:i} read from file.}
+% \begin{listing}[\doclist{proba:i} read from file.]
+% {label=listing:proba:ii}
+% \CcoolRead \tab $\Omega$ $\Field$ $\Meas$
+% \end{listing}
+%
+% \phantomsection\addcontentsline{toc}{section}{\doclist{mvt:i}. Mittelwertsatz f\"ur $n$ Variable.}
+% \begin{listing}[{Mittelwertsatz f\"ur $n$ Variable\cite[17.3]{tcolbox}}]
+% {label=listing:mvt:i}
+% \CcoolOption{ Write = \BooleanTrue }
+% \newtheorem{theorem}{Theorem}
+% \AfterEndEnvironment{theorem}{\CcoolHook}
+% \Ccool i{\mathbb{#1}}
+% { N = { N } , R = { R } }+[]
+% { Grad = { \operatorname{grad} } }+
+% [\begin{theorem}
+% [Mittelwertsatz f\"ur $n$ Variable]Es~sei~]
+% { OffMenge = {D}, Ci = {C^{1}}, Strecke = { \left[x_0,x\right] } }+
+% [$n\in\N$,~$\OffMenge\subseteq\N^n$ eine offene Menge und $f\in\Ci(\OffMenge,\R)$.
+% Dann gibt es auf jeder Strecke $\Strecke\subset\OffMenge$ einen Punkt $\xi\in\Strecke$,~]
+% { Steig = { \frac{ f(x)-f(x_0) }{ x-x_0 } }, Punkt = { \xi } }+
+% [so dass gilt
+% \begin{equation*}
+% \Steig = \Grad f(\Punkt)^{\top}
+% \end{equation*}
+% \end{theorem}]
+% {}
+% (Check: $\N$, $\Punkt$)
+% \CcoolOption{ Write = \BooleanFalse }
+% \end{listing}
+%
+% \phantomsection\addcontentsline{toc}{section}{\doclist{mvt:ii}. \doclist{mvt:i} read from file.}
+% \begin{listing}[\doclist{mvt:i} read from file.]
+% {label=listing:mvt:ii}
+% \CcoolRead \tab $\N$ $\R$ $\OffMenge$ $\Ci$ $\Strecke$
+% \end{listing}
+%
+% \phantomsection\addcontentsline{toc}{section}{\doclist{lambda:i}. Lambda expression.}
+% \begin{listing}[Lambda expression.]
+% {label=listing:lambda:i}
+% \CcoolOption{ Write = \BooleanTrue }
+% \Ccool{ EvalAt = \CcoolLambda{(#1)}, ApplyOp = \CcoolLambda[2]{#1[#2]} }
+% [Supposons une fonction $f\EvalAt{t}$, et \'etudions le probl\`eme o\`u la fonctionnelle $\ApplyOp{S}{f}$ est donn\'ee par\dots]{}
+% \CcoolOption{ Write = \BooleanFalse }
+% \end{listing}
+%
+% \phantomsection\addcontentsline{toc}{section}{\doclist{lambda:ii}. \doclist{lambda:i} read from file.}
+% \begin{listing}[\doclist{lambda:i} read from file.]
+% {label=listing:lambda:ii}
+% \CcoolRead \tab $f\EvalAt{t}$, $\ApplyOp{S}{f}$
+% \end{listing}
+%
+% \phantomsection\addcontentsline{toc}{section}{\doclist{cusum:i}. CUSUM statistic.}
+% \begin{listing}[CUSUM statistic\cite{ccool-thesis}]
+% {label=listing:cusum:i}
+% \newtheorem{definition}{Definition}
+% \AfterEndEnvironment{definition}{\CcoolHook}
+%
+% \CcoolOption{ Write = \BooleanTrue }
+% \Ccool{ SuchThat = { ;~ }, Time = { t }, Process = { \xi }, StopT = { T }, EvalAt = \CcoolLambda{(#1)} }
+% [The CUSUM statistic process and the corresponding one-sided CUSUM stopping time are defined as follows:
+% \begin{definition}\label{the CUSUM statistic}. Let~]
+% { Scale = { \lambda }, Real = {\mathcal{R}} }+*s{{~\in~}}[~and~]
+% { CUSUMthresh = { \nu } }+*o{$#1\in\Real^{+}$.}
+% [~Define the following processes:]
+% { LogWald = { u }, CUSUMst = { \StopT_{c} }, CUSUM = { y }, LogWaldInf = { m } }+
+% [\begin{enumerate}
+% \item{$\LogWald_{\Time}\EvalAt{ \Scale } = \Scale\Process_{\Time} - \frac{1}{2}\Scale^2\Time$;
+% $\LogWaldInf_{\Time}\EvalAt{ \Scale } = \inf_{ 0\le s \le \Time }\CUSUM_{s} \EvalAt{ \Scale }$.}
+% \item{$\CUSUM_{\Time}\EvalAt{ \Scale } = \LogWaldInf_{\Time}\EvalAt{ \Scale } - \LogWald_{\Time}\EvalAt{ \Scale }\ge0$, which is the CUSUM statistic process.}
+% \item{$\CUSUMst \EvalAt{ \Scale, \LogWaldInf } = \inf\left[ \Time \ge 0 \SuchThat \CUSUM_{\Time}\EvalAt{\Scale} \ge \LogWaldInf \right]$, which is the CUSUM stopping time.} \end{enumerate}\end{definition}\par]{}
+%
+% (Check: $\Scale$, $\CUSUM$)
+% \CcoolOption{ Write = \BooleanFalse }
+% \end{listing}
+%
+% \phantomsection\addcontentsline{toc}{section}{\doclist{cusum:ii}. \doclist{cusum:i} read from file.}
+% \begin{listing}[\doclist{cusum:i} read from file.]
+% {label=listing:cusum:ii}
+% \CcoolRead \tab $\Time $ $\Process$ $\Scale$ $\Real$ $\CUSUMthresh$ $\LogWald$ $\CUSUMst$ $\CUSUM$ $\LogWaldInf$
+% \end{listing}
+%
+% \clearpage
+% \part{Other}\label{part:other}
+%
+% \section{Acknowledgment}\label{other:acknowl}
+%
+% This work has benefited from Q\&A's from the \LaTeX community\cite{user-erw}.
+% Specific attributions are made throughout this document.
+%
+% \section{Install}\label{other:install}
+%
+% Compiling \file{ccool.dtx}\footnote{Under Unix, |$tex ccool.dtx|} will generate \file{ccool.sty} and \file{ccool.pdf}
+%
+% \section{Issue}\label{other:issue}
+%
+% \begin{enumerate}
+% \item
+% \begin{description}
+% \item[\docissuedont] |Inner={\{####1\}}|
+% \item[\docissuesymp] \cs{CcoolRead} fails
+% \item[\docissuedo] |Inner={\char`{####1\char`}}|
+% \end{description}
+% \end{enumerate}
+%
+% \section{Support}\label{other:support}
+%
+% This package is available from \url{https://www.ctan.org/pkg/ccool} and \url{https://github.com/rogard/ccool}.
+%
+% \section{Testing}\label{other:testing}
+%
+% \subsection{Technicality}
+% Not possible to compile-check the expansion of a certain class of macros against predefined values\cite{a-534100}.
+% Instead, one can visually check \autoref{part:listing}, as generated in \autoref{other:install} on one's own machine,
+% against that \href{https://github.com/rogard/ccool}{of the repository} for the same version.
+%
+%
+% \subsection{Platform}
+% \begin{enumerate}[label=\emph{\roman*)}]
+% \item
+% ^^A uname -a
+% \begin{Verbatim}[breaklines=true]
+% Linux laptop 4.15.0-20-generic #21-Ubuntu SMP Tue Apr 24 06:16:15 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
+% \end{Verbatim}
+% \label{plat:lin}
+% \end{enumerate}
+%
+% \subsection{Engine}
+% \begin{enumerate}[label=\emph{\alph*})]
+% \item
+% \begin{Verbatim}[breaklines=true]
+% pdfTeX 3.14159265-2.6-1.40.20 (TeX Live 2019)
+% \end{Verbatim}
+% \label{eng:tlxviiii:pdf}
+% \item
+% \begin{Verbatim}[breaklines=true]
+% pdfTeX 3.14159265-2.6-1.40.21 (TeX Live 2020)
+% \end{Verbatim}
+% \label{eng:tlxx:pdf}
+% \item
+% \begin{Verbatim}[breaklines=true]
+% LuaHBTeX, Version 1.12.0 (TeX Live 2020)
+% \end{Verbatim}
+% \label{eng:tlxx:lua}
+% \item
+% \begin{Verbatim}[breaklines=true]
+% XeTeX 3.14159265-2.6-0.999992 (TeX Live 2020)
+% \end{Verbatim}
+% \label{eng:tlxx:xe}
+% \end{enumerate}
+%
+% \subsection{Results}
+%
+% \begin{enumerate}
+% \item \pkg{ccool} \docvers{1}{8} satisfactory on platform \ref{plat:lin} and engine \ref{eng:tlxviiii:pdf}
+% \item \pkg{ccool} \docvers{1}{8} satisfactory on platform \ref{plat:lin} and engine \ref{eng:tlxx:pdf}
+% \item \pkg{ccool} \docvers{1}{9} satisfactory on platform \ref{plat:lin} and engines \ref{eng:tlxx:pdf} and \ref{eng:tlxx:lua}
+% \item \pkg{ccool} \docvers{2}{0} satisfactory on platform \ref{plat:lin} and engines \ref{eng:tlxx:pdf}, \ref{eng:tlxx:lua}, and \ref{eng:tlxx:xe}
+% \end{enumerate}
+%
+% \subsection{Other}
+% Check \cite{ccool-thesis} for testing \pkg{ccool} with \cls{llncs}
+%
+% \leavevmode
+% \refstepcounter{section}
+% \docsetnameref{References}
+% \label{other:bib}
+% \phantomsection\addcontentsline{toc}{section}{References}
+% \begin{thebibliography}{1}
+% \bibitem{cool} Nick Setzer {\em The \pkg{cool} package}, 2005, \url{https://www.ctan.org/pkg/cool}
+% \bibitem{interface3} The \LaTeX3 Project Team {\em The \LaTeX3 interfaces}, 2019,
+% \url{http://ftp.math.purdue.edu/mirrors/ctan.org/macros/latex/contrib/l3kernel/interface3.pdf}
+% \bibitem{tcolbox} Thomas F. Sturm {\em The \pkg{tcolorbox} package}, 2019,
+% \url{http://www.texdoc.net/texmf-dist/doc/latex/tcolorbox/tcolorbox.pdf}
+% \bibitem{xparse} The \LaTeX3 Project Team {\em The \pkg{xparse} package}, 2020,
+% \url{http://ftp.math.purdue.edu/mirrors/ctan.org/macros/latex/contrib/l3packages/xparse.pdf}
+% \bibitem{ccool-thesis} Erwann Rogard and Olympia Hadjiliadis {\em Typesetting a math thesis with \pkg{ccool}}, 2020,
+% \url{https://github.com/rogard/ccool/blob/master/thesis.pdf}
+% \bibitem{user-erw} \url{https://tex.stackexchange.com/users/112708/erwann?tab=questions}
+% \bibitem{a-188053} \href{https://tex.stackexchange.com/users/17423/sean-allred}{@{}sean-allred}'s answer to
+% ``How to create lambda expressions?'', \url{https://tex.stackexchange.com/a/188053/112708}
+% \bibitem{a-534100} \href{https://tex.stackexchange.com/users/73/joseph-wright}{@{}joseph-wright}'s answer to
+% ``Checking a function's expansion against a string'', \url{https://tex.stackexchange.com/a/534100}
+% \bibitem{a-536597} \href{https://tex.stackexchange.com/users/73317/frougon}{@{}frougon}'s answer to ``Journaling calls to a function \textdel{taking inline code as argument}'', \url{https://tex.stackexchange.com/a/536620}
+% \end{thebibliography}
+%
+% \changes{\docvers{1}{0}}{2020/03/08}{Initial version}
+% \changes{\docvers{1}{1}}{2020/04/04}{Revamped: much of the implementation}
+% \changes{\docvers{1}{1}}{2020/04/04}{Replaced: \Arg{kvl_{2}}~by~\docoptd{kvl_{2}}~given that option type \texttt{G} not recommended\cite{xparse}}
+% \changes{\docvers{1}{1}}{2020/04/04}{Replaced: \cs{OopsOptions}~by~\cs{OopsOption}}
+% \changes{\docvers{1}{1}}{2020/04/04}{Replaced: \docarg{GenericObject}~by~\docarg{Name}}
+% \changes{\docvers{1}{1}}{2020/04/04}{Replaced: \docarg{Separators}~by~\docarg{Separ}}
+% \changes{\docvers{1}{1}}{2020/04/04}{Added:\cs{OopsTest}}
+% \changes{\docvers{1}{1}}{2020/04/04}{Added:\cs{OopsRestore}}
+% \changes{\docvers{1}{1}}{2020/04/04}{Added: \docarg{Save}}
+% \changes{\docvers{1}{1}}{2020/04/04}{Deleted: Listing 1-5 from \docvers{1}{0}}
+% \changes{\docvers{1}{1}}{2020/04/04}{Added: Listing~1., 2., 3., 4., 6., and 9.}
+% \changes{\docvers{1}{1}}{2020/04/04}{Fixed: apparent anomaly in \docvers{1}{0}'s Listing~4, see \doclist{test:i}}
+% \changes{\docvers{1}{2}}{2020/04/06}{Added: optional |*| to \cs{OopsNew} as instruction to expand \pkgparde}
+% \changes{\docvers{1}{2}}{2020/04/06}{Replaced: \cs{OopsClear}\Arg{\pkgparna} by \cs{OopsClear}\docopto{\meta{\doccceptkvl}}}
+% \changes{\docvers{1}{2}}{2020/04/06}{Deleted: \meta{kvl_{2}}~and~\meta{code_{2}}}
+% \changes{\docvers{1}{2}}{2020/04/06}{Deleted: \cs{OopsTest}}
+% \changes{\docvers{1}{2}}{2020/04/06}{Deleted: Listing~2-3 from \docvers{1}{1}.}
+% \changes{\docvers{1}{2}}{2020/04/06}{Replaced: \cs{Save} by \cs{Write}}
+% \changes{\docvers{1}{2}}{2020/04/06}{Replaced: \cs{Restore} by \cs{Read}}
+% \changes{\docvers{1}{3}}{2020/04/06}{Replaced: \cs{OopsNew} by \cs{Oops}}
+% \changes{\docvers{1}{3}}{2020/04/06}{Replaced: \Arg{\pkgparna} and \docopto{\meta{\pkgparna}} by \docoptd{\meta{\pkgparna}} }
+% \changes{\docvers{1}{4}}{2020/04/10}{Replaced: \docopte{s}{\Arg{\pkgparsi}\Arg{\pkgparsii}\Arg{\pkgparsiii}}
+% by \docopte{s}{\Arg{\pkgparsi}\docpipe\Arg{\pkgparsi}\Arg{\pkgparsii}\docpipe\Arg{\pkgparsi}\Arg{\pkgparsii}\Arg{\pkgparsiii}}}
+% \changes{\docvers{1}{4}}{2020/04/10}{Added:optional |+| to \cs{OopsNew} to make side effects presist beyond local group}
+% \changes{\docvers{1}{4}}{2020/04/10}{Added: \cs{OopsHook}}
+% \changes{\docvers{1}{4}}{2020/04/10}{Deleted: Listing~1., and 2. }
+% \changes{\docvers{1}{4}}{2020/04/10}{Added: Listing~1., 2., and 3. }
+% \changes{\docvers{1}{4}}{2020/04/10}{Added: \docarg{Expans} (for debugging' sake, but...) }
+% \changes{\docvers{1}{4}}{2020/04/10}{Added: \autoref{usage:dosdont} }
+% \changes{\docvers{1}{4}}{2020/04/10}{Added: \cs{OopsDebug} }
+% \changes{\docvers{1}{5}}{2020/04/10}{Deleted: dependence on \pkg{datetime} }
+% \changes{\docvers{1}{5}}{2020/04/10}{Added: \pkgoptfi }
+% \changes{\docvers{1}{6}}{2020/04/10}{Renamed: \pkg{oops} to \pkg{ccool} (better describes the purpose) }
+% \changes{\docvers{1}{6}}{2020/04/10}{Renamed: \cs{Oops} to \cs{Ccool}}
+% \changes{\docvers{1}{6}}{2020/04/10}{Renamed: \cs{OopsClear} to \cs{CcoolClear}}
+% \changes{\docvers{1}{6}}{2020/04/10}{Renamed: \cs{OopsDebug} to \cs{CcoolDebug}}
+% \changes{\docvers{1}{6}}{2020/04/10}{Renamed: \cs{OopsHook} to \cs{CcoolHook}}
+% \changes{\docvers{1}{6}}{2020/04/10}{Renamed: \cs{OopsOption} to \cs{CcoolOption}}
+% \changes{\docvers{1}{6}}{2020/04/10}{Renamed: \cs{OopsRead} to \cs{CcoolRead}}
+% \changes{\docvers{1}{6}}{2020/04/10}{Added: \doclist{pre} (preamble) }
+% \changes{\docvers{1}{7}}{2020/04/11}{Added: \doclist{cusum:i} (CUSUM) }
+% \changes{\docvers{1}{7}}{2020/04/11}{Added: Legends to listings }
+% \changes{\docvers{1}{7}}{2020/04/11}{Deleted: \cs{CcoolDebug} }
+% \changes{\docvers{1}{7}}{2020/04/11}{Deleted: Listing~5 from \docvers{1}{6} }
+% \changes{\docvers{1}{8}}{2020/04/12}{Added: \cs{CcoolLambda} }
+% \changes{\docvers{1}{8}}{2020/04/12}{Added: \doclist{lambda:i}, \doclist{lambda:ii} }
+% \changes{\docvers{1}{8}}{2020/04/12}{Added: \cs{CcoolVers} }
+% \changes{\docvers{1}{8}}{2020/04/12}{Added: \doclist{vers} }
+% \changes{\docvers{1}{9}}{2020/04/14}{Added: support for \LuaTeX }
+% \changes{\docvers{1}{9}}{2020/04/14}{Moved: from \autoref{part:usage} to \autoref{part:impl}, what is now that part's \autoref{impl:frontend}}
+% \changes{\docvers{2}{0}}{2020/04/15}{Deleted: \pkgoptfi's dependency on \pkg{texosquery} and \cs{pdfcreationdate}}
+% \changes{\docvers{2}{0}}{2020/04/15}{Added: support for \XeTeX}
+% \changes{\docvers{2}{0}}{2020/04/15}{Updated: \cs{RequirePackage}, \cs{NeedsTeXFormat}'s second argument / TeX Live 2020}
+%
+% \PrintChanges
+% \PrintIndex
+% \clearpage
+% \StopEventually{
+% ^^A \PrintChanges
+% ^^A \PrintIndex
+% }
+%^^A \end{documentation}
+%^^A% Commented out to eliminate WARNING: Reference `doc/function//
+%^^A \begin{implementation}
+% \part{Implementation}\label{part:impl}
+%
+% \iffalse
+%<*package>
+% \fi
+% \begin{macrocode}
+%<@@=ccool>
+\ExplSyntaxOn
+% \end{macrocode}
+% \section{\texttt{aux}}
+% \begin{macro}{\@@_aux_inner_set:n}
+% \begin{arguments}
+% \item \meta{code}
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_aux_inner_set:n
+{
+ \cs_gset:Npn \@@_aux_inner:n ##1 {#1}
+ \cs_generate_variant:Nn \@@_aux_inner:n { e }
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_aux_key:w }
+% \begin{arguments}
+% \item \meta{ key }
+% \item \meta{ value }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_aux_key:w #1 = #2 \q_stop
+{
+ \seq_gput_right:Nx \g@@_aux_key_seq { \tl_trim_spaces:n{#1} }
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_aux_key:n }
+% \begin{arguments}
+% \item \meta{ key = value }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_aux_key:n
+{
+ \@@_aux_key:w #1 \q_stop
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_aux_key:N }
+% \begin{arguments}
+% \item \meta{ seq }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_aux_key:N
+{
+ \seq_gclear_new:N \g@@_aux_key_seq
+ \seq_map_function:NN #1 \@@_aux_key:n
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_aux_outer_set:n}
+% \begin{arguments}
+% \item \meta{ inline code }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_aux_outer_set:n
+{
+ \cs_gset:Npn \@@_aux_outer:n ##1 {#1}
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_aux_prop:nn}
+% \begin{macrocode}
+\prop_new:N \g@@_aux_prop
+\cs_new_protected:Nn \@@_aux_prop:nn
+{
+ \prop_gput:Nnn \g@@_aux_prop{#1}{#2}
+}
+\cs_generate_variant:Nn \@@_aux_prop:nn { eo, ee, ex, xo, xe, xx }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_aux_prop:w}
+% \begin{arguments}
+% \item \meta{ key }
+% \item \meta{ value }
+% \end{arguments}
+% \begin{macrocode}
+\tl_new:N \g@@_option_expans_tl
+\cs_new_protected:Npn \@@_aux_prop:w #1 = #2 \q_stop
+{
+ \exp_args:Nx
+ \use:c{@@_aux_prop:\g@@_option_expans_tl}
+ { \tl_trim_spaces:n{#1} }
+ { \@@_aux_inner:n{ \tl_trim_spaces:n{#2} } }
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_aux_prop:n}
+% \begin{arguments}
+% \item \meta{ key = value }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_aux_prop:n
+{
+ \@@_aux_prop:w #1 \q_stop
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_aux_prop:N}
+% \begin{arguments}
+% \item \meta{keyval list}
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_aux_prop:N
+{
+ \prop_gclear_new:N \g@@_aux_prop
+ \seq_if_empty:NTF #1
+ { \c_empty_tl }
+ {
+ \seq_map_function:NN #1 \@@_aux_prop:n
+ }
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_aux_separ:nn}
+% \begin{arguments}
+% \item \meta{ int }
+% \item \meta{ tokens }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new:Nn \@@_aux_separ:nn
+{
+ \int_case:nnTF {#1}
+ {
+ {1}
+ { \prg_replicate:nn{ 3 }{#2} }
+ {2}
+ {
+ { \use_i:nn #2 }
+ { \use_ii:nn #2 }
+ { \use_i:nn #2 }
+ }
+ {3}{#2}
+ }
+ { \c_empty_tl }
+ {
+ \msg_error:nnnn { @@ }
+ { separ }
+ { \exp_not:N \_@@_aux_separ:nn }
+ {#2}
+ }
+}
+\cs_generate_variant:Nn \@@_aux_separ:nn { e }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_aux_separ:n}
+% \begin{arguments}
+% \item \meta{ tokens }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new:Nn \@@_aux_separ:n
+{
+ \@@_aux_separ:en{ \tl_count:n{#1} }{#1}
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_aux_val:Nn}
+% \begin{arguments}
+% \item \meta{ seq }
+% \item \meta{ tl var name }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_aux_val:Nn
+{
+ \seq_gclear_new:N \g@@_aux_val_seq
+ \@@_seq_from_prop:NNn \g@@_aux_val_seq #1 { \@@_prop_name:n{#2} }
+}
+% \end{macrocode}
+% \end{macro}
+% \section{\texttt{lambda}}
+% \begin{macro}{\@@_lambda:nn}\cite{a-188053}
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_lambda:nn #1 #2
+{
+ \exp_args:NNx
+ \DeclareDocumentCommand \@@_lambda_expression
+ { \prg_replicate:nn { #1 } { m } }
+ {#2}
+ \@@_lambda_expression
+}
+% \end{macrocode}
+% \end{macro}
+% \section{\texttt{log}}
+% \begin{macro}{\@@_log_close:}
+% \begin{macrocode}
+\iow_new:N \g@@_log_iow
+\AtEndDocument{\iow_close:N \g@@_log_iow}
+\bool_set_false:N \g@@_log_open_bool
+\cs_new_protected:Nn \@@_log_close:
+{
+ \iow_close:N \g@@_log_iow
+ \bool_gset_false:N \g@@_log_open_bool
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_log_open:}
+% \begin{macrocode}
+\tl_new:N \g@@_log_file_tl
+\cs_new_protected:Nn \@@_log_open:
+{
+ \tl_gset:Nx \g@@_log_to_tl{\g@@_log_file_tl}
+ \iow_open:Nn \g@@_log_iow {\g@@_log_to_tl}
+ \bool_gset_true:N \g@@_log_open_bool
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_log_read:n}
+% \begin{arguments}
+% \item \meta{path}
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_log_read:n
+{
+ \file_input:n{#1}
+ \tl_log:n{read~from~#1}
+}
+\cs_generate_variant:Nn \@@_log_read:n { e }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_log_read:}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_log_read:
+{
+ \@@_log_read:e{\g@@_log_to_tl}
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_log_write:n}
+% \begin{macrocode}
+\tl_new:N \g@@_log_to_tl
+\cs_new_protected:Nn \@@_log_write:n
+{
+ \bool_if:nTF{ \g@@_log_open_bool }
+ {
+ \iow_now:Nn \g@@_log_iow {#1}
+ \tl_log:n{ write~to~#1 }
+ }
+ { \msg_error:nnn{ @@ }{ iow }{ \g@@_log_iow } }
+}
+\cs_generate_variant:Nn \@@_log_write:n { e }
+% \end{macrocode}
+% \end{macro}
+% \section{\texttt{make_key}}
+% \begin{macro}{\@@_make_key:Nn}
+% \begin{arguments}
+% \item \meta{ token }
+% \item \meta{ key }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_make_key:Nn
+{
+ \exp_args:NNx
+ \ProvideDocumentCommand{#1}
+ { D<>{\g@@_option_name_tl} }
+ {
+ \@@_prop_item:nn{##1}{#2}
+ }
+}
+\cs_generate_variant:Nn \@@_make_key:Nn {c}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_make_key:n}
+% \begin{arguments}
+% \item \meta{ key }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_make_key:n
+{
+ \@@_make_key:cn{#1}{#1}
+}
+\cs_generate_variant:Nn \@@_make_key:n { e }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_make_key:N}
+% \begin{arguments}
+% \item \meta{ seq }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_make_key:N
+{
+ \seq_map_function:NN #1 \@@_make_key:e
+}
+% \end{macrocode}
+% \end{macro}
+% \section{\texttt{make_ccool}}
+% \begin{macro}{\@@_make_ccool_exp:nnn}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_make_ccool_exp:nnn
+{
+ \@@_aux_val:Nn \g@@_aux_key_seq {#1}
+ \@@_aux_outer_set:n{#3}
+ \@@_aux_outer:n
+ {
+ \exp_args:NNf
+ \@@_seq_use:Nn
+ \g@@_aux_val_seq
+ {#2}
+ }
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_make_ccool_key:nnn}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_make_ccool_key:nnn
+{
+ \@@_prop_if_exist:nTF{#1}
+ { \c_empty_tl }
+ { \@@_prop_new:n{#1} }
+ \exp_args:No \@@_aux_inner_set:n{#2}
+ \seq_set_from_clist:Nn \g@@_aux_keyval_seq {#3}
+ \@@_aux_prop:N \g@@_aux_keyval_seq
+ \@@_prop_append:Nn \g@@_aux_prop {#1}
+ \@@_aux_key:N \g@@_aux_keyval_seq
+ \@@_make_key:N \g@@_aux_key_seq
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_make_ccool_sideeffect:nnn}\cite{a-536597}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_make_ccool_sideeffect:nnn
+{
+ \@@_make_ccool_key:nnn{#1}{#2}{#3}
+ \bool_if:nTF{ \g@@_log_open_bool }
+ {
+ \@@_log_write:n
+ {
+ \begingroup
+ \def \@@_log_entry { \Ccool<#1>i{#2}{#3} } \expandafter
+ \endgroup \@@_log_entry
+ }
+ }{\c_empty_tl}
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_make_ccool:nnnn}
+% \begin{arguments}
+% \item \meta{ token list }
+% \item \meta{ seq_{1} }
+% \item \meta{ seq_{2} }
+% \item \meta{ prop }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_make_ccool:nnnn #1 #2 #3 #4
+{
+ \exp_args:NNx \DeclareDocumentCommand \Ccool
+ {%^^A 2 3 4 5 6 7 8 9
+ D<>{#1} +o E{ i }{{#2}} m t+ s E{ s o }{{#3}{#4}} +o
+ }
+ {
+ \IfValueT{##2}{##2}
+ \@@_make_ccool_sideeffect:nnn{##1}{##3}{##4}
+ \IfBooleanT{##6}
+ {
+ \@@_make_ccool_exp:nnn{##1}{##7}{##8}
+ }
+ \bool_if:nTF{##5}
+ {
+ \gappto{\CcoolHook}
+ {
+ \@@_make_ccool_sideeffect:nnn{##1}{##3}{##4}
+ }
+ }
+ {\c_empty_tl}
+ \IfValueT{##9}
+ {
+ \exp_not:n{ \Ccool<##1>[##9] }
+ }
+ }
+}
+% \end{macrocode}
+% \end{macro}
+% \section{\texttt{msg}}
+% \begin{macrocode}
+\msg_new:nnn {@@}{ generic }{#1}
+\msg_new:nnn {@@}{ iow }{#1~is~closed~can't~write}
+\msg_new:nnn {@@}{ keyonly }{#1~does~not~take~values;~keyval~is~#2}
+\msg_new:nnn {@@}{ keywrong }{#1~does~not~recognize~key~#2}
+\msg_new:nnn {@@}{ separ }{#1~expects~1~to~3~items,~#2}
+\msg_new:nnn {@@}{ unset }{#1~unset}
+% \end{macrocode}
+% \section{\texttt{option}}
+% \begin{macro}{\@@_aux_inner:n}
+% \begin{arguments}
+% \item \meta{code}
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_option_inner:n
+{
+ \tl_gset:Nn \g@@_option_inner_tl {#1}
+}
+\@@_option_inner:n
+{
+ \msg_warning:nnn{ @@ }{ unset }{ \exp_not:N \g@@_option_inner_tl }
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_option_name:n}
+% \begin{arguments}
+% \item \meta{token list}
+% \end{arguments}
+% \begin{macrocode}
+\cs_new:Nn \@@_option_name:n
+{
+ \tl_gset:Nn \g@@_option_name_tl{#1}
+}
+\@@_option_name:n
+{
+ \msg_error:nnx{ @@ }
+ { generic }
+ { \exp_not:N\g@@_option_name_tl~undefined }
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_option_outer:n}
+% \begin{arguments}
+% \item \meta{ inline code }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_option_outer:n
+{
+ \tl_gset:Nn \g@@_option_outer_tl {#1}
+}
+\@@_option_outer:n
+{
+ \msg_warning:nnn{ @@ }{ unset }{ \exp_not:N \g@@_option_outer_tl }
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_option_separ:n}
+% \begin{arguments}
+% \item \Arg{ tl_{1} }\Arg{ tl_{2} }\Arg{ tl_{3} }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_option_separ:n
+{
+ \cs_gset:Npn \g@@_option_separ_tl {#1}
+}
+\@@_option_separ:n
+{
+ \msg_warning:nnn{ @@ }{ unset }{ \exp_not:N \g@@_option_separ_tl }
+}
+% \end{macrocode}
+% \end{macro}
+% \section{\texttt{prop}}
+% \begin{macro}{\@@_prop_append:NN}
+% \begin{arguments}
+% \item \meta{ prop_{1} }
+% \item \meta{ prop_{2} }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Npn \@@_prop_append:NN #1 #2
+{
+ \cs_set:Nn \@@_prop_append:nn
+ {
+ \prop_gput:Nnx #1 {##1}{ \prop_item:Nn #2{##1} }
+ }
+ \prop_map_function:NN #2 \@@_prop_append:nn
+}
+\cs_generate_variant:Nn \@@_prop_append:NN { cN }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_prop_append:Nn}
+% \begin{arguments}
+% \item \meta{ prop }
+% \item \meta{ tl var name }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_prop_append:Nn
+{
+ \@@_prop_append:cN{ \@@_prop_name:n {#2} } #1
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_prop_clear_new:n}
+% \begin{arguments}
+% \item \meta{ tl var name }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_prop_clear_new:n
+{
+ \exp_args:No \prop_clear_new:c{ \@@_prop_name:n {#1} }
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_prop_clear_new_map:n}
+% \begin{arguments}
+% \item \meta{ keyval list }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_prop_clear_new_map:n
+{
+ \seq_set_from_clist:Nn \g@@_aux_key_seq {#1}
+ \seq_map_function:NN \g@@_aux_key_seq \@@_prop_clear_new:n
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_prop_if_exist:nTF}
+% \begin{arguments}
+% \item \meta{tl_{1}}
+% \item \meta{tl_{2}}
+% \item \meta{tl_{3}}
+% \end{arguments}
+% \begin{macrocode}
+\cs_new:Nn \@@_prop_if_exist:nTF
+{
+ \prop_if_exist:cTF{ \@@_prop_name:n {#1} }{#2}{#3}
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_prop_item:nn}
+% \begin{arguments}
+% \item \meta{ tl var name }
+% \item \meta{ key }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new:Nn \@@_prop_item:nn
+{
+ \prop_item:cn { \@@_prop_name:n {#1} } {#2}
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_prop_name:n}
+% \begin{arguments}
+% \item \meta{ tl var name }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new:Npn \@@_prop_name:n #1{ @@_#1 }
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_prop_new:n}
+% \begin{arguments}
+% \item \meta{ tl var name }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_prop_new:n
+{
+ \prop_new:c{ \@@_prop_name:n {#1} }
+}
+% \end{macrocode}
+% \end{macro}
+% \section{\texttt{seq}}
+% \begin{macro}{\@@_seq_from_prop:NNn}
+% \begin{arguments}
+% \item \meta{ seq_{1} }
+% \item \meta{ seq_{2} } (keys)
+% \item \meta{ prop }
+% \end{arguments}
+% \begin{macrocode}
+\cs_new_protected:Nn \@@_seq_from_prop:NNn
+{
+ \cs_set_protected:Nn \@@_seq_from_prop:n
+ {
+ \seq_gput_right:No #1 { \prop_item:cn{#3}{##1} }
+ }
+ \seq_map_function:NN #2 \@@_seq_from_prop:n
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_erw_seq_use:Nn}
+% \begin{macrocode}
+% \begin{arguments}
+% \item \meta{ seq }
+% \item \meta{ tokens }
+% \end{arguments}
+\cs_new:Nn \@@_seq_use:Nn
+{
+ \exp_last_unbraced:NNf
+ \seq_use:Nnnn #1
+ \@@_aux_separ:n{#2}
+}
+% \end{macrocode}
+% \end{macro}
+% \section{sys}\label{impl:sys}
+% \begin{macro}{\@@_sys_date:}
+% \begin{macrocode}
+\cs_new:Nn \@@_sys_date:
+{
+ \int_eval:n
+ {
+ \c_sys_year_int * 10000
+ +\c_sys_month_int * 100
+ +\c_sys_day_int * 1
+ }
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_sys_date_hex:}
+% \begin{macrocode}
+\cs_new:Nn \@@_sys_date_hex:
+{\int_to_hex:n{\@@_sys_date:}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_sys_time:}
+% \begin{macrocode}
+\cs_new:Nn \@@_sys_time:
+{
+ \int_eval:n
+ {
+ \c_sys_hour_int * 100
+ +\c_sys_minute_int * 1
+ }
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_sys_time_hex:}
+% \begin{macrocode}
+\cs_new:Nn\@@_sys_time_hex:
+{\int_to_hex:n{\@@_sys_time:}}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@@_sys_filename:}
+% \begin{macrocode}
+\cs_new:Nn\@@_sys_filename:
+{
+ \c_sys_jobname_str--
+ \@@_sys_date_hex:--
+ \@@_sys_time_hex:
+}
+% \end{macrocode}
+% \end{macro}
+% \section{Front-end}\label{impl:frontend}
+% \leavevmode
+% \refstepcounter{section}
+% \label{usage:cs:clear}
+% \docsetnameref{\cs{CcoolClear}}
+% \addcontentsline{toc}{section}{\protect\numberline{\thesection}\cs{CcoolClear}}
+% \begin{function}{\CcoolClear}
+% \begin{arguments}
+% \item \meta{\docccepttl}
+% \end{arguments}
+% \begin{description}
+% \item[Semantics] Clears any data created by \nameref{usage:cs:ccool}\Arg{\docccepttl}
+% \end{description}
+% \begin{macrocode}
+\NewDocumentCommand{ \CcoolClear }
+{ D<>{\g@@_option_name_tl} }
+{
+ \@@_prop_clear_new_map:n{#1}
+}
+% \end{macrocode}
+% \end{function}
+% \leavevmode
+% \refstepcounter{section}
+% \docsetnameref{\cs{CcoolHook}}
+% \label{usage:cs:hook}
+% \addcontentsline{toc}{section}{\protect\numberline{\thesection}\cs{CcoolHook}}
+% \begin{variable}{\CcoolHook}
+% \begin{description}
+% \item[Example] |\AfterEndEnvironment{theorem}{\CcoolHook}|
+% \end{description}
+% \begin{macrocode}
+\NewDocumentCommand{\CcoolHook}{}{\c_empty_tl}
+% \end{macrocode}
+% \end{variable}
+% \docsetnameref{\cs{CcoolLambda}}
+% \label{usage:cs:lambda}
+% \addcontentsline{toc}{section}{\protect\numberline{\thesection}\cs{CcoolLambda}}
+% \begin{function}{\CcoolLambda}
+% \begin{arguments}
+% \item \meta{\doccceptint}
+% \item \meta{\doccceptcode}
+% \end{arguments}
+% \begin{description}
+% \item[Example] |\Ccool{ EvalAt = \CcoolLambda{(#1)} }|
+% \item[Semantics] Creates a lambda expression with \meta{\doccceptint} arguments for \meta{\doccceptcode}
+% \end{description}
+% \begin{macrocode}
+\ProvideDocumentCommand \CcoolLambda { O{1} m }
+{
+ \@@_lambda:nn { #1 } { #2 }
+}
+% \end{macrocode}
+% \end{function}
+% \leavevmode
+% \refstepcounter{subsection}
+% \docsetnameref{\cs{CcoolOption}}
+% \label{usage:cs:option}
+% \addcontentsline{toc}{section}{\protect\numberline{\thesection}\cs{CcoolOption}}
+% \begin{function}{\CcoolOption}
+% \begin{arguments}
+% \item \meta{\doccceptkvl}
+% \end{arguments}
+% \begin{macrocode}
+\NewDocumentCommand{ \CcoolOption }
+{ m }
+{
+ \keys_set:nn{ @@ }{#1}
+}
+% \end{macrocode}
+% \end{function}
+% \begin{macrocode}
+\keys_define:nn { @@ }
+{
+% \end{macrocode}
+% \leavevmode
+% \refstepcounter{subsection}
+% \docsetnameref{\pkgoptex}
+% \label{usage:opt:ex}
+% \addcontentsline{toc}{subsection}{\protect\numberline{\thesubsection}\pkgoptex}
+% \DescribeOption{\pkgoptex}
+% \begin{description}
+% \item[Value] \texttt{eo\docpipe{}ee\docpipe{}ex\docpipe{}xo\docpipe{}xe\docpipe{}xx}
+% \end{description}
+% \begin{macrocode}
+Expans .multichoices:nn = { eo, ee, ex, xo, xe, xx }
+{ \tl_gset_eq:NN \g@@_option_expans_tl \l_keys_choice_tl },
+Expans .default:n = { xo },
+Expans .initial:n = { xo },
+% \end{macrocode}
+% \leavevmode
+% \refstepcounter{subsubsection}
+% \docsetnameref{\pkgoptfi}
+% \label{usage:opt:fi}
+% \addcontentsline{toc}{subsection}{\protect\numberline{\thesubsection}\pkgoptfi}
+% \DescribeOption{\pkgoptfi}
+% \begin{description}
+% \item[Value] \meta{\doccceptpath}
+% \end{description}
+% \begin{macrocode}
+File .code:n = {
+ \tl_gset:Nx \g@@_log_file_tl{#1}
+},
+File .default:n = { \@@_sys_filename: },
+File .initial:n = { \@@_sys_filename: },
+% \end{macrocode}
+% \leavevmode
+% \refstepcounter{subsubsection}
+% \docsetnameref{\pkgoptin}
+% \label{usage:opt:in}
+% \addcontentsline{toc}{subsection}{\protect\numberline{\thesubsection}\pkgoptin}
+% \DescribeOption{\pkgoptin}
+% \begin{description}
+% \item[Value] \meta{\doccceptcode}, with |####1| as the argument to be replaced
+% \end{description}
+% \begin{macrocode}
+Inner .code:n={
+ \@@_option_inner:n{#1}
+ \exp_last_unbraced:Nf
+ \@@_make_ccool:nnnn
+ {
+ { \g@@_option_name_tl }
+ { \g@@_option_inner_tl }
+ { \g@@_option_separ_tl }
+ { \g@@_option_outer_tl }
+ }
+},
+Inner .value_required:n = false,
+Inner .default:n = {####1},
+Inner .initial:n = {####1},
+% \end{macrocode}
+% \leavevmode
+% \refstepcounter{subsubsection}
+% \docsetnameref{\pkgoptna}
+% \label{usage:opt:na}
+% \addcontentsline{toc}{subsection}{\protect\numberline{\thesubsection}\pkgoptna}
+% \DescribeOption{\pkgoptna}
+% \begin{description}
+% \item[Value] \meta{\docccepttl}
+% \end{description}
+% \begin{macrocode}
+Name .code:n={
+ \@@_option_name:n{#1}
+ \exp_last_unbraced:Nf
+ \@@_make_ccool:nnnn
+ {
+ { \g@@_option_name_tl }
+ { \g@@_option_inner_tl }
+ { \g@@_option_separ_tl }
+ { \g@@_option_outer_tl }
+ }
+},
+Name .value_required:n = false,
+Name .default:n = { Math },
+Name .initial:n = { Math },
+% \end{macrocode}
+% \leavevmode
+% \refstepcounter{subsubsection}
+% \docsetnameref{\pkgoptou}
+% \label{usage:opt:ou}
+% \addcontentsline{toc}{subsection}{\protect\numberline{\thesubsection}\pkgoptou}
+% \DescribeOption{\pkgoptou}
+% \begin{description}
+% \item[Value] \meta{\doccceptcode}, with |####1| as the argument to be replaced
+% \end{description}
+% \begin{macrocode}
+Outer .code:n={
+ \@@_option_outer:n{#1}
+ \exp_last_unbraced:Nf
+ \@@_make_ccool:nnnn
+ {
+ { \g@@_option_name_tl }
+ { \g@@_option_inner_tl }
+ { \g@@_option_separ_tl }
+ { \g@@_option_outer_tl }
+ }
+},
+Outer .value_required:n = false,
+Outer .default:n = { \ensuremath{####1} },
+Outer .initial:n = { \ensuremath{####1} },
+% \end{macrocode}
+% \leavevmode
+% \refstepcounter{subsubsection}
+% \docsetnameref{\pkgoptse}
+% \label{usage:opt:se}
+% \addcontentsline{toc}{subsection}{\protect\numberline{\thesubsection}\pkgoptse}
+% \DescribeOption{\pkgoptse}
+% \begin{description}
+% \item[Value] That of `separators' in \cite[Section 8 of \pkg{l3seq}]{interface3}
+% \end{description}
+% \begin{macrocode}
+Separ .code:n={
+ \@@_option_separ:n{#1}
+ \exp_last_unbraced:Nf
+ \@@_make_ccool:nnnn
+ {
+ { \g@@_option_name_tl }
+ { \g@@_option_inner_tl }
+ { \g@@_option_separ_tl }
+ { \g@@_option_outer_tl }
+ }
+},
+Separ .value_required:n = false,
+Separ .default:n = { {\ }and{\ } } { ,{\ } } { ,{\ }and{\ } },
+Separ .initial:n = { {\ }and{\ } } { ,{\ } } { ,{\ }and{\ } },
+% \end{macrocode}
+% \leavevmode
+% \addtocounter{subsection}{1}
+% \docsetnameref{\pkgoptwr}
+% \label{usage:opt:wr}
+% \addcontentsline{toc}{subsection}{\protect\numberline{\thesubsection}\pkgoptwr}
+% \DescribeOption{\pkgoptwr}
+% \begin{description}
+% \item[Value] \meta{\doccceptbool}
+% \end{description}
+% \begin{macrocode}
+Write .code:n = {
+ \bool_if:nTF{#1}
+ {\@@_log_open:}
+ {\@@_log_close:}
+},
+Write .value_required:n = false,
+Write .default:n = \BooleanFalse,
+Write .initial:n = \BooleanFalse
+% \end{macrocode}
+% \begin{macrocode}
+}
+% \end{macrocode}
+% \leavevmode
+% \refstepcounter{section}
+% \docsetnameref{\cs{CcoolRead}}
+% \label{usage:cs:read}
+% \addcontentsline{toc}{section}{\protect\numberline{\thesection}\cs{CcoolRead}}
+% \begin{function}{\CcoolRead}
+% \begin{arguments}
+% \item \meta{\doccceptpath}
+% \end{arguments}
+% \begin{description}
+% \item[Semantics]\docfillblank
+% \begin{enumerate}
+% \item Reads the definitions in \meta{\doccceptpath}.
+% \item Writes to \file{ccool.log}: `read from \meta{\doccceptpath}'
+% \end{enumerate}
+% \end{description}
+% \end{function}
+% \begin{macrocode}
+\NewDocumentCommand{\CcoolRead}
+{o}
+{
+ \IfValueTF{#1}
+ {\@@_log_read:e{#1}}
+ {\@@_log_read:}
+}
+% \end{macrocode}
+% \leavevmode
+% \refstepcounter{section}
+% \docsetnameref{\cs{CcoolVers}}
+% \label{usage:cs:vers}
+% \addcontentsline{toc}{section}{\protect\numberline{\thesection}\cs{CcoolVers}}
+% \begin{variable}{\CcoolVers}
+% \end{variable}
+% \begin{description}
+% \item[Semantics] Expands to the package's version
+% \end{description}
+% \begin{macrocode}
+\NewDocumentCommand{\CcoolVers}
+{}
+{\use:c{ver@ccool.sty}}
+% \end{macrocode}
+% \section{Misc}
+% \begin{macrocode}
+\ExplSyntaxOff
+% \end{macrocode}
+%^^A \end{implementation}
+%
+% \iffalse
+%</package>
+% \fi
+% \Finale
+\endinput \ No newline at end of file
diff --git a/macros/latex/contrib/ccool/ccool.pdf b/macros/latex/contrib/ccool/ccool.pdf
new file mode 100644
index 0000000000..672af92977
--- /dev/null
+++ b/macros/latex/contrib/ccool/ccool.pdf
Binary files differ