summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/codedescribe
diff options
context:
space:
mode:
Diffstat (limited to 'macros/latex/contrib/codedescribe')
-rw-r--r--macros/latex/contrib/codedescribe/README.md90
-rw-r--r--macros/latex/contrib/codedescribe/doc/codedescribe.pdfbin0 -> 246809 bytes
-rw-r--r--macros/latex/contrib/codedescribe/doc/codedescribe.tex433
-rw-r--r--macros/latex/contrib/codedescribe/latex/codedescribe.sty964
-rw-r--r--macros/latex/contrib/codedescribe/latex/codelisting.sty691
5 files changed, 2178 insertions, 0 deletions
diff --git a/macros/latex/contrib/codedescribe/README.md b/macros/latex/contrib/codedescribe/README.md
new file mode 100644
index 0000000000..8045a1a210
--- /dev/null
+++ b/macros/latex/contrib/codedescribe/README.md
@@ -0,0 +1,90 @@
+
+codedescribe / codelisting
+==========
+
+These are expl3 based packages for LaTeX/expl3 code documetation.
+### codedescribe
+ provides a series of macros/environments (similar to doc/docx/doc3) for package/classes documentantion
+### codelisting
+ provides a few macros for LaTeX code listing/demo.
+
+They are designed to be 'as class independent as possible',
+no assumption about underline macros is made.
+Furthermore, it's assumed that *\maketitle* and the *abstract* environment
+were modified by the underline class, so alternatives (based on the article class) are provided.
+
+For more details, see the documentation,
+[codedescribe.pdf](http://mirrors.ctan.org/macros/latex/contrib/codedescribe/doc/codedescribe.pdf)
+
+--------------
+
+## Requirements
+* none besides a fairly recent LaTeX distribution as recent as 2022/06/01
+(with the new in kernel *\ProcessKeyOptions* and *\NewDocumentCommand*)
+
+## Installation
+The stable version is available at [CTAN](https://ctan.org/pkg/codedescribe).
+
+## Usage
+### Stable version
+Just place
+```latex
+ \usepackage{codedescribe}
+```
+
+in the preamble and compile away.
+
+
+Be aware that options might change between versions, so you have to check them manually.
+
+## More Information and documentation
+More Information can be found in the documentation; you can find a "bleeding edge" version
+at [the github page](http://github.com/alceu-frigeri/codedescribe)
+
+## Contacting Author
+
+For bug reports and enhacement suggestions, the preferred way is to use
+[the project's issue page](https://github.com/alceu-frigeri/codedescribe/issues).
+Please be ready to provide an example code showing the bug, if any.
+
+Please do not use the issue page for generic help on how to use the package.
+
+* git: https://github.com/alceu-frigeri/codedescribe
+
+-------------
+Copyright 2023 by Alceu Frigeri
+
+ This work may be distributed and/or modified under the
+ conditions of
+
+ * The [LaTeX Project Public License](http://www.latex-project.org/lppl.txt), version 1.3c (or later), and/or
+ * The [GNU Affero General Public License](https://www.gnu.org/licenses/agpl-3.0.html), version 3 (or later)
+
+This work has the LPPL maintenance status *maintained*.
+
+The Current Maintainer of this work is Alceu Frigeri
+
+-------------
+## This work consists of the files
+
+* codelisting.sty
+ - set of macros to typeset and demonstrate LaTeX code
+
+* codedescribe.sty
+ - set of macros to document LaTeX packages
+
+* README.md (this file)
+ - quick introduction
+
+* codedescribe.tex
+ - package documentation
+
+* codedescribe.pdf
+ - documentation in PDF format
+
+-------------
+
+## Changelog
+
+* Version 1.0 (this)
+ - Initial release by CTAN
diff --git a/macros/latex/contrib/codedescribe/doc/codedescribe.pdf b/macros/latex/contrib/codedescribe/doc/codedescribe.pdf
new file mode 100644
index 0000000000..882a93affd
--- /dev/null
+++ b/macros/latex/contrib/codedescribe/doc/codedescribe.pdf
Binary files differ
diff --git a/macros/latex/contrib/codedescribe/doc/codedescribe.tex b/macros/latex/contrib/codedescribe/doc/codedescribe.tex
new file mode 100644
index 0000000000..b16853b40a
--- /dev/null
+++ b/macros/latex/contrib/codedescribe/doc/codedescribe.tex
@@ -0,0 +1,433 @@
+% !TEX program = pdflatex
+% !TEX ext = --interaction=nonstopmode --enable-etex --enable-write18
+% !BIB program = none
+%%%==============================================================================
+%% Copyright 2022 by Alceu Frigeri
+%%
+%% This work may be distributed and/or modified under the conditions of
+%%
+%% * The [LaTeX Project Public License](http://www.latex-project.org/lppl.txt),
+%% version 1.3c (or later), and/or
+%% * The [GNU Affero General Public License](https://www.gnu.org/licenses/agpl-3.0.html),
+%% version 3 (or later)
+%%
+%% This work has the LPPL maintenance status *maintained*.
+%%
+%% The Current Maintainer of this work is Alceu Frigeri
+%%
+%% This is version 1.0 (2023/05/11)
+%%
+%% The list of files that compose this work can be found in the README.md file at
+%% https://ctan.org/pkg/democodetools
+%%
+%%%==============================================================================
+%\documentclass[dctools,english]{ufrgscca}
+\documentclass{article}
+\RequirePackage[verbose,a4paper,marginparwidth=27.5mm,top=2.5cm,bottom=1.5cm,hmargin={40mm,20mm},marginparsep=2.5mm,columnsep=10mm,asymmetric]{geometry}
+\usepackage{codedescribe}
+\usepackage{enumitem}
+
+\begin{document}
+
+%%% TO BE DETERMINED !! \parindent
+%%%\setlength\parindent{0pt}
+
+\tstitle{
+ author={Alceu Frigeri\footnote{\tsverb{https://github.com/alceu-frigeri/codedescribe}}},
+ date={2023/05/11},
+ title={The codedescribe and codelisting Packages\break Version \PkgInfo{codedesc}{version}}
+ }
+
+\begin{typesetabstract}
+
+This documentation package is designed to be `as class independent as possible', depending only on \tsobj[pkg]{expl3,scontents,listing}. Unlike other packages of the kind, a minimal set of macros/commands/environments is defined: most/all defined commands have an 'object type' as a \tsobj[key]{keyval} parameter, allowing for an easy expansion mechanism (instead of the usual 'one set of macros/environments' for each object type).
+
+No assumption about page layout is made (besides `having a marginpar'), or underlying macros, so that it can be used with any document class.
+
+\end{typesetabstract}
+
+\tableofcontents
+
+%\setcodefmt{fontsize=\large}
+
+\section{Introduction}
+
+This package aims to document both \tsobj[code]{Document} level (i.e. final user) commands, as well \tsobj[code]{Package/Class} level commands. It's fully implemented using \tsobj[pkg]{expl3} syntax and structures, in special \tsobj[pkg]{l3coffins, l3seq, l3keys}. Besides those \tsobj[pkg]{scontents,listing} packages are used to typeset code snippets.
+
+
+No other package/class is needed, any class can be used as the base one, which allows to demonstrate the documented commands with any desired layout.
+
+\tsobj[pkg]{codelisting} defines a few macros to display and demonstrate \LaTeX~ code (using \tsobj[pkg]{listings} and \tsobj[pkg]{scontents}), whilst \tsobj[pkg]{codedescribe} defines a series of macros to display/enumerate macros and environments (somewhat resembling the \tsobj[pkg]{doc3} style).
+
+\subsection{Single versus Multi-column Classes}
+This package 'can' be used with multi-column classes, given that the \tsobj[code]{\linewidth,\columnsep} are defined appropriately. \tsobj{\linewidth} shall defaults to text/column real width, whilst \tsobj{\columnsep}, if needed (2 or more columns) shall be greater than \tsobj{\marginparwidth} plus \tsobj{\marginparsep}.
+
+\subsection{Current Version}
+This doc regards to \tsobj[pkg]{codedescribe} version \PkgInfo{codedesc}{version}~ and \tsobj[pkg]{codelisting} version \PkgInfo{codedesc}{version}. Those two packages are fairly stable, and given the \tsobj[meta]{obj-type} mechanism (see below, \ref{obj-type-def}) it can be easily extended without changing it's interface.
+
+\section{codelisting Package}
+
+It requires two packages: \tsobj[pkg]{listings,scontents}, defines an environment: \tsobj[env]{codestore} and
+ 2 main commands: \tsobj[code]{\tscode,\tsdemo} and 1 auxiliary command: \tsobj{\setcodekeys}.
+
+\subsection{In Memory Code Storage}
+Thanks to \tsobj[pkg]{scontents} (\tsobj[pkg]{expl3} based) it's possible to store \LaTeX~ code snippets in a \tsobj[pkg]{expl3} key.
+
+
+\begin{codedescribe}[env,rulecolor=white]{codestore}
+ \begin{codesyntax}
+ \tsmacro{\begin{codestore}}[stcontents-keys]{}
+ \tsmacro{\end{codestore}}{}
+ \end{codesyntax}
+This environment is an alias to \tsobj[env]{scontents} environment (from \tsobj[pkg]{scontents} package), all \tsobj[pkg]{scontents} keys are valid, with two additional ones: \tsobj[key]{st,store-at} which are aliases to the \tsobj[key]{store-env} key. If an 'isolated' \tsobj[key,meta]{st-name} is given (unknown \tsobj[key]{key}), it is assumed 'by Default' that the environment body shall be stored in it (for use with \tsobj[code]{\tscode,\tsdemo}).
+\end{codedescribe}
+
+
+
+\subsection{Code Display/Demo}
+\begin{codedescribe}{\tscode*,\tsdemo*}
+ \begin{codesyntax}%
+ \tsmacro{\tscode*}[code-keys]{st-name}
+ \tsmacro{\tsdemo*}[code-keys]{st-name}
+ \end{codesyntax}
+\tsmacro{\tscode}{} just typesets \tsobj[meta]{st-name} (the key-name created with \tsobj[env]{stcode}), in verbatim mode with syntax highlight. The non-star version centers it and use just half of the base line. The star version uses the full text width.
+
+\tsmacro{\tsdemo*}{} first typesets \tsobj[meta]{st-name}, as above, then it \emph{executes} said code. The non-start versions place them side-by-side, whilst the star versions places one following the other.
+\end{codedescribe}
+
+
+For Example:
+
+\begin{codestore}[st=democodestore]
+ \begin{codestore}[stmeta]
+ Some \LaTeX~coding, for example: \ldots.
+ \end{codestore}
+
+This will just typesets \tsobj[key]{stmeta}:
+
+\tscode*[codeprefix={Sample Code:}] {stmeta}
+
+and this will demonstrate it, side by side with source code:
+
+\tsdemo[numbers=left,ruleht=0.5,
+ codeprefix={inner sample code},
+ resultprefix={inner sample result}] {stmeta}
+\end{codestore}
+
+\tsdemo*[emph2={tscode,tsdemo},emph={stmeta},keywd2={codestore}]{democodestore}
+
+\begin{codedescribe}{\setcodekeys}
+ \begin{codesyntax}%
+ \tsmacro{\setcodekeys}{code-keys}
+ \end{codesyntax}
+
+Instead of setting/defining \tsmeta{code-keys} per \tsmacro{\tscode}{}/\tsmacro{\tsdemo}{} call, one can set those \emph{globally}, better said, \emph{in the called context group} .\\
+\begin{tsremark}[N.B.:]
+All \tsobj[code]{\tscode,\tsdemo} commands create a local group in which the \tsmeta{code-keys} are defined, and discarded once said local group is closed. \tsmacro{\setcodekeys}{} defines those keys in the \emph{current} context/group.
+\end{tsremark}
+\end{codedescribe}
+
+
+
+
+\subsubsection{Code Keys}
+Using a \tsobj[key]{key}\,=\tsobj[value]{value} syntax, one can fine tune \tsobj[pkg]{listings} syntax highlight.
+
+\begin{codedescribe}[key]{settexcs,texcs,texcsstyle}
+\begin{codesyntax}% Also
+ \tsobj[key]{settexcs,settexcs2,settexcs3}
+ \tsobj[key]{texcs,texcs2,texcs3}
+ \tsobj[key]{texcsstyle,texcs2style,texcs3style}
+\end{codesyntax}
+Those define sets of \LaTeX~commands (csnames), the \tsobj[key]{set} variants initialize/redefine those sets (an empty list, clears the set), while the others extend those sets. The \tsobj[key]{style} ones redefines the command display style (an empty \tsobj[meta]{value} resets the style to it's default).\\
+\end{codedescribe}
+
+\begin{codedescribe}[key]{setkeywd,keywd,keywdstyle}
+\begin{codesyntax} %
+ \tsobj[key]{setkeywd,setkeywd2,setkeywd3}
+ \tsobj[key]{keywd,keywd2,keywd3}
+ \tsobj[key]{keywdstyle,keywd2style,keywd3style}
+\end{codesyntax}
+Same for other \emph{keywords} sets.\\
+\end{codedescribe}
+
+\begin{codedescribe}[key]{setemph,emph,emphstyle}
+\begin{codesyntax} %
+ \tsobj[key]{setemph,setemph2,setemph3}
+ \tsobj[key]{emph,emph2,emph3}
+ \tsobj[key]{emphstyle,emph2style,emph3style}
+\end{codesyntax}
+for some extra emphasis sets.\\
+\end{codedescribe}
+
+\begin{codedescribe}[key]{numbers,numberstyle}
+\begin{codesyntax} %
+ \tsobj[key]{numbers,numberstyle}
+\end{codesyntax}
+\tsobj[key]{numbers} possible values are \tsobj[value]{none} (default) and \tsobj[value]{left} (to add tinny numbers to the left of the listing). With \tsobj[key]{numberstyle} one can redefine the numbering style.\\
+\end{codedescribe}
+
+\begin{codedescribe}[key]{stringstyle,codestyle}
+\begin{codesyntax} %
+ \tsobj[key]{stringstyle,commentstyle}
+\end{codesyntax}
+to redefine \tsobj[key]{strings} and \tsobj[key]{comments} formatting style.\\
+\end{codedescribe}
+
+\begin{codedescribe}[key]{bckgndcolor}
+\begin{codesyntax} %
+ \tsobj[key]{bckgndcolor}
+\end{codesyntax}
+to change the listing background's color.\\
+\end{codedescribe}
+
+\begin{codedescribe}[key]{codeprefix,resultprefix}
+\begin{codesyntax} %
+ \tsobj[key]{codeprefix,resultprefix}
+\end{codesyntax}
+those set the \tsobj[key]{codeprefix} (default: \LaTeX~Code:) and \tsobj[key]{resultprefix} (default: \LaTeX~Result:)
+\end{codedescribe}
+
+\begin{codedescribe}[key]{parindent}
+\begin{codesyntax} %
+ \tsobj[key]{parindent}
+\end{codesyntax}
+Sets the indentation to be used when 'demonstrating' \LaTeXe code (\tsobj[code]{\tsdemo}). Defaults to whatever value \tsobj[code]{\parindent} was when the package was first loaded.
+\end{codedescribe}
+
+\begin{codedescribe}[key]{ruleht}
+\begin{codesyntax} %
+ \tsobj[key]{ruleht}
+\end{codesyntax}
+When typesetting the 'code demo' (\tsobj{\tsdemo}) a set of rules is drawn. The Default, 1, equals to \tsobj{\arrayrulewidth} (usually 0.4pt).
+\end{codedescribe}
+
+
+
+\section{codedescribe Package}
+
+This package aims at minimizing the number of commands, having the object kind (if a macro, or a function, or environment, or variable, or key ...) as a parameter, allowing for a simple 'extension mechanism': other object types can be easily introduced without having to change, or add commands.
+
+\subsection{Package Options}
+It has a single package option:
+\begin{describelist}{option}
+\describe{nolisting}{it will suppress the \tsobj[pkg]{codelisting} package load. In case it's not necessary or one wants to use a differen package for \LaTeX\ code listing.}
+\end{describelist}
+
+\subsection{\tsobj[oarg]{obj-type} keys}\label{obj-type-def}
+
+
+The current known Object Types (keys) are:
+\begin{itemize}[noitemsep]
+\item \tsobj[keys]{meta} for a 'general' case,
+\item \tsobj[keys]{arg,marg,oarg,parg,xarg} for commands/functions arguments,
+\item \tsobj[keys]{code,macro,function} for macros in general,
+\item \tsobj[keys]{syntax} to describe/typeset code syntax,
+\item \tsobj[keys]{key,keys,keyval,value,defaultval} to list keys, values, etc.,
+\item \tsobj[keys]{option} for package/macros options,
+\item \tsobj[keys]{env} for environments,
+\item \tsobj[keys]{pkg,pack} for packages.
+\end{itemize}
+% Besides those, for \tsmacro{\tsobj}{} one has \tsobj[keys]{sep,comma} keys to change the last 'connector term' (default: and) and \tsobj[keys]{rulecolor,new,update,note} to customize the \tsobj[env]{codedescribe} environment.
+The format's defaults can be changed with \tsobj{\setcodefmt}
+
+\begin{codedescribe}[code]{\setcodefmt}
+\begin{codesyntax} %
+ \tsmacro{\setcodefmt}{fmt-keys}
+\end{codesyntax}
+\tsobj[marg]{fmt-keys} are basically the same as above:
+\begin{itemize}[noitemsep]
+ \item To change default colors: (note each group defines a single entry/alias)
+ \begin{itemize}[noitemsep]
+\item \tsobj[keys,sep=or]{meta,marg,arg} ,
+\item \tsobj[keys,sep=or]{oarg,parg,xarg} ,
+\item \tsobj[keys,sep=or]{code,macro,function} ,
+\item \tsobj[keys,sep=or]{syntax} ,
+\item \tsobj[keys,sep=or]{key,keys,keyval,value} ,
+\item \tsobj[keys,sep=or]{defaultval} ,
+\item \tsobj[keys,sep=or]{option} ,
+\item \tsobj[keys,sep=or]{env} ,
+\item \tsobj[keys,sep=or]{pkg,pack} ,
+\item \tsobj[keys,sep=or]{allcolors} to set all colors at once, single value.
+ \end{itemize}
+\item others
+ \begin{itemize}
+ \item \tsobj[keys]{font} to change font (default: \tsobj{\ttfamily})
+ \item \tsobj[keys]{fontsize} to change size (default: \tsobj{\small})
+ \item \tsobj[keys]{fontshape} to change the used 'slshape' (default: \tsobj{\slshape})
+ \end{itemize}
+\end{itemize}
+
+\end{codedescribe}
+
+
+
+\subsection{Environments}
+\begin{codedescribe}[env,new=2023/05/01,update=2023/05/1,note={this is an example}]{codedescribe}
+\begin{codesyntax}
+\tsmacro{\begin{codedescribe}}[obj-type]{csv-list}
+\ldots
+\tsmacro{\end{codedescribe}}{}
+\end{codesyntax}
+This is the main environment to describe \tsobj[env]{Macros, Functions, Variable, Environments, etc.} \tsobj[meta]{csv-list} is typeset in the margin. The optional \tsobj[oarg]{obj-type} defines the object-type format.
+\end{codedescribe}
+\begin{tsremark}
+One can change the rule color with the key \tsobj[keys]{rulecolor}, for instance \tsmacro{\begin{codedescribe}[rulecolor=white]}{} will remove the rules.
+\end{tsremark}
+\begin{tsremark}
+Besides that, one can use the keys \tsobj[keys]{new,update,note} to further customize it as: \tsverb{\begin{codedescribe}[new=2023/05/01,update=2023/05/1,note={this is an example}]}
+\end{tsremark}
+
+
+\begin{codedescribe}[env]{codesyntax}
+\begin{codesyntax}
+\tsmacro{\begin{codesyntax}}{}
+\end{codesyntax}
+The \tsobj[env]{codesyntax} environment sets the fontsize and activates \tsmacro{\obeylines,\obeyspaces}{}, so one can list macros/cmds/keys use, one per line.
+
+\end{codedescribe}
+
+\begin{tsremark}
+\tsobj[env]{codesyntax} environment shall appear only once, inside of a \tsobj[env]{codedescribe} environment. Take note, as well, this is not a verbatim environment!
+%\begin{describelist*}{code}
+%\describe{something}{ a text}
+%\describe{some}{ some text}
+%\end{describelist*}
+%
+\end{tsremark}
+
+For example, the code for \tsobj[env]{codedescribe} (entry above) is:
+
+\begin{codestore}[demoD]
+\begin{codedescribe}[env,new=2023/05/01,update=2023/05/1,note={this is an example}]{codedescribe}
+ \begin{codesyntax}
+ \tsmacro{\begin{codedescribe}}[obj-type]{csv-list}
+ \ldots
+ \tsmacro{\end{codedescribe}}{}
+ \end{codesyntax}
+ This is the main ...
+\end{codedescribe}
+\end{codestore}
+
+\tscode*{demoD}
+
+
+
+\begin{codedescribe}[env]{describelist,describelist*}
+ \begin{codesyntax}
+\tsmacro{\begin{describelist}}[item-indent]{obj-type}
+..\tsmacro{\describe}{item-name,item-description}
+..\tsmacro{\describe}{item-name,item-description}
+\ldots
+\tsmacro{\end{describelist}}{}
+ \end{codesyntax}
+This sets a \tsobj[env]{description} like 'list'. In the non-star version the \tsobj[marg]{items-name} will be typeset on the marginpar. In the star version, \tsobj[marg]{item-description} will be indented by \tsobj[oarg]{item-indent} (defaults to: 20mm).
+\tsobj[marg]{obj-type} defines the object-type format used to typeset \tsobj[marg]{item-name}.
+\end{codedescribe}
+
+\begin{codedescribe}[code]{\describe}
+\begin{codesyntax}
+\tsmacro{\describe}{item-name,item-description}
+\end{codesyntax}
+This is the \tsobj[env]{describelist} companion macro. In case of the \tsobj[env]{describe*}, \tsobj[marg]{item-name} will be typeset in a box \tsobj[oarg]{item-ident} wide, so that \tsobj[marg]{item-description} will be fully indented, otherwise \tsobj[marg]{item-name} will be typed in the marginpar.
+\end{codedescribe}
+
+
+\subsection{Commands}
+
+
+\begin{codedescribe}[code]{\typesetobj,\tsobj}
+\begin{codesyntax}
+\tsmacro{\typesetobj}[obj-type]{csv-list}
+\tsmacro{\tsobj}[obj-type]{csv-list}
+\end{codesyntax}
+It can be used to typeset a single 'object' or a list thereof. In the case of a list, each term will be separated by commas. The last two by \tsobj[key]{sep} (defaults to: and).
+\end{codedescribe}
+\begin{tsremark}
+One can change the last 'separator' with the key \tsobj[keys]{sep}, for instance \tsverb[code]{\tsobj[env,sep=or] {}} (in case one wants to produce an 'or' list of environments). Additionally, one can use the key \tsobj[keys]{comma} to change the last separator to a single comma, like \tsverb[code]{\tsobj[env,comma] {}}.
+\end{tsremark}
+
+\begin{codedescribe}[code]{\typesetargs,\tsargs}
+\begin{codesyntax}
+\tsmacro{\typesetargs}[obj-type]{csv-list}
+\tsmacro{\tsargs}[obj-type]{csv-list}
+\end{codesyntax}
+ Those will typeset \tsobj[marg]{csv-list} as a list of parameters, like \tsargs[oarg]{arg1,arg2,arg3}, or \tsargs[marg]{arg1,arg2,arg3}, etc. \tsobj[oarg]{obj-type} defines the formating AND kind of braces used: \tsverb{[]} for optional arguments (oarg), \tsverb{{}} for mandatory arguments (marg), and so on.
+\end{codedescribe}
+
+
+\begin{codedescribe}[code]{\typesetmacro,\tsmacro}
+\begin{codesyntax}
+\tsmacro{\typesetmacro}{macro-list}\tsargs[oarg]{oargs-list}\tsargs[marg]{margs-list}
+\tsmacro{\tsmacro}{macro-list}\tsargs[oarg]{oargs-list}\tsargs[marg]{margs-list}
+\end{codesyntax}
+This is just a short-cut for\par \tsobj[code]{\tsobj [code] {macro-list}} \tsobj[code]{\tsargs [oarg] {oargs-list}} \tsobj[code]{\tsargs [marg] {margs-list}}.
+\end{codedescribe}
+
+\begin{codedescribe}[code]{\typesetmeta,\tsmeta}
+\begin{codesyntax}
+\tsmacro{\typesetmeta}{name}
+\tsmacro{\tsmeta}{name}
+\end{codesyntax}
+ Those will just typeset \tsobj[meta]{name} between left/right 'angles' (no other formatting).
+\end{codedescribe}
+
+\begin{codedescribe}[code]{\typesetverb,\tsverb}
+\begin{codesyntax}
+\tsmacro{\typesetverb}[obj-type]{verbatim text}
+\tsmacro{\tsverb}[obj-type]{verbatim text}
+\end{codesyntax}
+ Typesets \tsobj[marg]{verbatim text} as is (verbatim...). \tsobj[oarg]{obj-type} defines the used format.
+\end{codedescribe}
+
+\begin{codedescribe}[code]{\typesetmarginnote,\tsmarginnote}
+\begin{codesyntax}
+\tsmacro{\typesetmarginnote}{note}
+\tsmacro{\tsmarginnote}{note}
+\end{codesyntax}
+Typesets a small note at the margin.
+\end{codedescribe}
+
+\begin{codedescribe}[env]{tsremark}
+\begin{codesyntax}
+\tsmacro{\begin{tsremark}[NB]}{}
+\tsmacro{\end{tsremark}}{}
+\end{codesyntax}
+ The environment body will be typeset as a text note. \tsobj[oarg]{NB} (defaults to Note:) is the note begin (in boldface). For instance:
+ \begin{codestore}[demo.remark]
+ Sample text. Sample test.
+ \begin{tsremark}[N.B.]
+ This is an example.
+ \end{tsremark}
+ \end{codestore}
+ \tsdemo{demo.remark}
+\end{codedescribe}
+
+\subsection{Auxiliar Command / Environment}
+In case the used Document Class redefines the \tsobj[code]{\maketitle} command and/or \tsobj[env]{abstract} environment, alternatives are provided (based on the article class).
+
+\begin{codedescribe}[code]{typesettitle,tstitle}
+\begin{codesyntax}
+\tsmacro{\typesettitle}{title-keys}
+\tsmacro{\tstitle}{title-keys}
+\end{codesyntax}
+This is based on the \tsobj[code]{\maketitle} from the \tsobj[pkg]{article} class. The \tsobj[marg]{title-keys} are:
+\end{codedescribe}
+
+\begin{describelist}{key}
+\describe{title}{The used title.}
+\describe{author}{Author's name. It's possible to use \tsobj[code]{\footnote} command in it.}
+\describe{date}{Title's date.}
+\end{describelist}
+
+\begin{codedescribe}[env]{tsabstract}
+\begin{codesyntax}
+\tsmacro{\begin{tsabstract}}{}
+\ldots
+\tsmacro{\end{tsabstract}}{}
+\end{codesyntax}
+This is the \tsobj[env]{abstract} environment from the \tsobj[pkg]{article} class.
+\end{codedescribe}
+
+
+\end{document} \ No newline at end of file
diff --git a/macros/latex/contrib/codedescribe/latex/codedescribe.sty b/macros/latex/contrib/codedescribe/latex/codedescribe.sty
new file mode 100644
index 0000000000..370f01ba82
--- /dev/null
+++ b/macros/latex/contrib/codedescribe/latex/codedescribe.sty
@@ -0,0 +1,964 @@
+%%%==============================================================================
+%% Copyright 2023 by Alceu Frigeri
+%%
+%% This work may be distributed and/or modified under the conditions of
+%%
+%% * The [LaTeX Project Public License](http://www.latex-project.org/lppl.txt),
+%% version 1.3c (or later), and/or
+%% * The [GNU Affero General Public License](https://www.gnu.org/licenses/agpl-3.0.html),
+%% version 3 (or later)
+%%
+%% This work has the LPPL maintenance status *maintained*.
+%%
+%% The Current Maintainer of this work is Alceu Frigeri
+%%
+%% This is version 1.0.1beta (2023/05/11)
+%%
+%% The list of files that compose this work can be found in the README.md file at
+%% https://ctan.org/pkg/codedescribe
+%%
+%%%==============================================================================
+\NeedsTeXFormat{LaTeX2e}[2022/06/01]
+\RequirePackage{ expl3 }
+\ProvidesExplPackage
+ {codedescribe}
+ {2023/05/11}
+ {1.0}
+ {LaTeX Code Description/Documentation}
+
+\prop_if_exist:NTF \g__codedesc_pkg_prop
+ {}
+ { \prop_new:N \g__codedesc_pkg_prop }
+
+\prop_put_from_keyval:Nn \g__codedesc_pkg_prop
+ {
+ codedesc . name = codedescribe ,
+ codedesc . prefix = codedesc ,
+ codedesc . date = 2023/05/11 ,
+ codedesc . version = 1.0 ,
+ codedesc . description = LaTeX Code Description/Documentation
+ }
+
+\cs_gset:Npn \__codedesc_pkg_info:nn #1#2
+ {
+ \prop_item:Nn \g__codedesc_pkg_prop {#1.#2}
+ }
+
+\cs_if_exist:NTF \PkgInfo
+ {}
+ {
+ \NewDocumentCommand \PkgInfo {mm} { \prop_item:Nn \g__codedesc_pkg_prop {#1.#2} }
+ }
+
+
+\use:c {@reversemargintrue}
+
+\bool_new:N \l__codedesc_loadlisting_bool
+\bool_set_true:N \l__codedesc_loadlisting_bool
+
+\keys_define:nn { codedescribe }
+{
+ nolisting.usage:n = general,
+ nolisting.bool_set_inverse:N = \l__codedesc_loadlisting_bool,
+ nolisting.default:n = {true},
+}
+\ProcessKeyOptions [codedescribe ]
+
+\RequirePackage{xcolor}
+\bool_if:nT {\l__codedesc_loadlisting_bool}
+ {
+ \RequirePackage{codelisting}
+ }
+
+
+\cs_generate_variant:Nn \tl_set:Nn {Ne}
+
+
+
+%%%%%%%
+%%%
+%%% 'simplified' bold versions of \hline and \rule
+%%% those don't peek ahead (to see if they are followed by another line)
+%%%
+%%%%%%%
+\cs_new:Npn \__codedesc_hline:nnnn #1#2#3#4 {\noalign{#1\vskip #2\vskip 0pt\hrule height #3\arrayrulewidth\vskip #4\vskip 0pt}}
+\cs_new:Npn \__codedesc_hline:nn #1#2 {\__codedesc_hline:nnnn {#1}{-0.5ex}{#2}{0.25ex}}
+\cs_new:Npn \__codedesc_hline:n #1 {\__codedesc_hline:nnnn {#1}{-0.5ex}{2}{0.25ex}}
+\cs_new:Npn \__codedesc_rule:n #1 {\hrule height #1\arrayrulewidth}
+\cs_new:Npn \__codedesc_rule: {\hrule height 2\arrayrulewidth}
+
+
+
+%%%%%%%
+%%%
+%%% To get the 'real' columnwidth (multicolumn case)
+%%% given the current \linewidth and \textwidth
+%%%
+%%%%%%%
+
+\dim_new:N \l__codedesc_linewidth_dim
+\dim_new:N \l__codedesc_textcolwidth_dim
+
+\cs_new:Npn \__codedesc_set_textcolwidth:
+ {
+ \dim_compare:nNnTF {\linewidth} = {\l__codedesc_linewidth_dim}
+ {}
+ {
+% \dim_set:Nn \l__codedesc_linewidth_dim {\linewidth}
+% \fp_set:Nn \l_tmpa_fp {(\textwidth - \linewidth) / \textwidth}
+% \dim_set:Nn \l__codedesc_textcolwidth_dim {\linewidth - \fp_use:N \l_tmpa_fp \columnsep}
+
+ \dim_set:Nn \l__codedesc_textcolwidth_dim {\linewidth}
+ }
+
+ }
+
+\colorlet{c__codedesc_none_color}{red!70!black}
+
+\bool_new:N \l__codedesc_descnotes_bool
+\bool_new:N \l__codedesc_descdate_new_bool
+\tl_new:N \l__codedesc_descdate_new_tl
+\bool_new:N \l__codedesc_descdate_update_bool
+\tl_new:N \l__codedesc_descdate_update_tl
+\bool_new:N \l__codedesc_sidenote_bool
+\tl_new:N \l__codedesc_sidenote_tl
+
+
+\cs_new:Npn \__codedesc_keysmetadefaults:nn #1#2
+ {
+ \tl_if_blank:nTF {#2}
+ { \keys_set:nn {codedesc / defaults} { #1 } }
+ { \keys_set:nn {codedesc / defaults} { #1 = {#2} } }
+ }
+
+\keys_define:nn { codedesc / defaults }
+{
+ meta.usage:n = general,
+ meta.code:n = { \colorlet{c__codedesc_marg_color}{#1} } ,
+ meta.default:n = { gray!60!black } ,
+ %
+ marg.usage:n = general,
+ marg.code:n = { \__codedesc_keysmetadefaults:nn {meta}{#1} } ,
+ %
+ arg.usage:n = general,
+ arg.code:n = { \__codedesc_keysmetadefaults:nn {meta}{#1} } ,
+ %
+
+ oarg.usage:n = general,
+ oarg.code:n = { \colorlet{c__codedesc_oarg_color}{#1} } ,
+ oarg.default:n = { gray!90!black } ,
+ %
+ parg.usage:n = general,
+ parg.code:n = { \__codedesc_keysmetadefaults:nn {oarg}{#1} } ,
+ %
+ xarg.usage:n = general,
+ xarg.code:n = { \__codedesc_keysmetadefaults:nn {oarg}{#1} } ,
+ %
+
+ code.usage:n = general,
+ code.code:n = { \colorlet{c__codedesc_code_color}{#1} } ,
+ code.default:n = { blue!40!black } ,
+ %
+ macro.usage:n = general,
+ macro.code:n = { \__codedesc_keysmetadefaults:nn {code}{#1} } ,
+ %
+ function.usage:n = general,
+ function.code:n = { \__codedesc_keysmetadefaults:nn {code}{#1} } ,
+ %
+
+ syntax.usage:n = general,
+ syntax.code:n = { \colorlet{c__codedesc_syntax_color}{#1} } ,
+ syntax.default:n = { blue!60!black } ,
+ %
+
+ keyval.usage:n = general,
+ keyval.code:n = { \colorlet{c__codedesc_keyval_color}{#1} } ,
+ keyval.default:n = { teal!40!black } ,
+ %
+ key.usage:n = general,
+ key.code:n = { \__codedesc_keysmetadefaults:nn {keyval}{#1} } ,
+ %
+ keys.usage:n = general,
+ keys.code:n = { \__codedesc_keysmetadefaults:nn {keyval}{#1} } ,
+ %
+ value.usage:n = general,
+ value.code:n = { \__codedesc_keysmetadefaults:nn {keyval}{#1} } ,
+ %
+
+ option.usage:n = general,
+ option.code:n = { \colorlet{c__codedesc_options_color}{#1} } ,
+ option.default:n = { green!30!black } ,
+ %
+
+ defaultval.usage:n = general,
+ defaultval.code:n = { \colorlet{c__codedesc_defaultval_color}{#1} } ,
+ defaultval.default:n = { blue!60!black } ,
+ %
+
+ env.usage:n = general,
+ env.code:n = { \colorlet{c__codedesc_env_color}{#1} } ,
+ env.default:n = { green!30!black } ,
+ %
+
+ pkg.usage:n = general,
+ pkg.code:n = { \colorlet{c__codedesc_pkg_color}{#1} } ,
+ pkg.default:n = { green!30!black } ,
+ %
+ pack.usage:n = general,
+ pack.code:n = { \__codedesc_keysmetadefaults:nn {pkg}{#1} } ,
+ %
+
+ allcolors.usage:n = general,
+ allcolors.meta:n =
+ {
+ meta = {#1} ,
+ oarg = {#1} ,
+ code = {#1} ,
+ syntax = {#1} ,
+ keyval = {#1} ,
+ option = {#1} ,
+ defaultval = {#1} ,
+ env = {#1} ,
+ pkg = {#1} ,
+ } ,
+ allcolors.default:n = { black } ,
+
+ font.usage:n = general ,
+ font.code:n = { \tl_set:Nn \__codedesc_metafont_tl: {#1} } ,
+ font.default:n = { \ttfamily } ,
+
+ fontsize.usage:n = general ,
+ fontsize.code:n = { \tl_set:Nn \__codedesc_metasize_tl: {#1} } ,
+ fontsize.default:n = { \small } ,
+
+ fontshape.usage:n = general ,
+ fontshape.code:n = { \tl_set:Nn \__codedesc_slshape_tl: {#1} } ,
+ fontshape.default:n = { \slshape } ,
+
+ setdefaults.usage:n = general ,
+ setdefaults.meta:n = { meta, oarg, code, syntax, keyval, option, defaultval, env, pkg , font, fontsize, fontshape} ,
+
+ unknown.usage:n = general,
+ unknown.code:n =
+ { }, % unknown keys are silently ignored...
+}
+
+\keys_set:nn {codedesc / defaults}{setdefaults}
+
+\NewDocumentCommand \setcodefmt {m} { \keys_set:nn {codedesc / defaults}{#1}}
+
+\keys_define:nn { codedesc / format }
+{
+ meta.usage:n = general,
+ meta.code:n =
+ {
+ \tl_set:Nn \__codedesc_metacolor_tl: { \color{c__codedesc_marg_color} }
+ \tl_set:Nn \__codedesc_typeset_tl:n { \__codedesc_meta:n }
+ \tl_set:Nn \__codedesc_typeset_tl:o { \__codedesc_meta:o }
+ },
+ marg.usage:n = general,
+ marg.meta:n = { meta } ,
+ %
+ %
+ arg.usage:n = general,
+ arg.meta:n = { meta } ,
+ %
+
+ oarg.usage:n = general,
+ oarg.code:n =
+ {
+ \tl_set:Nn \__codedesc_metacolor_tl: { \color{c__codedesc_oarg_color} }
+ \tl_set:Nn \__codedesc_typeset_tl:n { \__codedesc_meta:n }
+ \tl_set:Nn \__codedesc_typeset_tl:o { \__codedesc_meta:o }
+ },
+ %
+ parg.usage:n = general,
+ parg.meta:n = { oarg } ,
+ %
+ xarg.usage:n = general,
+ xarg.meta:n = { oarg } ,
+ %
+
+ code.usage:n = general,
+ code.code:n =
+ {
+ \tl_set:Nn \__codedesc_metacolor_tl: { \color{c__codedesc_code_color} }
+ \tl_set:Nn \__codedesc_typeset_tl:n { \__codedesc_macro_typeset:n }
+ \tl_set:Nn \__codedesc_typeset_tl:o { \__codedesc_macro_typeset:o }
+ },
+ %
+ macro.usage:n = general,
+ macro.meta:n = { code } ,
+ %
+ function.usage:n = general,
+ function.meta:n = { code } ,
+ %
+
+ syntax.usage:n = general,
+ syntax.code:n =
+ {
+ \tl_set:Nn \__codedesc_metacolor_tl: { \color{c__codedesc_syntax_color} }
+ },
+ %
+
+ keyval.usage:n = general,
+ keyval.code:n =
+ {
+ \tl_set:Nn \__codedesc_metacolor_tl: { \color{c__codedesc_keyval_color} }
+ \tl_set:Nn \__codedesc_metashape_tl: { \__codedesc_slshape_tl: }
+ },
+ %
+ key.usage:n = general,
+ key.meta:n = { keyval } ,
+ %
+ keys.usage:n = general,
+ keys.meta:n = { keyval } ,
+ %
+ value.usage:n = general,
+ value.meta:n = { keyval } ,
+ %
+
+ option.usage:n = general,
+ option.code:n =
+ {
+ \tl_set:Nn \__codedesc_metacolor_tl: { \color{c__codedesc_options_color} }
+ },
+ %
+
+ defaultval.usage:n = general,
+ defaultval.code:n =
+ {
+ \tl_set:Nn \__codedesc_metacolor_tl: { \color{c__codedesc_defaultval_color} }
+ },
+ %
+
+ env.usage:n = general,
+ env.code:n =
+ {
+ \tl_set:Nn \__codedesc_metacolor_tl: { \color{c__codedesc_env_color} }
+ \tl_set:Nn \__codedesc_metashape_tl: { \__codedesc_slshape_tl: }
+ },
+ %
+
+ pkg.usage:n = general,
+ pkg.code:n =
+ {
+ \tl_set:Nn \__codedesc_metacolor_tl: { \color{c__codedesc_pkg_color} }
+ \tl_set:Nn \__codedesc_metashape_tl: { \__codedesc_slshape_tl: }
+ },
+ %
+ pack.usage:n = general,
+ pack.meta:n = { pkg } ,
+ %
+
+ sep.usage:n = general,
+ sep.code:n =
+ {
+ \tl_set:Nn \__codedesc_lastsep_tl { ~#1~ }
+ },
+ %
+ comma.usage:n = general,
+ comma.code:n =
+ {
+ \tl_set:Nn \__codedesc_lastsep_tl { ,~ }
+ },
+ %
+ rulecolor.usage:n = general,
+ rulecolor.code:n =
+ {
+ \tl_set:Nn \__codedesc_rulecolor_tl: { \color{#1} }
+ },
+ %
+ new.usage:n = general,
+ new.code:n =
+ {
+ \bool_set_true:N \l__codedesc_descnotes_bool
+ \bool_set_true:N \l__codedesc_descdate_new_bool
+ \tl_set:Nn \l__codedesc_descdate_new_tl {#1}
+ },
+
+ update.usage:n = general,
+ update.code:n =
+ {
+ \bool_set_true:N \l__codedesc_descnotes_bool
+ \bool_set_true:N \l__codedesc_descdate_update_bool
+ \tl_set:Nn \l__codedesc_descdate_update_tl {#1}
+ },
+
+ note.usage:n = general,
+ note.code:n =
+ {
+ \bool_set_true:N \l__codedesc_descnotes_bool
+ \bool_set_true:N \l__codedesc_sidenote_bool
+ \tl_set:Nn \l__codedesc_sidenote_tl {#1}
+ },
+
+ unknown.usage:n = general,
+ unknown.code:n =
+ {
+ \tl_set:Nn \__codedesc_metacolor_tl: { \color{c__codedesc_none_color} }
+ },
+
+}
+
+\cs_new:Npn \__codedesc_metafmt_set:n #1
+ {
+ \tl_set:Nn \__codedesc_rulecolor_tl: { \__codedesc_metacolor_tl: }
+ \tl_set:Nn \__codedesc_metashape_tl: { }
+ \tl_set:Nn \__codedesc_typeset_tl:n { }
+ \tl_set:Nn \__codedesc_typeset_tl:o { \relax }
+ \tl_set:Nn \__codedesc_sep_tl {,\ }
+ \tl_set:Nn \__codedesc_lastsep_tl {\ and\ }
+
+ \bool_set_false:N \l__codedesc_descnotes_bool
+ \bool_set_false:N \l__codedesc_descdate_new_bool
+ \bool_set_false:N \l__codedesc_descdate_update_bool
+ \bool_set_false:N \l__codedesc_sidenote_bool
+
+ \keys_set:nn {codedesc / format}{#1}
+ }
+
+\cs_generate_variant:Nn \__codedesc_metafmt_set:n {o}
+
+\cs_new:Npn \__codedesc_metafmt:n #1
+ {
+ \tl_set:Nn \__codedesc_rulecolor_tl: { \__codedesc_metacolor_tl: }
+ \tl_set:Nn \__codedesc_metashape_tl: { }
+ \tl_set:Nn \__codedesc_typeset_tl:n { }
+ \tl_set:Nn \__codedesc_typeset_tl:o { }
+ \tl_set:Nn \__codedesc_sep_tl {,\ }
+ \tl_set:Nn \__codedesc_lastsep_tl {\ and\ }
+
+ \bool_set_false:N \l__codedesc_descnotes_bool
+ \bool_set_false:N \l__codedesc_descdate_new_bool
+ \bool_set_false:N \l__codedesc_descdate_update_bool
+ \bool_set_false:N \l__codedesc_sidenote_bool
+
+ \keys_set:nn {codedesc / format}{#1}
+ %\tl_show:N \__codedesc_rulecolor_tl
+ \__codedesc_metafmt:
+ }
+
+\cs_generate_variant:Nn \__codedesc_metafmt:n {o}
+
+
+\cs_new:Npn \__codedesc_metafmt:
+ {
+ \__codedesc_metacolor_tl:
+ \__codedesc_metasize_tl:
+ \__codedesc_metafont_tl:
+ \__codedesc_metashape_tl:
+ }
+
+
+\keys_define:nn { codedesc / delimiters }
+{
+ oarg.usage:n = general,
+ oarg.code:n =
+ {
+ \tl_set:Nn \__codedesc_open_delimit_tl {[}
+ \tl_set:Nn \__codedesc_close_delimit_tl {]}
+ },
+ marg.usage:n = general,
+ marg.code:n =
+ {
+ \tl_set:Nn \__codedesc_open_delimit_tl {\{}
+ \tl_set:Nn \__codedesc_close_delimit_tl {\}}
+ },
+ parg.usage:n = general,
+ parg.code:n =
+ {
+ \tl_set:Nn \__codedesc_open_delimit_tl {(}
+ \tl_set:Nn \__codedesc_close_delimit_tl {)}
+ },
+ %
+ xarg.usage:n = general,
+ xarg.code:n =
+ {
+ \tl_set:Nn \__codedesc_open_delimit_tl {<}
+ \tl_set:Nn \__codedesc_close_delimit_tl {>}
+ },
+ %
+ meta.usage:n = general,
+ meta.code:n =
+ {
+ \tl_set:Nn \__codedesc_open_delimit_tl {}
+ \tl_set:Nn \__codedesc_close_delimit_tl {}
+ },
+ %
+ unknown.usage:n = general,
+ unknown.code:n =
+ {
+% \tl_set:Nn \__codedesc_open_delimit_tl {!}
+% \tl_set:Nn \__codedesc_close_delimit_tl {!}
+ },
+ %
+}
+
+
+%%%%%%%
+%%%
+%%% < meta >
+%%%
+%%%%%%%
+\cs_new:Npn \__codedesc_meta:n #1
+ {
+ \ensuremath\langle #1 \ensuremath\rangle
+ }
+
+\cs_generate_variant:Nn \__codedesc_meta:n {o}
+
+%%%%%%%
+%%%
+%%% < meta > 'detokenized'
+%%%
+%%%%%%%
+\cs_new:Npn \__codedesc_meta*:n #1
+ {
+ \ensuremath\langle \tl_to_str:n {#1} \ensuremath\rangle
+ }
+
+
+\cs_generate_variant:cn {__codedesc_meta*:n} {o}
+
+
+
+\cs_new:Npn \__codedesc_macro_typeset:n #1
+ {
+ \tl_set:Ne \l_tmpb_tl {\tl_to_str:n{#1}}
+ \regex_replace_all:nnN {\ }{} \l_tmpb_tl
+ \regex_replace_once:nnNTF {TF}{}\l_tmpb_tl
+ {
+ \l_tmpb_tl\textsl{\underline{TF}}
+ }
+ { \l_tmpb_tl }
+ }
+
+\cs_generate_variant:Nn \__codedesc_macro_typeset:n {o}
+
+
+
+
+
+\cs_new:Npn \__codedesc_list_typeset:nnn #1#2#3
+ {
+ \seq_set_from_clist:Nn \l_tmpa_seq {#1}
+ \bool_set:Nn \l__codedesc_bool {\seq_if_empty_p:N \l_tmpa_seq}
+ \tl_set:Nn \l__codedesc_middle_tl {}
+ \tl_set:Nn \l__codedesc_lastone_tl {}
+ \bool_until_do:Nn \l__codedesc_bool
+ {
+ \seq_pop_left:NNTF \l_tmpa_seq \l_tmpa_tl
+ {
+ \seq_if_empty:NTF \l_tmpa_seq
+ {
+ \l__codedesc_lastone_tl
+ {
+ \__codedesc_metafmt:
+ \__codedesc_typeset_tl:o \l_tmpa_tl
+ }
+ \bool_set_true:N \l__codedesc_bool
+ }
+ {
+ \l__codedesc_middle_tl
+ {
+ \__codedesc_metafmt:
+ \__codedesc_typeset_tl:o \l_tmpa_tl
+ }
+ \tl_set:Nn \l__codedesc_middle_tl {#2}
+ \tl_set:Nn \l__codedesc_lastone_tl {#3}
+ }
+ }
+ {}
+ }
+ }
+
+\cs_generate_variant:Nn \__codedesc_list_typeset:nnn {noo}
+
+
+
+
+\cs_new:Npn \__codedesc_args_typeset:nnnn #1#2#3#4
+ {
+ \seq_set_from_clist:Nn \l_tmpa_seq {#3}
+ \group_begin:
+ \__codedesc_metafmt:n {#1}
+ \seq_map_inline:Nn \l_tmpa_seq {~\!\!#2 \__codedesc_meta:n {##1} #4 }
+ \group_end:
+ }
+
+
+\bool_new:N \l__codedesc_longblock_bool
+\coffin_new:N \l__codedesc_margin_coffin
+\coffin_new:N \l__codedesc_text_coffin
+\coffin_new:N \l__codedesc_syntax_coffin
+\bool_new:N \l__codedesc_syntax_bool
+\dim_new:N \l__codedesc_syntax_wd_dim
+\dim_new:N \l__codedesc_margin_wd_dim
+
+
+
+%%%%%%%%%%%%%%%%%%%
+%%%%
+%%%% User/Document level commands
+%%%%
+%%%%%%%%%%%%%%%%%%%
+
+
+
+\NewDocumentEnvironment {codedescribe}{O{code}m}
+ {
+ \seq_set_from_clist:Nn \l_tmpa_seq {#2}
+ \__codedesc_set_textcolwidth:
+ \hcoffin_set:Nn \l__codedesc_margin_coffin
+ {
+ \__codedesc_metafmt:n {#1}
+
+ \begin{tabular}{@{} l @{} }
+ \__codedesc_hline:nnnn {\__codedesc_rulecolor_tl:}{0.5ex}{2}{0.25ex}
+ \seq_map_inline:Nn \l_tmpa_seq { \__codedesc_typeset_tl:n {##1} \\ }
+ \bool_if:nTF {\l__codedesc_descnotes_bool}
+ {
+ \\[-2.5ex]
+ \__codedesc_hline:nnnn {\color{black}}{0.5ex}{0.25}{0.25ex}
+
+ \bool_if:nT {\l__codedesc_descdate_new_bool}
+ {\scriptsize\color{black}new:~ \l__codedesc_descdate_new_tl\\}
+ \bool_if:nT {\l__codedesc_descdate_update_bool}
+ {\scriptsize\color{black}update:~ \l__codedesc_descdate_update_tl\\}
+ \bool_if:nT {\l__codedesc_sidenote_bool}
+ {\scriptsize\color{black}NB:~ \l__codedesc_sidenote_tl\\}
+ }
+ {}
+ \\[-2.5ex]
+ \__codedesc_hline:nnnn {\__codedesc_rulecolor_tl:}{-0.25ex}{2}{1ex}
+ \end{tabular}
+ }
+ \dim_set:Nn \l__codedesc_margin_wd_dim {\coffin_wd:N \l__codedesc_margin_coffin}
+ \bool_if:nTF { \dim_compare_p:nNn \l__codedesc_margin_wd_dim > \marginparwidth}
+ {
+ \bool_set_true:N \l__codedesc_longblock_bool
+ \dim_set:Nn \l__codedesc_syntax_wd_dim {\l__codedesc_textcolwidth_dim - (\l__codedesc_margin_wd_dim - \marginparwidth) }
+ }
+ {
+ \bool_set_false:N \l__codedesc_longblock_bool
+ \dim_set:Nn \l__codedesc_syntax_wd_dim {\l__codedesc_textcolwidth_dim}
+ }
+ \coffin_clear:N \l__codedesc_syntax_coffin
+ \bool_set_false:N \l__codedesc_syntax_bool
+ \vcoffin_set:Nnw \l__codedesc_text_coffin {\l__codedesc_textcolwidth_dim}
+ \setlength\parindent{0pt}
+ \begin{minipage}[t]{\l__codedesc_textcolwidth_dim}
+ }
+ {
+ \end{minipage}
+ \vcoffin_set_end:
+ \bool_if:NTF \l__codedesc_longblock_bool
+ { % __describeblock starting at marginpar
+ \coffin_join:NnnNnnnn \l__codedesc_syntax_coffin {l}{t} \l__codedesc_margin_coffin {r}{t} {-\marginparsep}{0pt}
+ \coffin_join:NnnNnnnn \l__codedesc_syntax_coffin {l}{b} \l__codedesc_text_coffin {l}{t} {\marginparwidth+\marginparsep}{0pt}%{-0.25\baselineskip}
+ \par\noindent
+ \coffin_typeset:Nnnnn \l__codedesc_syntax_coffin {l}{t} {-\marginparwidth-\marginparsep}{0pt}
+ }
+ { % __describeblock at marginpar
+ \coffin_attach:NnnNnnnn \l__codedesc_syntax_coffin {l}{t} \l__codedesc_margin_coffin {r}{t} {-\marginparsep}{0pt}
+ \coffin_join:NnnNnnnn \l__codedesc_syntax_coffin {l}{b} \l__codedesc_text_coffin {l}{t} {0pt}{0pt}%{-0.25\baselineskip}
+ \par\noindent
+ \coffin_typeset:Nnnnn \l__codedesc_syntax_coffin {l}{t} {0pt}{0pt}
+ }
+ \\[0.25\baselineskip]
+ }
+
+
+
+\NewDocumentEnvironment{codesyntax}{}
+ {
+ \vcoffin_gset:Nnw \l__codedesc_syntax_coffin {\l__codedesc_syntax_wd_dim}
+ \__codedesc_metafmt:n {syntax}
+ \hspace*{2em} %% !!! together with \parindent{-2em}
+ \begin{tabular} { @{} l @{} }
+ \__codedesc_hline:nnnn {\color{white}}{0.5ex}{2}{-1.5ex}
+ \__codedesc_metacolor_tl:
+ \begin{minipage}[t]{\l__codedesc_syntax_wd_dim}
+ \obeylines\obeyspaces\setlength\parindent{-2em}
+ }
+ {
+ \end{minipage}\\[-2.5ex]
+ \\
+ \__codedesc_hline:nnnn {\color{white}}{0ex}{2}{1ex}
+ \end{tabular}
+ %\color{black}
+ \vcoffin_gset_end:
+ }
+
+
+\coffin_new:N \__codedesc_describe_coffin
+\dim_new:N \__codedesc_describelabel_wd_dim
+\dim_new:N \__codedesc_describelist_wd_dim
+\tl_new:N \__codedesc_join_tl:
+\tl_new:N \__codedesc_ragged_tl:
+
+
+
+ \NewDocumentEnvironment{describelist}{O{20mm}m}
+ {
+ %\vspace*{-1.5ex}
+ \mode_if_horizontal:TF
+ {\vspace*{-0.75ex}}
+ {}
+ \__codedesc_set_textcolwidth:
+ \coffin_clear:N \__codedesc_describe_coffin
+ \dim_set:Nn \__codedesc_describelabel_wd_dim {#1}
+ \dim_set:Nn \__codedesc_describelist_wd_dim {\l__codedesc_textcolwidth_dim}
+ \tl_set:Nn \__codedesc_join_tl: {\coffin_attach:NnnNnnnn}
+ \tl_set:Nn \__codedesc_ragged_tl: {\raggedleft}
+ \tl_set:Nn \__codedesc_listkind_tl {#2}
+ }
+ {
+% \par\noindent\coffin_typeset:Nnnnn \__codedesc_describe_coffin {l}{t}{0pt}{10pt}
+ }
+
+\NewDocumentEnvironment{describelist*}{O{20mm}m}
+ {
+ %\vspace*{-1.5ex}
+ \mode_if_horizontal:TF
+ {\vspace*{-1ex}}
+ {}
+ \__codedesc_set_textcolwidth:
+ \coffin_clear:N \__codedesc_describe_coffin
+ \dim_set:Nn \__codedesc_describelabel_wd_dim {#1}
+ \dim_set:Nn \__codedesc_describelist_wd_dim {\l__codedesc_textcolwidth_dim - \__codedesc_describelabel_wd_dim -\marginparsep}
+ \tl_set:Nn \__codedesc_join_tl: {\coffin_join:NnnNnnnn}
+ \tl_set:Nn \__codedesc_ragged_tl: {}
+ \tl_set:Nn \__codedesc_listkind_tl {#2}
+ }
+ {
+% \par\noindent\coffin_typeset:Nnnnn \__codedesc_describe_coffin {l}{t}{0pt}{10pt}
+ }
+
+\NewDocumentCommand \describe {mm}
+ {
+
+ \hcoffin_set:Nn \l_tmpb_coffin
+ {
+ \__codedesc_metafmt:o { \__codedesc_listkind_tl }
+ \__codedesc_ragged_tl: \__codedesc_typeset_tl:n {#1}
+ }
+
+ \dim_compare:nNnTF {\coffin_wd:N \l_tmpb_coffin} > {\__codedesc_describelabel_wd_dim}
+ {
+ \vcoffin_set:Nnn \l_tmpa_coffin
+ { \__codedesc_describelabel_wd_dim }
+ { ~\ ~ }
+ \coffin_attach:NnnNnnnn
+ \l_tmpa_coffin {r}{t}
+ \l_tmpb_coffin {r}{t}
+ {0pt}{0pt}
+
+ }
+ {
+ \vcoffin_set:Nnn \l_tmpa_coffin
+ { \__codedesc_describelabel_wd_dim }
+ {
+ \__codedesc_metafmt:o { \__codedesc_listkind_tl }
+ \noindent\__codedesc_ragged_tl: \__codedesc_typeset_tl:n {#1}
+ }
+ }
+
+ \vcoffin_set:Nnn \l_tmpb_coffin
+ { \__codedesc_describelist_wd_dim }
+ {
+ \noindent
+ \begin{minipage}[t]{ \__codedesc_describelist_wd_dim }
+ #2
+ \end{minipage}
+ }
+
+
+ \__codedesc_join_tl:
+ \l_tmpb_coffin {l}{t}
+ \l_tmpa_coffin {r}{t}
+ {-\marginparsep}{0pt}
+
+ \mode_if_horizontal:TF
+ {
+ \\
+% \tl_set:Nn \l_tmpa_tl {~\ ~}
+ }
+ {
+% \tl_set:Nn \l_tmpa_tl {~\ ~}
+ }
+ \noindent%\vspace*{-1ex}
+ \coffin_typeset:Nnnnn
+ \l_tmpb_coffin {l}{t} {0pt}{0pt}
+ \\[-0.5\baselineskip]
+
+ }
+
+
+
+\NewDocumentCommand \typesetmeta {m} {\__codedesc_meta:n {#1}}
+
+\cs_new_eq:NN \tsmeta \typesetmeta
+
+
+\NewDocumentCommand \typesetargs {O{meta}m}
+ {
+ \keys_set:nn {codedesc / delimiters}{#1}
+ \__codedesc_args_typeset:nnnn {#1} \__codedesc_open_delimit_tl {#2} \__codedesc_close_delimit_tl
+ }
+
+\cs_new_eq:NN \tsargs \typesetargs
+
+
+
+\NewDocumentCommand \typesetmacro {mO{}m}
+ {
+ \__codedesc_metafmt_set:n {code} %.... argh!
+ \__codedesc_list_typeset:nnn{#1}{,~}{,~}
+% \__codedesc_macro_typeset:n{#1}
+ \,\__codedesc_args_typeset:nnnn {oarg} [ {#2} ]
+ \__codedesc_args_typeset:nnnn {marg} \{ {#3} \}
+ }
+\cs_new_eq:NN \tsmacro \typesetmacro
+
+
+\NewDocumentCommand \typesetverb {O{code}m}
+ {
+ \group_begin:
+ \__codedesc_metafmt:n {#1}
+ \tl_to_str:n {#2}
+ \group_end:
+ }
+\cs_new_eq:NN \tsverb \typesetverb
+
+\NewDocumentCommand \typesetobj {O{code}m}
+ {
+ \__codedesc_metafmt_set:n {#1}
+ \__codedesc_list_typeset:noo{#2}{\__codedesc_sep_tl}{\__codedesc_lastsep_tl}
+ }
+
+\cs_new_eq:NN \tsobj \typesetobj
+
+
+\NewDocumentCommand \typesetmarginnote {m}{\marginpar{{\scriptsize\raggedleft #1 \par}}}
+\cs_new_eq:NN \tsmarginnote \typesetmarginnote
+
+
+\NewDocumentEnvironment {tsremark} {O{Note:}}
+ {
+% \par\vspace*{0.5\baselineskip}
+ \mode_if_horizontal:TF
+ {\par\vspace*{0.25\baselineskip}}%\vspace*{-1.5ex}}
+ {\vspace*{0.75\baselineskip}}
+ \__codedesc_set_textcolwidth:
+ \group_begin:
+ \noindent\hspace{0.2\l__codedesc_textcolwidth_dim}
+ \begin{minipage}{0.8\l__codedesc_textcolwidth_dim}
+ \setlength\parindent{0pt}\small
+ \textsl{\textbf{#1}} %\dim_to_decimal:n {\linewidth}
+ }
+ {
+ \end{minipage}
+ \group_end:
+ \par
+ }
+
+
+%%%% ARGH !!!!
+
+\keys_define:nn { codedesc / title }
+ {
+ title .usage:n = general ,
+ title .tl_set:N = \l__codedesc_title_tl ,
+
+ author .usage:n = general ,
+ author .tl_set:N = \l__codedesc_author_tl ,
+
+ date .usage:n = general ,
+ date .tl_set:N = \l__codedesc_descdate_tl ,
+
+ abstract .usage:n = general ,
+ abstract .tl_set:N = \l__codedesc_abstract_tl ,
+ }
+
+
+\cs_new:Npn \__codedesc_make_title: {%
+ \newpage
+ \null
+ \vskip 2em%
+ \begin{center}%
+ \let \footnote \thanks
+ {\LARGE \l__codedesc_title_tl \par}%
+ \vskip 1.5em%
+ {\large
+ \lineskip .5em%
+ \begin{tabular}[t]{c}%
+ \l__codedesc_author_tl
+ \end{tabular}\par}%
+ \vskip 1em%
+ {\large \l__codedesc_descdate_tl}%
+ \end{center}%
+ \par
+ \vskip 1.5em
+}
+
+
+%%%ARGH !!!!!
+%%% 'adapted' from 'abstract.cls'
+%%%
+%%%
+
+\makeatletter
+
+
+\NewDocumentCommand \typesettitle {m}
+ {
+ \keys_set:nn {codedesc / title}{#1}
+
+ \group_begin:
+ \renewcommand\thefootnote{\@fnsymbol\c@footnote}%
+ \def\@makefnmark{\rlap{\@textsuperscript{\normalfont\@thefnmark}}}%
+ \long\def\@makefntext##1{\parindent 1em\noindent
+ \hb@xt@1.8em{%
+ \hss\@textsuperscript{\normalfont\@thefnmark}}##1}%
+ \if@twocolumn
+ \ifnum \col@number=\@ne
+ \__codedesc_make_title:
+ \else
+ \twocolumn[\__codedesc_make_title:]%
+ \fi
+ \else
+ \newpage
+ \global\@topnum\z@ % Prevents figures from going at top of page.
+ \__codedesc_make_title:
+ \fi
+ \thispagestyle{plain}\@thanks
+ \group_end:
+ }
+
+\cs_new_eq:NN \tstitle \typesettitle
+
+
+\NewDocumentEnvironment{tsabstract}{}
+ {
+ \if@twocolumn
+ \section*{\abstractname}%
+ \else
+ \small
+ \begin{center}%
+ {\bfseries \abstractname\vspace{-.5em}\vspace{\z@}}%
+ \end{center}%
+ \quotation
+ \fi
+ }
+ {
+ \if@twocolumn\else\endquotation\fi
+ }
+\cs_new_eq:NN \typesetabstract \tsabstract
+\cs_new_eq:NN \endtypesetabstractend \endtsabstract
+
+\makeatother
+
+
+
diff --git a/macros/latex/contrib/codedescribe/latex/codelisting.sty b/macros/latex/contrib/codedescribe/latex/codelisting.sty
new file mode 100644
index 0000000000..ede0132e3e
--- /dev/null
+++ b/macros/latex/contrib/codedescribe/latex/codelisting.sty
@@ -0,0 +1,691 @@
+%%%==============================================================================
+%% Copyright 2023 by Alceu Frigeri
+%%
+%% This work may be distributed and/or modified under the conditions of
+%%
+%% * The [LaTeX Project Public License](http://www.latex-project.org/lppl.txt),
+%% version 1.3c (or later), and/or
+%% * The [GNU Affero General Public License](https://www.gnu.org/licenses/agpl-3.0.html),
+%% version 3 (or later)
+%%
+%% This work has the LPPL maintenance status *maintained*.
+%%
+%% The Current Maintainer of this work is Alceu Frigeri
+%%
+%% This is version 1.0 (2023/05/11)
+%%
+%% The list of files that compose this work can be found in the README.md file at
+%% https://ctan.org/pkg/codedescribe
+%%
+%%%==============================================================================
+\NeedsTeXFormat{LaTeX2e}[2022/06/01]
+
+\RequirePackage{ expl3 }
+\ProvidesExplPackage
+ {codelisting}
+ {2023/05/11}
+ {1.0}
+ {LaTeX Code Listing}
+
+\prop_if_exist:NTF \g__codedesc_pkg_prop
+ {}
+ { \prop_new:N \g__codedesc_pkg_prop }
+
+\prop_put_from_keyval:Nn \g__codedesc_pkg_prop
+ {
+ codelist . name = codelisting ,
+ codelist . prefix = codelist ,
+ codelist . date = 2023/05/11 ,
+ codelist . version = 1.0 ,
+ codelist . description = LaTeX Code Listing
+ }
+
+\cs_gset:Npn \__codedesc_pkg_info:nn #1#2
+ {
+ \prop_item:Nn \g__codedesc_pkg_prop {#1.#2}
+ }
+
+\RequirePackage{listings,scontents}
+
+
+
+\dim_new:N \l__codelist_demo_parindent_dim
+\dim_new:N \l__codelist_org_parindent_dim
+
+\dim_set:Nn\l__codelist_org_parindent_dim{\parindent}
+
+
+\colorlet{c__codelist_lightcyan_color}{white!97!cyan}
+\colorlet{c__codelist_lightgray_color}{white!97!black}
+\definecolor{c__codelist_grayblack_color}{rgb}{0.8,0.8,0.8}
+
+\colorlet{c__codelist_darkred_color}{red!45!black!100}
+\colorlet{c__codelist_darkgreen_color}{green!45!black!100}
+\colorlet{c__codelist_darkblue_color}{blue!40!black!100}
+\colorlet{c__codelist_darkmagenta_color}{magenta!45!black!100}
+\colorlet{c__codelist_darkyellow_color}{yellow!45!black!100}
+\colorlet{c__codelist_darkteal_color}{teal!45!black!100}
+
+\colorlet{c__codelist_redishblack_color}{red!60!black!100}
+\colorlet{c__codelist_greenishblack_color}{green!65!black!100}
+\colorlet{c__codelist_blueishblack_color}{blue!85!black!100}
+\colorlet{c__codelist_magentaishblack_color}{magenta!65!black!100}
+\colorlet{c__codelist_yellowishblack_color}{yellow!65!black!100}
+\colorlet{c__codelist_tealishblack_color}{teal!65!black!100}
+
+\colorlet{c__codelist_redblack_color}{red!90!black!100}
+\colorlet{c__codelist_greenblack_color}{green!90!black!100}
+\colorlet{c__codelist_blueblack_color}{blue!90!black!100}
+\colorlet{c__codelist_magentablack_color}{magenta!90!black!100}
+\colorlet{c__codelist_yellowblack_color}{yellow!80!black!100}
+\colorlet{c__codelist_tealblack_color}{teal!90!black!100}
+
+\colorlet{c__codelist_gray_color}{gray}
+
+\tl_set:Nn \l__codelist_bckgnd_color_default_tl{c__codelist_lightgray_color}%
+\tl_set:Nn \l__codelist_string_color_default_tl{c__codelist_darkteal_color}
+\tl_set:Nn \l__codelist_comment_color_default_tl{c__codelist_darkgreen_color}
+
+\tl_set:Nn \l__codelist_texcs_color_default_tl{c__codelist_darkblue_color}
+\tl_set:Nn \l__codelist_keywd_color_default_tl{c__codelist_darkgreen_color}
+\tl_set:Nn \l__codelist_emph_color_default_tl{c__codelist_darkred_color}
+
+\tl_set:Nn \l__codelist_texcsB_color_default_tl{c__codelist_blueishblack_color}
+\tl_set:Nn \l__codelist_keywdB_color_default_tl{c__codelist_greenishblack_color}
+\tl_set:Nn \l__codelist_emphB_color_default_tl{c__codelist_redishblack_color}
+
+\tl_set:Nn \l__codelist_texcsC_color_default_tl{c__codelist_blueblack_color}
+\tl_set:Nn \l__codelist_keywdC_color_default_tl{c__codelist_greenblack_color}
+\tl_set:Nn \l__codelist_emphC_color_default_tl{c__codelist_redblack_color}
+
+\tl_set:Nn \l__codelist_rule_color_default_tl{c__codelist_gray_color}
+\tl_set:Nn \l__codelist_number_color_default_tl{c__codelist_gray_color}
+
+\keys_define:nn {CodeListingOptions} {
+ settexcs .usage:n = general,
+ settexcs .code:n = { \tl_set:Nn \l__codelist_texcs_tl {#1} },
+ settexcs .default:n = ,
+
+ texcs .usage:n = general,
+ texcs .code:n = { \tl_put_right:Nn \l__codelist_texcs_tl { , #1} },
+ texcs .default:n = ,
+
+ texcsstyle .usage:n = general,
+ texcsstyle .code:n = { \tl_set:Nn \l__codelist_texcsstyle_tl {#1} },
+ texcsstyle .default:n = \bfseries\color{ \l__codelist_texcs_color_default_tl },
+
+
+ settexcs2 .usage:n = general,
+ settexcs2 .code:n = { \tl_set:Nn \l__codelist_texcsB_tl {#1} },
+ settexcs2 .default:n = ,
+
+ texcs2 .usage:n = general,
+ texcs2 .code:n = { \tl_put_right:Nn \l__codelist_texcsB_tl { , #1} },
+ texcs2 .default:n = ,
+
+ texcs2style .usage:n = general,
+ texcs2style .code:n = { \tl_set:Nn \l__codelist_texcsBstyle_tl {#1} },
+ texcs2style .default:n = \bfseries\color{ \l__codelist_texcs_color_default_tl } ,
+
+
+ settexcs3 .usage:n = general,
+ settexcs3 .code:n = { \tl_set:Nn \l__codelist_texcsC_tl {#1} },
+ settexcs3 .default:n = ,
+
+ texcs3 .usage:n = general,
+ texcs3 .code:n = { \tl_put_right:Nn \l__codelist_texcsC_tl { , #1} },
+ texcs3 .default:n = ,
+
+ texcs3style .usage:n = general,
+ texcs3style .code:n = { \tl_set:Nn \l__codelist_texcsCstyle_tl {#1} },
+ texcs3style .default:n = \bfseries\color{ \l__codelist_texcsC_color_default_tl } ,
+
+
+ setkeywd .usage:n = general,
+ setkeywd .code:n = { \tl_set:Nn \l__codelist_keywd_tl {#1} },
+ setkeywd .default:n = ,
+
+ keywd .usage:n = general,
+ keywd .code:n = { \tl_put_right:Nn \l__codelist_keywd_tl { , #1} },
+ keywd .default:n = ,
+
+ keywdstyle .usage:n = general,
+ keywdstyle .code:n = { \tl_set:Nn \l__codelist_keywdstyle_tl {#1} },
+ keywdstyle .default:n = \bfseries\color{ \l__codelist_keywd_color_default_tl } ,
+
+ setkeywd2 .usage:n = general,
+ setkeywd2 .code:n = { \tl_set:Nn \l__codelist_keywdB_tl {#1} },
+ setkeywd2 .default:n = ,
+
+ keywd2 .usage:n = general,
+ keywd2 .code:n = { \tl_put_right:Nn \l__codelist_keywdB_tl { , #1} },
+ keywd2 .default:n = ,
+
+ keywd2style .usage:n = general,
+ keywd2style .code:n = { \tl_set:Nn \l__codelist_keywdBstyle_tl {#1} },
+ keywd2style .default:n = \bfseries\color{ \l__codelist_keywdB_color_default_tl } ,
+
+ setkeywd3 .usage:n = general,
+ setkeywd3 .code:n = { \tl_set:Nn \l__codelist_keywdC_tl {#1} },
+ setkeywd3 .default:n = ,
+
+ keywd3 .usage:n = general,
+ keywd3 .code:n = { \tl_put_right:Nn \l__codelist_keywdC_tl { , #1} },
+ keywd3 .default:n = ,
+
+ keywd3style .usage:n = general,
+ keywd3style .code:n = { \tl_set:Nn \l__codelist_keywdCstyle_tl {#1} },
+ keywd3style .default:n = \bfseries\color{ \l__codelist_keywdC_color_default_tl } ,
+
+ setemph .usage:n = general,
+ setemph .code:n = { \tl_set:Nn \l__codelist_emph_tl {#1} },
+ setemph .default:n = ,
+
+ emph .usage:n = general,
+ emph .code:n = { \tl_put_right:Nn \l__codelist_emph_tl { , #1} },
+ emph .default:n = ,
+
+ emphstyle .usage:n = general,
+ emphstyle .code:n = { \tl_set:Nn \l__codelist_emphstyle_tl {#1} },
+ emphstyle .default:n = \bfseries\color{ \l__codelist_emph_color_default_tl } ,
+
+ setemph2 .usage:n = general,
+ setemph2 .code:n = { \tl_set:Nn \l__codelist_emphB_tl {#1} },
+ setemph2 .default:n = ,
+
+ emph2 .usage:n = general,
+ emph2 .code:n = { \tl_put_right:Nn \l__codelist_emphB_tl { , #1} },
+ emph2 .default:n = ,
+
+ emph2style .usage:n = general,
+ emph2style .code:n = { \tl_set:Nn \l__codelist_emphBstyle_tl {#1} },
+ emph2style .default:n = \bfseries\color{ \l__codelist_emphB_color_default_tl } ,
+
+ setemph3 .usage:n = general,
+ setemph3 .code:n = { \tl_set:Nn \l__codelist_emphC_tl {#1} },
+ setemph3 .default:n = ,
+
+ emph3 .usage:n = general,
+ emph3 .code:n = { \tl_put_right:Nn \l__codelist_emphC_tl { , #1} },
+ emph3 .default:n = ,
+
+ emph3style .usage:n = general,
+ emph3style .code:n = { \tl_set:Nn \l__codelist_emphCstyle_tl {#1} },
+ emph3style .default:n = \bfseries\color{ \l__codelist_emphC_color_default_tl } ,
+
+ stringstyle .usage:n = general,
+ stringstyle .code:n = { \tl_set:Nn \l__codelist_stringstyle_tl {#1} },
+ stringstyle .default:n = \color{ \l__codelist_string_color_default_tl } ,
+
+ commentstyle .usage:n = general,
+ commentstyle .code:n = { \tl_set:Nn \l__codelist_commentstyle_tl {#1} },
+ commentstyle .default:n = \color{ \l__codelist_comment_color_default_tl } ,
+
+ bckgndcolor .usage:n = general,
+ bckgndcolor .code:n = { \tl_set:Nn \l__codelist_bckgndcolor_tl {#1} },
+ bckgndcolor .default:n = \color{ \l__codelist_bckgnd_color_default_tl } ,
+
+ rulecolor .usage:n = general,
+ rulecolor .code:n = { \tl_set:Nn \l__codelist_rulecolor_tl {#1} },
+ rulecolor .default:n = \color{ \l__codelist_rule_color_default_tl } ,
+
+ numbers .usage:n = general,
+ numbers .code:n = { \tl_set:Nn \l__codelist_numbers_tl {#1} },
+ numbers .default:n = none,
+
+ numberstyle .usage:n = general,
+ numberstyle .code:n = { \tl_set:Nn \l__codelist_numberstyle_tl {#1} },
+ numberstyle .default:n = \tiny\color{ \l__codelist_number_color_default_tl },
+
+
+ parindent .usage:n = general,
+ parindent .code:n = { \dim_set:Nn\l__codelist_demo_parindent_dim{#1} },
+ parindent .default:n = \l__codelist_org_parindent_dim,
+
+
+ codeprefix .usage:n = general,
+ codeprefix .code:n = { \tl_set:Nn \l__codelist_codeprefix_tl {#1} },
+ codeprefix .default:n = \LaTeX\ Code:,
+
+ resultprefix .usage:n = general,
+ resultprefix .code:n = { \tl_set:Nn \l__codelist_resultprefix_tl {#1} },
+ resultprefix .default:n = \LaTeX\ Result:,
+
+ ruleht .usage:n = general,
+ ruleht .code:n = { \tl_set:Nn \l__codelist_ruleheight_tl {#1} },
+ ruleht .default:n = 1,
+
+ default .usage:n = general,
+ default .meta:n = {
+ settexcs , texcsstyle ,
+ settexcs2 , texcs2style ,
+ settexcs3 , texcs3style ,
+ setkeywd , keywdstyle ,
+ setkeywd2 , keywd2style ,
+ setkeywd3 , keywd3style ,
+ setemph , emphstyle ,
+ setemph2 , emph2style ,
+ setemph3 , emph3style ,
+ stringstyle ,
+ commentstyle ,
+ bckgndcolor , rulecolor ,
+ numbers , numberstyle ,
+ parindent ,
+ codeprefix , resultprefix ,
+ ruleht ,
+ },
+
+}
+
+\cs_new:Npn \__codelist_set_options:n #1 {\keys_set:nn {CodeListingOptions}{#1}}
+
+\__codelist_set_options:n{default}
+
+
+%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%
+%%%
+%%% From doctools.dtx file
+%%% lstlistings 'definitions'
+%%%
+%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%
+
+%%% listings
+%
+\lstdefinestyle{lstStyleDefault}{
+ %%% appearance
+ ,basicstyle=\small\ttfamily % Standardschrift
+ %%% Space and placement
+ ,floatplacement=tbp % is used as float place specifier
+ ,aboveskip=\medskipamount % define the space above and
+ ,belowskip=\medskipamount % below displayed listings.
+ ,lineskip=0pt % specifies additional space between lines in listings.
+ ,boxpos=c % c,b,t
+ ,showlines=false % prints empty lines at the end of listings
+ %%% characters
+ ,extendedchars=true % allows or prohibits extended characters
+ % in listings, that means (national)
+ % characters of codes 128-255.
+ ,upquote=true % determines printing of quotes
+ ,tabsize=2, % chars of tab
+ ,showtabs=false % do not show tabs
+ ,showspaces=false % do not show spaces
+ ,showstringspaces=false % do not show blank spaces in string
+ %%% Line numbers
+ ,numbers=none % left, right, none
+ %%% Captions
+ ,numberbychapter=true %
+ ,captionpos=b % t,b
+ ,abovecaptionskip=\smallskipamount % the vertical space respectively above
+ ,belowcaptionskip=\smallskipamount % or below each caption
+ %%% Margins and line shape
+ ,linewidth=\linewidth % defines the base line width for listings.
+ ,xleftmargin=0pt % extra margins
+ ,xrightmargin=0pt %
+ ,resetmargins=false % indention from list environments like enumerate
+ % or itemize is reset, i.e. not used.
+ ,breaklines=true % line breaking of long lines.
+ ,breakatwhitespace=false % allows line breaks only at white space.
+ ,breakindent=0pt % is the indention of the second, third, ...
+ % line of broken lines.
+ ,breakautoindent=true % apply intendation
+ ,columns=flexible %
+ ,keepspaces=true %
+}
+
+
+\lstdefinestyle{lstDocStyleBase}{
+ %%% base style
+ ,style=lstStyleDefault
+
+ ,commentstyle=\slshape
+ %%% Line numbers
+ ,numbers=left % left, right, none
+ ,stepnumber=1 % seperation between numbers
+ ,numberfirstline=false % number first line always
+ %
+ ,numberstyle={\l__codelist_numberstyle_tl} % style of numbers
+ ,numbersep=5pt % distance to text
+ ,numberblanklines=true %
+ %%% language
+ ,language = [LaTeX]TeX
+ %%% commands
+ % LaTeX programming
+ ,moretexcs={setlength,usepackage,newcommand,renewcommand,providecommand,RequirePackage,SelectInputMappings,ifpdftex,ifpdfoutput,AtBeginEnvironment,ProvidesPackage},
+ ,moretexcs={maketitle,text,includegraphics,chapter,section,subsection,
+ subsubsection,paragraph,textmu,enquote,blockquote,ding,mathds,ifcsdef,Bra,Ket,Braket,subcaption,lettrine,mdfsetup,captionof,listoffigures,listoftables,tableofcontents,appendix}
+ ,moretexcs={newcolumntype,rowfont,taburowcolors,rowcolor,rowcolors,bottomrule,
+ toprule,midrule,}
+ ,moretexcs={hypersetup}
+ ,moretexcs={gls,printglossary,glsadd,newglossaryentry,newacronym}
+ ,moretexcs={mainmatter,frontmatter,geometry,KOMAoptions,setkomafont,addtokomafont}
+ ,moretexcs={si,SI,sisetup,unit,unitfrac,micro}
+ ,moretexcs={newblock,ExecuteBibliographyOptions,addbibresource}
+ ,moretexcs={operatorname,frac,sfrac,dfrac,DeclareMathOperator,mathcal,underset}
+ ,moretexcs={democodefile,package,cs,command,env,DemoError,PrintDemo}
+ ,moretexcs={theadstart,tbody,tsubheadstart,tsubhead,tend}
+ ,moretexcs={DefineCodeSection,SetCodeSection,BeginCodeSection,EndCodeSection}
+ ,moretexcs={IfDefined,IfUndefined,IfElseDefined,IfElseUndefined,IfMultDefined,IfNotDraft,IfNotDraftElse,IfDraft,IfPackageLoaded,IfElsePackageLoaded,IfPackageNotLoaded,IfPackagesLoaded,IfPackagesNotLoaded,ExecuteAfterPackage,ExecuteBeforePackage,IfTikzLibraryLoaded,IfColumntypeDefined,IfColumntypesDefined,IfColorDefined,IfColorsDefined,IfMathVersionDefined,SetTemplateDefinition,UseDefinition,IfFileExists,iflanguage}
+ ,moretexcs={setuptablefontsize,tablefontsize,setuptablestyle,tablestyle, setuptablecolor,tablecolor,disablealternatecolors, tablealtcolored,tbegin,tbody,tend,thead, theadstart,tsubheadstart,tsubhead,theadrow,tsubheadrow,resettablestyle,theadend,tsubheadend,tableitemize,PreserveBackslash}
+ ,moretexcs={todo,missingfigure}
+ ,moretexcs={lstloadlanguages,lstdefinestyle,lstset}
+ ,moretexcs={indexsetup}
+ ,moretexcs={newglossarystyle,glossarystyle,deftranslation,newglossary}
+ ,moretexcs={usetikzlibrary}
+ ,moretexcs={definecolor,colorlet}
+ ,moretexcs={captionsetup,DeclareCaptionStyle}
+ ,moretexcs={floatsetup}
+ ,moretexcs={EnableCrossrefs,DisableCrossrefs,PageIndex,CodelineIndex,CodelineNumbered}
+ ,moretexcs={cref,Cref,vref,eqnref,figref,tabref,secref,chapref}
+}
+
+%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%
+%%%
+%%% From doctools.dtx file
+%%% lstlistings 'definitions'
+%%%
+%%%%%%%%%%%%%%%%%%%%%
+%%%%%%%%%%%%%%%%%%%%%
+
+\lstloadlanguages{[LaTeX]TeX}
+\lstdefinestyle{codestyle}{
+ style = lstDocStyleBase,
+ language = [LaTeX]{TeX},
+ numbers = none, %\l__codelist_numbers_tl,
+ rulecolor = {\l__codelist_rulecolor_tl},
+ backgroundcolor = {\l__codelist_bckgndcolor_tl},
+ stringstyle = {\l__codelist_stringstyle_tl},
+ commentstyle = {\l__codelist_commentstyle_tl},
+ framerule = 0pt, %0.4pt,
+ nolol = true,
+ frame = none,
+ aboveskip = 0pt,%-2ex,
+ belowskip = 0pt,%-2ex,
+ basicstyle = \footnotesize\ttfamily ,
+ rulesep = 0pt,
+ breaklines = true,
+ breakindent = 3em,
+ moretexcs = {\l__codelist_texcs_tl},
+ moretexcs = [2] {\l__codelist_texcsB_tl},
+ moretexcs = [3] {\l__codelist_texcsC_tl},
+ texcsstyle = * {\l__codelist_texcsstyle_tl},
+ texcsstyle = *[2] {\l__codelist_texcsBstyle_tl},
+ texcsstyle = *[3] {\l__codelist_texcsCstyle_tl},
+ morekeywords = {\l__codelist_keywd_tl},
+ morekeywords = [2] {\l__codelist_keywdB_tl},
+ morekeywords = [3] {\l__codelist_keywdC_tl},
+ keywordstyle = {\l__codelist_keywdstyle_tl},
+ keywordstyle = [2] {\l__codelist_keywdBstyle_tl},
+ keywordstyle = [3] {\l__codelist_keywdCstyle_tl},
+ emph = {\l__codelist_emph_tl},
+ emph = [2] {\l__codelist_emphB_tl},
+ emph = [3] {\l__codelist_emphC_tl},
+ emphstyle = {\l__codelist_emphstyle_tl},
+ emphstyle = [2] {\l__codelist_emphBstyle_tl},
+ emphstyle = [3] {\l__codelist_emphCstyle_tl},
+}
+\lstset{style=codestyle}
+
+\cs_generate_variant:Nn \keys_set:nn {nx}
+%%%
+%%% extending scontents package options !!!!
+%%% changing it's default key handling from \msg_error to 'store-env'.
+%%%
+\keys_define:nn { scontents / scontents}
+ {
+ st.meta:nn = { scontents } { store-env = #1 },
+ st.value_required:n = true,
+ store-at.meta:nn = { scontents } { store-env = #1 },
+ store-at.value_required:n = true,
+ unknown . undefine: ,
+ unknown . code:n = { \keys_set:nx {scontents}{ store-env = \l_keys_key_str} }
+ }
+
+\newenvsc{codestore}
+
+
+
+%%%%%%%%%
+%%%
+%%% yep, the <verbatimsc> environment gets redefined
+%%% each and every time (to change the 'listings' defaults/highlights !
+%%%
+%%%
+%%%%%%%%%
+
+\cs_undefine:c{verbatimsc}
+\cs_undefine:c{verbatimsc@@}
+\cs_undefine:c{verbatimsc@}
+\cs_undefine:c{endverbatimsc}
+\lstnewenvironment{verbatimsc}{\lstset{style=codestyle}}{}
+
+\cs_new:Npn \__codelist_set_verbsc:n #1
+ {
+ \cs_undefine:c{verbatimsc}
+ \cs_undefine:c{verbatimsc@@}
+ \cs_undefine:c{verbatimsc@}
+ \cs_undefine:c{endverbatimsc}
+
+ \__codelist_set_options:n{#1}
+
+ \lstnewenvironment{verbatimsc}
+ {
+ \exp_args:Ne \lstset
+ {
+ style=codestyle,
+ moretexcs = {\l__codelist_texcs_tl},
+ moretexcs =[2] {\l__codelist_texcsB_tl},
+ moretexcs =[3] {\l__codelist_texcsC_tl},
+ morekeywords = {\l__codelist_keywd_tl},
+ morekeywords =[2] {\l__codelist_keywdB_tl},
+ morekeywords =[3] {\l__codelist_keywdC_tl},
+ emph = {\l__codelist_emph_tl},
+ emph =[2] {\l__codelist_emphB_tl},
+ emph =[3] {\l__codelist_emphC_tl},
+ numbers = \l__codelist_numbers_tl
+ }
+ }
+ {}
+ }
+
+%%% !!! DEPRECTAED !!!
+\NewDocumentEnvironment {verbsc} {m}
+ {
+ \cs_undefine:c{verbatimsc}
+ \cs_undefine:c{verbatimsc@@}
+ \cs_undefine:c{verbatimsc@}
+ \cs_undefine:c{endverbatimsc}
+
+ \__codelist_set_options:n{#1}
+
+ \lstnewenvironment{verbatimsc}
+ {
+ \exp_args:Ne \lstset
+ {
+ style=codestyle,
+ moretexcs = {\l__codelist_texcs_tl},
+ moretexcs =[2] {\l__codelist_texcsB_tl},
+ moretexcs =[3] {\l__codelist_texcsC_tl},
+ morekeywords = {\l__codelist_keywd_tl},
+ morekeywords =[2] {\l__codelist_keywdB_tl},
+ morekeywords =[3] {\l__codelist_keywdC_tl},
+ emph = {\l__codelist_emph_tl},
+ emph =[2] {\l__codelist_emphB_tl},
+ emph =[3] {\l__codelist_emphC_tl},
+ numbers = \l__codelist_numbers_tl
+ }
+ }
+ {}
+ }
+ { } %environment's end
+
+
+\NewDocumentCommand \setcodekeys {m}
+ {
+ \keys_set:nn {CodeListingOptions}{#1}
+ }
+
+\NewDocumentCommand{\typesetcode}{sO{}m}
+ {
+ \__codedesc_set_textcolwidth:
+ \group_begin:
+ \par\noindent
+ \bool_if:nTF {#1}
+ { % paragraph wide
+ \dim_set:Nn \l__codedesc_width_dim {\l__codedesc_textcolwidth_dim}
+ \dim_set:Nn \l__codedesc_offset_dim {0pt}
+ }
+ { % half as wide
+ \dim_set:Nn \l__codedesc_width_dim {0.5\l__codedesc_textcolwidth_dim}
+ \dim_set:Nn \l__codedesc_offset_dim {0.5\l__codedesc_width_dim}
+ }
+
+ \__codelist_set_verbsc:n {#2}
+ \vcoffin_set:Nnn \__codelist_display_label_coffin {\l__codedesc_width_dim}
+ {
+ \raggedright
+ \l__codelist_codeprefix_tl
+ }
+ \vcoffin_set:Nnn \__codelist_display_coffin {\l__codedesc_width_dim}
+ {
+ \raggedright
+ \typestored{#3}
+ }
+ \coffin_join:NnnNnnnn
+ \__codelist_display_label_coffin {l}{b}
+ \__codelist_display_coffin {l}{t}
+ {0pt}{-1ex}
+ \vspace*{-1ex}
+ \coffin_typeset:Nnnnn \__codelist_display_label_coffin {l}{t}{\l__codedesc_offset_dim}{0pt}
+ \vspace*{2ex}
+ \par
+ \group_end:
+ }
+
+\cs_new_eq:NN \tscode \typesetcode
+
+
+
+\coffin_new:N \__codelist_display_coffin
+\coffin_new:N \__codelist_display_label_coffin
+\coffin_new:N \__codelist_demo_coffin
+\coffin_new:N \__codelist_demo_label_coffin
+
+\dim_new:N \l__codedesc_width_dim
+\dim_new:N \l__codedesc_offset_dim
+
+\NewDocumentCommand{\typesetdemo}{sO{}mO{1ex}}
+ {
+ \__codedesc_set_textcolwidth:
+ \group_begin:
+ \par\setlength\parindent{0pt}
+ \bool_if:nTF {#1}
+ { % one below the other
+ \dim_set:Nn \l__codedesc_width_dim {\l__codedesc_textcolwidth_dim}
+ \tl_set:Nn \l__codedesc_rule_in_tl {\__codedesc_rule:n {\l__codelist_ruleheight_tl}}
+ \tl_set:Nn \l__codedesc_rule_out_tl {}
+ }
+ { % side-by-side
+ \dim_set:Nn \l__codedesc_width_dim {0.5\l__codedesc_textcolwidth_dim}
+ \tl_set:Nn \l__codedesc_rule_in_tl {}
+ \tl_set:Nn \l__codedesc_rule_out_tl {\__codedesc_rule:n {\l__codelist_ruleheight_tl}}
+ }
+
+ \__codelist_set_verbsc:n {#2}
+ \vcoffin_set:Nnn \__codelist_display_label_coffin {\l__codedesc_width_dim}
+ {
+ \raggedright
+ \l__codelist_codeprefix_tl
+ }
+ \vcoffin_set:Nnn \__codelist_display_coffin {\l__codedesc_width_dim}
+ {
+ \raggedright\vspace*{0.1ex}
+ \typestored{#3}
+ }
+
+ \vcoffin_set:Nnn \__codelist_demo_label_coffin {\l__codedesc_width_dim}
+ {
+ \raggedright
+ \l__codelist_resultprefix_tl
+ }
+ \vcoffin_set:Nnn \__codelist_demo_coffin {\l__codedesc_width_dim}
+ {
+ \l__codedesc_rule_in_tl
+ \group_begin:\vspace*{0.5\baselineskip}%\vspace*{-1ex}
+ \setlength\parindent{\l__codelist_demo_parindent_dim}
+ \getstored{#3}%\vspace*{-1ex}
+ \group_end:
+ \l__codedesc_rule_in_tl
+ }
+
+ \bool_if:nTF {#1}
+ { % one below the other
+ \coffin_join:NnnNnnnn
+ \__codelist_display_label_coffin {l}{b}
+ \__codelist_display_coffin {l}{t}
+ {0pt}{-1ex}
+ \vspace*{-1ex}
+ \coffin_typeset:Nnnnn \__codelist_display_label_coffin {l}{t}{0pt}{0pt}\vspace*{1ex}
+ \par
+ \coffin_join:NnnNnnnn
+ \__codelist_demo_label_coffin {l}{b}
+ \__codelist_demo_coffin {l}{t}
+ {0pt}{-1ex}
+ \coffin_typeset:Nnnnn \__codelist_demo_label_coffin {l}{t}{0pt}{0pt}
+ \vspace*{\baselineskip}
+ %\vspace*{1ex}
+ }
+ { % side-by-side
+ \coffin_join:NnnNnnnn
+ \__codelist_display_label_coffin {r}{b}
+ \__codelist_demo_label_coffin {l}{b}
+ {0pt}{0pt}
+ \coffin_join:NnnNnnnn
+ \__codelist_display_coffin {r}{vc}
+ \__codelist_demo_coffin {l}{vc}
+ {0pt}{0pt}
+
+ \coffin_typeset:Nnnnn \__codelist_display_label_coffin {l}{t}{0pt}{0pt}\vspace*{1ex}\par
+ \l__codedesc_rule_out_tl
+ \coffin_typeset:Nnnnn \__codelist_display_coffin {l}{t}{0pt}{0pt}
+ \vspace*{0.25ex}
+ \l__codedesc_rule_out_tl
+ \vspace*{\baselineskip}
+ }
+ \par
+ \group_end:
+ }
+
+
+\cs_new_eq:NN \tsdemo \typesetdemo
+
+%%%
+%%% Using scontents package !!!!
+%%%
+
+
+%%%
+%%% from https://en.wikibooks.org/wiki/LaTeX/Source_Code_Listings#Encoding_issue
+\lstset{literate=
+ {á}{{\'a}}1 {é}{{\'e}}1 {í}{{\'i}}1 {ó}{{\'o}}1 {ú}{{\'u}}1
+ {Á}{{\'A}}1 {É}{{\'E}}1 {Í}{{\'I}}1 {Ó}{{\'O}}1 {Ú}{{\'U}}1
+ {à}{{\`a}}1 {è}{{\`e}}1 {ì}{{\`i}}1 {ò}{{\`o}}1 {ù}{{\`u}}1
+ {À}{{\`A}}1 {È}{{\'E}}1 {Ì}{{\`I}}1 {Ò}{{\`O}}1 {Ù}{{\`U}}1
+ {ä}{{\"a}}1 {ë}{{\"e}}1 {ï}{{\"i}}1 {ö}{{\"o}}1 {ü}{{\"u}}1
+ {Ä}{{\"A}}1 {Ë}{{\"E}}1 {Ï}{{\"I}}1 {Ö}{{\"O}}1 {Ü}{{\"U}}1
+ {â}{{\^a}}1 {ê}{{\^e}}1 {î}{{\^i}}1 {ô}{{\^o}}1 {û}{{\^u}}1
+ {Â}{{\^A}}1 {Ê}{{\^E}}1 {Î}{{\^I}}1 {Ô}{{\^O}}1 {Û}{{\^U}}1
+ {ã}{{\~{a}}}1 {õ}{{\~{o}}}1
+ {Ã}{{\~{A}}}1 {Õ}{{\~{O}}}1
+ {ý}{{\'{y}}}1 {Ý}{{\'{Y}}}1 {ÿ}{{\"{y}}}1 {Ÿ}{{\"{Y}}}1
+ {œ}{{\oe}}1 {Œ}{{\OE}}1 {æ}{{\ae}}1 {Æ}{{\AE}}1 {ß}{{\ss}}1
+ {ç}{{\c c}}1 {Ç}{{\c C}}1 {ø}{{\o}}1 {å}{{\r a}}1 {Å}{{\r A}}1
+ {€}{{\EUR}}1 {£}{{\pounds}}1
+}
+
+
+
+
+\endinput