summaryrefslogtreecommitdiff
path: root/macros/latex/contrib/magicnum
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-11-30 03:00:45 +0000
committerNorbert Preining <norbert@preining.info>2019-11-30 03:00:45 +0000
commit763d7adeac2bc39fb895a0748f12422d5c959d4c (patch)
treeeb54a7ed141f7fd10a3bbd0f8ff7d478b22f06fc /macros/latex/contrib/magicnum
parentb4325b27feab3a4183f51bfe598686eb72a8c1e0 (diff)
CTAN sync 201911300300
Diffstat (limited to 'macros/latex/contrib/magicnum')
-rw-r--r--macros/latex/contrib/magicnum/README.md6
-rw-r--r--macros/latex/contrib/magicnum/magicnum.dtx1548
-rw-r--r--macros/latex/contrib/magicnum/magicnum.pdfbin0 -> 325183 bytes
3 files changed, 1554 insertions, 0 deletions
diff --git a/macros/latex/contrib/magicnum/README.md b/macros/latex/contrib/magicnum/README.md
new file mode 100644
index 0000000000..b7d9570471
--- /dev/null
+++ b/macros/latex/contrib/magicnum/README.md
@@ -0,0 +1,6 @@
+# magicnum
+
+magicnum package for LaTeX
+
+This packages allows to access magic numbers by a hierarchical
+name system.
diff --git a/macros/latex/contrib/magicnum/magicnum.dtx b/macros/latex/contrib/magicnum/magicnum.dtx
new file mode 100644
index 0000000000..9f01819338
--- /dev/null
+++ b/macros/latex/contrib/magicnum/magicnum.dtx
@@ -0,0 +1,1548 @@
+% \iffalse meta-comment
+%
+% File: magicnum.dtx
+% Version: 2019/11/29 v1.7
+% Info: Magic numbers
+%
+% Copyright (C)
+% 2007, 2009-2011 Heiko Oberdiek
+% 2016-2019 Oberdiek Package Support Group
+% https://github.com/ho-tex/magicnum/issues
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either
+% version 1.3c of this license or (at your option) any later
+% version. This version of this license is in
+% https://www.latex-project.org/lppl/lppl-1-3c.txt
+% and the latest version of this license is in
+% https://www.latex-project.org/lppl.txt
+% and version 1.3 or later is part of all distributions of
+% LaTeX version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status "maintained".
+%
+% The Current Maintainers of this work are
+% Heiko Oberdiek and the Oberdiek Package Support Group
+% https://github.com/ho-tex/magicnum/issues
+%
+% The Base Interpreter refers to any `TeX-Format',
+% because some files are installed in TDS:tex/generic//.
+%
+% This work consists of the main source file magicnum.dtx
+% and the derived files
+% magicnum.sty, magicnum.pdf, magicnum.ins, magicnum.drv, magicnum.txt,
+% magicnum.lua.
+%
+% Distribution:
+% CTAN:macros/latex/contrib/magicnum/magicnum.dtx
+% CTAN:macros/latex/contrib/magicnum/magicnum.pdf
+%
+% Unpacking:
+% (a) If magicnum.ins is present:
+% tex magicnum.ins
+% (b) Without magicnum.ins:
+% tex magicnum.dtx
+% (c) If you insist on using LaTeX
+% latex \let\install=y\input{magicnum.dtx}
+% (quote the arguments according to the demands of your shell)
+%
+% Documentation:
+% (a) If magicnum.drv is present:
+% latex magicnum.drv
+% (b) Without magicnum.drv:
+% latex magicnum.dtx; ...
+% The class ltxdoc loads the configuration file ltxdoc.cfg
+% if available. Here you can specify further options, e.g.
+% use A4 as paper format:
+% \PassOptionsToClass{a4paper}{article}
+%
+% Programm calls to get the documentation (example):
+% pdflatex magicnum.dtx
+% makeindex -s gind.ist magicnum.idx
+% pdflatex magicnum.dtx
+% makeindex -s gind.ist magicnum.idx
+% pdflatex magicnum.dtx
+%
+% Installation:
+% TDS:tex/generic/magicnum/magicnum.sty
+% TDS:scripts/magicnum/magicnum.lua
+% TDS:doc/latex/magicnum/magicnum.pdf
+% TDS:doc/latex/magicnum/magicnum.txt
+% TDS:source/latex/magicnum/magicnum.dtx
+%
+%<*ignore>
+\begingroup
+ \catcode123=1 %
+ \catcode125=2 %
+ \def\x{LaTeX2e}%
+\expandafter\endgroup
+\ifcase 0\ifx\install y1\fi\expandafter
+ \ifx\csname processbatchFile\endcsname\relax\else1\fi
+ \ifx\fmtname\x\else 1\fi\relax
+\else\csname fi\endcsname
+%</ignore>
+%<*install>
+\input docstrip.tex
+\Msg{************************************************************************}
+\Msg{* Installation}
+\Msg{* Package: magicnum 2019/11/29 v1.7 Magic numbers (HO)}
+\Msg{************************************************************************}
+
+\keepsilent
+\askforoverwritefalse
+
+\let\MetaPrefix\relax
+\preamble
+
+This is a generated file.
+
+Project: magicnum
+Version: 2019/11/29 v1.7
+
+Copyright (C)
+ 2007, 2009-2011 Heiko Oberdiek
+ 2016-2019 Oberdiek Package Support Group
+
+This work may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either
+version 1.3c of this license or (at your option) any later
+version. This version of this license is in
+ https://www.latex-project.org/lppl/lppl-1-3c.txt
+and the latest version of this license is in
+ https://www.latex-project.org/lppl.txt
+and version 1.3 or later is part of all distributions of
+LaTeX version 2005/12/01 or later.
+
+This work has the LPPL maintenance status "maintained".
+
+The Current Maintainers of this work are
+Heiko Oberdiek and the Oberdiek Package Support Group
+https://github.com/ho-tex/magicnum/issues
+
+
+The Base Interpreter refers to any `TeX-Format',
+because some files are installed in TDS:tex/generic//.
+
+This work consists of the main source file magicnum.dtx
+and the derived files
+ magicnum.sty, magicnum.pdf, magicnum.txt, magicnum.lua.
+
+\endpreamble
+\let\MetaPrefix\DoubleperCent
+
+\generate{%
+ \file{magicnum.ins}{\from{magicnum.dtx}{install}}%
+ \file{magicnum.drv}{\from{magicnum.dtx}{driver}}%
+ \usedir{tex/generic/magicnum}%
+ \file{magicnum.sty}{\from{magicnum.dtx}{package}}%
+% \usedir{doc/latex/magicnum/test}%
+% \file{magicnum-test1.tex}{\from{magicnum.dtx}{test1}}%
+% \file{magicnum-test2.tex}{\from{magicnum.dtx}{testplain,testdata}}%
+% \file{magicnum-test3.tex}{\from{magicnum.dtx}{testlatex,testdata}}%
+% \file{magicnum-test4.tex}{\from{magicnum.dtx}{test4}}%
+ \nopreamble
+ \nopostamble
+ \usedir{doc/latex/magicnum}%
+ \file{magicnum.txt}{\from{magicnum.dtx}{data}}%
+% \usedir{source/latex/magicnum/catalogue}%
+% \file{magicnum.xml}{\from{magicnum.dtx}{catalogue}}%
+}
+\def\MetaPrefix{-- }
+\def\defaultpostamble{%
+ \MetaPrefix^^J%
+ \MetaPrefix\space End of File `\outFileName'.%
+}
+\def\currentpostamble{\defaultpostamble}%
+\generate{%
+ \usedir{scripts/magicnum}%
+ \file{magicnum.lua}{\from{magicnum.dtx}{lua}}%
+}
+
+\catcode32=13\relax% active space
+\let =\space%
+\Msg{************************************************************************}
+\Msg{*}
+\Msg{* To finish the installation you have to move the following}
+\Msg{* file into a directory searched by TeX:}
+\Msg{*}
+\Msg{* magicnum.sty}
+\Msg{*}
+\Msg{* And install the following script file:}
+\Msg{*}
+\Msg{* magicnum.lua}
+\Msg{*}
+\Msg{* To produce the documentation run the file `magicnum.drv'}
+\Msg{* through LaTeX.}
+\Msg{*}
+\Msg{* Happy TeXing!}
+\Msg{*}
+\Msg{************************************************************************}
+
+\endbatchfile
+%</install>
+%<*ignore>
+\fi
+%</ignore>
+%<*driver>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesFile{magicnum.drv}%
+ [2019/11/29 v1.7 Magic numbers (HO)]%
+\documentclass{ltxdoc}
+\usepackage{holtxdoc}[2011/11/22]
+\usepackage{array}
+\begin{document}
+ \DocInput{magicnum.dtx}%
+\end{document}
+%</driver>
+% \fi
+%
+%
+% \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 \~}
+%
+% \GetFileInfo{magicnum.drv}
+%
+% \title{The \xpackage{magicnum} package}
+% \date{2019/11/29 v1.7}
+% \author{Heiko Oberdiek\thanks
+% {Please report any issues at \url{https://github.com/ho-tex/magicnum/issues}}}
+%
+% \maketitle
+%
+% \begin{abstract}
+% This packages allows to access magic numbers by a hierarchical
+% name system.
+% \end{abstract}
+%
+% \tableofcontents
+%
+% \hypersetup{bookmarksopenlevel=2}
+% \section{Documentation}
+%
+% \subsection{Introduction}
+%
+% Especially since \eTeX\ there are many integer values
+% with special meanings, such as catcodes, group types, \dots
+% Package \xpackage{etex}, enabled by options, defines
+% macros in the user namespace for these values.
+%
+% This package goes another approach for storing the names and values.
+% \begin{itemize}
+% \item If \LuaTeX\ is available, they
+% are stored in Lua tables.
+% \item Without \LuaTeX\ they are remembered using internal
+% macros.
+% \end{itemize}
+%
+% \subsection{User interface}
+%
+% The integer values and names are organized in a hierarchical
+% scheme of categories with the property names as leaves.
+% Example: \eTeX's \cs{currentgrouplevel} reports |2| for a
+% group caused by \cs{hbox}. This package has choosen to organize
+% the group types in a main category |etex| and its subcategory
+% |grouptype|:
+% \begin{quote}
+% |etex.grouptype.hbox| = |2|
+% \end{quote}
+% The property name |hbox| in category |etex.grouptype| has value |2|.
+% Dots are used to separate components.
+%
+% If you want to have the value, the access key is constructed by
+% the category with all its components and the property name.
+% For the opposite the value is used instead of the property name.
+%
+% Values are always integers (including negative numbers).
+%
+% \subsubsection{\cs{magicnum}}
+%
+% \begin{declcs}{magicnum} \M{access key}
+% \end{declcs}
+% Macro \cs{magicnum} expects an access key as argument and
+% expands to the requested data. The macro is always expandable.
+% In case of errors the expansion result is empty.
+%
+% The same macro is also used for getting a property name.
+% In this case the property name part in the access key is
+% replaced by the value.
+%
+% The catcodes
+% of the resulting numbers and strings follow \TeX's tradition of
+% \cs{string}, \cs{meaning}, \dots: The space has catcode 10
+% (|tex.catcode.space|) and the other characters have catcode
+% 12 (|tex.catcode.other|).
+%
+% Examples:
+% \begin{quote}
+% |\magicnum{etex.grouptype.hbox}| $\Rightarrow$ |2|\\
+% |\magicnum{tex.catcode.14}| $\Rightarrow$ |comment|\\
+% |\magicnum{tex.catcode.undefined}| $\Rightarrow$ $\emptyset$
+% \end{quote}
+%
+% \subsubsection{Properties}
+%
+% \begin{itemize}
+% \item The components of a category are either subcategories or
+% key value pairs, but not both.
+% \item The full specified property names are unique and thus
+% has one integer value exactly.
+% \item Also the values inside a category are unique.
+% This condition is a prerequisite for the reverse mapping
+% of \cs{magicnum}.
+% \item All names start with a letter. Only letters or digits
+% may follow.
+% \end{itemize}
+%
+% \subsection{Data}
+%
+% \subsubsection{\texorpdfstring{Category }{}\texttt{tex.catcode}}
+%
+% \begin{quote}
+% \begin{tabular}{@{}>{\ttfamily}l>{\ttfamily}l@{}}
+% tex.catcode.escape & 0\\
+% tex.catcode.begingroup & 1\\
+% tex.catcode.endgroup & 2\\
+% tex.catcode.math & 3\\
+% tex.catcode.align & 4\\
+% tex.catcode.eol & 5\\
+% tex.catcode.parameter & 6\\
+% tex.catcode.superscript & 7\\
+% tex.catcode.subscript & 8\\
+% tex.catcode.ignore & 9\\
+% tex.catcode.space & 10\\
+% tex.catcode.letter & 11\\
+% tex.catcode.other & 12\\
+% tex.catcode.active & 13\\
+% tex.catcode.comment & 14\\
+% tex.catcode.invalid & 15\\
+% \end{tabular}
+% \end{quote}
+%
+% \subsubsection{\texorpdfstring{Category }{}\texttt{etex.grouptype}}
+%
+% \begin{quote}
+% \begin{tabular}{@{}>{\ttfamily}l>{\ttfamily}l@{}}
+% etex.grouptype.bottomlevel & 0\\
+% etex.grouptype.simple & 1\\
+% etex.grouptype.hbox & 2\\
+% etex.grouptype.adjustedhbox & 3\\
+% etex.grouptype.vbox & 4\\
+% etex.grouptype.align & 5\\
+% etex.grouptype.noalign & 6\\
+% etex.grouptype.output & 8\\
+% etex.grouptype.math & 9\\
+% etex.grouptype.disc & 10\\
+% etex.grouptype.insert & 11\\
+% etex.grouptype.vcenter & 12\\
+% etex.grouptype.mathchoice & 13\\
+% etex.grouptype.semisimple & 14\\
+% etex.grouptype.mathshift & 15\\
+% etex.grouptype.mathleft & 16\\
+% \end{tabular}
+% \end{quote}
+%
+% \subsubsection{\texorpdfstring{Category }{}\texttt{etex.iftype}}
+%
+% \begin{quote}
+% \begin{tabular}{@{}>{\ttfamily}l>{\ttfamily}l@{}}
+% etex.iftype.none & 0\\
+% etex.iftype.char & 1\\
+% etex.iftype.cat & 2\\
+% etex.iftype.num & 3\\
+% etex.iftype.dim & 4\\
+% etex.iftype.odd & 5\\
+% etex.iftype.vmode & 6\\
+% etex.iftype.hmode & 7\\
+% etex.iftype.mmode & 8\\
+% etex.iftype.inner & 9\\
+% etex.iftype.void & 10\\
+% etex.iftype.hbox & 11\\
+% etex.iftype.vbox & 12\\
+% etex.iftype.x & 13\\
+% etex.iftype.eof & 14\\
+% etex.iftype.true & 15\\
+% etex.iftype.false & 16\\
+% etex.iftype.case & 17\\
+% etex.iftype.defined & 18\\
+% etex.iftype.csname & 19\\
+% etex.iftype.fontchar & 20\\
+% \end{tabular}
+% \end{quote}
+%
+% \subsubsection{\texorpdfstring{Category }{}\texttt{etex.nodetype}}
+%
+% \begin{quote}
+% \begin{tabular}{@{}>{\ttfamily}l>{\ttfamily}l@{}}
+% etex.nodetype.none & -1\\
+% etex.nodetype.char & 0\\
+% etex.nodetype.hlist & 1\\
+% etex.nodetype.vlist & 2\\
+% etex.nodetype.rule & 3\\
+% etex.nodetype.ins & 4\\
+% etex.nodetype.mark & 5\\
+% etex.nodetype.adjust & 6\\
+% etex.nodetype.ligature & 7\\
+% etex.nodetype.disc & 8\\
+% etex.nodetype.whatsit & 9\\
+% etex.nodetype.math & 10\\
+% etex.nodetype.glue & 11\\
+% etex.nodetype.kern & 12\\
+% etex.nodetype.penalty & 13\\
+% etex.nodetype.unset & 14\\
+% etex.nodetype.maths & 15\\
+% \end{tabular}
+% \end{quote}
+%
+% \subsubsection{\texorpdfstring{Category }{}\texttt{etex.interactionmode}}
+%
+% \begin{quote}
+% \begin{tabular}{@{}>{\ttfamily}l>{\ttfamily}l@{}}
+% etex.interactionmode.batch & 0\\
+% etex.interactionmode.nonstop & 1\\
+% etex.interactionmode.scroll & 2\\
+% etex.interactionmode.errorstop & 3\\
+% \end{tabular}
+% \end{quote}
+%
+% \subsubsection{\texorpdfstring{Category }{}\texttt{luatex.pdfliteral.mode}}
+%
+% \begin{quote}
+% \begin{tabular}{@{}>{\ttfamily}l>{\ttfamily}l@{}}
+% luatex.pdfliteral.mode.setorigin & 0\\
+% luatex.pdfliteral.mode.page & 1\\
+% luatex.pdfliteral.mode.direct & 2\\
+% \end{tabular}
+% \end{quote}
+%
+%
+% \hypersetup{bookmarksopenlevel=1}
+%
+% \StopEventually{
+% }
+%
+% \section{Implementation}
+%
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+%
+% \subsection{Reload check and package identification}
+% Reload check, especially if the package is not used with \LaTeX.
+% \begin{macrocode}
+\begingroup\catcode61\catcode48\catcode32=10\relax%
+ \catcode13=5 % ^^M
+ \endlinechar=13 %
+ \catcode35=6 % #
+ \catcode39=12 % '
+ \catcode44=12 % ,
+ \catcode45=12 % -
+ \catcode46=12 % .
+ \catcode58=12 % :
+ \catcode64=11 % @
+ \catcode123=1 % {
+ \catcode125=2 % }
+ \expandafter\let\expandafter\x\csname ver@magicnum.sty\endcsname
+ \ifx\x\relax % plain-TeX, first loading
+ \else
+ \def\empty{}%
+ \ifx\x\empty % LaTeX, first loading,
+ % variable is initialized, but \ProvidesPackage not yet seen
+ \else
+ \expandafter\ifx\csname PackageInfo\endcsname\relax
+ \def\x#1#2{%
+ \immediate\write-1{Package #1 Info: #2.}%
+ }%
+ \else
+ \def\x#1#2{\PackageInfo{#1}{#2, stopped}}%
+ \fi
+ \x{magicnum}{The package is already loaded}%
+ \aftergroup\endinput
+ \fi
+ \fi
+\endgroup%
+% \end{macrocode}
+% Package identification:
+% \begin{macrocode}
+\begingroup\catcode61\catcode48\catcode32=10\relax%
+ \catcode13=5 % ^^M
+ \endlinechar=13 %
+ \catcode35=6 % #
+ \catcode39=12 % '
+ \catcode40=12 % (
+ \catcode41=12 % )
+ \catcode44=12 % ,
+ \catcode45=12 % -
+ \catcode46=12 % .
+ \catcode47=12 % /
+ \catcode58=12 % :
+ \catcode64=11 % @
+ \catcode91=12 % [
+ \catcode93=12 % ]
+ \catcode123=1 % {
+ \catcode125=2 % }
+ \expandafter\ifx\csname ProvidesPackage\endcsname\relax
+ \def\x#1#2#3[#4]{\endgroup
+ \immediate\write-1{Package: #3 #4}%
+ \xdef#1{#4}%
+ }%
+ \else
+ \def\x#1#2[#3]{\endgroup
+ #2[{#3}]%
+ \ifx#1\@undefined
+ \xdef#1{#3}%
+ \fi
+ \ifx#1\relax
+ \xdef#1{#3}%
+ \fi
+ }%
+ \fi
+\expandafter\x\csname ver@magicnum.sty\endcsname
+\ProvidesPackage{magicnum}%
+ [2019/11/29 v1.7 Magic numbers (HO)]%
+% \end{macrocode}
+%
+% \subsection{Catcodes}
+%
+% \begin{macrocode}
+\begingroup\catcode61\catcode48\catcode32=10\relax%
+ \catcode13=5 % ^^M
+ \endlinechar=13 %
+ \catcode123=1 % {
+ \catcode125=2 % }
+ \catcode64=11 % @
+ \def\x{\endgroup
+ \expandafter\edef\csname magicnum@AtEnd\endcsname{%
+ \endlinechar=\the\endlinechar\relax
+ \catcode13=\the\catcode13\relax
+ \catcode32=\the\catcode32\relax
+ \catcode35=\the\catcode35\relax
+ \catcode61=\the\catcode61\relax
+ \catcode64=\the\catcode64\relax
+ \catcode123=\the\catcode123\relax
+ \catcode125=\the\catcode125\relax
+ }%
+ }%
+\x\catcode61\catcode48\catcode32=10\relax%
+\catcode13=5 % ^^M
+\endlinechar=13 %
+\catcode35=6 % #
+\catcode64=11 % @
+\catcode123=1 % {
+\catcode125=2 % }
+\def\TMP@EnsureCode#1#2{%
+ \edef\magicnum@AtEnd{%
+ \magicnum@AtEnd
+ \catcode#1=\the\catcode#1\relax
+ }%
+ \catcode#1=#2\relax
+}
+\TMP@EnsureCode{34}{12}% "
+\TMP@EnsureCode{39}{12}% '
+\TMP@EnsureCode{40}{12}% (
+\TMP@EnsureCode{41}{12}% )
+\TMP@EnsureCode{42}{12}% *
+\TMP@EnsureCode{44}{12}% ,
+\TMP@EnsureCode{45}{12}% -
+\TMP@EnsureCode{46}{12}% .
+\TMP@EnsureCode{47}{12}% /
+\TMP@EnsureCode{58}{12}% :
+\TMP@EnsureCode{60}{12}% <
+\TMP@EnsureCode{62}{12}% >
+\TMP@EnsureCode{91}{12}% [
+\TMP@EnsureCode{93}{12}% ]
+\edef\magicnum@AtEnd{\magicnum@AtEnd\noexpand\endinput}
+% \end{macrocode}
+%
+% \subsection{Check for previous definition}
+%
+% \begin{macrocode}
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname newcommand\endcsname\relax
+ \expandafter\ifx\csname magicnum\endcsname\relax
+ \else
+ \input infwarerr.sty\relax
+ \@PackageError{magicnum}{%
+ \string\magicnum\space is already defined%
+ }\@ehc
+ \fi
+\else
+ \newcommand*{\magicnum}{}%
+\fi
+% \end{macrocode}
+%
+% \subsection{Without \LuaTeX}
+%
+% \begin{macrocode}
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname directlua\endcsname\relax
+% \end{macrocode}
+%
+% \begin{macro}{\magicnum}
+% \begin{macrocode}
+ \begingroup\expandafter\expandafter\expandafter\endgroup
+ \expandafter\ifx\csname ifcsname\endcsname\relax
+ \def\magicnum#1{%
+ \expandafter\ifx\csname MG@#1\endcsname\relax
+ \else
+ \csname MG@#1\endcsname
+ \fi
+ }%
+ \else
+ \begingroup
+ \edef\x{\endgroup
+ \def\noexpand\magicnum##1{%
+ \expandafter\noexpand\csname
+ ifcsname\endcsname MG@##1\noexpand\endcsname
+ \noexpand\csname MG@##1%
+ \noexpand\expandafter\noexpand\endcsname
+ \expandafter\noexpand\csname fi\endcsname
+ }%
+ }%
+ \x
+ \fi
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\else
+% \end{macrocode}
+%
+% \subsection{With \LuaTeX}
+%
+% \begin{macrocode}
+ \begingroup\expandafter\expandafter\expandafter\endgroup
+ \expandafter\ifx\csname RequirePackage\endcsname\relax
+ \input tex.sty\relax
+ \input infwarerr.sty\relax
+ \else
+ \RequirePackage{iftex}[2019/11/07]%
+ \RequirePackage{infwarerr}[2010/04/08]%
+ \fi
+% \end{macrocode}
+%
+% \begin{macro}{\magicnum@directlua}
+% \begin{macrocode}
+ \ifnum\luatexversion<36 %
+ \def\magicnum@directlua{\directlua0 }%
+ \else
+ \let\magicnum@directlua\directlua
+ \fi
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+ \magicnum@directlua{%
+ require("magicnum")%
+ }%
+ \begingroup
+ \def\x{2019/11/29 v1.7}%
+ \def\StripPrefix#1>{}%
+ \edef\x{\expandafter\StripPrefix\meaning\x}%
+ \edef\y{%
+ \magicnum@directlua{%
+ if oberdiek.magicnum.getversion then %
+ oberdiek.magicnum.getversion()%
+ end%
+ }%
+ }%
+ \ifx\x\y
+ \else
+ \@PackageError{magicnum}{%
+ Wrong version of lua module.\MessageBreak
+ Package version: \x\MessageBreak
+ Lua module: \y
+ }\@ehc
+ \fi
+ \endgroup
+% \end{macrocode}
+% \begin{macro}{\luaescapestring}
+% \begin{macrocode}
+ \begingroup
+ \expandafter\ifx\csname luaescapestring\endcsname\relax
+ \directlua{%
+ if tex.enableprimitives then %
+ tex.enableprimitives('magicnum@', {'luaescapestring'})%
+ end%
+ }%
+ \global\let\luaescapestring\magicnum@luaescapestring
+ \fi
+ \expandafter\ifx\csname luaescapestring\endcsname\relax
+ \escapechar=92 %
+ \@PackageError{magicnum}{%
+ Missing \string\luaescapestring
+ }\@ehc
+ \fi
+ \endgroup
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\magicnum}
+% \begin{macrocode}
+ \def\magicnum#1{%
+ \magicnum@directlua{%
+ oberdiek.magicnum.get("\luaescapestring{#1}")%
+ }%
+ }%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+ \expandafter\magicnum@AtEnd
+\fi%
+%</package>
+% \end{macrocode}
+%
+% \subsection{Data}
+%
+% \subsubsection{Plain data}
+%
+% \begin{macrocode}
+%<*data>
+tex.catcode
+ escape = 0
+ begingroup = 1
+ endgroup = 2
+ math = 3
+ align = 4
+ eol = 5
+ parameter = 6
+ superscript = 7
+ subscript = 8
+ ignore = 9
+ space = 10
+ letter = 11
+ other = 12
+ active = 13
+ comment = 14
+ invalid = 15
+etex.grouptype
+ bottomlevel = 0
+ simple = 1
+ hbox = 2
+ adjustedhbox = 3
+ vbox = 4
+ align = 5
+ noalign = 6
+ output = 8
+ math = 9
+ disc = 10
+ insert = 11
+ vcenter = 12
+ mathchoice = 13
+ semisimple = 14
+ mathshift = 15
+ mathleft = 16
+etex.iftype
+ none = 0
+ char = 1
+ cat = 2
+ num = 3
+ dim = 4
+ odd = 5
+ vmode = 6
+ hmode = 7
+ mmode = 8
+ inner = 9
+ void = 10
+ hbox = 11
+ vbox = 12
+ x = 13
+ eof = 14
+ true = 15
+ false = 16
+ case = 17
+ defined = 18
+ csname = 19
+ fontchar = 20
+etex.nodetype
+ none = -1
+ char = 0
+ hlist = 1
+ vlist = 2
+ rule = 3
+ ins = 4
+ mark = 5
+ adjust = 6
+ ligature = 7
+ disc = 8
+ whatsit = 9
+ math = 10
+ glue = 11
+ kern = 12
+ penalty = 13
+ unset = 14
+ maths = 15
+etex.interactionmode
+ batch = 0
+ nonstop = 1
+ scroll = 2
+ errorstop = 3
+luatex.pdfliteral.mode
+ setorigin = 0
+ page = 1
+ direct = 2
+%</data>
+% \end{macrocode}
+%
+% \subsubsection{Data for \TeX}
+%
+% \begin{macrocode}
+%<*package>
+% \end{macrocode}
+% \begin{macro}{\magicnum@add}
+% \begin{macrocode}
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname detokenize\endcsname\relax
+ \def\magicnum@add#1#2#3{%
+ \expandafter\magicnum@@add
+ \csname MG@#1.#2\expandafter\endcsname
+ \csname MG@#1.#3\endcsname
+ {#3}{#2}%
+ }%
+ \def\magicnum@@add#1#2#3#4{%
+ \def#1{#3}%
+ \def#2{#4}%
+ \edef#1{%
+ \expandafter\strip@prefix\meaning#1%
+ }%
+ \edef#2{%
+ \expandafter\strip@prefix\meaning#2%
+ }%
+ }%
+ \expandafter\ifx\csname strip@prefix\endcsname\relax
+ \def\strip@prefix#1->{}%
+ \fi
+\else
+ \def\magicnum@add#1#2#3{%
+ \expandafter\edef\csname MG@#1.#2\endcsname{%
+ \detokenize{#3}%
+ }%
+ \expandafter\edef\csname MG@#1.#3\endcsname{%
+ \detokenize{#2}%
+ }%
+ }%
+\fi
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+\magicnum@add{tex.catcode}{escape}{0}
+\magicnum@add{tex.catcode}{begingroup}{1}
+\magicnum@add{tex.catcode}{endgroup}{2}
+\magicnum@add{tex.catcode}{math}{3}
+\magicnum@add{tex.catcode}{align}{4}
+\magicnum@add{tex.catcode}{eol}{5}
+\magicnum@add{tex.catcode}{parameter}{6}
+\magicnum@add{tex.catcode}{superscript}{7}
+\magicnum@add{tex.catcode}{subscript}{8}
+\magicnum@add{tex.catcode}{ignore}{9}
+\magicnum@add{tex.catcode}{space}{10}
+\magicnum@add{tex.catcode}{letter}{11}
+\magicnum@add{tex.catcode}{other}{12}
+\magicnum@add{tex.catcode}{active}{13}
+\magicnum@add{tex.catcode}{comment}{14}
+\magicnum@add{tex.catcode}{invalid}{15}
+\magicnum@add{etex.grouptype}{bottomlevel}{0}
+\magicnum@add{etex.grouptype}{simple}{1}
+\magicnum@add{etex.grouptype}{hbox}{2}
+\magicnum@add{etex.grouptype}{adjustedhbox}{3}
+\magicnum@add{etex.grouptype}{vbox}{4}
+\magicnum@add{etex.grouptype}{align}{5}
+\magicnum@add{etex.grouptype}{noalign}{6}
+\magicnum@add{etex.grouptype}{output}{8}
+\magicnum@add{etex.grouptype}{math}{9}
+\magicnum@add{etex.grouptype}{disc}{10}
+\magicnum@add{etex.grouptype}{insert}{11}
+\magicnum@add{etex.grouptype}{vcenter}{12}
+\magicnum@add{etex.grouptype}{mathchoice}{13}
+\magicnum@add{etex.grouptype}{semisimple}{14}
+\magicnum@add{etex.grouptype}{mathshift}{15}
+\magicnum@add{etex.grouptype}{mathleft}{16}
+\magicnum@add{etex.iftype}{none}{0}
+\magicnum@add{etex.iftype}{char}{1}
+\magicnum@add{etex.iftype}{cat}{2}
+\magicnum@add{etex.iftype}{num}{3}
+\magicnum@add{etex.iftype}{dim}{4}
+\magicnum@add{etex.iftype}{odd}{5}
+\magicnum@add{etex.iftype}{vmode}{6}
+\magicnum@add{etex.iftype}{hmode}{7}
+\magicnum@add{etex.iftype}{mmode}{8}
+\magicnum@add{etex.iftype}{inner}{9}
+\magicnum@add{etex.iftype}{void}{10}
+\magicnum@add{etex.iftype}{hbox}{11}
+\magicnum@add{etex.iftype}{vbox}{12}
+\magicnum@add{etex.iftype}{x}{13}
+\magicnum@add{etex.iftype}{eof}{14}
+\magicnum@add{etex.iftype}{true}{15}
+\magicnum@add{etex.iftype}{false}{16}
+\magicnum@add{etex.iftype}{case}{17}
+\magicnum@add{etex.iftype}{defined}{18}
+\magicnum@add{etex.iftype}{csname}{19}
+\magicnum@add{etex.iftype}{fontchar}{20}
+\magicnum@add{etex.nodetype}{none}{-1}
+\magicnum@add{etex.nodetype}{char}{0}
+\magicnum@add{etex.nodetype}{hlist}{1}
+\magicnum@add{etex.nodetype}{vlist}{2}
+\magicnum@add{etex.nodetype}{rule}{3}
+\magicnum@add{etex.nodetype}{ins}{4}
+\magicnum@add{etex.nodetype}{mark}{5}
+\magicnum@add{etex.nodetype}{adjust}{6}
+\magicnum@add{etex.nodetype}{ligature}{7}
+\magicnum@add{etex.nodetype}{disc}{8}
+\magicnum@add{etex.nodetype}{whatsit}{9}
+\magicnum@add{etex.nodetype}{math}{10}
+\magicnum@add{etex.nodetype}{glue}{11}
+\magicnum@add{etex.nodetype}{kern}{12}
+\magicnum@add{etex.nodetype}{penalty}{13}
+\magicnum@add{etex.nodetype}{unset}{14}
+\magicnum@add{etex.nodetype}{maths}{15}
+\magicnum@add{etex.interactionmode}{batch}{0}
+\magicnum@add{etex.interactionmode}{nonstop}{1}
+\magicnum@add{etex.interactionmode}{scroll}{2}
+\magicnum@add{etex.interactionmode}{errorstop}{3}
+\magicnum@add{luatex.pdfliteral.mode}{setorigin}{0}
+\magicnum@add{luatex.pdfliteral.mode}{page}{1}
+\magicnum@add{luatex.pdfliteral.mode}{direct}{2}
+% \end{macrocode}
+% \begin{macrocode}
+\magicnum@AtEnd%
+%</package>
+% \end{macrocode}
+%
+% \subsubsection{Lua module}
+%
+% \begin{macrocode}
+%<*lua>
+% \end{macrocode}
+% \begin{macrocode}
+oberdiek = oberdiek or {}
+local magicnum = oberdiek.magicnum or {}
+oberdiek.magicnum = magicnum
+% \end{macrocode}
+% \begin{macrocode}
+function magicnum.getversion()
+ tex.write("2019/11/29 v1.7")
+end
+% \end{macrocode}
+% \begin{macrocode}
+local data = {
+ ["tex.catcode"] = {
+ [0] = "escape",
+ [1] = "begingroup",
+ [2] = "endgroup",
+ [3] = "math",
+ [4] = "align",
+ [5] = "eol",
+ [6] = "parameter",
+ [7] = "superscript",
+ [8] = "subscript",
+ [9] = "ignore",
+ [10] = "space",
+ [11] = "letter",
+ [12] = "other",
+ [13] = "active",
+ [14] = "comment",
+ [15] = "invalid",
+ ["active"] = 13,
+ ["align"] = 4,
+ ["begingroup"] = 1,
+ ["comment"] = 14,
+ ["endgroup"] = 2,
+ ["eol"] = 5,
+ ["escape"] = 0,
+ ["ignore"] = 9,
+ ["invalid"] = 15,
+ ["letter"] = 11,
+ ["math"] = 3,
+ ["other"] = 12,
+ ["parameter"] = 6,
+ ["space"] = 10,
+ ["subscript"] = 8,
+ ["superscript"] = 7
+ },
+ ["etex.grouptype"] = {
+ [0] = "bottomlevel",
+ [1] = "simple",
+ [2] = "hbox",
+ [3] = "adjustedhbox",
+ [4] = "vbox",
+ [5] = "align",
+ [6] = "noalign",
+ [8] = "output",
+ [9] = "math",
+ [10] = "disc",
+ [11] = "insert",
+ [12] = "vcenter",
+ [13] = "mathchoice",
+ [14] = "semisimple",
+ [15] = "mathshift",
+ [16] = "mathleft",
+ ["adjustedhbox"] = 3,
+ ["align"] = 5,
+ ["bottomlevel"] = 0,
+ ["disc"] = 10,
+ ["hbox"] = 2,
+ ["insert"] = 11,
+ ["math"] = 9,
+ ["mathchoice"] = 13,
+ ["mathleft"] = 16,
+ ["mathshift"] = 15,
+ ["noalign"] = 6,
+ ["output"] = 8,
+ ["semisimple"] = 14,
+ ["simple"] = 1,
+ ["vbox"] = 4,
+ ["vcenter"] = 12
+ },
+ ["etex.iftype"] = {
+ [0] = "none",
+ [1] = "char",
+ [2] = "cat",
+ [3] = "num",
+ [4] = "dim",
+ [5] = "odd",
+ [6] = "vmode",
+ [7] = "hmode",
+ [8] = "mmode",
+ [9] = "inner",
+ [10] = "void",
+ [11] = "hbox",
+ [12] = "vbox",
+ [13] = "x",
+ [14] = "eof",
+ [15] = "true",
+ [16] = "false",
+ [17] = "case",
+ [18] = "defined",
+ [19] = "csname",
+ [20] = "fontchar",
+ ["case"] = 17,
+ ["cat"] = 2,
+ ["char"] = 1,
+ ["csname"] = 19,
+ ["defined"] = 18,
+ ["dim"] = 4,
+ ["eof"] = 14,
+ ["false"] = 16,
+ ["fontchar"] = 20,
+ ["hbox"] = 11,
+ ["hmode"] = 7,
+ ["inner"] = 9,
+ ["mmode"] = 8,
+ ["none"] = 0,
+ ["num"] = 3,
+ ["odd"] = 5,
+ ["true"] = 15,
+ ["vbox"] = 12,
+ ["vmode"] = 6,
+ ["void"] = 10,
+ ["x"] = 13
+ },
+ ["etex.nodetype"] = {
+ [-1] = "none",
+ [0] = "char",
+ [1] = "hlist",
+ [2] = "vlist",
+ [3] = "rule",
+ [4] = "ins",
+ [5] = "mark",
+ [6] = "adjust",
+ [7] = "ligature",
+ [8] = "disc",
+ [9] = "whatsit",
+ [10] = "math",
+ [11] = "glue",
+ [12] = "kern",
+ [13] = "penalty",
+ [14] = "unset",
+ [15] = "maths",
+ ["adjust"] = 6,
+ ["char"] = 0,
+ ["disc"] = 8,
+ ["glue"] = 11,
+ ["hlist"] = 1,
+ ["ins"] = 4,
+ ["kern"] = 12,
+ ["ligature"] = 7,
+ ["mark"] = 5,
+ ["math"] = 10,
+ ["maths"] = 15,
+ ["none"] = -1,
+ ["penalty"] = 13,
+ ["rule"] = 3,
+ ["unset"] = 14,
+ ["vlist"] = 2,
+ ["whatsit"] = 9
+ },
+ ["etex.interactionmode"] = {
+ [0] = "batch",
+ [1] = "nonstop",
+ [2] = "scroll",
+ [3] = "errorstop",
+ ["batch"] = 0,
+ ["errorstop"] = 3,
+ ["nonstop"] = 1,
+ ["scroll"] = 2
+ },
+ ["luatex.pdfliteral.mode"] = {
+ [0] = "setorigin",
+ [1] = "page",
+ [2] = "direct",
+ ["direct"] = 2,
+ ["page"] = 1,
+ ["setorigin"] = 0
+ }
+}
+% \end{macrocode}
+% \begin{macrocode}
+function magicnum.get(name)
+ local startpos, endpos, category, entry =
+ string.find(name, "^(%a[%a%d%.]*)%.(-?[%a%d]+)$")
+ if not entry then
+ return
+ end
+ local node = data[category]
+ if not node then
+ return
+ end
+ local num = tonumber(entry)
+ local value
+ if num then
+ value = node[num]
+ if not value then
+ return
+ end
+ else
+ value = node[entry]
+ if not value then
+ return
+ end
+ value = "" .. value
+ end
+ tex.write(value)
+end
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</lua>
+% \end{macrocode}
+%
+% \section{Test}
+%
+% \subsection{Catcode checks for loading}
+%
+% \begin{macrocode}
+%<*test1>
+% \end{macrocode}
+% \begin{macrocode}
+\catcode`\{=1 %
+\catcode`\}=2 %
+\catcode`\#=6 %
+\catcode`\@=11 %
+\expandafter\ifx\csname count@\endcsname\relax
+ \countdef\count@=255 %
+\fi
+\expandafter\ifx\csname @gobble\endcsname\relax
+ \long\def\@gobble#1{}%
+\fi
+\expandafter\ifx\csname @firstofone\endcsname\relax
+ \long\def\@firstofone#1{#1}%
+\fi
+\expandafter\ifx\csname loop\endcsname\relax
+ \expandafter\@firstofone
+\else
+ \expandafter\@gobble
+\fi
+{%
+ \def\loop#1\repeat{%
+ \def\body{#1}%
+ \iterate
+ }%
+ \def\iterate{%
+ \body
+ \let\next\iterate
+ \else
+ \let\next\relax
+ \fi
+ \next
+ }%
+ \let\repeat=\fi
+}%
+\def\RestoreCatcodes{}
+\count@=0 %
+\loop
+ \edef\RestoreCatcodes{%
+ \RestoreCatcodes
+ \catcode\the\count@=\the\catcode\count@\relax
+ }%
+\ifnum\count@<255 %
+ \advance\count@ 1 %
+\repeat
+
+\def\RangeCatcodeInvalid#1#2{%
+ \count@=#1\relax
+ \loop
+ \catcode\count@=15 %
+ \ifnum\count@<#2\relax
+ \advance\count@ 1 %
+ \repeat
+}
+\def\RangeCatcodeCheck#1#2#3{%
+ \count@=#1\relax
+ \loop
+ \ifnum#3=\catcode\count@
+ \else
+ \errmessage{%
+ Character \the\count@\space
+ with wrong catcode \the\catcode\count@\space
+ instead of \number#3%
+ }%
+ \fi
+ \ifnum\count@<#2\relax
+ \advance\count@ 1 %
+ \repeat
+}
+\def\space{ }
+\expandafter\ifx\csname LoadCommand\endcsname\relax
+ \def\LoadCommand{\input magicnum.sty\relax}%
+\fi
+\def\Test{%
+ \RangeCatcodeInvalid{0}{47}%
+ \RangeCatcodeInvalid{58}{64}%
+ \RangeCatcodeInvalid{91}{96}%
+ \RangeCatcodeInvalid{123}{255}%
+ \catcode`\@=12 %
+ \catcode`\\=0 %
+ \catcode`\%=14 %
+ \LoadCommand
+ \RangeCatcodeCheck{0}{36}{15}%
+ \RangeCatcodeCheck{37}{37}{14}%
+ \RangeCatcodeCheck{38}{47}{15}%
+ \RangeCatcodeCheck{48}{57}{12}%
+ \RangeCatcodeCheck{58}{63}{15}%
+ \RangeCatcodeCheck{64}{64}{12}%
+ \RangeCatcodeCheck{65}{90}{11}%
+ \RangeCatcodeCheck{91}{91}{15}%
+ \RangeCatcodeCheck{92}{92}{0}%
+ \RangeCatcodeCheck{93}{96}{15}%
+ \RangeCatcodeCheck{97}{122}{11}%
+ \RangeCatcodeCheck{123}{255}{15}%
+ \RestoreCatcodes
+}
+\Test
+\csname @@end\endcsname
+\end
+% \end{macrocode}
+% \begin{macrocode}
+%</test1>
+% \end{macrocode}
+%
+% \subsection{Test data}
+%
+% \begin{macrocode}
+%<*testplain>
+\input magicnum.sty\relax
+\def\Test#1#2{%
+ \edef\result{\magicnum{#1}}%
+ \edef\expect{#2}%
+ \edef\expect{\expandafter\stripprefix\meaning\expect}%
+ \ifx\result\expect
+ \else
+ \errmessage{%
+ Failed: [#1] % hash-ok
+ returns [\result] instead of [\expect]%
+ }%
+ \fi
+}
+\def\stripprefix#1->{}
+%</testplain>
+% \end{macrocode}
+% \begin{macrocode}
+%<*testlatex>
+\NeedsTeXFormat{LaTeX2e}
+\documentclass{minimal}
+\usepackage{magicnum}[2016/05/16]
+\usepackage{qstest}
+\IncludeTests{*}
+\LogTests{log}{*}{*}
+\newcommand*{\Test}[2]{%
+ \Expect*{\magicnum{#1}}{#2}%
+}
+\begin{qstest}{magicnum}{magicnum}
+%</testlatex>
+% \end{macrocode}
+% \begin{macrocode}
+%<*testdata>
+\Test{tex.catcode.escape}{0}
+\Test{tex.catcode.invalid}{15}
+\Test{tex.catcode.unknown}{}
+\Test{tex.catcode.0}{escape}
+\Test{tex.catcode.15}{invalid}
+\Test{etex.iftype.true}{15}
+\Test{etex.iftype.false}{16}
+\Test{etex.iftype.15}{true}
+\Test{etex.iftype.16}{false}
+\Test{etex.nodetype.none}{-1}
+\Test{etex.nodetype.-1}{none}
+\Test{luatex.pdfliteral.mode.direct}{2}
+\Test{luatex.pdfliteral.mode.1}{page}
+\Test{}{}
+\Test{unknown}{}
+\Test{unknown.foo.bar}{}
+\Test{unknown.foo.4}{}
+%</testdata>
+% \end{macrocode}
+% \begin{macrocode}
+%<*testplain>
+\csname @@end\endcsname
+\end
+%</testplain>
+%<*testlatex>
+\end{qstest}
+\csname @@end\endcsname
+%</testlatex>
+% \end{macrocode}
+%
+% \subsection{Small test for \hologo{iniTeX}}
+%
+% \begin{macrocode}
+%<*test4>
+\catcode`\{=1
+\catcode`\}=2
+\catcode`\#=6
+\input magicnum.sty\relax
+\edef\x{\magicnum{tex.catcode.15}}
+\edef\y{invalid}
+\def\Strip#1>{}
+\edef\y{\expandafter\Strip\meaning\y}
+\ifx\x\y
+ \immediate\write16{Ok}%
+\else
+ \errmessage{\x<>\y}%
+\fi
+\csname @@end\endcsname\end
+%</test4>
+% \end{macrocode}
+%
+% \section{Installation}
+%
+% \subsection{Download}
+%
+% \paragraph{Package.} This package is available on
+% CTAN\footnote{\CTANpkg{magicnum}}:
+% \begin{description}
+% \item[\CTAN{macros/latex/contrib/magicnum/magicnum.dtx}] The source file.
+% \item[\CTAN{macros/latex/contrib/magicnum/magicnum.pdf}] Documentation.
+% \end{description}
+%
+%
+% \paragraph{Bundle.} All the packages of the bundle `magicnum'
+% are also available in a TDS compliant ZIP archive. There
+% the packages are already unpacked and the documentation files
+% are generated. The files and directories obey the TDS standard.
+% \begin{description}
+% \item[\CTANinstall{install/macros/latex/contrib/magicnum.tds.zip}]
+% \end{description}
+% \emph{TDS} refers to the standard ``A Directory Structure
+% for \TeX\ Files'' (\CTANpkg{tds}). Directories
+% with \xfile{texmf} in their name are usually organized this way.
+%
+% \subsection{Bundle installation}
+%
+% \paragraph{Unpacking.} Unpack the \xfile{magicnum.tds.zip} in the
+% TDS tree (also known as \xfile{texmf} tree) of your choice.
+% Example (linux):
+% \begin{quote}
+% |unzip magicnum.tds.zip -d ~/texmf|
+% \end{quote}
+%
+% \paragraph{Script installation.}
+% Check the directory \xfile{TDS:scripts/magicnum/} for
+% scripts that need further installation steps.
+%
+% \subsection{Package installation}
+%
+% \paragraph{Unpacking.} The \xfile{.dtx} file is a self-extracting
+% \docstrip\ archive. The files are extracted by running the
+% \xfile{.dtx} through \plainTeX:
+% \begin{quote}
+% \verb|tex magicnum.dtx|
+% \end{quote}
+%
+% \paragraph{TDS.} Now the different files must be moved into
+% the different directories in your installation TDS tree
+% (also known as \xfile{texmf} tree):
+% \begin{quote}
+% \def\t{^^A
+% \begin{tabular}{@{}>{\ttfamily}l@{ $\rightarrow$ }>{\ttfamily}l@{}}
+% magicnum.sty & tex/generic/magicnum/magicnum.sty\\
+% magicnum.lua & scripts/magicnum/magicnum.lua\\
+% magicnum.magicnum.lua & scripts/magicnum/magicnum.magicnum.lua\\
+% magicnum.pdf & doc/latex/magicnum/magicnum.pdf\\
+% magicnum.txt & doc/latex/magicnum/magicnum.txt\\
+% magicnum.dtx & source/latex/magicnum/magicnum.dtx\\
+% \end{tabular}^^A
+% }^^A
+% \sbox0{\t}^^A
+% \ifdim\wd0>\linewidth
+% \begingroup
+% \advance\linewidth by\leftmargin
+% \advance\linewidth by\rightmargin
+% \edef\x{\endgroup
+% \def\noexpand\lw{\the\linewidth}^^A
+% }\x
+% \def\lwbox{^^A
+% \leavevmode
+% \hbox to \linewidth{^^A
+% \kern-\leftmargin\relax
+% \hss
+% \usebox0
+% \hss
+% \kern-\rightmargin\relax
+% }^^A
+% }^^A
+% \ifdim\wd0>\lw
+% \sbox0{\small\t}^^A
+% \ifdim\wd0>\linewidth
+% \ifdim\wd0>\lw
+% \sbox0{\footnotesize\t}^^A
+% \ifdim\wd0>\linewidth
+% \ifdim\wd0>\lw
+% \sbox0{\scriptsize\t}^^A
+% \ifdim\wd0>\linewidth
+% \ifdim\wd0>\lw
+% \sbox0{\tiny\t}^^A
+% \ifdim\wd0>\linewidth
+% \lwbox
+% \else
+% \usebox0
+% \fi
+% \else
+% \lwbox
+% \fi
+% \else
+% \usebox0
+% \fi
+% \else
+% \lwbox
+% \fi
+% \else
+% \usebox0
+% \fi
+% \else
+% \lwbox
+% \fi
+% \else
+% \usebox0
+% \fi
+% \else
+% \lwbox
+% \fi
+% \else
+% \usebox0
+% \fi
+% \end{quote}
+% If you have a \xfile{docstrip.cfg} that configures and enables \docstrip's
+% TDS installing feature, then some files can already be in the right
+% place, see the documentation of \docstrip.
+%
+% \subsection{Refresh file name databases}
+%
+% If your \TeX~distribution
+% (\TeX\,Live, \mikTeX, \dots) relies on file name databases, you must refresh
+% these. For example, \TeX\,Live\ users run \verb|texhash| or
+% \verb|mktexlsr|.
+%
+% \subsection{Some details for the interested}
+%
+% \paragraph{Unpacking with \LaTeX.}
+% The \xfile{.dtx} chooses its action depending on the format:
+% \begin{description}
+% \item[\plainTeX:] Run \docstrip\ and extract the files.
+% \item[\LaTeX:] Generate the documentation.
+% \end{description}
+% If you insist on using \LaTeX\ for \docstrip\ (really,
+% \docstrip\ does not need \LaTeX), then inform the autodetect routine
+% about your intention:
+% \begin{quote}
+% \verb|latex \let\install=y\input{magicnum.dtx}|
+% \end{quote}
+% Do not forget to quote the argument according to the demands
+% of your shell.
+%
+% \paragraph{Generating the documentation.}
+% You can use both the \xfile{.dtx} or the \xfile{.drv} to generate
+% the documentation. The process can be configured by the
+% configuration file \xfile{ltxdoc.cfg}. For instance, put this
+% line into this file, if you want to have A4 as paper format:
+% \begin{quote}
+% \verb|\PassOptionsToClass{a4paper}{article}|
+% \end{quote}
+% An example follows how to generate the
+% documentation with pdf\LaTeX:
+% \begin{quote}
+%\begin{verbatim}
+%pdflatex magicnum.dtx
+%makeindex -s gind.ist magicnum.idx
+%pdflatex magicnum.dtx
+%makeindex -s gind.ist magicnum.idx
+%pdflatex magicnum.dtx
+%\end{verbatim}
+% \end{quote}
+%
+% \begin{History}
+% \begin{Version}{2007/12/12 v1.0}
+% \item
+% First public version.
+% \end{Version}
+% \begin{Version}{2009/04/10 v1.1}
+% \item
+% Adaptation to \LuaTeX\ 0.40.
+% \end{Version}
+% \begin{Version}{2010/03/09 v1.2}
+% \item
+% Adaptation to package \xpackage{luatex} 0.4.
+% \end{Version}
+% \begin{Version}{2011/03/24 v1.3}
+% \item
+% Catcode fixes.
+% \end{Version}
+% \begin{Version}{2011/04/10 v1.4}
+% \item
+% Compatibility for \hologo{iniTeX}.
+% \item
+% Dependency from package \xpackage{luatex} removed.
+% \item
+% Version check for lua module.
+% \end{Version}
+% \begin{Version}{2016/05/16 v1.5}
+% \item
+% Documentation updates.
+% \end{Version}
+% \begin{Version}{2019/07/25 v1.6}
+% \item
+% remove uses of module function, see PR70
+% \end{Version}
+
+% \begin{Version}{2019/11/29 v1.7}
+% \item
+% Documentation updates.
+% \item
+% Use \xpackage{iftex} directly.
+% \end{Version}
+% \end{History}
+%
+% \PrintIndex
+%
+% \Finale
+\endinput
diff --git a/macros/latex/contrib/magicnum/magicnum.pdf b/macros/latex/contrib/magicnum/magicnum.pdf
new file mode 100644
index 0000000000..6a54e1b265
--- /dev/null
+++ b/macros/latex/contrib/magicnum/magicnum.pdf
Binary files differ