summaryrefslogtreecommitdiff
path: root/macros/generic/expkv-bundle/expkv-bundle.tex
diff options
context:
space:
mode:
Diffstat (limited to 'macros/generic/expkv-bundle/expkv-bundle.tex')
-rw-r--r--macros/generic/expkv-bundle/expkv-bundle.tex353
1 files changed, 353 insertions, 0 deletions
diff --git a/macros/generic/expkv-bundle/expkv-bundle.tex b/macros/generic/expkv-bundle/expkv-bundle.tex
new file mode 100644
index 0000000000..f8110ea36a
--- /dev/null
+++ b/macros/generic/expkv-bundle/expkv-bundle.tex
@@ -0,0 +1,353 @@
+\PassOptionsToPackage{full}{textcomp}
+\documentclass[exfoo=value, exbar, exfoo=\empty]{l3doc}
+
+% preamble >>=
+\makeatletter
+\let\save@onlypreamble\@onlypreamble
+\let\@onlypreamble\@gobble
+\usepackage[all]{expkv}
+\let\@onlypreamble\save@onlypreamble
+\makeatother
+\usepackage[oldstylenums,nott]{kpfonts}
+\input{glyphtounicode}
+\pdfgentounicode=1
+\usepackage{xfp} % required for an example
+\usepackage{booktabs}
+\usepackage{array}
+\usepackage{collcell}
+\usepackage{siunitx}
+\DeclareSIUnit\ops{ops}
+\usepackage{xcolor}
+\usepackage{caption}
+\usepackage{microtype}
+\usepackage{accsupp}
+\usepackage{enumitem}
+\usepackage{randtext}
+
+\usepackage{tcolorbox}%>>=
+\newtcolorbox{exresult}[2][]
+ {%
+ colback=ekvgrey!10!white%
+ ,colframe=ekvgrey%
+ ,fontupper=\small
+ ,width={\dimexpr#2\relax}%
+ ,#1%
+ }
+\newtcbox\exres[1][]
+ {
+ colback=ekvgrey!10!white
+ ,colframe=ekvgrey
+ ,size=small
+ ,nobeforeafter
+ ,tcbox raise base
+ ,fontupper=\small
+ ,#1
+ }
+%=<<
+
+\usepackage{listings}%>>=
+\input{preamble-lst.tex}
+%=<<
+
+\let\metaORIG\meta
+\protected\def\meta #1{\texttt{\metaORIG{#1}}}
+
+\input{preamble-examples.tex}
+\input{preamble-logos.tex}
+
+\makeatletter
+% shortcuts >>=
+\newcommand\Vkey{\texttt{Val}-\key}
+\newcommand*\Nkey{\texttt{NoVal}-\key}
+\newcommand\kv{\meta{key}=\penalty2000\meta{value}}
+\newcommand\kvarg{\{\kv, \ldots\}}
+\newcommand\key{\meta{key}}
+\newcommand\val{\meta{value}}
+\newcommand\set{\meta{set}}
+\newcommand\prefix{\texorpdfstring{\textit{prefix}}{prefix}}
+\newcommand\prefixes{\textit{prefixes}}
+\newcommand\type{\texorpdfstring{\textit{type}}{type}}
+\newcommand\types{\textit{types}}
+\newcommand\tkn[2]{\texttt{\char`#1}\textsubscript{#2}}
+\newcommand\expansion{\meta{expansion}}
+%\newcommand\expnotation{}
+%\edef\expnotation
+ %{\noexpand\texttt{exp\string|}\penalty\@M-\hskip\z@skip notation}
+\newcommand\singlecs[1]
+ {%
+ The \meta{cs} should be a single control sequence, such as
+ \cs[no-index]{#1}. \ignorespaces
+ }
+\newcommand\ekvdocsection[8]
+ {%
+ \clearpage
+ \chardef\ekvdoc@insection1
+ \section[{#7}]%
+ {%
+ #7%
+ \hfill
+ \begingroup\scriptsize\ttfamily
+ \begin{tabular}{@{}r@{}l@{}}%
+ #1{\string\input\{expkv#8\}} & \rlap{#2{\ \% plain}}\\
+ #3{\string\usepackage\{expkv#8\}} & \rlap{#4{\ \% LaTeX}}\\
+ #5{\string\usemodule[expkv#8]} & \rlap{#6{\ \% ConTeXt}}\\
+ \end{tabular}%
+ \endgroup
+ \label{sec:expkv#8}%
+ }%
+ \chardef\ekvdoc@insection0
+ }
+\chardef\ekvdoc@insection0
+\newcommand*\genericekv
+ {\ekvdocsection{}{\textcolor{gray}}{}{\textcolor{gray}}{}{\textcolor{gray}}}
+\newcommand*\latexekv
+ {\ekvdocsection\phantom\phantom{}{\textcolor{gray}}\phantom\phantom}
+%=<<
+
+\hypersetup{linkcolor=red!80!black,urlcolor=purple!80!black}
+
+\input{preamble-prefixes.tex}
+\input{preamble-noidx.tex}
+\input{preamble-enverb.tex}
+
+% vissp >>=
+\ExplSyntaxOn
+\cs_new_protected:Npn \vissp #1
+ {
+ \group_begin:
+ \tl_set:Nn \l_tmpa_tl {#1}
+ \tl_replace_all:Nnn \l_tmpa_tl { ~ } { \asciispace }
+ \l_tmpa_tl
+ \group_end:
+ }
+\ExplSyntaxOff
+% =<<
+
+\ekvcSplit\expkvorules% >>=
+ {
+ cd = \emph{nothing}
+ ,cu = \emph{nothing}
+ ,pd = \emph{nothing}
+ ,pu = \emph{nothing}
+ }
+ {%
+ \begin{description}
+ \item[Class:]
+ \begin{description}
+ \item[defined] #1
+ \item[undefined] #2
+ \end{description}
+ \item[Package:]
+ \begin{description}
+ \item[defined] #3
+ \item[undefined] #4
+ \end{description}
+ \end{description}%
+ }
+\ekvcSecondaryKeys\expkvorules
+ {
+ meta d = {cd={#1},pd={#1}}
+ ,meta u = {cu={#1},pu={#1}}
+ }% =<<
+
+\newcommand*\pmso[1] % poor man's strike out%>>=
+ {%
+ \leavevmode
+ \begingroup
+ \sbox0{#1}%
+ \rlap{\vrule height .6ex depth -.5ex width \wd0\relax}%
+ \usebox0\relax
+ \endgroup
+ }%=<<
+
+\@ifdefinable\gobbledocstriptag{\def\gobbledocstriptag#1>{}}
+
+\renewcommand*\partname{Part}
+
+% \addsec and friends >>=
+\newcommand*\addsec@[2]
+ {%
+ \c@secnumdepth=%
+ \expanded
+ {%
+ \m@ne
+ \unexpanded{#1{#2}}%
+ \c@secnumdepth=\the\c@secnumdepth\relax
+ }%
+ }
+\newcommand*\addsec {\addsec@\section}
+\newcommand*\addssec {\addsec@\subsection}
+\newcommand*\addsssec{\addsec@\subsubsection}
+% =<<
+
+\newenvironment{syntaxexample}% >>=
+ {%
+ \quote
+ \ttfamily\small\frenchspacing
+ \parskip=\z@
+ \def\indent{\leavevmode\phantom{mm}}%
+ }
+ {\endquote}
+\newenvironment{syntaxexample*}
+ {\syntaxexample\obeylines}
+ {\endsyntaxexample}% =<<
+
+\newcommand\expkvdocPrintErrors[1][]
+ {%
+ \protected\long\def\expkvdoc@errfont##1%
+ {\texttt{\frenchspacing\textcolor{red!80!black}{##1}}}%
+ \protected\long\def\ekv@err@collect##1\par##2%
+ {\expkvdoc@errfont{! \detokenize{##2} Error: ##1}#1}%
+ \protected\long\def\expkvdoc@errm##1##2%
+ {\expkvdoc@errfont{! expkv##1 Error: ##2}#1}%
+ \def\ekv@errm{\expkvdoc@errm{}}%
+ \def\ekvc@errm{\expkvdoc@errm{-cs}}%
+ \def\ekvd@errm{\expkvdoc@errm{-def}}%
+ \def\ekvp@errm{\expkvdoc@errm{-pop}}%
+ }
+\makeatother
+
+\ExplSyntaxOn
+\str_new:N \g__expkvdoc_module_str
+\cs_new_protected:Npn \expkvdocfile #1% >>=
+ {
+ \expkvdoc_for_module:nn {#1}
+ {
+ \str_if_eq:nnTF {#1} {main}
+ { \lstset{style=expkv} }
+ { \lstset{style=expkv-#1} }
+ \addtocontents{exs}
+ {
+ \medskip
+ \noindent
+ \use:c { expkv \str_if_eq:nnF {#1} {main} { \str_head:n {#1} } }
+ \smallskip
+ }
+ \input{pkg-#1.tex}
+ }
+ }% =<<
+\cs_new_protected:Npn \expkvdocdtx #1% >>=
+ {
+ \expkvdoc_for_module:nn {#1}
+ {
+ \str_if_eq:nnTF {#1} {main}
+ { \DocInput{expkv.dtx} }
+ { \DocInput{expkv-#1.dtx} }
+ }
+ }% =<<
+\cs_new_protected:Npn \expkvdoc_for_module:nn #1#2% >>=
+ {
+ \use:e
+ {
+ \exp_not:n
+ {
+ \str_gset:Nn \g__expkvdoc_module_str {#1}
+ #2
+ \str_gset:Nn \g__expkvdoc_module_str
+ }
+ { \g__expkvdoc_module_str }
+ }
+ }% =<<
+\ExplSyntaxOff
+
+\input{preamble-l3doctweaks.tex}
+
+%=<<
+
+% for thanking Niranjan
+% code from https://tex.stackexchange.com/a/635125/117050
+\def\DevnagVersion{2.17}
+\usepackage{devanagari}
+
+\newif\ifexpkvDocImplementation%\expkvDocImplementationtrue
+
+\begin{document}
+\title{\expkvbundle}
+%\title% >>=
+ %{%
+ %\texorpdfstring
+ %{%
+ %\huge\expkvbundle
+ %\\[\medskipamount]
+ %\Large an {\expFormat}andable
+ %\meta{{\kvstyle k}\kern-.05em ey}=%
+ %\meta{{\kvstyle v}\kern-.05em alue}
+ %implementation and more%
+ %}
+ %{expkv-bundle - an expandable <key>=<value> implementation and more}%
+ %}% =<<
+\author
+ {%
+ Jonathan P. Spratte%
+ \thanks
+ {%
+ \protect\randomize{jspratte@yahoo.de};
+ Special thanks to {\protect\dn Enr\2jn} (Niranjan) for valuable
+ suggestions and additions to this documentation.%
+ }%
+ }
+\date{2023-01-23}
+\begingroup
+\renewcommand*\thefootnote{\fnsymbol{footnote}}
+\maketitle
+\endgroup
+
+\begin{abstract}%>>=
+ \noindent\parfillskip=0pt
+ The \expkvbundle\ provides at its core a \emph{fully expandable} \kv\ parser,
+ that is \emph{safe} for active commas and equals signs, \emph{reliable} to
+ only strip one set of braces after spaces are stripped, and blazingly
+ \emph{fast}, as of writing this only \pkg{keyval} is faster.
+ \par
+ \bigskip
+ This parser gets augmented by a family of packages. \expkvc\ allows to easily
+ define expandable macros using a \kv\ interface, making the expandable parser
+ available to the masses. \expkvd\ provides a \kv\ interface to
+ define common \key-types. With \expkvo\ you can parse package
+ and class options. \expkvp\ enables you to design your own prefix
+ oriented parsers for interface definitions.
+\end{abstract}%=<<
+
+\tableofcontents
+
+\clearpage
+
+\begin{documentation}% >>=
+\ifexpkvDocImplementation\part{Documentation}\fi
+
+\input{introduction.tex}
+\clearpage
+\input{impatient.tex}
+
+\expkvdocfile{main}
+\expkvdocfile{cs}
+\expkvdocfile{def}
+\expkvdocfile{opt}
+\expkvdocfile{pop}
+\clearpage
+\lstset{style=expkv-all}
+\input{comparison.tex}
+\end{documentation}% =<<
+
+\clearpage
+\listofexamples
+
+\ifexpkvDocImplementation
+ \clearpage
+ \begin{implementation}% >>=
+ \part{Implementation}
+ \expkvdocdtx{main}
+ \clearpage
+ \expkvdocdtx{cs}
+ \clearpage
+ \expkvdocdtx{def}
+ \clearpage
+ \expkvdocdtx{opt}
+ \clearpage
+ \expkvdocdtx{pop}
+ \end{implementation}% =<<
+\fi
+
+\clearpage
+\PrintIndex
+\end{document}