% \iffalse meta-comment % !TEX program = pdfLaTeX %<*internal> \iffalse % %<*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 ---------------------------------------------------------------- % %<*internal> \fi \def\nameofplainTeX{plain} \ifx\fmtname\nameofplainTeX\else \expandafter\begingroup \fi % %<*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}} } % % \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 % % \NeedsTeXFormat{LaTeX2e}[2020/02/02] % \RequirePackage{etoolbox}[2019/09/21] % \RequirePackage{l3keys2e}[2020/03/06] % \RequirePackage{xparse}[2020/03/06] % \ProvidesExplPackage % {ccool} % Package name % {2020/04/15} % Release date % {2.0} % Release version % {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} % % \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[Let~] % i{\mathbb{#1}}{ Nat = N, Real = R }*s{{~\rm{and}~}} % [~denote the natural and real numbers.]{} % \end{Verbatim} % expands to: ``\Ccool[Let~]i{\mathbb{#1}}{Nat = N, Real = R}*s{{~\rm{and}~}}[~denote the natural and real numbers.]{}'' % As a side effect, |$\Nat$|~encodes~``$\Nat$'' (and likewise for |\Real|). % \pkgoptnad~being the default for \meta{name}, || 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}}| % Separ={{\ \char`@\ }{\ \%\ }{\ \char`@\ }}} % \Ccool{ 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 % { 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} }\nobreak % \KeyL\KeyD\KeyZ\KeyN\\ % \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\KeyA\nobreak % \KeyG\KeyA\nobreak % \KeyH\KeyA\nobreak % \KeyH\KeyA\nobreak % {\{}\nobreak\KeyO{\}},{\ }\nobreak % \KeyM\KeyR\nobreak % \KeyO\nobreak % \KeyT\nobreak % \KeyL\nobreak % \KeyD\nobreak % \KeyZ\nobreak % \KeyN\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 % % \fi % \Finale \endinput