% \iffalse meta-comment % % Copyright (C) 2018-2019 by Richard Grewe % ------------------------------------------------------- % % This file may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either version 1.2 % of this license or (at your option) any later version. % The latest version of this license is in: % % http://www.latex-project.org/lppl.txt % % and version 1.2 or later is part of all distributions of LaTeX % version 1999/12/01 or later. % % \fi % % \iffalse %<*driver> \ProvidesFile{rgltxdoc.dtx} % %\NeedsTeXFormat{LaTeX2e}[1999/12/01] %\ProvidesPackage{rgltxdoc} %<*package> [2019/12/21 v1.3 Common documentation code used for Richard Grewe's packages] % % %<*driver> \documentclass{ltxdoc} \RequirePackage{rgltxdoc} \EnableCrossrefs \CodelineIndex \RecordChanges \begin{document} \DocInput{rgltxdoc.dtx} \PrintChanges \PrintIndex \end{document} % % \fi % % \CheckSum{0} % % \CharacterTable % {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z % Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z % Digits \0\1\2\3\4\5\6\7\8\9 % Exclamation \! Double quote \" Hash (number) \# % Dollar \$ Percent \% Ampersand \& % Acute accent \' Left paren \( Right paren \) % Asterisk \* Plus \+ Comma \, % Minus \- Point \. Solidus \/ % Colon \: Semicolon \; Less than \< % Equals \= Greater than \> Question mark \? % Commercial at \@ Left bracket \[ Backslash \\ % Right bracket \] Circumflex \^ Underscore \_ % Grave accent \` Left brace \{ Vertical bar \| % Right brace \} Tilde \~} % % % \changes{v1}{2019/01/05}{Initial version} % % \GetFileInfo{rgltxdoc.dtx} % % \DoNotIndex{\newcommand,\newenvironment,\def,\gdef,\edef} % % % \title{The \pkgname{rgltxdoc} package\thanks{This document % corresponds to \pkgname{rgltxdoc}~\fileversion, dated \filedate. % The package is available online at % \url{http://www.ctan.org/pkg/rgltxdoc} and % \url{https://github.com/Ri-Ga/rgltxdoc}.}} % \author{Richard Grewe\\ \texttt{r-g+tex@posteo.net}} % % \maketitle % % \section{Introduction} % % This package combines several other packages and defines additional % macros and environments for the purpose of documenting LaTeX code. % The package mainly serves the purpose of combining the preferences % used in the author's package documentations. However, others can % use the package as well. Compatibility between versions cannot be % guaranteed, however. % % \StopEventually{} %\iffalse %<*package> %\fi % % \section{Basic Dependencies} % % Generally, the documentation can be compiled with \hologo{pdfLaTeX} % and with \hologo{LuaLaTeX}. Other processors are untested. There is no % assertion as to how close the \hologo{pdfLaTeX} and \hologo{LuaLaTeX} % results are to each other. % \begin{macrocode} \RequirePackage{ifluatex} % \end{macrocode} % The \pkgname{etoolbox} package is used to simplify some of the % package's code. % \begin{macrocode} \RequirePackage{etoolbox} % \end{macrocode} % % \section{Documentation Input} % % The documentation is expected to be written in UTF-8 and in US-English % language. If \pkgname{babel} is already loaded, it will not be loaded % again, though. This is to support packages that use other languages % than English in examples and load \pkgname{babel} accordingly. % \changes{v1.1}{2019/01/12}{load babel only if not yet loaded} % \begin{macrocode} \ifbool{luatex}{ \RequirePackage[utf8]{luainputenc} \RequirePackage{polyglossia} \setmainlanguage[variant=american]{english} }{ \RequirePackage[utf8]{inputenc} \@ifpackageloaded{babel}{} {\RequirePackage[english]{babel}} } % \end{macrocode} % % \section{General Appearance} % % Code in this section determines the general appearance of % documentation text and is not specific to documenting \hologo{LaTeX} % code. % % \subsection{Page Layout} % % For the page layout, A4 is used for the paper size. % Border correction established wider left margins for typesetting long % macro names. % The |DIV| value is tuned to make the lines wide enough to support % at least 72~characters in the package documentation code. % \begin{macrocode} \RequirePackage[a4paper,twoside=false]{geometry} \RequirePackage[DIV=9,BCOR=2.25cm]{typearea} % \end{macrocode} % % \subsection{Fonts} % % For the font, Latin Modern is used. % Particularly, a light version of the typewriter font is used, such % that highlighting in listings is possible via a bold font series. % \begin{macrocode} \ifbool{luatex}{ \RequirePackage{fontspec} \setmainfont[SmallCapsFont={* Caps}]{Latin Modern Roman} \setsansfont{Latin Modern Sans} \setmonofont[Scale=MatchLowercase, SmallCapsFont={Latin Modern Mono Caps}] {Latin Modern Mono Light} }{ \RequirePackage[T1]{fontenc} \RequirePackage[lighttt]{lmodern} % \end{macrocode} % With just the above code, a construct like |\cs{foo\meta{bar}}| for % documenting parameter-dependent macro names fails due to missing % fonts. The following two lines fix this. The first line ensures that % the typewriter font is loaded (via an |\hbox| with typewriter text % that is not actually displayed) and the second line declares the % required font shape (see % \url{https://tex.stackexchange.com/questions/234003/italic-font-in-lmodern-lighttt}). % \begin{macrocode} \bgroup\setbox\z@\hbox{\ttfamily ignore}\egroup \DeclareFontShape{T1}{lmtt}{m}{it}{<->sub*lmtt/m/sl}{} } % \end{macrocode} % Finally, \pkgname{microtype} is used for small font improvements. % \begin{macrocode} \RequirePackage{microtype} % \end{macrocode} % We simplify quoting names through the \pkgname{csquotes} package and % register |"| to produce double opening/closing quotation marks. % \begin{macrocode} \RequirePackage[autostyle=true]{csquotes} \MakeOuterQuote{"} % \end{macrocode} % % \subsection{Document Structure} % % For the most part, documentations are structured as usual, through a % title as well as sections and sub-sections and so forth. % The following two packages improve the possibilities for using lists % in documentation and visually improve the index through a two-column % layout. % \begin{macrocode} \RequirePackage[inline]{enumitem} \RequirePackage[columns=2]{idxlayout} % \end{macrocode} % % The \pkgname{cleveref} package now requires \pkgname{amsmath} to be % loaded before. We actually do not need \pkgname{amsmath}, but it also % should not harm to load it nonetheless to avoid that % \pkgname{rgltxdoc} now has to be loaded after \pkgname{amsmath}. % \changes{v1.3}{2019/12/21}{add \pkgname{amsmath} dependency} % \begin{macrocode} \RequirePackage{amsmath} % \end{macrocode} % % The \pkgname{cleveref} and \pkgname{varioref} packages shall be used % for referencing structural entities, such as sections and figures. % Hyperlinks are enabled through \pkgname{hypdoc}. % \begin{macrocode} \RequirePackage{varioref} \RequirePackage{hypdoc} \RequirePackage[capitalise,noabbrev,nameinlink]{cleveref} % \end{macrocode} % % % \section{Documenting Things} % % This package builds on the \pkgname{doc} package for several % documentation macros, such as |\marg|, |\oarg|, and |\meta|. % \begin{macrocode} \RequirePackage{doc} % \end{macrocode} % % \subsection{Macros and Environments}\label{sec:MacrosEnvs} % % The main macros here, |\NiceDescribeMacro| and |\NiceDescribeEnv|, are % references to |\DescribeMacro| and |\DescribeEnv| of the \pkgname{doc} % package, with which they share the purpose. % The main difference is the appearance in that the "nice" macros % include the argument list. % % \NiceDescribeMacros{2} % {\NiceDescribeMacro}{\oarg{idx}\marg{macro}\marg{parameters}} % {\NiceDescribeMacros}{\marg{n}\oarg{idx$_1$}\marg{macro$_1$}\marg{params$_1$}\ldots\oarg{idx$_n$}\marg{macro$_n$}\marg{params$_n$}} % These macros produce a description header for a single macro or, % respectively, for multiple macros. % The above two lines are an example of such a description header, which % is produced by the following code: % \begin{lstlisting} % \NiceDescribeMacros{2} % {\NiceDescribeMacro}{\oarg{idx}\marg{macro}\marg{parameters}} % {\NiceDescribeMacros}{\marg{n} % \oarg{idx$_1$}\marg{macro$_1$}\marg{params$_1$}\ldots % \oarg{idx$_n$}\marg{macro$_n$}\marg{params$_n$}} % \end{lstlisting} % The arguments to the macro are described below: % \begin{KeyValTable}{ArgDesc} % \Row{arg=\meta{n}, % desc={This argument specifies the number of macros to be % described.}} % \Row{arg=\pbox[t]{\linewidth}{\meta{macro},\\\meta{macro$_1$},\ldots,\\\meta{macro$_n$}}, % desc={These arguments specify the macros for which a description % header shall be produced.}} % \Row{arg=\pbox[t]{\linewidth}{\meta{parameters},\\\meta{params$_1$},\ldots,\\\meta{params$_n$}}, % desc={These arguments take the sequence that specifies all optional % and mandatory arguments of the respective \meta{macro}. % Typically, these would be sequences of \cs{oarg} and \cs{marg} % instances.}} % \Row{arg=\pbox[t]{\linewidth}{\meta{idx},\\\meta{idx$_1$},\ldots,\\\meta{idx$_N$}}, % desc={These optional arguments arguments specify which index entries % shall be documented, if they differ from the respective % \meta{macro} parameters. This, for instance allows \meta{macro} to % be "\texttt{\cs{foo}(*)}" whereas the \meta{idx} parameter could be % "\texttt{\cs{foo},\cs{foo}*}".}} % \end{KeyValTable} % % \NiceDescribeMacros{2} % {\NiceDescribeEnv}{\oarg{idx}\marg{environment}\marg{parameters}} % {\NiceDescribeEnvs}{\marg{n}\oarg{idx$_1$}\marg{env$_1$}\marg{params$_1$}\ldots\oarg{idx$_n$}\marg{env$_n$}\marg{params$_n$}} % These macros are the counterparts of |\NiceDescribeMacro| and, % respectively, |\NiceDescribeMacros| when it comes to \hologo{LaTeX} % environments. The \meta{environment} (resp.\ \meta{env$_1$} to % \meta{env$_n$}) parameters are the names of the respective environments. % A usage example can be found in the implementation part of % \vref{sec:KeysValues:impl}. % % \NiceDescribeMacros{2} % {\NiceDescribeCounter}{\oarg{idx}\marg{counter}\marg{qualifiers}} % {\NiceDescribeCounters}{\marg{n}\oarg{idx$_1$}\marg{ctr$_1$}\marg{qual$_1$}\ldots\oarg{idx$_n$}\marg{ctr$_n$}\marg{qual$_n$}} % These macros are analogous to the above macros, but aimed for % documenting \hologo{LaTeX} counters. % % \NiceDescribeMacros{2} % {\NiceDescribeKey}{\oarg{idx}\marg{keyname}\marg{keyconfig}} % {\NiceDescribeKeys}{\marg{n}\oarg{idx$_1$}\marg{name$_1$}\marg{cfg$_1$}\ldots\oarg{idx$_n$}\marg{name$_n$}\marg{cfg$_n$}} % These macros are for documenting option keys, for instances of % packages \pkgname{xkeyval} or \pkgname{pgfkeys}. % The \meta{keyconfig} is a key-value list in which the keys "vals", % "init", and "def" can be used to specify the range of % expected/permitted values, the initial (preset) value, and the default % (if the key is provided without a value). % % \NiceDescribeMacro{\NewNiceDescription}{\marg{type}\marg{efmt}\marg{afmt}\marg{icmd}} % This macro is used internally for defining the above macros and can be % used for defining new types of entity descriptions. The following % table describes the arguments of the macro. % \begin{KeyValTable}{ArgDesc} % \Row{arg=\meta{type}, % desc={The \meta{type} argument is the name of the type of entities.}} % \Row{arg=\meta{efmt}, % desc={The \meta{efmt} argument is \hologo{TeX} code that formats the % entities in the margin. It can -- and should -- reference the % positional parameter |\#1|, through which it is passed the name of % the entities.}} % \Row{arg=\meta{afmt}, % desc={The \meta{afmt} argument is \hologo{TeX} code that formats the % arguments or qualifiers of the entities in the body of the % documentation. Analogous to \meta{efmt}, also \meta{afmt} receives % the arguments/qualifiers through the positional parameter |\#1|.}} % \Row{arg=\meta{icmd}, % desc={The \meta{icmd} argument is \hologo{TeX} code that adds a % usage entry for the entity to the index. It takes one argument, % through which \meta{icmd} is passed the entity name.}} % \end{KeyValTable} % A usage example for |\NewNiceDescription| can be found in the % implementation below. % % % \paragraph{Implementation} % % \begin{macro}{\NewNiceDescription} % The |\NewNiceDescription|\marg{type}\marg{efmt}\marg{afmt}\marg{icmd} % macro defines the \cs{NiceDescribe\meta{type}} and % \cs{NiceDescribe\meta{type}s} macros and saves the \meta{efmt} and % \meta{afmt} parameters for use by \cs{NiceDescribe\meta{type}s}. % \begin{macrocode} \newcommand\NewNiceDescription[4]{% \expandafter\newcommand\csname NiceDescribe#1\endcsname{% \csname NiceDescribe#1s\endcsname{1}}% \expandafter\newcommand\csname NiceDescribe#1s\endcsname{% \rgltxdoc@Desc {\csuse{rgltxdoc@@efmt@#1}} {\csuse{rgltxdoc@@afmt@#1}} {#4}}% \csdef{rgltxdoc@@efmt@#1}##1{#2}% \csdef{rgltxdoc@@afmt@#1}##1{#3}} % \end{macrocode} % \end{macro} % % \begin{macro}{\NiceDescribeMacro} % \begin{macro}{\NiceDescribeMacros} % Macro names are formatted detokenized through |\string|. % Arguments are formatted as is. % For the index, |\SpecialUsageIndex| of the \pkgname{doc} package is % used. % \begin{macrocode} \NewNiceDescription{Macro}{\string#1}{#1}{\SpecialUsageIndex} % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\NiceDescribeEnv} % \begin{macro}{\NiceDescribeEnvs} % Environment names are formatted with a gray |\begin| and |\end|. % The arguments of environments are formatted as is. % For the index, |\SpecialEnvIndex| of the \pkgname{doc} package is % used. % \begin{macrocode} \NewNiceDescription{Env} {\textcolor{gray}{\cs{begin}}\cmarg{#1}\\ \textcolor{gray}{\cs{end}}\cmarg{#1}} {#1}{\SpecialEnvIndex} % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\NiceDescribeCounter} % \begin{macro}{\NiceDescribeCounters} % Counter names are formatted as is. Arguments or qualifiers should % usually not be present for counters, but if provided, they would be % formatted as is. % The index entry is produced through |\SpecialOtherIndex| (see its % documentation below). % \begin{macrocode} \NewNiceDescription{Counter}{#1}{#1} {\SpecialOtherIndex{counter}{counters}} % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\NiceDescribeKey} % \begin{macro}{\NiceDescribeKeys} % Option-key names are formatted as is. Arguments are split into the range % of values (|vals|), the initial value (|init|), and the default value % (|def| -- the value used when only the key but no value is specified % to the key). These three can be set as keys. The index entry is % produced through |\SpecialOtherIndex| (see its documentation below). % \changes{v1.2}{2019/05/04}{macros added} % \begin{macrocode} \NewNiceDescription{Key}{#1\,\textrm{=}\,\null} {\begingroup \newcommand\vmeta[1]{{\normalfont\meta{##1}}}% \setkeys[rgltxdoc]{DescOpt}{#1}% \setbox\z@\hbox{\qquad\let\rgltxdoc@@sep\@empty \rgltxdoc@opt{default}{\cmdrgltxdoc@DescOpt@def}% \rgltxdoc@opt{initially}{\cmdrgltxdoc@DescOpt@init}}% \parbox[t]{\linewidth-\wd\z@}{% \raggedright\cmdrgltxdoc@DescOpt@vals}% \box\z@\endgroup} {\SpecialOtherIndex{option-key}{option-keys}} \usepackage{xkeyval,calc} \define@key[rgltxdoc]{DescOpt}{vals}{% \def\cmdrgltxdoc@DescOpt@vals{}\let\rgltxdoc@@sep\@empty% \def\do##1{% \protected@eappto\cmdrgltxdoc@DescOpt@vals{\rgltxdoc@@sep\texttt{##1}}% \def\rgltxdoc@@sep{, }}% \docsvlist{#1}} \define@cmdkey[rgltxdoc]{DescOpt}{init}{} \define@cmdkey[rgltxdoc]{DescOpt}{def}{} \newcommand\rgltxdoc@opt[2]{\ifdef{#2} {\rgltxdoc@@sep\textsl{#1: }\texttt{#2}% \def\rgltxdoc@@sep{, }} {}} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\SpecialOtherIndex} % The |\SpecialOtherIndex|\marg{type}\marg{types}\marg{name} macro % adds an index entry of the given \meta{type} (with plural form % \meta{types}) and given \meta{name}. % The macro is a straightforward generalization of |\SpecialEnvIndex| % (both from \pkgname{hypdoc} and from \pkgname{doc}). % \changes{v1.2}{2019/05/04}{enabled \pkgname{hypdoc} support} % \begin{macrocode} \newcommand*\SpecialOtherIndex[3]{% \@bsphack \begingroup \HD@target \let\HDorg@encapchar\encapchar \edef\encapchar usage{% \HDorg@encapchar hdclindex{\the\c@HD@hypercount}{usage}% }% \rgltxdoc@nohyp@SpecialOtherIndex{#1}{#2}{#3}% \endgroup \@esphack} \newcommand\rgltxdoc@nohyp@SpecialOtherIndex[3]{% \index{#3\actualchar{\protect\ttfamily#3} (#1)\encapchar usage}% \index{#2:\levelchar#3\actualchar {\protect\ttfamily#3}\encapchar usage}} % \end{macrocode} % \end{macro} % % \begin{macro}{\rgltxdoc@DescRec} % The % |\rgltxdoc@Desc|\marg{efmt}\marg{afmt}\marg{icmd}\marg{n}\oarg{idx}\marg{entity}\marg{args} % macro formats a description header for \meta{n} entities, of which the % first are specified through \meta{idx}, \meta{entity}, and % \meta{args}. % The margin parts are formatted through the \meta{efmt}\marg{entity} % macro, the parts in the text body through the \meta{afmt}\marg{args} % macro. The index entries are created through the % \meta{icmd}\marg{idx} macro. % In its implementation, |\rgltxdoc@Desc| builds on |\pbox| from the % \pkgname{pbox} package. It uses |\rgltxdoc@DescRec| and % |\rgltxdoc@DescRec@i| (both with the same argument lists) for the % parsing of arguments and for recursively grabbing the arguments for % the \meta{n} entities. % At first, |\rgltxdoc@Desc| creates some vertical space above a % list of description headers. Afterwards it starts the recursion. % \begin{macrocode} \RequirePackage{pbox} \newcommand\rgltxdoc@Desc{\medskip\par\noindent\rgltxdoc@DescRec} \newcommand\rgltxdoc@DescRec[4]{% \@ifnextchar[%] {\rgltxdoc@DescRec@i{#1}{#2}{#3}{#4}}% {\rgltxdoc@DescRec@i{#1}{#2}{#3}{#4}[]}} \def\rgltxdoc@DescRec@i#1#2#3#4[#5]#6#7{% % \end{macrocode} % The following code creates the "margin" text (more precisely, a box to % the left of the text) and the \meta{args} next to it. % \begin{macrocode} \rgltxdoc@inmargin{\ttfamily #1{#6}}% % \end{macrocode} % If there is no \meta{args}, then the margin part is moved towards the % left by a |\quad|. % \begin{macrocode} {\ifstrempty{#7}{\quad}{}}% #2{#7}\relax % \end{macrocode} % Next, the index entries are created, through the comma-separated % \meta{idx} if this optional argument is given. % \begin{macrocode} \ifstrempty{#5}% {#3{#6}}% {\forcsvlist{#3}{#5}}% % \end{macrocode} % Next, we check whether $\meta{n}>1$ and recurse, after a line break, % if this is satisfied. % \begin{macrocode} \ifnumgreater{#4}{1}% {\\\rgltxdoc@DescRec{#1}{#2}{#3}{#4-1}}% % \end{macrocode} % Finally, the following code ends a list of description headers, taking % into account that an empty \meta{args} allows the documentation text % to already start in the same line as the "margin" text. % \begin{macrocode} {\ifstrempty{#7}{}{\smallskip\par\noindent}\ignorespaces}} % \end{macrocode} % \end{macro} % % \begin{macro}{\rgltxdoc@inmargin} % The |\rgltxdoc@inmargin|\marg{text}\marg{spacing} macro puts % \meta{text} into the margin of a newly started paragraph and uses % \meta{spacing} to put additional horizontal spacing between % \meta{text} and the left side of the paragraph. % \begin{macrocode} \newcommand\rgltxdoc@inmargin[2]{% \leavevmode\null\hbox to\z@{\hss% \pbox[t]{3\marginparwidth}{#1}% #2}} % \end{macrocode} % \end{macro} % % % \subsection{Arguments, Keys, and Values} % % Longer descriptions of macro/environment arguments as well as of keys % (in key-value lists) and special values can be typeset in tables. % For a common appearance, the \pkgname{keyvaltable} package is used. % % \NiceDescribeEnv{KeyValTable}{\cmarg{KeyDesc}} % This table is used for describing keys in key-value lists. It has % three columns: |key|, |desc|, and |default|. The former two have the % obvious meaning. The latter allows for specifying a default value for % the key that is used when the key is not provided. % % \NiceDescribeEnv{KeyValTable}{\cmarg{ValDesc}} % This table is used for describing special values (constants). It has % two columns, |val| and |desc|, with their obvious meaning. % % \NiceDescribeEnv{KeyValTable}{\cmarg{ArgDesc}} % This table is used for describing arguments of macros and environments % in a structured fashion. It has two columns, |arg| and |desc|. % Examples of this kind of table can be found in \cref{sec:MacrosEnvs}. % % \paragraph{Implementation}\label{sec:KeysValues:impl} % % The \pkgname{keyvaltable} package is used for creating the tables that % document keys, values etc. % \begin{macrocode} \RequirePackage{keyvaltable} \kvtSet{headbg=black!10,rowbg=white..black!5} % \end{macrocode} % The following code defines the table types. The code should be % self-explanatory in terms of which columns exist and what their % alignment and purpose is. % \begin{macrocode} \NewKeyValTable{KeyDesc}{% key: align=l, format=\texttt, head=\textbf{Key}; desc: align=X, head=\textbf{Description and Possible Values}; default: align=l, format=\texttt, head=\textbf{Default}; } \NewKeyValTable[showhead=false]{ValDesc}{% val: align=l, format=\texttt, head=\textbf{Value}; desc: align=X, head=\textbf{Description}; } \NewKeyValTable[showhead=false]{ArgDesc}{% arg: align=l, head=\textbf{Argument}; desc: align=X, head=\textbf{Description}; } % \end{macrocode} % % % \subsection{Individual Entities} % % \begin{macro}{\env} % The |\env|\marg{environment} macro is the counterpart of |\cs| for % environment names instead of command names. % \begin{macrocode} \newcommand\env[1]{\texttt{#1}} % \end{macrocode} % \end{macro} % % \begin{macro}{\pkgname} % The |\pkgname|\marg{package-name} macro typesets package names in a % uniform font (sans-serif). Moreover, the package checks whether the % package actually exists, in order to identify embarrassing typos in % the package name. % \begin{macrocode} \newrobustcmd\pkgname[1]{% \IfFileExists{#1.sty} {\textsf{#1}} {\rgltxdoc@err{Package `#1' not found. Spelling?}}} % \end{macrocode} % \end{macro} % \begin{macro}{\pkgnames} % The |\pkgnames|\marg{package-names} macro typesets a comma-separated % list of package names. % \changes{v1.2}{2019/05/04}{macro added} % \begin{macrocode} \newcommand\pkgnames{% \def\do##1{\pkgname{##1}\def\do####1{, \pkgname{####1}}}% \docsvlist} % \end{macrocode} % \end{macro} % % \begin{macro}{\cmarg} % \begin{macro}{\coarg} % The |\cmarg|\marg{const-arg} and |\coarg|\marg{const-arg} macros are % counterparts for |\marg| and |\oarg|. They format constant argument % values, though. % \begin{macrocode} \newcommand\cmarg[1]{\mbox{\texttt{\string{#1\string}}}} \newcommand\coarg[1]{\mbox{\texttt{[#1]}}} % \end{macrocode} % \end{macro} % \end{macro} % % The following enables references to various \hologo{LaTeX} tools in % the common formatting of their names. % \begin{macrocode} \RequirePackage{hologo} % \end{macrocode} % % % \section{Typesetting Examples} % % For typesetting examples, the \pkgname{showexpl} package is used. % Some specific settings for the appearance of the example listings are % defined and some auxiliary macros simplify special examples. % % Generally, code examples shall be typeset in one of two ways: % \begin{enumerate} % \item through \env{lstlisting} environments, if only code shall be % displayed but no visualization of the code's output; % \item through \env{LTXexample} environments, if the code as well as its % output shall be displayed. % \end{enumerate} % Below follows an example of \env{LTXexample} that uses some of the % features provided by \pkgname{rgltxdoc} on top of \pkgname{showexpl}: % Labels/references and sections. % \begin{LTXexample} % \section{Test} % \label{sec:test} % \cref{sec:test} has number~\ref{sec:test}. % \end{LTXexample} % % The following code performs the setup for both (because % \env{LTXexample} builds on \env{lstlisting}). % \begin{macrocode} \RequirePackage{showexpl} \lstset{% gobble=2, frame=trbl, backgroundcolor=\color{black!5!white}, explpreset={% numbers=none, columns=flexible, basicstyle=\footnotesize\ttfamily}, numbers=none, columns=flexible, basicstyle=\footnotesize\ttfamily, preset={\rgltxdoc@ExampleFix\rgltxdoc@SaveSecs\small\sffamily}, overhang=2cm, pos=r, captionpos=b} % \end{macrocode} % The following enables references to \env{LTXexample} and % \env{lstlisting} environments through |\cref| and |\vref|. % \begin{macrocode} \crefname{lstlisting}{Listing}{Listings} % \end{macrocode} % % The following adds the |morepreset| key to \env{listing} environments, % to allow for extending |preset| code rather than overwriting it. % \begin{macrocode} \lst@Key{morepreset}\relax{\appto\SX@preset{#1}} % \end{macrocode} % % \begin{macro}{\rgltxdoc@ExampleFix} % The |\rgltxdoc@ExampleFix| macro performs some setup to enable, to % some extent, functionality that \pkgname{showexpl} disables or does % not implement. Concretely, % \begin{itemize} % \item the macro simulates labels and references, as long as labels are % only referenced after they have been defined (in \env{LTXexample} % environments, the normal label and ref mechanism is otherwise % disabled); % \item the macro re-enables the default |\marginpar| macro, which is % disabled by \env{LTXexample} presumably due to its suboptimal % appearance; for the cases in which the appearance can be justified, % the macro is enabled. % \end{itemize} % \begin{macrocode} \newcommand\rgltxdoc@ExampleFix{% % \end{macrocode} % The fake |\label|\oarg{type}\marg{label} macro takes the optional % \meta{type}, as the \pkgname{cleveref} package defines it. The macro % first saves the current label value in a global macro for basic % |\ref|s. Then, for |\cref|s, the macro also stores the label's type, % either from \meta{type} or from \pkgname{cleveref}'s routines. % \begin{macrocode} \renewcommand\label[2][]{% \global\csletcs{rgltxdoc@@lbl@##2}{@currentlabel}% \ifstrempty{##1} {\csxdef{rgltxdoc@@lbltype@##2}{\rgltxdoc@curlbltype}} {\csgdef{rgltxdoc@@lbltype@##2}{##1}}}% % \end{macrocode} % The |\ref| and |\cref| macros simply use the values stored by % |\label|. Note that the multitude of further \pkgname{cleveref} and % \pkgname{varioref} macros, e.g., |\crefrange| are currently not % implemented. They would need to be defined when there is actual % demand for them. % \begin{macrocode} \def\ref##1{\csuse{rgltxdoc@@lbl@##1}}% \def\cref##1{% \csuse{cref@\csuse{rgltxdoc@@lbltype@##1}@name}~\ref{##1}}% \let\marginpar=\rgltxdoc@@marginpar } \let\rgltxdoc@@marginpar=\marginpar % \end{macrocode} % The |\rgltxdoc@curlbltype| and |\rgltxdoc@curlbltype@i| macros are % auxiliary macros for parsing the content of |\cref@currentlabel|, as set % by the \pkgname{cleveref} package. The first bracketet value in the % content is the label type we're interested in here. % If there's no current label type, we silently use the empty string. % \begin{macrocode} \def\rgltxdoc@curlbltype{% \@ifundefined{cref@currentlabel}{} {\expandafter\rgltxdoc@curlbltype@i\cref@currentlabel\@nil}} \def\rgltxdoc@curlbltype@i[#1][#2][#3]#4\@nil{#1} % \end{macrocode} % \end{macro} % % \begin{macro}{\rgltxdoc@SaveSecs} % \begin{macro}{\rgltxdoc@RestoreSecs} % The |\rgltxdoc@SaveSecs| macro saves the section counters and the % |\rgltxdoc@RestoreSecs| macro restores the values of the section % counters. This allows one to use sectioning commands in code examples % without interfering with the section numbering in the documentation. % The |\rgltxdoc@SaveSecs| macro additionally disables the TOC macro, % such that example sections do not appear in the documentation's TOC. % \changes{v1.2}{2019/05/04}{disabled contents lines} % \begin{macrocode} \newcommand\rgltxdoc@SaveSecs{% \def\addcontentsline##1##2##3{}% \@for\SC:=chapter,section,subsection,subsubsection\do{% \@ifundefined{c@\SC}{} {\csedef{rgltx@@ctr@\SC}{\the\value{\SC}}% \setcounter{\SC}{0}}}} \newcommand\rgltxdoc@RestoreSecs{% \@for\SC:=chapter,section,subsection,subsubsection\do{% \@ifundefined{c@\SC}{} {\setcounter{\SC}{\csuse{rgltx@@ctr@\SC}}}}} \patchcmd{\SX@resultInput}{\par}{\rgltxdoc@RestoreSecs\par} {} {\rgltxdoc@warn{Could not patch showexpl to reset section counters.}} % \end{macrocode} % \end{macro} % \end{macro} % % \section{Shared Internal Code} % % \begin{macro}{\rgltxdoc@err} % \begin{macro}{\rgltxdoc@warn} % The |\rgltxdoc@err|\marg{error} macro raises the given \meta{error}. % The |\rgltxdoc@warn|\marg{warning} macro raises the given % \meta{warning}. % \begin{macrocode} \newcommand\rgltxdoc@err[1]{% \PackageError{rgltxdoc}{#1}{}} \newcommand\rgltxdoc@warn[1]{% \PackageWarning{rgltxdoc}{#1}{}} % \end{macrocode} % \end{macro} % \end{macro} % % \section{Future Work} % % \begin{itemize} % \item Add keys, as listed in |KeyDesc| tables to the index % automatically. % \end{itemize} % %\iffalse % %\fi % \Finale \endinput