summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/source/latex/oberdiek
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/source/latex/oberdiek')
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/accsupp.dtx1
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/aliascnt.dtx1
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/alphalph.dtx1602
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/atbegshi.dtx133
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/atenddvi.dtx1
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/attachfile2.dtx1
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/auxhook.dtx1
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/bmpsize.dtx1
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/bookmark.dtx1
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/catchfile.dtx125
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/centernot.dtx9
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/chemarr.dtx1
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/classlist.dtx1
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/colonequals.dtx1
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/dvipscol.dtx1
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/embedfile.dtx327
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/engord.dtx109
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/epstopdf.dtx1
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/etexcmds.dtx145
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/flags.dtx1
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/grffile.dtx1
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/holtxdoc.dtx1
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/hycolor.dtx1
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/hypbmsec.dtx1
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/hypcap.dtx1
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/hypdestopt.dtx1
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/hypdoc.dtx1
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/ifdraft.dtx1
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/iflang.dtx165
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/ifpdf.dtx110
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/ifvtex.dtx108
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/infwarerr.dtx162
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/inputenx.dtx1
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/intcalc.dtx3701
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/kvoptions.dtx1
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/kvsetkeys.dtx181
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/makerobust.dtx1
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/oberdiek.ins7
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/oberdiek.tex105
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/pagesel.dtx1
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/pdfcol.dtx942
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/pdfcolfoot.dtx124
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/pdfcolmk.dtx1
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/pdfcolparallel.dtx890
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/pdfcolparcolumns.dtx686
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/pdfcrypt.dtx3
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/pdfescape.dtx224
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/pdflscape.dtx1
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/picture.dtx1
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/pmboxdraw.dtx1
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/refcount.dtx1
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/selinput.dtx59
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/setouterhbox.dtx148
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/settobox.dtx1
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/soulutf8.dtx1760
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/stackrel.dtx1
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/stringenc.dtx171
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/tabularht.dtx1
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/tabularkv.dtx1
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/telprint.dtx129
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/transparent.dtx1
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/twoopt.dtx1
-rw-r--r--Master/texmf-dist/source/latex/oberdiek/zref.dtx1
63 files changed, 11103 insertions, 1059 deletions
diff --git a/Master/texmf-dist/source/latex/oberdiek/accsupp.dtx b/Master/texmf-dist/source/latex/oberdiek/accsupp.dtx
index 4ca301db4bf..39ace16bc8d 100644
--- a/Master/texmf-dist/source/latex/oberdiek/accsupp.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/accsupp.dtx
@@ -671,6 +671,7 @@ A\notparallel B
% \begin{macrocode}
%</dvips>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
diff --git a/Master/texmf-dist/source/latex/oberdiek/aliascnt.dtx b/Master/texmf-dist/source/latex/oberdiek/aliascnt.dtx
index b280be8396e..e7368483072 100644
--- a/Master/texmf-dist/source/latex/oberdiek/aliascnt.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/aliascnt.dtx
@@ -340,6 +340,7 @@ and the derived files
% \begin{macrocode}
%</package>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
diff --git a/Master/texmf-dist/source/latex/oberdiek/alphalph.dtx b/Master/texmf-dist/source/latex/oberdiek/alphalph.dtx
index 7fba92f4829..3a3d117ec0b 100644
--- a/Master/texmf-dist/source/latex/oberdiek/alphalph.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/alphalph.dtx
@@ -17,7 +17,8 @@
%
% This work consists of the main source file alphalph.dtx
% and the derived files
-% alphalph.sty, alphalph.pdf, alphalph.ins, alphalph.drv.
+% alphalph.sty, alphalph.pdf, alphalph.ins, alphalph.drv,
+% alphalph-test1.tex, alphalph-test2.tex, alphalph-test3.tex.
%
% Distribution:
% CTAN:macros/latex/contrib/oberdiek/alphalph.dtx
@@ -52,6 +53,9 @@
% Installation:
% TDS:tex/generic/oberdiek/alphalph.sty
% TDS:doc/latex/oberdiek/alphalph.pdf
+% TDS:doc/latex/oberdiek/alphalph-test1.tex
+% TDS:doc/latex/oberdiek/alphalph-test2.tex
+% TDS:doc/latex/oberdiek/alphalph-test3.tex
% TDS:source/latex/oberdiek/alphalph.dtx
%
%<*ignore>
@@ -67,7 +71,7 @@
\input docstrip.tex
\Msg{************************************************************************}
\Msg{* Installation}
-\Msg{* Package: alphalph 2007/04/11 v1.5 Converting numbers to letters (HO)}
+\Msg{* Package: alphalph 2007/04/11 v2.0 Converting numbers to letters (HO)}
\Msg{************************************************************************}
\keepsilent
@@ -94,7 +98,8 @@ This Current Maintainer of this work is Heiko Oberdiek.
This work consists of the main source file alphalph.dtx
and the derived files
- alphalph.sty, alphalph.pdf, alphalph.ins, alphalph.drv.
+ alphalph.sty, alphalph.pdf, alphalph.ins, alphalph.drv,
+ alphalph-test1.tex, alphalph-test2.tex, alphalph-test3.tex.
\endpreamble
@@ -103,6 +108,10 @@ and the derived files
\file{alphalph.drv}{\from{alphalph.dtx}{driver}}%
\usedir{tex/generic/oberdiek}%
\file{alphalph.sty}{\from{alphalph.dtx}{package}}%
+ \usedir{doc/latex/oberdiek}%
+ \file{alphalph-test1.tex}{\from{alphalph.dtx}{test1}}%
+ \file{alphalph-test2.tex}{\from{alphalph.dtx}{test2,etex}}%
+ \file{alphalph-test3.tex}{\from{alphalph.dtx}{test2,noetex}}%
}
\obeyspaces
@@ -128,17 +137,42 @@ and the derived files
%<*driver>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{alphalph.drv}%
- [2007/04/11 v1.5 Converting numbers to letters (HO)]%
+ [2007/04/11 v2.0 Converting numbers to letters (HO)]%
\documentclass{ltxdoc}
\usepackage{holtxdoc}
-\usepackage{alphalph}
+\usepackage{alphalph}[2007/04/11]
+\makeatletter
+\newalphalph{\fnsymbolwrap}[wrap]{\@fnsymbol}{}
+\newcommand*{\fnsymbolsingle}[1]{%
+ \ensuremath{%
+ \ifcase#1%
+ \or *%
+ \or \dagger
+ \or \ddagger
+ \or \mathsection
+ \or \mathparagraph
+ \else
+ \@ctrerr
+ \fi
+ }%
+}
+\makeatother
+\newalphalph{\fnsymbolmult}[mult]{\fnsymbolsingle}{}
+\usepackage{amsmath}
+\DeclareMathOperator{\opDiv}{div}
+\DeclareMathOperator{\opMod}{mod}
+\newcommand*{\Def}{%
+ \ensuremath{%
+ \mathrel{\mathop{:}}=%
+ }%
+}
\begin{document}
\DocInput{alphalph.dtx}%
\end{document}
%</driver>
% \fi
%
-% \CheckSum{406}
+% \CheckSum{1035}
%
% \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
@@ -159,100 +193,352 @@ and the derived files
% \GetFileInfo{alphalph.drv}
%
% \title{The \xpackage{alphalph} package}
-% \date{2007/04/11 v1.5}
+% \date{2007/04/11 v2.0}
% \author{Heiko Oberdiek\\\xemail{oberdiek@uni-freiburg.de}}
%
% \maketitle
%
% \begin{abstract}
-% The package provides the new expandable commands \cs{alphalph}
-% and \cs{AlphAlph}. They are like \cs{number}, but the expansion
-% consists of lowercase and uppercase letters respectively.
+% The package provides methods to represent numbers with a limited
+% set of symbols. Both \LaTeX\ and \plainTeX are supported.
% \end{abstract}
%
% \tableofcontents
%
-% \newenvironment{param}{^^A
-% \newcommand{\entry}[1]{\meta{\###1}:&}^^A
-% \begin{tabular}[t]{@{}l@{ }l@{}}^^A
-% }{^^A
-% \end{tabular}^^A
-% }
+% \section{Documentation}
%
-% \section{Usage}
-% The package \Package{alphalph} can be used with both \plainTeX\
-% and \LaTeX:
-% \begin{description}
-% \item[\plainTeX:] |\input alphalph.sty|
-% \item[\LaTeXe:] |\usepackage{alphalph}|\\
-% There aren't any options.
-% \end{description}
+% \subsection{Introduction}
+% \LaTeX\ counter can be represented in different ways
+% by using presentation commands:
+% \begin{quote}
+% \cs{arabic}, \cs{roman}, \cs{Roman},\\
+% \cs{alph}, \cs{Alph}, \cs{fnsymbol}
+% \end{quote}
+% The ranges of supported counter values are more or less
+% restricted. Only \cs{arabic} can be used with any counter
+% value \TeX\ supports.
+% \begin{quote}
+% \catcode`\|=12 %
+% \begin{tabular}{@{}l|l|l|l@{}}
+% Presentation & Supported & Ignored & Error message\\
+% command & domain & values & ``Counter too large''\\
+% \hline
+% \cs{arabic}
+% & \ttfamily -MAX..MAX & &\\
+% \cs{roman}, \cs{Roman}
+% & \ttfamily 1..MAX & \ttfamily MAX..0 &\\
+% \cs{alph}, \cs{Alph}
+% & \ttfamily 1..26 & 0 & \ttfamily MAX..-1, 27..MAX\\
+% \cs{fnsymbol}
+% & \ttfamily 1..9 & 0 & \ttfamily -MAX..-1, 10..MAX\\
+% \hline
+% \end{tabular}\\[1ex]
+% \texttt{MAX} = \texttt{2147483647}
+% \end{quote}
+% Ordinal numbers are often used in documents: numbering
+% of chapters, sections, figures, footnotes and so on.
+% The layouter chooses \cs{Alph} for chapter numbers
+% and \cs{fnsymbol} for footnotes. But what can be done
+% if there are more than 26 chapters or more than 10 footnotes?
+% This package \xpackage{alphalph} allows to define new
+% presentation commands. They rely on a existing command
+% and define presentations for values greater the limits.
+% Three different methods are provided by the package.
+% In the following use cases they are presentated.
+%
+% \subsection{Use cases}
+%
+% \subsubsection{Number system based on symbols}
+%
+% Asume you are writing a book and your lecturer demands
+% that chapter numbers must be letters. But you have already
+% 30 chapters and you have only 26 letters?
+%
+% In the decimal system the situation would be clear.
+% If you run out of digits, you are using more digits
+% to represent a number. This method can be also be used
+% for letters. After chapter 26 with |Z| we us |AA|, |AB|, |AC|, and |AD|
+% for the remaining chapters.
+%
+% Happily this package already defines this presentation command:
+%\begin{quote}
+%\begin{verbatim}
+%\usepackage{alphalph}
+%\renewcommand*{\thechapter}{%
+% \AlphAlph{\value{chapter}}%
+%}
+%\end{verbatim}
+%\end{quote}
+% \cs{AlphAlph} generates:
+% \AlphAlph{1}, \AlphAlph{2}, \AlphAlph{3}, \dots,
+% \AlphAlph{26}, \AlphAlph{27}, \AlphAlph{28}, \dots
+%
+% The other presentation command is \cs{alphalph} for lowercase letters.
+%
+% \subsubsection{Wrap symbols around}
+%
+% Nine footnote symbols are quite a few.
+% Too soon the symbols are consumed
+% and \LaTeX\ complains with the error ``Counter too large''.
+% However, it could be acceptable to start again with the symbols
+% from the beginning, especially if there are less than nine symbols
+% on a page.
+% This could be achieved by a counter reset.
+% But finding the right place can be difficult or needs manual
+% actions. Also a
+% unique counter value can be desirable (e.g. for generating
+% unique anchor/link names).
+% Package \xpackage{alphalph} allows you to define
+% a macro that implements a ``wrap around'', but letting
+% the value of the counter untouched:
+%\begin{quote}
+%\begin{verbatim}
+%\usepackage{alphalph}
+%\makeatletter
+%\newalphalph{\fnsymbolwrap}[wrap]{\@fnsymbol}{}
+%\makeatother
+%\renewcommand*{\thefootnote}{%
+% \fnsymbolwrap{\value{footnote}}%
+%}
+%\end{verbatim}
+%\end{quote}
+% \cs{fnsymbolwrap} generates:
+% \fnsymbolwrap{1}~(1), \fnsymbolwrap{2}~(2), \fnsymbolwrap{3}~(3), \dots,
+% \fnsymbolwrap{9}~(9), \fnsymbolwrap{10}~(10), \fnsymbolwrap{11}~11, \dots
%
-% \subsection{User commands}
-% \begin{description}
-% \item[\cmd{\alphalph}:]\DescribeMacro{\alphalph}
-% This works like \cmd{\number}, but the expansion consists of
-% lowercase letters.
-% \item[\cmd{\AlphAlph}:]\DescribeMacro{\AlphAlph}
-% It converts a number into uppercase letters.
-% \end{description}
-% Both commands have following properties:
-% \begin{itemize}
-% \item They are fully expandable. This means that they can safely
-% \begin{itemize}
-% \item be written to a file,
-% \item used in moving arguments (\LaTeX: they are \emph{robust}),
-% \item used in a \cmd{\csname}-\cmd{\endcsname} pair.
-% \end{itemize}
-% \item If the argument is zero or negative, the commands expand
-% to nothing like \cmd{\romannumeral}.
-% \item As argument is allowed all that can be used after a \cmd{\number}:
-% \begin{itemize}
-% \item explicite constants,
-% \item macros that expand to a number,
-% \item count registers, \LaTeX\ counter can used
-% via \cmd{\value}, e.\,g.:\\
-% |\alphalph{\value{page}}|
-% \end{itemize}
-% \end{itemize}
-%
-% The following table shows, how the conversion is made:
-% \begin{center}
-% \catcode`\|=12
-% \catcode`\+\active
-% \def+#1&{\alphalph{#1}&}%
-% \begin{tabular}{@{}l|*{14}{r@{, }}r@{}}
-% number & 1& 2&\dots& 26& 27&\dots& 52& 53&
-% \dots& 78& 79&\dots& 702& 703&\dots
-% \\\hline
-% \cmd{\alphalph}&+1&+2&\dots&+26&+27&\dots&+52&+53&
-% \dots&+78&+79&\dots&+702&+703&\dots
-% \end{tabular}
-% \end{center}
-%
-% \subsubsection{New commands like \cs{alphalph}}
-% \begin{description}
-% \item[\cmd{\newalphalph}:]\DescribeMacro{\newalphalph}
-% This macro defines a new command that acts like \cs{alphalph}.
-% The use of \eTeX is required.
-% The macro has three arguments:
-% \begin{itemize}
-% \item[\texttt{\#1}:] The command to be defined.
-% \item[\texttt{\#2}:] A macro that converts a positive number
-% to a symbol.
-% \item[\texttt{\#3}:] The number of available symbols.
-% \end{itemize}
-% \end{description}
-%
-% Example:
+% \subsubsection{Multiple symbols}
+%
+% \LaTeX's standard set of footnote symbols contains doubled
+% symbols at the higher positions. Could this principle
+% be generalized?
+% Yes, but first we need a clean footnote symbol list without
+% doubled entries, example:
+%\begin{quote}
+%\begin{verbatim}
+%\usepackage{alphalph}
+%\makeatletter
+%\newcommand*{\fnsymbolsingle}[1]{%
+% \ensuremath{%
+% \ifcase#1%
+% \or *%
+% \or \dagger
+% \or \ddagger
+% \or \mathsection
+% \or \mathparagraph
+% \else
+% \@ctrerr
+% \fi
+% }%
+%}
+%\makeatother
+%\newalphalph{\fnsymbolmult}[mult]{\fnsymbolsingle}{}
+%\renewcommand*{\thefootnote}{%
+% \fnsymbolmult{\value{footnote}}%
+%}
+%\end{verbatim}
+%\end{quote}
+% The own definition of \cs{fnsymbolsingle} has the
+% advantage that this list can easily modified.
+% Otherwise you can use \cs{@fnsymbol} directly,
+% because it uses the same first five symbols.
%\begin{quote}
%\begin{verbatim}
-%\newcommand*{\myvocals}[1]{%
-% \ifcase#1\or A\or E\or I\or O\or U\fi
+%\usepackage{alphalph}
+%\makeatletter
+%\newalphalph{\fnsymbolmult}[mult]{\@fnsymbol}{5}
+%\makeatother
+%\renewcommand*{\thefootnote}{%
+% \fnsymbolmult{\value{footnote}}%
%}
-%\newalphalph{\vocalsvocals}{\myvocals}{5}
%\end{verbatim}
%\end{quote}
+% \cs{fnsymbolmult} generates:
+% \fnsymbolmult{1}~(1), \fnsymbolmult{2}~(2), \fnsymbolmult{3}~(3),
+% \fnsymbolmult{4}~(4), \fnsymbolmult{5}~(5), \fnsymbolmult{6}~(6),
+% \dots, \fnsymbolmult{16}~16, \fnsymbolmult{17}~17, \dots
+%
+% \bigskip
+% The same method can also be used for the chapter problem
+% in the first discussed use case:
+%\begin{quote}
+%\begin{verbatim}
+%\usepackage{alphalph}
+%\makeatletter
+%\newalphalph{\AlphMult}[mult]{\@Alph}{26}
+%\makeatother
+%\renewcommand*{\chapter}{%
+% \AlphMult{\value{chapter}}%
+%}
+%\end{verbatim}
+%\end{quote}
+% \cs{AlphMult} then generates AA, BB, CC, and DD for chapters 27--30.
+%
+% \subsection{Glossary}
+%
+% \begin{description}
+% \item[Counter presentation command] is a macro that
+% expects a \LaTeX\ counter name as argument.
+% Numbers cannot be used. Examples:
+% \cs{arabic}, \cs{alph}, \cs{fnsymbol}.
+% \item[Number presentation command] is a macro that
+% expects a number as argument. A number is anything
+% that \TeX\ accepts as number including \cs{value}.
+% Examples: \cs{alphalph}, \cs{AlphAlph}, \cs{alphalph@alph}
+%
+% However, \cs{alph} or \cs{fnsymbol} are not number
+% presentation commands because they expect a counter
+% name as argument. Happily \LaTeX\ counter presentation
+% commands internally uses number presentation commands
+% with the same name, but prefixed by `@'. Thus
+% \cs{@alph}, \cs{@fnsymbol} are number presentation commands.
+% \item[Symbols provider] is a command that can be used
+% to get a list of symbols. For example, \cs{@Alph}
+% provides the 26 uppercase letters from `A' to `Z'.
+% Basically a symbol provider is a number presentation
+% command, usually with a limited range.
+% \item[Number of symbols] is the number of the
+% last symbol slot of a symbol provider. Thus \cs{@Alph}
+% generates 26 symbols, \cs{@fnsymbol} provides 9 symbols.
+% \end{description}
+%
+% \subsection{Package usage}
+%
+% The package \Package{alphalph} can be used with both \plainTeX\
+% and \LaTeX:
+% \begin{description}
+% \item[\plainTeX:] |\input alphalph.sty|
+% \item[\LaTeXe:] |\usepackage{alphalph}|\\
+% There aren't any options.
+% \end{description}
+%
+% \subsection{User commands}
+%
+% \begin{declcs}{AlphAlph} \M{number}\\
+% \cs{alphalph} \M{number}
+% \end{declcs}
+% Both macros are number presentation commands that
+% expects a number as argument. \LaTeX\ counters
+% are used with \cs{value}.
+%
+% The macros represents a number by letters.
+% First single letters |A..Z| are used, then
+% two letters |AA..ZZ|, three letters |AAA...ZZZ|, \dots
+% follow.
+%
+% Macro \cs{AlphAlph} uses uppercase letters,
+% \cs{alphalph} generates the lowercase variant.
+% \begin{quote}
+% \catcode`\|=12
+% \def\entry#1{
+% \texttt{#1}
+% & \texttt{\AlphAlph{#1}}
+% & \texttt{\alphalph{#1}}
+% }
+% \begin{tabular}{@{}l|l|l@{}}
+% \meta{number} & \verb|\AlphAlph{|\meta{number}\verb|}|
+% & \verb|\alphalph{|\meta{number}\verb|}|\\
+% \hline
+% \entry{1}\\
+% \entry{2}\\
+% \entry{26}\\
+% \entry{27}\\
+% \entry{30}\\
+% \entry{2000}\\
+% \entry{3752127}\\
+% \entry{10786572}\\
+% \entry{2147483647}\\
+% \end{tabular}
+% \end{quote}
+%
+% \begin{declcs}{newalphalph}
+% \M{cmd}
+% |[|\meta{method}|]|
+% \M{symbols provider}
+% \M{number of symbols}
+% \end{declcs}
+% Macro \cs{newalphalph} defines \meta{cmd} as new
+% number presentation command. Like \cs{newcommand} an error
+% is thrown, if macro \meta{cmd} already exists.
+%
+% The \meta{method} is one of |alph|, |wrap|, or |mult|.
+% The default is |alph|.
+%
+% As symbol provider a number presentation command
+% can be used, e.g. \cs{@fnsymbol}, \cs{@Alph}, or
+% \cs{alphalph@alph}.
+%
+% The last argument is the number of symbols.
+% If the argument is empty, then \cs{newalphalph} tries
+% to find this number itself. \LaTeX's number presentation
+% commands throw an error message, if the number is too large.
+% This error message is put in a macro \cs{@ctrerr}.
+% Thus \cs{newalphalph} calls the symbol provider and tests
+% a number by typesetting it in a temporary box. The error
+% macro \cs{@ctrerr} is catched, it proofs that the number
+% is not supported. Also if the width of the result is zero
+% the number is considered as unavailable.
+%
+% The empty argument is useful for potentially variable lists.
+% However if the end cannot be detected, then the number of
+% symbols must be given. This is also a lot faster. Therefore don't
+% let the argument empty without reason.
+%
+% \subsection{Programmer commands}
+%
+% \begin{declcs}{alphalph@Alph} \M{number}\\
+% \cs{alphalph@alph} \M{number}
+% \end{declcs}
+% They are basically the same as \cs{@Alph} and \cs{@alph}.
+% Some languages of package \xpackage{babel} redefine
+% \LaTeX's macros to include some font setup that
+% breaks expandibility. Therefore \cs{AlphAlph} and \cs{alphalph}
+% are based on \cs{alphalph@Alph} and \cs{alphalph@alph} to get
+% the letters. The behaviour of these symbol providers for numbers
+% outside the range |1..26| is undefined.
+%
+% \subsection{Design principles}
+%
+% \subsubsection{Number presentation commands}
+%
+% All number presentation commands that this package defines
+% (including \cs{alphalph} and \cs{AlphAlph}) have the following
+% properties:
+% \begin{itemize}
+% \item They are fully expandable. This means that they can safely
+% \begin{itemize}
+% \item be written to a file,
+% \item used in moving arguments (\LaTeX: they are \emph{robust}),
+% \item used in a \cmd{\csname}-\cmd{\endcsname} pair.
+% \end{itemize}
+% \item If the argument is zero or negative, the commands expand
+% to nothing like \cmd{\romannumeral}.
+% \item The argument is a \TeX\ number. Anything that would be
+% accepted by \cmd{\number} is a valid argument:
+% \begin{itemize}
+% \item explicite constants,
+% \item macros that expand to a number,
+% \item count registers, \LaTeX\ counter can used
+% via \cmd{\value}, e.\,g.:\\
+% |\alphalph{\value{page}}|
+% \item \dots
+% \end{itemize}
+% \item \eTeX's numeric expressions are supported, if \eTeX\ is
+% available. Then \cs{numexpr} is applied to the argument.
+% Package \cs{calc}'s expressions are not supported.
+% That would violate the expandibility.
+% \end{itemize}
+%
+% \subsubsection{General usability}
+%
+% \begin{description}
+% \item[\TeX\ format:]
+% The package does not depend on \LaTeX, it can also be used
+% by \plainTeX, for example.
+% \item[\eTeX:] \eTeX is supported, the macros are shorter and
+% faster. But \eTeX's extensions are not requirements.
+% Without \eTeX, just the implementation changes. The properties
+% remain unchanged.
+% \end{description}
%
% \StopEventually{
% }
@@ -319,18 +605,107 @@ and the derived files
\fi
\expandafter\x\csname ver@alphalph.sty\endcsname
\ProvidesPackage{alphalph}%
- [2007/04/11 v1.5 Converting numbers to letters (HO)]
+ [2007/04/11 v2.0 Converting numbers to letters (HO)]
% \end{macrocode}
%
-% For unique command names this package uses |aa@| as prefix
-% for internal command names. Because we need |@| as a letter
-% we save the current catcode value.
+% \subsection{Catcodes}
+%
% \begin{macrocode}
-\expandafter\edef\csname aa@atcode\endcsname{\the\catcode`\@ }
-\catcode`\@=11
+\expandafter\edef\csname AlPh@AtEnd\endcsname{%
+ \catcode64 \the\catcode64\relax
+}
+\catcode64 11 % @
+\def\TMP@EnsureCode#1#2{%
+ \edef\AlPh@AtEnd{%
+ \AlPh@AtEnd
+ \catcode#1 \the\catcode#1\relax
+ }%
+ \catcode#1 #2\relax
+}
+\TMP@EnsureCode{33}{12}% !
+\TMP@EnsureCode{39}{12}% '
+\TMP@EnsureCode{40}{12}% (
+\TMP@EnsureCode{41}{12}% )
+\TMP@EnsureCode{43}{12}% +
+\TMP@EnsureCode{44}{12}% ,
+\TMP@EnsureCode{46}{12}% .
+\TMP@EnsureCode{47}{12}% /
+\TMP@EnsureCode{59}{12}% ;
+\TMP@EnsureCode{60}{12}% <
+\TMP@EnsureCode{61}{12}% =
+\TMP@EnsureCode{62}{12}% >
+\TMP@EnsureCode{91}{12}% [
+\TMP@EnsureCode{93}{12}% ]
+\TMP@EnsureCode{96}{12}% `
+\TMP@EnsureCode{124}{12}% |
+% \end{macrocode}
+%
+% \subsection{Package loading}
+%
+% \begin{macrocode}
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname RequirePackage\endcsname\relax
+ \input infwarerr.sty\relax
+ \input intcalc.sty\relax
+\else
+ \RequirePackage{infwarerr}[2007/09/09]%
+ \RequirePackage{intcalc}[2007/09/09]%
+\fi
+% \end{macrocode}
+%
+% \subsection{\eTeX\ detection}
+%
+% \begin{macrocode}
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname numexpr\endcsname\relax
+ \catcode124=9 % '!': ignore
+ \catcode43=14 % '+': comment
+\else
+ \catcode124=14 % '!': comment
+ \catcode43=9 % '+': ignore
+\fi
% \end{macrocode}
%
% \subsection{Help macros}
+%
+% \begin{macro}{\AlPh@Error}
+% \begin{macrocode}
+\def\AlPh@Error#1{%
+ \begingroup
+ \escapechar=92 % backslash
+ \@PackageError{alphalph}{#1}\@ehc
+ \endgroup
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\AlPh@IfDefinable}
+% \begin{macrocode}
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname @ifdefinable\endcsname\relax
+ \def\AlPh@IfDefinable#1#2{%
+ \ifcase\ifx#1\@undefined\else\ifx#1\relax\else1\fi\fi0 %
+ #2%
+ \else
+ \AlPh@Error{%
+ Command \string#1 already defined%
+ }%
+ \fi
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+\else
+% \end{macrocode}
+% \begin{macro}{\AlPh@IfDefinable}
+% \begin{macrocode}
+ \let\AlPh@IfDefinable\@ifdefinable
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+\fi
+% \end{macrocode}
+%
% \begin{macro}{\@ReturnAfterElseFi}
% \begin{macro}{\@ReturnAfterFi}
% The following commands moves the `then' and `else' part respectively
@@ -338,7 +713,7 @@ and the derived files
% and so a \TeX\ capacity error because of a limited input stack size.
% I use this trick in several packages, so I don't prefix these internal
% commands in order not to have the same macros with different names.
-% (It saves memory).
+% (It saves memory.)
% \begin{macrocode}
\long\def\@ReturnAfterElseFi#1\else#2\fi{\fi#1}
\long\def\@ReturnAfterFi#1\fi{\fi#1}
@@ -346,461 +721,810 @@ and the derived files
% \end{macro}
% \end{macro}
%
-% \begin{macro}{\aa@alph}
-% \begin{macro}{\aa@Alph}
-% The two commands \cmd{\aa@alph} and \cmd{\aa@Alph} convert a
-% number into a letter (lowercase and uppercase respectivly).
+% \begin{macro}{\@gobblefour}
+% \LaTeX\ defines commands for eating arguments.
+% Define \cs{@gobblefour} if it is not defined (\plainTeX).
+% \begin{macrocode}
+\expandafter\ifx\csname @gobblefour\endcsname\relax
+ \long\def\@gobblefour#1#2#3#4{}%
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{AlPh@IfOptArg}
+% \begin{macrocode}
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname kernel@ifnextchar\endcsname\relax
+ \begingroup\expandafter\expandafter\expandafter\endgroup
+ \expandafter\ifx\csname @ifnextchar\endcsname\relax
+ \def\AlPh@IfOptArg#1#2{%
+ \def\AlPh@TempA{#1}%
+ \def\AlPh@TempB{#2}%
+ \futurelet\AlPh@Token\AlPh@IfOptArgNext
+ }%
+ \let\AlPh@BracketLeft=[%]
+ \def\AlPh@IfOptArgNext{%
+ \ifx\AlPh@Token\AlPh@BracketLeft
+ \expandafter\AlPh@TempA
+ \else
+ \expandafter\AlPh@TempB
+ \fi
+ }%
+ \else
+ \def\AlPh@IfOptArg{\@ifnextchar[}%]
+ \fi
+\else
+ \def\AlPh@IfOptArg{\kernel@ifnextchar[}%]
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Symbol provider}
+%
+% \subsubsection{Alphabet}
+%
+% The output of \cs{alphalph} and \cs{AlphAlph} should be
+% usable as part of command names (see \cs{@namedef}, \cs{csname}, \dots).
+% Unhappily some languages of package \xpackage{babel}
+% redefine \LaTeX's \cs{@alph} and \cs{@Alph} in a manner that
+% they cannot be used in expandable context any more.
+% Therefore package \xpackage{alphalph} provides its own
+% commands.
+%
+% \begin{macro}{\alphalph@Alph}
+% \begin{macro}{\alphalph@alph}
+% The two commands \cmd{\AlPh@Alph} and \cmd{\AlPh@alph} convert a
+% number into a letter (uppercase and lowercase respectivly).
% The character |@| is used as an error symbol,
% if the number isn't in the range of 1 until 26.
% Here we need no space after the number |#1|, because the error
% symbol |@| for the zero case stops scanning the number.
+% This error symbol should not appear anywhere (except for bugs).
% \begin{macrocode}
-\def\aa@alph#1{%
+\def\alphalph@Alph#1{%
\ifcase#1%
@%
- \or a\or b\or c\or d\or e\or f\or g\or h\or i\or j\or k\or l\or m%
- \or n\or o\or p\or q\or r\or s\or t\or u\or v\or w\or x\or y\or z%
+ \or A\or B\or C\or D\or E\or F\or G\or H\or I\or J\or K\or L\or M%
+ \or N\or O\or P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z%
\else
+ \AlPh@ctrerr
@%
\fi
}
-\def\aa@Alph#1{%
+\def\alphalph@alph#1{%
\ifcase#1%
@%
- \or A\or B\or C\or D\or E\or F\or G\or H\or I\or J\or K\or L\or M%
- \or N\or O\or P\or Q\or R\or S\or T\or U\or V\or W\or X\or Y\or Z%
+ \or a\or b\or c\or d\or e\or f\or g\or h\or i\or j\or k\or l\or m%
+ \or n\or o\or p\or q\or r\or s\or t\or u\or v\or w\or x\or y\or z%
\else
+ \AlPh@ctrerr
@%
\fi
}
% \end{macrocode}
% \end{macro}
% \end{macro}
-%
-% \subsection{User commands}
-% \begin{macro}{\alphalph}
-% \begin{macro}{\AlphAlph}
-% The whole difference between \cmd{\alphalph} and \cmd{\AlphAlph}
-% is that the output consists of lowercase or uppercase letters.
+% \begin{macro}{\AlPh@ctrerr}
+% Macro \cs{AlPh@ctrerr} is used as hook for the algorithm
+% to get the available number of symbols.
% \begin{macrocode}
-\def\alphalph{\aa@callmake\aa@alph}
-\def\AlphAlph{\aa@callmake\aa@Alph}
+\def\AlPh@ctrerr{}
% \end{macrocode}
% \end{macro}
-% \end{macro}
%
-% \begin{macro}{\aa@callmake}
-% \cmd{\aa@callmake} converts the number in
-% the second argument |#2| into explicite decimal digits via
-% the \TeX\ primitive \cmd{\number}. (The closing curly brace stops reading
-% the number at the latest.)
+% \subsection{Finding number of symbols}
+%
+% \begin{macro}{\AlPh@GetNumberOfSymbols}
+% \noindent
+% |#1|: symbols provider
% \begin{macrocode}
-\def\aa@callmake#1#2{%
- \expandafter\aa@make\expandafter{\number#2}#1%
+\def\AlPh@GetNumberOfSymbols#1{%
+ \AlPh@TestNumber1!{#1}%
+ \ifAlPh@Unavailable
+ \def\AlPh@Number{0}%
+ \AlPh@Error{No symbols found}%
+ \else
+ \def\AlPh@Number{1}%
+ \AlPh@ExpSearch2!{#1}%
+ \fi
}
% \end{macrocode}
% \end{macro}
-%
-% \eTeX provides the new primitive \cmd{\numexpr}.
-% With this command the implementation is very simple
-% (see \ref{sec:etex}). Therefore the package provides two
-% methods: a fast and simple one that uses the \eTeX\ extension
-% and a method that is restricted to the standard \TeX\ means.
-%
-% Now we distinguish between \TeX\ and \eTeX\ by checking
-% whether \cmd{\numexpr} is defined or isn't.
-% Because the \TeX\ primitive \cmd{\csname} defines an
-% undefined command to be \cmd{\relax}, \cmd{\csname}
-% is executed in a group.
+% \begin{macro}{\ifAlPh@Unavailable}
% \begin{macrocode}
-\begingroup\expandafter\expandafter\expandafter\endgroup
-\expandafter\ifx\csname numexpr\endcsname\relax
+\newif\ifAlPh@Unavailable
+\def\AlPh@Unavailabletrue{%
+ \global\let\ifAlPh@Unavailable\iftrue
+}
+\def\AlPh@Unavailablefalse{%
+ \global\let\ifAlPh@Unavailable\iffalse
+}
% \end{macrocode}
-%
-% \subsection{\texorpdfstring{Conversion with standard \TeX\ means}{\TeX}}
-% \begin{macro}{\aa@make}
-% \cmd{\aa@make} catches the cases, if the number is zero or negative.
-% Then it expands to nothing like \cmd{\romannumeral}.
+% \end{macro}
+% \begin{macro}{\AlPh@TestNumber}
+% |#1|: number to be tested\\
+% |#2|: symbols provider
% \begin{macrocode}
- \def\aa@make#1#2{%
- \ifnum#1<1 %
- \else
- \@ReturnAfterFi{%
- \aa@process1;#1;1..#2%
- }%
+\def\AlPh@TestNumber#1!#2{%
+ \AlPh@Unavailablefalse
+ \begingroup
+ \setbox0=\hbox{%
+ \begingroup % color
+ \let\@ctrerr\AlPh@Unavailabletrue
+ \let\AlPh@ctrerr\AlPh@Unavailabletrue
+ #2{#1}%
+ \endgroup
+ }%
+ \ifdim\wd0=0pt %
+ \AlPh@Unavailabletrue
\fi
- }%
+ \endgroup
+}
% \end{macrocode}
% \end{macro}
-%
-% \begin{macro}{\aa@process}
-% \cmd{\aa@process} contains the algorithm for the conversion.
-% \TeX doesn't provide a simple method to divide or multiply
-% numbers in a fully expandable way. An expandable addition by one
-% is complicated enough. Therefore \cmd{\aa@process} uses
-% only expandible versions of additions by one. The algorithm
-% starts with one and increments it until the size of the wanted
-% number is reached. The intermediate number that is incremented
-% is present in two kinds:
-% \begin{itemize}
-% \item the normal decimal form for the \cs{ifnum}-comparison,
-% \item a digit format: the end of each digit is marked by an dot,
-% and the digits are in reserved order. An empty digit
-% ends this format. The meaning of a digit is here the
-% decimal representation of a letter, the range is
-% from 1 until 26.
-% \end{itemize}
-% Example: The aim number is 100, the intermediate number 50, so
-% following would be on the argument stack:
-% \begin{quote}
-% |50;100;24.1..\aa@alph|
-% \end{quote}
-% \cmd{\aa@process} increments the first argument |#1| (|50|),
-% and calls \cmd{\aa@alphinc} to increment the digit form
-% (|24.1..|). The middle part with the aim number |;#2;| (|;100;|)
-% will not be changed. Neither \cmd{\aa@process} nor \cmd{\aa@alphinc}
-% need the conversion command \cmd{\aa@alph} nor \cmd{\aa@Alph}.
-% This command is read by \cmd{\aa@getresult}, if the digit form is
-% ready.
-%
-% The expansion motor is \cmd{\number}. It reads and expands token
-% to get decimal numbers until a token is reached that isn't a
-% decimal digit. So the expansion doesn't stop, if \cmd{\aa@inc}
-% is ready, because \cmd{\aa@inc} produces only decimal digits.
-% \cmd{\aa@alphinc} is expanded to look for further digits.
-% Now \cmd{\aa@alphinc} makes its job and returns with its
-% argument |;#2;|. At last the first character |;| finishes \cmd{\number}.
+% \begin{macro}{\AlPh@ExpSearch}
+% |#1|: number to be tested\\
+% |#2|: symbols provider
% \begin{macrocode}
- \def\aa@process#1;#2;{%
- \ifnum#1=#2 %
- \expandafter\aa@getresult
+\def\AlPh@ExpSearch#1!#2{%
+ \let\AlPh@Next\relax
+ \AlPh@TestNumber#1!{#2}%
+ \ifAlPh@Unavailable
+ \expandafter\AlPh@BinSearch\AlPh@Number!#1!{#2}%
+ \else
+ \def\AlPh@Number{#1}%
+ \ifnum#1>1073741823 %
+ \AlPh@TestNumber2147483647!{#2}%
+ \ifAlPh@Unavailable
+ \AlPh@BinSearch#1!2147483647!{#2}%
+ \else
+ \def\AlPh@Number{0}%
+ \AlPh@Error{%
+ Maximal symbol number not found%
+ }%
+ \fi
\else
- \@ReturnAfterFi{%
- \expandafter\aa@process\number\aa@inc{#1}\aa@alphinc{;#2;}%
+ \def\AlPh@Next{%
+ \expandafter\AlPh@ExpSearch\number\intcalcShl{#1}!{#2}%
}%
\fi
- }%
+ \fi
+ \AlPh@Next
+}
% \end{macrocode}
% \end{macro}
-%
-% \subsubsection{\texorpdfstring{^^A
-% Convert the separated digits to the letter result}{^^A
-% Digits to letter result}}\label{sec:form}
-%
-% The single decimal digits of the final letter number are
-% limited by a dot and come in reverse order. The end is
-% marked by an empty digit.
-% The next token is the command to convert a digit
-% (\cmd{\aa@alph} or \cmd{\aa@Alph}), e.g.:
-% \begin{quote}
-% |11.3.1..\alph| $\Rightarrow$ |ack|
-% \end{quote}
-%
-% \begin{macro}{\aa@getresult}
-% \cmd{\aa@getresult} reads the digits |#1| and the converting
-% command |#2|. Then it
-% calls \cmd{\aa@@getresult} with its arguments.
+% \begin{macro}{\AlPh@BinSearch}
+% |#1|: available number\\
+% |#2|: unavailable number, |#2| $>$ |#1|\\
+% |#3|: symbols provider
% \begin{macrocode}
- \def\aa@getresult#1..#2{%
- \aa@@getresult!#2#1..%
- }%
+\def\AlPh@BinSearch#1!#2!#3{%
+ \expandafter\AlPh@ProcessBinSearch
+ \number\intcalcShr{\intcalcAdd{#1}{#2}}!%
+ #1!#2!{#3}%
+}
% \end{macrocode}
% \end{macro}
-%
-% \begin{macro}{\aa@@getresult}
-% In its first argument |#1| \cmd{\aa@@getresult} collects the
-% converted letters in the correct order. Character |!| is used
-% as a parameter separator. The next token |#2| is the converting
-% command (\cmd{\aa@alph} or \cmd{\aa@Alph}). The next digit |#3|
-% is read, converted, and |\aa@@getresult| is called again.
-% If the digit |#3| is empty, the end of the digit form is reached
-% and the process stops and the ready letter number is output.
+% \begin{macro}{\AlPh@ProcessBinSearch}
+% |#1|: number to be tested, |#2| $\leq$ |#1| $\leq$ |#3|\\
+% |#2|: available number\\
+% |#3|: unavailable number\\
+% |#4|: symbols provider
% \begin{macrocode}
- \def\aa@@getresult#1!#2#3.{%
- \ifx\\#3\\%
- \@ReturnAfterElseFi{#1}% ready
+\def\AlPh@ProcessBinSearch#1!#2!#3!#4{%
+ \let\AlPh@Next\relax
+ \ifnum#1>#2 %
+ \ifnum#1<#3 %
+ \AlPh@TestNumber#1!{#4}%
+ \ifAlPh@Unavailable
+ \def\AlPh@Next{%
+ \AlPh@BinSearch#2!#1!{#4}%
+ }%
+ \else
+ \def\AlPh@Next{%
+ \AlPh@BinSearch#1!#3!{#4}%
+ }%
+ \fi
\else
- \@ReturnAfterFi{%
- \expandafter\expandafter\expandafter\expandafter
- \expandafter\expandafter\expandafter
- \aa@@getresult
- \expandafter\expandafter\expandafter\expandafter
- #2{#3}#1!#2%
- }%
+ \def\AlPh@Number{#2}%
\fi
- }%
+ \else
+ \def\AlPh@Number{#2}%
+ \fi
+ \AlPh@Next
+}
% \end{macrocode}
% \end{macro}
%
-% \subsubsection{Addition by one}
-%
-% \paragraph{Expandable addition of a decimal integer.}
-% \begin{macro}{\aa@inc}
-% \cmd{\aa@inc} increments its argument |#1| by one.
-% The case, that the whole number is less than nine, is
-% specially treated because of speed. (The space
-% after |9| is neccessary.)
+% \subsection{Methods}
+%
+% The names of method macros start with \cs{AlPh@Method}.
+% These macros do the main job in converting a number to
+% its representation.
+% A method command is called with three arguments.
+% The first argument is the number of symbols. The
+% second argument is the basic macro for converting
+% a number with limited number range. The last parameter
+% is the number that needs converting.
+%
+% \subsubsection{Common methods}
+%
+% \begin{macro}{\AlPh@CheckPositive}
+% \noindent
+% |#1|: number to be checked
+% |#2|: continuation macro\\
+% |#3|: number of symbols (hidden here)\\
+% |#4|: symbol provider (hidden here)
% \begin{macrocode}
-% \aa@inc adds one to its argument #1.
- \def\aa@inc#1{%
- \ifnum#1<9 %
- \aa@nextdigit{#1}%
- \else
- \aa@reverse#1!!%
- \fi
- }%
+\def\AlPh@CheckPositive#1!#2{%
+ \ifnum#1<1 %
+ \expandafter\@gobblefour
+ \fi
+ #2{#1}%
+}
% \end{macrocode}
% \end{macro}
-% \begin{macro}{\aa@nextdigit}
-% \cmd{\aa@nextdigit} increments the digit |#1|. The result
-% is a digit again. \cmd{\aa@addone} works off the case ``9+1''.
+%
+% \subsubsection{Method `alph'}
+%
+% \begin{macro}{\AlPh@Method@alph}
+% \noindent
+% |#1|: number of symbols\\
+% |#2|: symbols provider\\
+% |#3|: number to be converted
% \begin{macrocode}
- \def\aa@nextdigit#1{\ifcase#1 1\or2\or3\or4\or5\or6\or7\or8\or9\fi}%
+\def\AlPh@Method@alph#1#2#3{%
+ \expandafter\AlPh@CheckPositive
+| \number#3!%
++ \the\numexpr#3!%
+ \AlPh@ProcessAlph
+ {#1}{#2}%
+}
% \end{macrocode}
% \end{macro}
-% \begin{macro}{\aa@reverse}
-% Because the addition starts with the lowest significant digit
-% of the number. But with the means of \TeX's macro expansion is
-% the first digit of a number available. So \cmd{\aa@reverse}
-% reverses the order of the digits and calls \cmd{\aa@addone},
-% if it is ready.
+% \begin{macro}{\AlPh@ProcessAlph}
+% |#1|: current number\\
+% |#2|: number of symbols\\
+% |#3|: symbols provider
% \begin{macrocode}
- \def\aa@reverse#1#2!#3!{%
- \ifx\\#2\\%
- \aa@addone#1#3!!%
- \else
- \@ReturnAfterFi{%
- \aa@reverse#2!#1#3!%
- }%
- \fi
- }%
+\def\AlPh@ProcessAlph#1#2#3{%
+ \ifnum#1>#2 %
+ \@ReturnAfterElseFi{%
+ \expandafter\AlPh@StepAlph\number
+ \intcalcInc{%
+ \intcalcMod{\intcalcDec{#1}}{#2}%
+ }%
+ \expandafter!\number
+ \intcalcDiv{\intcalcDec{#1}}{#2}%
+ !{#2}{#3}%
+ }%
+ \else
+ \@ReturnAfterFi{%
+ #3{#1}%
+ }%
+ \fi
+}
% \end{macrocode}
% \end{macro}
-% \begin{macro}{\aa@addone}
-% The addition is performed by the macro \cmd{\aa@addone}.
-% The digits are in reversed order. The parameter text |#1#2|
-% separates the next digit |#1| that have to be incremented.
-% Already incremented digits are stored in |#3| in reversed order
-% to take some work of \cmd{\aa@lastreverse}.
+% \begin{macro}{\AlPh@StepAlph}
+% |#1|: current last digit\\
+% |#2|: new current number\\
+% |#3|: number of symbols\\
+% |#4|: symbols provider
% \begin{macrocode}
- \def\aa@addone#1#2!#3!{%
- \ifnum#1<9 %
- \expandafter\aa@lastreverse\number\aa@nextdigit#1 #2!#3!%
- \else
- \@ReturnAfterFi{%
- \ifx\\#2\\%
- 10#3%
- \else
- \@ReturnAfterFi{%
- \aa@addone#2!0#3!%
- }%
- \fi
- }%
- \fi
- }%
+\def\AlPh@StepAlph#1!#2!#3#4{%
+ \AlPh@ProcessAlph{#2}{#3}{#4}%
+ #4{#1}%
+}
% \end{macrocode}
% \end{macro}
-% \begin{macro}{\aa@lastreverse}
-% With \cmd{\aa@reverse} the order of the digits is changed to
-% perform the addition in \cmd{\aa@addone}. Now we have to return
-% to the original order that is done by \cmd{\aa@lastreverse}.
+%
+% \subsubsection{Method `wrap'}
+%
+% \begin{macro}{\AlPh@Method@wrap}
+% \noindent
+% |#1|: number of symbols\\
+% |#2|: symbols provider\\
+% |#3|: number to be converted
% \begin{macrocode}
- \def\aa@lastreverse#1#2!#3!{%
- \ifx\\#2\\%
- #1#3%
- \else
- \@ReturnAfterFi{%
- \aa@lastreverse#2!#1#3!%
- }%
- \fi
- }%
+\def\AlPh@Method@wrap#1#2#3{%
+ \expandafter\AlPh@CheckPositive
+| \number#3!%
++ \the\numexpr#3!%
+ \AlPh@ProcessWrap
+ {#1}{#2}%
+}
% \end{macrocode}
% \end{macro}
%
-% \paragraph{Increment of the decimal digit result form.}
-% \begin{macro}{\aa@alphinc}
-% \cmd{\aa@alphinc} adds one to the intermediate number in
-% the decimal digit result form (see \ref{sec:form}).
-% Parameter |#1| consists of the tokens that come before the
-% addition result (see |;#2;| of \cmd{\aa@process}). Then
-% it is also used to store already incremented digits.
-% |#2| contains the next digit in the range of 1 until 26.
-% An empty |#2| marks the end of the number.
+% \begin{macro}{\AlPh@ProcessWrap}
+% |#1|: number to be converted\\
+% |#2|: number of symbols\\
+% |#3|: symbols provider
% \begin{macrocode}
- \def\aa@alphinc#1#2.{%
- \ifx\\#2\\%
- \@ReturnAfterElseFi{%
- #11..% ready
- }%
- \else
- \@ReturnAfterFi{%
- \ifnum#2<26 %
- \@ReturnAfterElseFi{%
- \expandafter\aa@alphinclast\expandafter
- {\number\aa@inc{#2}}{#1}%
- }%
- \else
- \@ReturnAfterFi{%
- \aa@alphinc{#11.}%
- }%
- \fi
- }%
- \fi
- }%
+\def\AlPh@ProcessWrap#1#2#3{%
+ \ifnum#1>#2 %
+ \@ReturnAfterElseFi{%
+ \expandafter\AlPh@StepWrap\number
+ \intcalcInc{\intcalcMod{\intcalcDec{#1}}{#2}}%
+ !{#3}%
+ }%
+ \else
+ \@ReturnAfterFi{%
+ #3{#1}%
+ }%
+ \fi
+}
% \end{macrocode}
% \end{macro}
-% \begin{macro}{\aa@alphinclast}
-% \cmd{\aa@alphinclast} is a help macro. Because |#2| consists of
-% several tokens (e.g. |;100;|), we cannot jump over it via
-% \cmd{\expandafter} in \cmd{\aa@alphinc}.
+% \begin{macro}{\AlPh@StepWrap}
+% |#1|: final number\\
+% |#2|: symbols provider
% \begin{macrocode}
- \def\aa@alphinclast#1#2{#2#1.}%
+\def\AlPh@StepWrap#1!#2{%
+ #2{#1}%
+}
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\newalphalph}
+% \subsubsection{Method `mult'}
+%
+% After the number of symbols is exhausted,
+% repetitions of the symbol are used.
+% \begin{gather*}
+% x \Def \text{number to be converted}\\
+% n \Def \text{number of symbols}\\
+% r \Def \text{repetition length}\\
+% s \Def \text{symbol slot}\\
+% r = ((x - 1) \div n) + 1\\
+% s = ((x - 1) \mod n) + 1
+% \end{gather*}
+% \begin{macro}{\AlPh@Method@mult}
+% \noindent
+% |#1|: number of symbols\\
+% |#2|: symbols provider\\
+% |#3|: number to be converted
% \begin{macrocode}
- \newcommand*{\newalphalph}[3]{%
- \PackageError{alphalph}{%
- \string\newalphalph\space requires e-TeX%
- }\@ehc
+\def\AlPh@Method@mult#1#2#3{%
+ \expandafter\AlPh@CheckPositive
+| \number#3!%
++ \the\numexpr#3!%
+ \AlPh@ProcessMult
+ {#1}{#2}%
+}
% \end{macrocode}
% \end{macro}
%
-% \subsection{\texorpdfstring{Conversion with \eTeX\ features}{\eTeX}}
-% \label{sec:etex}
+% \begin{macro}{\AlPh@ProcessMult}
+% |#1|: number to be converted\\
+% |#2|: number of symbols\\
+% |#3|: symbols provider
% \begin{macrocode}
-\else
-% \end{macrocode}
-%
-% \begin{macro}{\aa@make}
-% \cmd{\aa@make} catches the cases, if the number is zero or negative.
-% Then it expands to nothing like \cmd{\romannumeral}.
-% \begin{macrocode}
- \def\aa@make#1#2{%
- \ifnum#1<1 %
- \else
- \@ReturnAfterFi{%
- \aa@eprocess#1;#2%
- }%
- \fi
- }%
+\def\AlPh@ProcessMult#1#2#3{%
+ \ifnum#1>#2 %
+ \@ReturnAfterElseFi{%
+ \expandafter\AlPh@StepMult\romannumeral
+ \intcalcInc{\intcalcDiv{\intcalcDec{#1}}{#2}}%
+ 000%
+ \expandafter!\number
+ \intcalcInc{\intcalcMod{\intcalcDec{#1}}{#2}}%
+ !{#3}%
+ }%
+ \else
+ \@ReturnAfterFi{%
+ #3{#1}%
+ }%
+ \fi
+}
% \end{macrocode}
% \end{macro}
-%
-% \begin{macro}{\aa@eprocess}
-% The first argument |#1| contains the number that have to be
-% converted yet, the next argument |#2| the command for making
-% the conversion of a digit (\cmd{\aa@alph} or \cmd{\aa@Alph}).
-% The number is divided by 26 to get the rest. Command
-% |#2| converts the rest to a letter that is put after the arguments
-% of the next call of \cmd{\aa@eprocess}.
-%
-% The only feature of \eTeX\ we use the new primitive \cmd{\numexpr}.
-% It provides expandible mathematical calculations.
+% \begin{macro}{\AlPh@StepMult}
+% |#1#2|: repetitions coded as list of character `m'\\
+% |#3|: symbol slot\\
+% |#4|: symbols provider
% \begin{macrocode}
- \def\aa@eprocess#1;#2{%
- \ifnum#1<27 %
- \@ReturnAfterElseFi{%
- #2{#1}%
- }%
- \else
- \@ReturnAfterFi{%
- \expandafter\aa@eprocess\number\numexpr(#1-14)/26%
- \expandafter\expandafter\expandafter;%
- \expandafter\expandafter\expandafter#2%
- #2{\numexpr#1-((#1-14)/26)*26}%
- }%
- \fi
- }%
+\def\AlPh@StepMult#1#2!#3!#4{%
+ \ifx\\#2\\%
+ \else
+ \@ReturnAfterFi{%
+ \AlPh@StepMult#2!#3!{#4}%
+ }%
+ \fi
+ #4{#3}%
+}
% \end{macrocode}
% \end{macro}
%
-% \subsection{Generic version}
+% \subsection{User interface}
%
-% \begin{macro}{\aa@gen@callmake}
-% See macro \cs{aa@callmake}. Argument |#3| holds the
-% number of available symbols.
+% \begin{macro}{\newalphalph}
+% Macro \cs{newalphalph} had three arguments in versions below 2.0.
+% For the new method argument we use an optional argument an first
+% position.\\
+% |#1|: cmd\\
+% |[#2]|: method name: |alph| (default), |wrap|, |mult|\\ % hash-ok
+% |#3|: symbols provider\\
+% |#4|: number of symbols
% \begin{macrocode}
- \def\aa@gen@callmake#1#2#3{%
- \expandafter\aa@gen@make\expandafter{\number#3}#1{#2}%
+\AlPh@IfDefinable\newalphalph{%
+ \def\newalphalph#1{%
+ \AlPh@IfOptArg{%
+ \AlPh@newalphalph{#1}%
+ }{%
+ \AlPh@newalphalph{#1}[alph]%
+ }%
}%
+}
% \end{macrocode}
% \end{macro}
-% \begin{macro}{\aa@gen@make}
-% See macro \cs{aa@make}. Argument |#3| holds the number of
-% available symbols.
+% \begin{macro}{\AlPh@newalphalph}
+% |#1|: cmd
+% |#2|: method name\\
+% |#3|: symbols provider\\
+% |#4|: number of symbols
% \begin{macrocode}
- \def\aa@gen@make#1#2#3{%
- \ifnum#1<1 %
+\def\AlPh@newalphalph#1[#2]#3#4{%
+ \begingroup\expandafter\expandafter\expandafter\endgroup
+ \expandafter\ifx\csname AlPh@Method@#2\endcsname\relax
+ \AlPh@Error{%
+ Unknown method %
+| `#2'%
++ `\detokenize{#2}'%
+ }%
+ \else
+ \ifx\\#4\\%
+ \AlPh@GetNumberOfSymbols{#3}%
+ \ifcase\AlPh@Number
+ \else
+ \begingroup
+ \escapechar=92 % backslash
+ \@PackageInfo{alphalph}{%
+ Number of symbols for \string#1 is \AlPh@Number
+ }%
+ \endgroup
+ \expandafter\AlPh@NewAlphAlph
+ \csname AlPh@Method@#2\expandafter\endcsname
+ \AlPh@Number!{#1}{#3}%
+ \fi
\else
- \@ReturnAfterFi{%
- \aa@gen@eprocess{#3}#1;#2%
- }%
+ \expandafter\AlPh@NewAlphAlph
+ \csname AlPh@Method@#2\expandafter\endcsname
+| \number#4!%
++ \the\numexpr#4!%
+ {#1}{#3}%
\fi
- }%
+ \fi
+}%
% \end{macrocode}
% \end{macro}
-% \begin{macro}{\aa@gen@eprocess}
-% See macro \cs{aa@eprocess}. Argument |#1| holds the number of
-% available symbols.
+% \begin{macro}{\AlPh@NewAlphAlph}
+% |#1|: method macro\\
+% |#2|: number of symbols\\
+% |#3|: cmd\\
+% |#4|: symbols provider
% \begin{macrocode}
- \def\aa@gen@eprocess#1#2;#3{%
- \ifnum#2>#1 %
- \@ReturnAfterElseFi{%
- \expandafter\aa@gen@eprocess\expandafter{%
- \number#1\expandafter
- }%
- \number\numexpr(#2-(\aa@half{#1}+1))/#1%
- \expandafter\expandafter\expandafter;%
- \expandafter\expandafter\expandafter#3%
- #3{\numexpr#2-((#2-(\aa@half{#1}+1))/#1)*#1\relax}%
- }%
+\def\AlPh@NewAlphAlph#1#2!#3#4{%
+ \AlPh@IfDefinable#3{%
+ \ifnum#2>0 %
+ \def#3{#1{#2}{#4}}%
\else
- \@ReturnAfterFi{%
- #3{#2}%
- }%
+ \AlPh@Error{%
+ Definition of \string#3 failed,\MessageBreak
+ because number of symbols (#2) is not positive%
+ }%
\fi
}%
+}
% \end{macrocode}
% \end{macro}
-% \begin{macro}{\aa@half}
-% Macro \cs{aa@half} implements integer division by two
-% without rounding.
+%
+% \begin{macro}{\AlphAlph}
% \begin{macrocode}
- \def\aa@half#1{%
- \number\dimexpr.5\dimexpr #1sp\relax\relax
- }%
+\newalphalph\AlphAlph\alphalph@Alph{26}
% \end{macrocode}
% \end{macro}
-% \begin{macro}{\newalphalph}
-% New macros are defined by \cs{newalphalph} that act like
-% \cs{alphalph}. The macro to be defined is |#1|. Argument |#2|
-% contains the macro that converts a number to a symbol and
-% argument |#3| holds the number of available symbols.
+% \begin{macro}{\alphalph}
% \begin{macrocode}
- \newcommand*{\newalphalph}[3]{%
- \newcommand*{#1}{}%
- \edef#1{%
- \noexpand\aa@gen@callmake\noexpand#2{\number\numexpr#3}%
- }%
- }%
+\newalphalph\alphalph\alphalph@alph{26}
% \end{macrocode}
% \end{macro}
%
-% \subsection{End\texorpdfstring{ of package}{}}
-% Now we can terminate the differentiation between \TeX\ and \eTeX.
% \begin{macrocode}
-\fi
+\AlPh@AtEnd
+%</package>
% \end{macrocode}
%
-% At the end the catcode of the character |@| is restored.
+% \section{Test}
+%
+% \subsection{Catcode checks for loading}
+%
% \begin{macrocode}
-\catcode`\@=\aa@atcode
+%<*test1>
% \end{macrocode}
% \begin{macrocode}
-%</package>
+\catcode`\@=11 %
+\def\RestoreCatcodes{}
+\count@=0 %
+\loop
+ \edef\RestoreCatcodes{%
+ \RestoreCatcodes
+ \catcode\the\count@=\the\catcode\count@\relax
+ }%
+\ifnum\count@<255 %
+ \advance\count@\@ne
+\repeat
+
+\def\RangeCatcodeInvalid#1#2{%
+ \count@=#1\relax
+ \loop
+ \catcode\count@=15 %
+ \ifnum\count@<#2\relax
+ \advance\count@\@ne
+ \repeat
+}
+\def\Test{%
+ \RangeCatcodeInvalid{0}{47}%
+ \RangeCatcodeInvalid{58}{64}%
+ \RangeCatcodeInvalid{91}{96}%
+ \RangeCatcodeInvalid{123}{255}%
+ \catcode`\@=12 %
+ \catcode`\\=0 %
+ \catcode`\{=1 %
+ \catcode`\}=2 %
+ \catcode`\#=6 %
+ \catcode`\[=12 %
+ \catcode`\]=12 %
+ \catcode`\%=14 %
+ \catcode`\ =10 %
+ \catcode13=5 %
+ \input alphalph.sty\relax
+ \RestoreCatcodes
+}
+\Test
+\csname @@end\endcsname
+\end
+% \end{macrocode}
+% \begin{macrocode}
+%</test1>
% \end{macrocode}
+%
+% \section{Macro tests}
+%
+% \begin{macrocode}
+%<*test2>
+\NeedsTeXFormat{LaTeX2e}
+\nofiles
+\documentclass{article}
+%<*noetex>
+\makeatletter
+\let\saved@numexpr\numexpr
+\newcommand*{\DisableNumexpr}{%
+ \let\numexpr\@undefined
+}
+\newcommand*{\RestoreNumexpr}{%
+ \let\numexpr\saved@numexpr
+}
+\DisableNumexpr
+%</noetex>
+\usepackage{alphalph}[2007/04/11]
+%<noetex>\RestoreNumexpr
+\usepackage{qstest}
+\IncludeTests{*}
+\LogTests{log}{*}{*}
+
+\newcommand*{\TestCmd}[3]{%
+ \setbox0=\hbox{%
+%<noetex> \DisableNumexpr
+ \edef\TestString{#1{#2}}%
+ \expandafter\Expect\expandafter{\TestString}{#3}%
+ \edef\TestString{#1{#2} }%
+ \expandafter\Expect\expandafter{\TestString}{#3 }%
+ }%
+ \Expect*{\the\wd0}{0.0pt}%
+}
+
+\makeatletter
+\newalphalph\LaTeXAlphAlph\@Alph{26}
+\newalphalph\LaTeXalphalph\@alph{26}
+\newalphalph\AlphWrap[wrap]\alphalph@Alph{26}
+\newalphalph\alphwrap[wrap]\alphalph@alph{26}
+\newalphalph\LaTeXAlphWrap[wrap]\@Alph{26}
+\newalphalph\LaTeXalphwrap[wrap]\@alph{26}
+\def\LastSymbol#1{%
+ \ifx\\#1\\%
+ \else
+ \@LastSymbol#1\@nil
+ \fi
+}
+\def\@LastSymbol#1#2\@nil{%
+ \ifx\\#2\\%
+ #1%
+ \else
+ \@LastSymbol#2\@nil
+ \fi
+}
+\makeatother
+\newcommand*{\TestAlph}[2]{%
+ \uppercase{\TestCallCmd\AlphAlph{#2}}{#1}%
+ \lowercase{\TestCallCmd\alphalph{#2}}{#1}%
+ \uppercase{\TestCallCmd\LaTeXAlphAlph{#2}}{#1}%
+ \lowercase{\TestCallCmd\LaTeXalphalph{#2}}{#1}%
+ \edef\WrapString{\LastSymbol{#2}}%
+ \expandafter\TestAlphWrap\expandafter{\WrapString}{#1}%
+}
+\newcommand*{\TestAlphWrap}[2]{%
+ \uppercase{\TestCallCmd\AlphWrap{#1}}{#2}%
+ \lowercase{\TestCallCmd\alphwrap{#1}}{#2}%
+ \uppercase{\TestCallCmd\LaTeXAlphWrap{#1}}{#2}%
+ \lowercase{\TestCallCmd\LaTeXalphwrap{#1}}{#2}%
+}
+\newcommand*{\TestCallCmd}[3]{%
+ \TestCmd#1{#3}{#2}%
+}
+\begin{qstest}{AlphSymbols}{alphalph, AlphAlph, symbols}
+ \TestAlph{1}{a}%
+ \TestAlph{2}{b}%
+ \TestAlph{3}{c}%
+ \TestAlph{4}{d}%
+ \TestAlph{5}{e}%
+ \TestAlph{6}{f}%
+ \TestAlph{7}{g}%
+ \TestAlph{8}{h}%
+ \TestAlph{9}{i}%
+ \TestAlph{10}{j}%
+ \TestAlph{11}{k}%
+ \TestAlph{12}{l}%
+ \TestAlph{13}{m}%
+ \TestAlph{14}{n}%
+ \TestAlph{15}{o}%
+ \TestAlph{16}{p}%
+ \TestAlph{17}{q}%
+ \TestAlph{18}{r}%
+ \TestAlph{19}{s}%
+ \TestAlph{20}{t}%
+ \TestAlph{21}{u}%
+ \TestAlph{22}{v}%
+ \TestAlph{23}{w}%
+ \TestAlph{24}{x}%
+ \TestAlph{25}{y}%
+ \TestAlph{26}{z}%
+\end{qstest}
+\begin{qstest}{AlphRange}{alphalph, range}
+ \TestAlph{0}{}%
+ \TestAlph{-1}{}%
+ \TestAlph{-2147483647}{}%
+ \TestAlph{27}{aa}%
+ \TestAlph{28}{ab}%
+ \TestAlph{52}{az}%
+ \TestAlph{53}{ba}%
+ \TestAlph{78}{bz}%
+ \TestAlph{79}{ca}%
+ \TestAlph{702}{zz}%
+ \TestAlph{703}{aaa}%
+ \TestAlph{2147483647}{fxshrxw}%
+\end{qstest}
+
+\makeatletter
+\newcommand*{\myvocals}[1]{%
+ \ifcase#1X\or A\or E\or I\or O\or U\else Y\fi
+}
+\makeatother
+\newalphalph\vocalsvocals\myvocals{5}
+\newcommand*{\TestVocals}{%
+ \TestCmd\vocalsvocals
+}
+\begin{qstest}{vocals}{vocals}
+ \TestVocals{0}{}%
+ \TestVocals{1}{A}%
+ \TestVocals{2}{E}%
+ \TestVocals{3}{I}%
+ \TestVocals{4}{O}%
+ \TestVocals{5}{U}%
+ \TestVocals{6}{AA}%
+ \TestVocals{7}{AE}%
+ \TestVocals{8}{AI}%
+ \TestVocals{9}{AO}%
+ \TestVocals{10}{AU}%
+ \TestVocals{11}{EA}%
+ \TestVocals{24}{OO}%
+ \TestVocals{25}{OU}%
+ \TestVocals{26}{UA}%
+ \TestVocals{29}{UO}%
+ \TestVocals{30}{UU}%
+ \TestVocals{31}{AAA}%
+ \TestVocals{155}{UUU}%
+ \TestVocals{156}{AAAA}%
+ \TestVocals{2147483647}{AIIOOEEIOIIUOE}%
+\end{qstest}
+
+\makeatletter
+\newalphalph\AlphMult[mult]{\alphalph@Alph}{26}
+\newalphalph\alphmult[mult]{\alphalph@alph}{26}
+\newalphalph\LaTeXAlphMult[mult]{\@Alph}{26}
+\newalphalph\LaTeXalphmult[mult]{\@alph}{26}
+\makeatother
+\newcommand*{\TestMult}[2]{%
+ \uppercase{\TestCallCmd\AlphMult{#2}}{#1}%
+ \lowercase{\TestCallCmd\alphmult{#2}}{#1}%
+ \uppercase{\TestCallCmd\LaTeXAlphMult{#2}}{#1}%
+ \lowercase{\TestCallCmd\LaTeXalphmult{#2}}{#1}%
+}
+\begin{qstest}{mult}{mult}
+ \TestMult{0}{}%
+ \TestMult{-1}{}%
+ \TestMult{-2147483647}{}%
+ \TestMult{1}{a}%
+ \TestMult{2}{b}%
+ \TestMult{26}{z}%
+ \TestMult{27}{aa}%
+ \TestMult{28}{bb}%
+ \TestMult{52}{zz}%
+ \TestMult{53}{aaa}%
+ \TestMult{54}{bbb}%
+ \TestMult{259}{yyyyyyyyyy}%
+ \TestMult{260}{zzzzzzzzzz}%
+ \TestMult{261}{aaaaaaaaaaa}%
+ \TestMult{262}{bbbbbbbbbbb}%
+\end{qstest}
+
+\def\myvocalsB#1{%
+ \ifcase#1\or A\or E\or I\or O\or U\fi
+}
+\begin{qstest}{symbolnum}{symbolnum}
+ \makeatletter
+ \def\Test#1#2{%
+ \let\TestCmd\relax
+ \newalphalph\TestCmd{#1}{}%
+ \Expect*{\AlPh@Number}{#2}%
+ }%
+ \Test\@alph{26}%
+ \Test\@Alph{26}%
+ \Test\@fnsymbol{9}%
+ \Test\myvocalsB{5}%
+ \Test\alphalph@alph{26}%
+ \Test\alphalph@Alph{26}%
+\end{qstest}
+
+\begin{qstest}{list}{list}
+ \makeatletter
+ \def\catch#1\relax{%
+ \def\FoundList{\catch#1}%
+ }%
+ \def\Test[#1]#2#3#4{%
+ \let\testcmd\relax
+ \newalphalph\testcmd[{#1}]{\catch}{#2}%
+ \testcmd{#3}|\relax
+ \expandafter\Expect\expandafter{\FoundList}{#4|}%
+ %
+ \let\SavedCatch\catch
+ \def\catch{\noexpand\catch\noexpand\foo}%
+ \edef\Result{#4|}%
+ \@onelevel@sanitize\Result
+ \let\catch\SavedCatch
+ \let\testcmd\relax
+ \newalphalph\testcmd[{#1}]{\catch\foo}{#2}%
+ \testcmd{#3}|\relax
+ \@onelevel@sanitize\FoundList
+ \Expect*{\FoundList}*{\Result}%
+ }%
+ \Test[alph]{26}{3}{\catch{3}}%
+ \Test[alph]{26}{12}{\catch{12}}%
+ \Test[alph]{26}{27}{\catch{1}\catch{1}}%
+ \Test[alph]{26}{78}{\catch{2}\catch{26}}%
+ \Test[wrap]{26}{7}{\catch{7}}%
+ \Test[wrap]{26}{14}{\catch{14}}%
+ \Test[wrap]{26}{80}{\catch{2}}%
+ \Test[wrap]{26}{700}{\catch{24}}%
+ \Test[mult]{26}{4}{\catch{4}}%
+ \Test[mult]{26}{17}{\catch{17}}%
+ \Test[mult]{26}{54}{\catch{2}\catch{2}\catch{2}}%
+\end{qstest}
+
+\begin{document}
+\end{document}
+%</test2>
+% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
@@ -862,6 +1586,9 @@ and the derived files
% \begin{tabular}{@{}>{\ttfamily}l@{ $\rightarrow$ }>{\ttfamily}l@{}}
% alphalph.sty & tex/generic/oberdiek/alphalph.sty\\
% alphalph.pdf & doc/latex/oberdiek/alphalph.pdf\\
+% alphalph-test1.tex & doc/latex/oberdiek/alphalph-test1.tex\\
+% alphalph-test2.tex & doc/latex/oberdiek/alphalph-test2.tex\\
+% alphalph-test3.tex & doc/latex/oberdiek/alphalph-test3.tex\\
% alphalph.dtx & source/latex/oberdiek/alphalph.dtx\\
% \end{tabular}^^A
% }^^A
@@ -1034,6 +1761,15 @@ and the derived files
% \item
% Line ends sanitized.
% \end{Version}
+% \begin{Version}{2007/09/09 v2.0}
+% \item
+% New implementation that uses package \cs{intcalc}.
+% This removes the dependency on \eTeX.
+% \item
+% \cs{newalphalph} is extended to support new methods `wrap' and 'multi'.
+% \item
+% Documentation rewritten.
+% \end{Version}
% \end{History}
%
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/oberdiek/atbegshi.dtx b/Master/texmf-dist/source/latex/oberdiek/atbegshi.dtx
index aff5a5fb9bf..8709755cd7f 100644
--- a/Master/texmf-dist/source/latex/oberdiek/atbegshi.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/atbegshi.dtx
@@ -18,7 +18,7 @@
% and the derived files
% atbegshi.sty, atbegshi.pdf, atbegshi.ins, atbegshi.drv,
% atbegshi-example.tex, atbegshi-test1.tex,
-% atbegshi-test2.tex.
+% atbegshi-test2.tex, atbegshi-test3.tex.
%
% Distribution:
% CTAN:macros/latex/contrib/oberdiek/atbegshi.dtx
@@ -56,6 +56,7 @@
% TDS:doc/latex/oberdiek/atbegshi-example.tex
% TDS:doc/latex/oberdiek/atbegshi-test1.tex
% TDS:doc/latex/oberdiek/atbegshi-test2.tex
+% TDS:doc/latex/oberdiek/atbegshi-test3.tex
% TDS:source/latex/oberdiek/atbegshi.dtx
%
%<*ignore>
@@ -71,7 +72,7 @@
\input docstrip.tex
\Msg{************************************************************************}
\Msg{* Installation}
-\Msg{* Package: atbegshi 2007/06/06 v1.5 At begin shipout hook (HO)}
+\Msg{* Package: atbegshi 2007/09/09 v1.6 At begin shipout hook (HO)}
\Msg{************************************************************************}
\keepsilent
@@ -99,7 +100,7 @@ This work consists of the main source file atbegshi.dtx
and the derived files
atbegshi.sty, atbegshi.pdf, atbegshi.ins, atbegshi.drv,
atbegshi-example.tex, atbegshi-test1.tex,
- atbegshi-test2.tex.
+ atbegshi-test2.tex, atbegshi-test3.tex.
\endpreamble
@@ -112,6 +113,7 @@ and the derived files
\file{atbegshi-example.tex}{\from{atbegshi.dtx}{example}}%
\file{atbegshi-test1.tex}{\from{atbegshi.dtx}{test1}}%
\file{atbegshi-test2.tex}{\from{atbegshi.dtx}{test2}}%
+ \file{atbegshi-test3.tex}{\from{atbegshi.dtx}{test3}}%
}
\obeyspaces
@@ -137,7 +139,7 @@ and the derived files
%<*driver>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{atbegshi.drv}%
- [2007/06/06 v1.5 At begin shipout hook (HO)]%
+ [2007/09/09 v1.6 At begin shipout hook (HO)]%
\documentclass{ltxdoc}
\usepackage{holtxdoc}
\begin{document}
@@ -146,7 +148,7 @@ and the derived files
%</driver>
% \fi
%
-% \CheckSum{1239}
+% \CheckSum{1283}
%
% \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
@@ -167,7 +169,7 @@ and the derived files
% \GetFileInfo{atbegshi.drv}
%
% \title{The \xpackage{atbegshi} package}
-% \date{2007/06/06 v1.5}
+% \date{2007/09/09 v1.6}
% \author{Heiko Oberdiek\\\xemail{oberdiek@uni-freiburg.de}}
%
% \maketitle
@@ -787,35 +789,33 @@ The last page.
\fi
\expandafter\x\csname ver@atbegshi.sty\endcsname
\ProvidesPackage{atbegshi}%
- [2007/06/06 v1.5 At begin shipout hook (HO)]
+ [2007/09/09 v1.6 At begin shipout hook (HO)]
% \end{macrocode}
%
% \subsection{Catcodes}
%
% \begin{macrocode}
-\expandafter\edef\csname AtBegShi@End\endcsname{%
- \catcode40 \the\catcode40\relax % (
- \catcode41 \the\catcode41\relax % )
- \catcode44 \the\catcode44\relax % ,
- \catcode45 \the\catcode45\relax % -
- \catcode46 \the\catcode46\relax % .
- \catcode58 \the\catcode58\relax % :
- \catcode61 \the\catcode61\relax % =
- \catcode64 \the\catcode64\relax % @
- \catcode94 \the\catcode94\relax % ^
- \catcode96 \the\catcode96\relax % `
- \noexpand\endinput
+\expandafter\edef\csname AtBegShi@AtEnd\endcsname{%
+ \catcode64 \the\catcode64\relax
}
-\catcode40 12 % (
-\catcode41 12 % )
-\catcode44 12 % ,
-\catcode45 12 % -
-\catcode46 12 % .
-\catcode58 12 % :
-\catcode61 12 % =
\catcode64 11 % @
-\catcode94 7 % ^
-\catcode96 12 % `
+\def\TMP@EnsureCode#1#2{%
+ \edef\AtBegShi@AtEnd{%
+ \AtBegShi@AtEnd
+ \catcode#1 \the\catcode#1\relax
+ }%
+ \catcode#1 #2\relax
+}
+\TMP@EnsureCode{40}{12}% (
+\TMP@EnsureCode{41}{12}% )
+\TMP@EnsureCode{44}{12}% ,
+\TMP@EnsureCode{45}{12}% -
+\TMP@EnsureCode{47}{12}% /
+\TMP@EnsureCode{46}{12}% .
+\TMP@EnsureCode{58}{12}% :
+\TMP@EnsureCode{61}{12}% =
+\TMP@EnsureCode{94}{7}% ^(superscript)
+\TMP@EnsureCode{96}{12}% `
% \end{macrocode}
%
% \subsection{Preparations}
@@ -825,7 +825,7 @@ The last page.
\expandafter\ifx\csname RequirePackage\endcsname\relax
\input infwarerr.sty\relax
\else
- \RequirePackage{infwarerr}%
+ \RequirePackage{infwarerr}[2007/09/09]%
\fi
% \end{macrocode}
%
@@ -1180,7 +1180,8 @@ X \endgroup
\def\AtBegShi@AbortIfUndefined#1{%
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname#1\endcsname\relax
- \expandafter\AtBegShi@End
+ \AtBegShi@AtEnd
+ \expandafter\endinput
\fi
}
\AtBegShi@AbortIfUndefined{currentgrouplevel}
@@ -1461,20 +1462,72 @@ X \endgroup
% \end{macrocode}
%
% \begin{macrocode}
-\AtBegShi@End
+\AtBegShi@AtEnd
%</package>
% \end{macrocode}
%
% \section{Test}
%
+% \subsection{Catcode checks for loading}
+%
% \begin{macrocode}
%<*test1>
+% \end{macrocode}
+% \begin{macrocode}
+\catcode`\@=11 %
+\def\RestoreCatcodes{}
+\count@=0 %
+\loop
+ \edef\RestoreCatcodes{%
+ \RestoreCatcodes
+ \catcode\the\count@=\the\catcode\count@\relax
+ }%
+\ifnum\count@<255 %
+ \advance\count@\@ne
+\repeat
+
+\def\RangeCatcodeInvalid#1#2{%
+ \count@=#1\relax
+ \loop
+ \catcode\count@=15 %
+ \ifnum\count@<#2\relax
+ \advance\count@\@ne
+ \repeat
+}
+\def\Test{%
+ \RangeCatcodeInvalid{0}{47}%
+ \RangeCatcodeInvalid{58}{64}%
+ \RangeCatcodeInvalid{91}{96}%
+ \RangeCatcodeInvalid{123}{255}%
+ \catcode`\@=12 %
+ \catcode`\\=0 %
+ \catcode`\{=1 %
+ \catcode`\}=2 %
+ \catcode`\#=6 %
+ \catcode`\[=12 %
+ \catcode`\]=12 %
+ \catcode`\%=14 %
+ \catcode`\ =10 %
+ \catcode13=5 %
+ \input atbegshi.sty\relax
+ \RestoreCatcodes
+}
+\Test
+\csname @@end\endcsname
+\end
+% \end{macrocode}
+% \begin{macrocode}
+%</test1>
+% \end{macrocode}
+%
+% \begin{macrocode}
+%<*test2>
\input atbegshi.sty\relax
\def\msg#{\immediate\write16}
-\msg{File: atbegshi-test1.tex 2007/06/06 v1.5 Test file for plain-TeX}
+\msg{File: atbegshi-test2.tex 2007/09/09 v1.6 Test file for plain-TeX}
\def\testmsg#1#2{%
\msg{}%
- \msg{*** Test with box (#1), expected page output [#2]}%
+ \msg{*** Test with box (#1), expected page output [#2]}% hash-ok
}
\newbox\voidbox
@@ -1562,13 +1615,13 @@ Hello World
\shipout\null
\end
-%</test1>
+%</test2>
% \end{macrocode}
%
% \begin{macrocode}
-%<*test2>
+%<*test3>
\NeedsTeXFormat{LaTeX2e}
-\ProvidesFile{atbegshi-test2.tex}[2007/06/06 v1.5 Test file for LaTeX]
+\ProvidesFile{atbegshi-test3.tex}[2007/09/09 v1.6 Test file for LaTeX]
\RequirePackage{color}
\pagecolor{yellow}
\documentclass[a5paper,showtrims]{memoir}
@@ -1614,8 +1667,9 @@ Hello World
\shipout\box\csname voidb@x\endcsname
\section{Hello World}
\end{document}
-%</test2>
+%</test3>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
@@ -1680,6 +1734,7 @@ Hello World
% atbegshi-example.tex & doc/latex/oberdiek/atbegshi-example.tex\\
% atbegshi-test1.tex & doc/latex/oberdiek/atbegshi-test1.tex\\
% atbegshi-test2.tex & doc/latex/oberdiek/atbegshi-test2.tex\\
+% atbegshi-test3.tex & doc/latex/oberdiek/atbegshi-test3.tex\\
% atbegshi.dtx & source/latex/oberdiek/atbegshi.dtx\\
% \end{tabular}^^A
% }^^A
@@ -1838,6 +1893,10 @@ Hello World
% \item
% Fix in second test file for newer version of \xclass{memoir}.
% \end{Version}
+% \begin{Version}{2007/09/09 v1.6}
+% \item
+% Catcode section rewritten.
+% \end{Version}
% \end{History}
%
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/oberdiek/atenddvi.dtx b/Master/texmf-dist/source/latex/oberdiek/atenddvi.dtx
index 32095839d01..8c2455e655e 100644
--- a/Master/texmf-dist/source/latex/oberdiek/atenddvi.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/atenddvi.dtx
@@ -358,6 +358,7 @@ and the derived files
% \begin{macrocode}
%</package>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
diff --git a/Master/texmf-dist/source/latex/oberdiek/attachfile2.dtx b/Master/texmf-dist/source/latex/oberdiek/attachfile2.dtx
index 4a3210d660c..4f52381c348 100644
--- a/Master/texmf-dist/source/latex/oberdiek/attachfile2.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/attachfile2.dtx
@@ -1929,6 +1929,7 @@ __END__
%</pdfatfi>
% \end{macrocode}
%
+%
% \section{Installation}
%
% \subsection{Download}
diff --git a/Master/texmf-dist/source/latex/oberdiek/auxhook.dtx b/Master/texmf-dist/source/latex/oberdiek/auxhook.dtx
index b3f81c660f8..8aa39aca79e 100644
--- a/Master/texmf-dist/source/latex/oberdiek/auxhook.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/auxhook.dtx
@@ -359,6 +359,7 @@ and the derived files
% \begin{macrocode}
%</package>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
diff --git a/Master/texmf-dist/source/latex/oberdiek/bmpsize.dtx b/Master/texmf-dist/source/latex/oberdiek/bmpsize.dtx
index 6d385ef9db9..1531bd66606 100644
--- a/Master/texmf-dist/source/latex/oberdiek/bmpsize.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/bmpsize.dtx
@@ -3643,6 +3643,7 @@ and the derived files
%</test>
% \end{macrocode}
%
+%
% \section{Installation}
%
% \subsection{Download}
diff --git a/Master/texmf-dist/source/latex/oberdiek/bookmark.dtx b/Master/texmf-dist/source/latex/oberdiek/bookmark.dtx
index 2bcc725a400..6fd099d53a5 100644
--- a/Master/texmf-dist/source/latex/oberdiek/bookmark.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/bookmark.dtx
@@ -2195,6 +2195,7 @@ and the derived files
\fi
%</dvipdfm|vtex>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
diff --git a/Master/texmf-dist/source/latex/oberdiek/catchfile.dtx b/Master/texmf-dist/source/latex/oberdiek/catchfile.dtx
index 58dfe9abef8..ca87b190bad 100644
--- a/Master/texmf-dist/source/latex/oberdiek/catchfile.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/catchfile.dtx
@@ -17,7 +17,8 @@
% This work consists of the main source file catchfile.dtx
% and the derived files
% catchfile.sty, catchfile.pdf, catchfile.ins, catchfile.drv,
-% catchfile-test1.tex, catchfile-test2.tex.
+% catchfile-test1.tex, catchfile-test2.tex,
+% catchfile-test3.tex.
%
% Distribution:
% CTAN:macros/latex/contrib/oberdiek/catchfile.dtx
@@ -54,6 +55,7 @@
% TDS:doc/latex/oberdiek/catchfile.pdf
% TDS:doc/latex/oberdiek/catchfile-test1.tex
% TDS:doc/latex/oberdiek/catchfile-test2.tex
+% TDS:doc/latex/oberdiek/catchfile-test3.tex
% TDS:source/latex/oberdiek/catchfile.dtx
%
%<*ignore>
@@ -69,7 +71,7 @@
\input docstrip.tex
\Msg{************************************************************************}
\Msg{* Installation}
-\Msg{* Package: catchfile 2007/05/30 v1.0 Catches the contents of a file (HO)}
+\Msg{* Package: catchfile 2007/09/09 v1.1 Catches the contents of a file (HO)}
\Msg{************************************************************************}
\keepsilent
@@ -96,7 +98,8 @@ This Current Maintainer of this work is Heiko Oberdiek.
This work consists of the main source file catchfile.dtx
and the derived files
catchfile.sty, catchfile.pdf, catchfile.ins, catchfile.drv,
- catchfile-test1.tex, catchfile-test2.tex.
+ catchfile-test1.tex, catchfile-test2.tex,
+ catchfile-test3.tex.
\endpreamble
@@ -108,6 +111,7 @@ and the derived files
\usedir{doc/latex/oberdiek}%
\file{catchfile-test1.tex}{\from{catchfile.dtx}{test1}}%
\file{catchfile-test2.tex}{\from{catchfile.dtx}{test2}}%
+ \file{catchfile-test3.tex}{\from{catchfile.dtx}{test3}}%
}
\obeyspaces
@@ -133,7 +137,7 @@ and the derived files
%<*driver>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{catchfile.drv}%
- [2007/05/30 v1.0 Catches the contents of a file (HO)]%
+ [2007/09/09 v1.1 Catches the contents of a file (HO)]%
\documentclass{ltxdoc}
\usepackage{holtxdoc}
\begin{document}
@@ -142,7 +146,7 @@ and the derived files
%</driver>
% \fi
%
-% \CheckSum{419}
+% \CheckSum{481}
%
% \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
@@ -163,7 +167,7 @@ and the derived files
% \GetFileInfo{catchfile.drv}
%
% \title{The \xpackage{catchfile} package}
-% \date{2007/05/30 v1.0}
+% \date{2007/09/09 v1.1}
% \author{Heiko Oberdiek\\\xemail{oberdiek@uni-freiburg.de}}
%
% \maketitle
@@ -258,27 +262,30 @@ and the derived files
\fi
\expandafter\x\csname ver@catchfile.sty\endcsname
\ProvidesPackage{catchfile}%
- [2007/05/30 v1.0 Catches the contents of a file (HO)]
+ [2007/09/09 v1.1 Catches the contents of a file (HO)]
% \end{macrocode}
%
% \subsection{Catcodes}
%
% \begin{macrocode}
-\expandafter\edef\csname CatchFile@End\endcsname{%
- \catcode44 \the\catcode44\relax % ,
- \catcode45 \the\catcode45\relax % -
- \catcode46 \the\catcode46\relax % .
- \catcode61 \the\catcode61\relax % =
- \catcode64 \the\catcode64\relax % @
- \catcode96 \the\catcode96\relax % `
- \noexpand\endinput
+\expandafter\edef\csname CatchFile@AtEnd\endcsname{%
+ \catcode64 \the\catcode64\relax
}
-\catcode44 12 % ,
-\catcode45 12 % -
-\catcode46 12 % .
-\catcode61 12 % =
\catcode64 11 % @
-\catcode96 12 % `
+\def\TMP@EnsureCode#1#2{%
+ \edef\CatchFile@AtEnd{%
+ \CatchFile@AtEnd
+ \catcode#1 \the\catcode#1\relax
+ }%
+ \catcode#1 #2\relax
+}
+\TMP@EnsureCode{39}{12}% '
+\TMP@EnsureCode{44}{12}% ,
+\TMP@EnsureCode{45}{12}% -
+\TMP@EnsureCode{46}{12}% .
+\TMP@EnsureCode{47}{12}% /
+\TMP@EnsureCode{61}{12}% =
+\TMP@EnsureCode{96}{12}% `
% \end{macrocode}
%
% \subsection{Preparations}
@@ -288,7 +295,7 @@ and the derived files
\expandafter\ifx\csname RequirePackage\endcsname\relax
\input infwarerr.sty\relax
\else
- \RequirePackage{infwarerr}%
+ \RequirePackage{infwarerr}[2007/09/09]%
\fi
% \end{macrocode}
%
@@ -305,7 +312,8 @@ and the derived files
package loading is aborted%
}\@ehd
\endgroup
- \expandafter\CatchFile@End
+ \CatchFile@AtEnd
+ \expandafter\endinput
\fi
\endgroup
% \end{macrocode}
@@ -343,7 +351,8 @@ and the derived files
package loading is aborted%
}\@ehd
\csname endgroup\endcsname
- \CatchFile@End
+ \CatchFile@AtEnd
+ \endinput
\endgroup
% \end{macrocode}
% \end{macro}
@@ -471,21 +480,73 @@ and the derived files
% \end{macro}
%
% \begin{macrocode}
-\CatchFile@End
+\CatchFile@AtEnd
%</package>
% \end{macrocode}
%
% \section{Test}
%
-% \subsection{\LaTeX}
+% \subsection{Catcode checks for loading}
%
% \begin{macrocode}
%<*test1>
+% \end{macrocode}
+% \begin{macrocode}
+\catcode`\@=11 %
+\def\RestoreCatcodes{}
+\count@=0 %
+\loop
+ \edef\RestoreCatcodes{%
+ \RestoreCatcodes
+ \catcode\the\count@=\the\catcode\count@\relax
+ }%
+\ifnum\count@<255 %
+ \advance\count@\@ne
+\repeat
+
+\def\RangeCatcodeInvalid#1#2{%
+ \count@=#1\relax
+ \loop
+ \catcode\count@=15 %
+ \ifnum\count@<#2\relax
+ \advance\count@\@ne
+ \repeat
+}
+\def\Test{%
+ \RangeCatcodeInvalid{0}{47}%
+ \RangeCatcodeInvalid{58}{64}%
+ \RangeCatcodeInvalid{91}{96}%
+ \RangeCatcodeInvalid{123}{255}%
+ \catcode`\@=12 %
+ \catcode`\\=0 %
+ \catcode`\{=1 %
+ \catcode`\}=2 %
+ \catcode`\#=6 %
+ \catcode`\[=12 %
+ \catcode`\]=12 %
+ \catcode`\%=14 %
+ \catcode`\ =10 %
+ \catcode13=5 %
+ \input catchfile.sty\relax
+ \RestoreCatcodes
+}
+\Test
+\csname @@end\endcsname
+\end
+% \end{macrocode}
+% \begin{macrocode}
+%</test1>
+% \end{macrocode}
+%
+% \subsection{\LaTeX}
+%
+% \begin{macrocode}
+%<*test2>
\NeedsTeXFormat{LaTeX2e}
\nofiles
\listfiles
\documentclass{minimal}
-\usepackage{catchfile}[2007/05/30]
+\usepackage{catchfile}[2007/09/09]
\makeatletter
\def\mysetup{%
\let\do\@makeother
@@ -504,13 +565,13 @@ and the derived files
}
\typeout{\contents}
\end{document}
-%</test1>
+%</test2>
% \end{macrocode}
%
% \subsection{\plainTeX}
%
% \begin{macrocode}
-%<*test2>
+%<*test3>
\def\msg#{\immediate\write16}
\newlinechar=10 %
\input catchfile.sty\relax
@@ -534,8 +595,9 @@ and the derived files
\csname @@end\endcsname
\end
-%</test2>
+%</test3>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
@@ -599,6 +661,7 @@ and the derived files
% catchfile.pdf & doc/latex/oberdiek/catchfile.pdf\\
% catchfile-test1.tex & doc/latex/oberdiek/catchfile-test1.tex\\
% catchfile-test2.tex & doc/latex/oberdiek/catchfile-test2.tex\\
+% catchfile-test3.tex & doc/latex/oberdiek/catchfile-test3.tex\\
% catchfile.dtx & source/latex/oberdiek/catchfile.dtx\\
% \end{tabular}^^A
% }^^A
@@ -724,6 +787,10 @@ and the derived files
% \item
% First version.
% \end{Version}
+% \begin{Version}{2007/09/09 v1.1}
+% \item
+% Catcode section rewritten.
+% \end{Version}
% \end{History}
%
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/oberdiek/centernot.dtx b/Master/texmf-dist/source/latex/oberdiek/centernot.dtx
index 40c1f5354c5..d83553b6df3 100644
--- a/Master/texmf-dist/source/latex/oberdiek/centernot.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/centernot.dtx
@@ -132,10 +132,10 @@ and the derived files
\usepackage{centernot}
\usepackage{amssymb}
\DeclareFontFamily{U}{matha}{\hyphenchar\font45}
-\DeclareFontShape{U}{matha}{m}{n}{
- <5> <6> <7> <8> <9> <10> gen * matha
- <10.95> matha10 <12> <14.4> <17.28> <20.74> <24.88> matha12
- }{}
+\DeclareFontShape{U}{matha}{m}{n}{%
+ <5> <6> <7> <8> <9> <10> gen * matha %
+ <10.95> matha10 <12> <14.4> <17.28> <20.74> <24.88> matha12 %
+}{}
\DeclareSymbolFont{matha}{U}{matha}{m}{n}
\DeclareMathSymbol{\notdivides}{3}{matha}{"1F}
\DeclareMathSymbol{\notrightarrow}{3}{matha}{"DB}
@@ -295,6 +295,7 @@ and the derived files
% \begin{macrocode}
%</package>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
diff --git a/Master/texmf-dist/source/latex/oberdiek/chemarr.dtx b/Master/texmf-dist/source/latex/oberdiek/chemarr.dtx
index 5872185b439..5a598a4d72d 100644
--- a/Master/texmf-dist/source/latex/oberdiek/chemarr.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/chemarr.dtx
@@ -294,6 +294,7 @@ and the derived files
% \begin{macrocode}
%</package>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
diff --git a/Master/texmf-dist/source/latex/oberdiek/classlist.dtx b/Master/texmf-dist/source/latex/oberdiek/classlist.dtx
index b5a752a41f7..17fa2ef4ede 100644
--- a/Master/texmf-dist/source/latex/oberdiek/classlist.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/classlist.dtx
@@ -383,6 +383,7 @@ and the derived files
% \begin{macrocode}
%</package>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
diff --git a/Master/texmf-dist/source/latex/oberdiek/colonequals.dtx b/Master/texmf-dist/source/latex/oberdiek/colonequals.dtx
index 4f9f5ff9233..fab1da60832 100644
--- a/Master/texmf-dist/source/latex/oberdiek/colonequals.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/colonequals.dtx
@@ -407,6 +407,7 @@ and the derived files
% \begin{macrocode}
%</package>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
diff --git a/Master/texmf-dist/source/latex/oberdiek/dvipscol.dtx b/Master/texmf-dist/source/latex/oberdiek/dvipscol.dtx
index 82de766dd0f..3494cb322bd 100644
--- a/Master/texmf-dist/source/latex/oberdiek/dvipscol.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/dvipscol.dtx
@@ -292,6 +292,7 @@ and the derived files
% \begin{macrocode}
%</package>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
diff --git a/Master/texmf-dist/source/latex/oberdiek/embedfile.dtx b/Master/texmf-dist/source/latex/oberdiek/embedfile.dtx
index f0734245cb7..c2ce95e1f4a 100644
--- a/Master/texmf-dist/source/latex/oberdiek/embedfile.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/embedfile.dtx
@@ -17,7 +17,9 @@
% This work consists of the main source file embedfile.dtx
% and the derived files
% embedfile.sty, embedfile.pdf, embedfile.ins, embedfile.drv,
-% dtx-attach.sty, embedfile-example-plain.tex.
+% dtx-attach.sty, embedfile-example-plain.tex,
+% embedfile-test1.tex, embedfile-test2.tex,
+% embedfile-test3.tex.
%
% Distribution:
% CTAN:macros/latex/contrib/oberdiek/embedfile.dtx
@@ -54,6 +56,9 @@
% TDS:tex/latex/oberdiek/dtx-attach.sty
% TDS:doc/latex/oberdiek/embedfile.pdf
% TDS:doc/latex/oberdiek/embedfile-example-plain.tex
+% TDS:doc/latex/oberdiek/embedfile-test1.tex
+% TDS:doc/latex/oberdiek/embedfile-test2.tex
+% TDS:doc/latex/oberdiek/embedfile-test3.tex
% TDS:source/latex/oberdiek/embedfile.dtx
%
%<*ignore>
@@ -69,7 +74,7 @@
\input docstrip.tex
\Msg{************************************************************************}
\Msg{* Installation}
-\Msg{* Package: embedfile 2007/04/11 v1.1 embed files into PDF (HO)}
+\Msg{* Package: embedfile 2007/09/09 v1.2 embed files into PDF (HO)}
\Msg{************************************************************************}
\keepsilent
@@ -96,7 +101,9 @@ This Current Maintainer of this work is Heiko Oberdiek.
This work consists of the main source file embedfile.dtx
and the derived files
embedfile.sty, embedfile.pdf, embedfile.ins, embedfile.drv,
- dtx-attach.sty, embedfile-example-plain.tex.
+ dtx-attach.sty, embedfile-example-plain.tex,
+ embedfile-test1.tex, embedfile-test2.tex,
+ embedfile-test3.tex.
\endpreamble
@@ -108,6 +115,9 @@ and the derived files
\file{dtx-attach.sty}{\from{embedfile.dtx}{dtxattach}}%
\usedir{doc/latex/oberdiek}%
\file{embedfile-example-plain.tex}{\from{embedfile.dtx}{exampleplain}}%
+ \file{embedfile-test1.tex}{\from{embedfile.dtx}{test1}}%
+ \file{embedfile-test2.tex}{\from{embedfile.dtx}{test2}}%
+ \file{embedfile-test3.tex}{\from{embedfile.dtx}{test3}}%
}
\obeyspaces
@@ -133,7 +143,7 @@ and the derived files
%<*driver>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{embedfile.drv}%
- [2007/04/11 v1.1 embed files into PDF (HO)]%
+ [2007/09/09 v1.2 embed files into PDF (HO)]%
\documentclass{ltxdoc}
\usepackage{holtxdoc}
\begin{document}
@@ -142,7 +152,7 @@ and the derived files
%</driver>
% \fi
%
-% \CheckSum{0}
+% \CheckSum{637}
%
% \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
@@ -163,14 +173,14 @@ and the derived files
% \GetFileInfo{embedfile.drv}
%
% \title{The \xpackage{embedfile} package}
-% \date{2007/04/11 v1.1}
+% \date{2007/09/09 v1.2}
% \author{Heiko Oberdiek\\\xemail{oberdiek@uni-freiburg.de}}
%
% \maketitle
%
% \begin{abstract}
% This package embeds files to a PDF document.
-% Currently \pdfTeX\ >= 1.30 in PDF mode is supported only.
+% Currently the only supported driver is \pdfTeX\ $>=$ 1.30 in PDF mode.
% \end{abstract}
%
% \tableofcontents
@@ -234,7 +244,7 @@ and the derived files
% safely use \cs{embedfile} before \verb|\end{document}|.
% Embedding files using \cs{AtEndDocument} will only work,
% if \cs{AtEndDocument} is called before loading the package
-% \xpackage{embedfile}
+% \xpackage{embedfile}.
%
% The \meta{options} are give as key value pairs. The following
% keys are supported:
@@ -266,13 +276,22 @@ and the derived files
% the use of \cs{pdfescapestring}.
% \end{description}
%
+% \begin{declcs}{embedfilefinish}
+% \end{declcs}
+% The list of all embedded files must be added as data structure
+% in the PDF file. In case of \LaTeX\ this is automatically done.
+% The package uses \cs{AtEndDocument}. Then the list of all
+% files should be known. However, \plainTeX\ does not know
+% about \cs{AtEndDocument}. Thus the user must call
+% \cs{embedfilefinish} at the end of the document
+% after the last file is embedded.
+%
% \subsection{Examples}
%
% \subsubsection{\plainTeX}\label{sec:plain}
%
-% The package can be used with \plainTeX. Because is uses
-% package \xpackage{keyval} and \cs{@ifnextchar}, it needs
-% a little help from \xfile{miniltx.tex}.
+% The package can be used with \plainTeX. It can be used
+% with or without help from \xfile{miniltx.tex}.
%
% If additionally package \xpackage{keyval} (\xpackage{graphicx})
% is needed, load it first. Then package \xpackage{embedfile} avoids
@@ -330,8 +349,8 @@ This example document contains three embedded files.
%<*dtxattach>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{dtx-attach}
- [2007/04/11 v1.1 Embed \string\jobname.dtx (HO)]%
-\RequirePackage{embedfile}[2007/04/11]
+ [2007/09/09 v1.2 Embed \string\jobname.dtx (HO)]%
+\RequirePackage{embedfile}[2007/09/09]
\embedfile[%
stringmethod=escape,%
mimetype=plain/text,%
@@ -407,71 +426,59 @@ This example document contains three embedded files.
\fi
\expandafter\x\csname ver@embedfile.sty\endcsname
\ProvidesPackage{embedfile}%
- [2007/04/11 v1.1 embed files into PDF (HO)]
+ [2007/09/09 v1.2 embed files into PDF (HO)]
% \end{macrocode}
%
+% \subsection{Catcodes}
+%
% \begin{macrocode}
-\edef\EmbedFileRestoreCatcodes{%
- \catcode39 \the\catcode39 % '
- \catcode40 \the\catcode40 % (
- \catcode41 \the\catcode41 % )
- \catcode47 \the\catcode47 % /
- \catcode60 \the\catcode60 % <
- \catcode62 \the\catcode62 % >
- \catcode64 \the\catcode64 % @
- \catcode91 \the\catcode91 % [
- \catcode93 \the\catcode93 % ]
- \catcode96 \the\catcode96 % `
+\expandafter\edef\csname EmbedFile@AtEnd\endcsname{%
+ \catcode64 \the\catcode64\relax
}
-\catcode39 12 % '
-\catcode40 12 % (
-\catcode41 12 % )
-\catcode47 12 % /
-\catcode60 12 % <
-\catcode62 12 % >
\catcode64 11 % @
-\catcode91 12 % [
-\catcode93 12 % ]
-\catcode96 12 % `
+\def\TMP@EnsureCode#1#2{%
+ \edef\EmbedFile@AtEnd{%
+ \EmbedFile@AtEnd
+ \catcode#1 \the\catcode#1\relax
+ }%
+ \catcode#1 #2\relax
+}
+\TMP@EnsureCode{39}{12}% '
+\TMP@EnsureCode{40}{12}% (
+\TMP@EnsureCode{41}{12}% )
+\TMP@EnsureCode{44}{12}% ,
+\TMP@EnsureCode{46}{12}% .
+\TMP@EnsureCode{47}{12}% /
+\TMP@EnsureCode{58}{12}% :
+\TMP@EnsureCode{60}{12}% <
+\TMP@EnsureCode{61}{12}% =
+\TMP@EnsureCode{62}{12}% >
+\TMP@EnsureCode{91}{12}% [
+\TMP@EnsureCode{93}{12}% ]
+\TMP@EnsureCode{96}{12}% `
% \end{macrocode}
%
% \subsection{Tools}
%
-% \begin{macro}{\EmbedFile@PackageError}
+% \begin{macro}{\EmbedFile@RequirePackage}
% \begin{macrocode}
\begingroup\expandafter\expandafter\expandafter\endgroup
-\expandafter\ifx\csname PackageError\endcsname\relax
- \def\EmbedFile@PackageError#1#2{%
- \errhelp{#2}%
- \errmessage{Package embedfile Error: #1.}%
+\expandafter\ifx\csname RequirePackage\endcsname\relax
+ \def\EmbedFile@RequirePackage#1[#2]{%
+ \input #1.sty\relax
}%
\else
- \def\EmbedFile@PackageError#1#2{%
- \begingroup
- \let\on@line\empty
- \PackageError{embedfile}{#1}{#2}%
- \endgroup
- }%
+ \let\EmbedFile@RequirePackage\RequirePackage
\fi
% \end{macrocode}
% \end{macro}
%
-% \begin{macro}{\EmbedFile@RequirePackage}
+% \begin{macro}{\EmbedFile@PackageError}
% \begin{macrocode}
-\begingroup\expandafter\expandafter\expandafter\endgroup
-\expandafter\ifx\csname RequirePackage\endcsname\relax
- \def\EmbedFile@RequirePackage#1#2{%
- \expandafter\ifx\csname #2\encsname\relax
- \input #1.sty\relax
- \fi
- }%
-\else
- \def\EmbedFile@RequirePackage#1#2{%
- \expandafter\ifx\csname #2\endcsname\relax
- \RequirePackage{#1}%
- \fi
- }%
-\fi
+\EmbedFile@RequirePackage{infwarerr}[2007/09/09]%
+\def\EmbedFile@PackageError{%
+ \@PackageError{embedfile}%
+}
% \end{macrocode}
% \end{macro}
%
@@ -479,15 +486,16 @@ This example document contains three embedded files.
%
% Load package \xpackage{ifpdf} and check mode.
% \begin{macrocode}
-\EmbedFile@RequirePackage{ifpdf}{ifpdf}
+\EmbedFile@RequirePackage{ifpdf}[2007/09/09]
\ifpdf
\else
\EmbedFile@PackageError{%
Missing pdfTeX in PDF mode%
}{%
- Currently other drivers are not supported. Package loading is aborted.%
+ Currently other drivers are not supported. %
+ Package loading is aborted.%
}%
- \EmbedFileRestoreCatcodes
+ \EmbedFile@AtEnd
\expandafter\endinput
\fi
% \end{macrocode}
@@ -500,7 +508,7 @@ This example document contains three embedded files.
}{%
At least version 1.30 is necessary. Package loading is aborted.%
}%
- \EmbedFileRestoreCatcodes
+ \EmbedFile@AtEnd
\expandafter\endinput
\fi
% \end{macrocode}
@@ -508,7 +516,100 @@ This example document contains three embedded files.
% \subsection{Key value definitions}
%
% \begin{macrocode}
-\EmbedFile@RequirePackage{keyval}{define@key}
+\expandafter\ifx\csname define@key\endcsname\relax
+ \chardef\EmbedFile@plain=\z@
+ \def\EmbedFile@temp#1{%
+ \begingroup\expandafter\expandafter\expandafter\endgroup
+ \expandafter\ifx\csname#1\endcsname\relax
+ \chardef\EmbedFile@plain=\@ne
+ \fi
+ }%
+ \EmbedFile@temp{NeedsTeXFormat}%
+ \EmbedFile@temp{ProvidesPackage}%
+ \EmbedFile@temp{DeclareOption}%
+ \EmbedFile@temp{ExecuteOptions}%
+ \EmbedFile@temp{ProcessOptions}%
+ \ifnum\EmbedFile@plain=\@ne
+ \def\EmbedFile@temp#1{%
+ \expandafter\let\csname EmbedFile@Org#1\expandafter\endcsname
+ \csname#1\endcsname
+ \expandafter\def\csname#1\endcsname
+ }%
+ \EmbedFile@temp{NeedsTeXFormat}#1{}%
+ \EmbedFile@temp{ProvidesPackage}#1[#2]{}% hash-ok
+ \EmbedFile@temp{DeclareOption}#1{}%
+ \EmbedFile@temp{ExecuteOptions}#1{}%
+ \EmbedFile@temp{ProcessOptions}{}%
+% \end{macrocode}
+% \begin{macro}{\KV@errx}
+% \LaTeX's option processing is not available with
+% \plainTeX. Thus we define the default error
+% command \cs{KV@errx} here, also using package
+% \xpackage{infwarerr}'s \cs{@PackageError}.
+% \begin{macrocode}
+ \def\KV@errx#1{%
+ \@PackageError{keyval}{#1}\@ehc
+ }%
+% \end{macrocode}
+% \end{macro}
+% Other macros from \LaTeX's kernel that are used by
+% package \xpackage{keyval}.
+% \begin{macro}{\@ifnextchar}
+% \begin{macrocode}
+ \expandafter\ifx\csname @ifnextchar\endcsname\relax
+ \def\@ifnextchar#1#2#3{%
+ \let\reserved@d=#1%
+ \def\reserved@a{#2}%
+ \def\reserved@b{#3}%
+ \futurelet\@let@token\@ifnch
+ }%
+ \def\@ifnch{%
+ \ifx\@let@token\@sptoken
+ \let\reserved@c\@xifnch
+ \else
+ \ifx\@let@token\reserved@d
+ \let\reserved@c\reserved@a
+ \else
+ \let\reserved@c\reserved@b
+ \fi
+ \fi
+ \reserved@c
+ }%
+ \begingroup
+ \def\:{\global\let\@sptoken= }%
+ \: % this makes \@sptoken a space token
+ \def\:{\@xifnch}%
+ \expandafter\gdef\: {%
+ \futurelet\@let@token\@ifnch
+ }%
+ \endgroup
+ \fi
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@namedef}
+% \begin{macrocode}
+ \expandafter\ifx\csname @namedef\endcsname\relax
+ \def\@namedef#1{%
+ \expandafter\def\csname#1\endcsname
+ }%
+ \fi
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+ \fi
+ \EmbedFile@RequirePackage{keyval}[1999/03/16]%
+ \ifnum\EmbedFile@plain=\@ne
+ \def\EmbedFile@temp#1{%
+ \expandafter\let\csname#1\expandafter\endcsname
+ \csname EmbedFile@Org#1\endcsname
+ }%
+ \EmbedFile@temp{NeedsTeXFormat}%
+ \EmbedFile@temp{ProvidesPackage}%
+ \EmbedFile@temp{DeclareOption}%
+ \EmbedFile@temp{ExecuteOptions}%
+ \EmbedFile@temp{ProcessOptions}%
+ \fi
+\fi
% \end{macrocode}
%
% \begin{macrocode}
@@ -732,9 +833,94 @@ This example document contains three embedded files.
% \end{macrocode}
%
% \begin{macrocode}
-\EmbedFileRestoreCatcodes
+\EmbedFile@AtEnd
%</package>
% \end{macrocode}
+%
+% \section{Test}
+%
+% \subsection{Catcode checks for loading}
+%
+% \begin{macrocode}
+%<*test1>
+% \end{macrocode}
+% \begin{macrocode}
+\catcode`\@=11 %
+\def\RestoreCatcodes{}
+\count@=0 %
+\loop
+ \edef\RestoreCatcodes{%
+ \RestoreCatcodes
+ \catcode\the\count@=\the\catcode\count@\relax
+ }%
+\ifnum\count@<255 %
+ \advance\count@\@ne
+\repeat
+
+\def\RangeCatcodeInvalid#1#2{%
+ \count@=#1\relax
+ \loop
+ \catcode\count@=15 %
+ \ifnum\count@<#2\relax
+ \advance\count@\@ne
+ \repeat
+}
+\def\Test{%
+ \RangeCatcodeInvalid{0}{47}%
+ \RangeCatcodeInvalid{58}{64}%
+ \RangeCatcodeInvalid{91}{96}%
+ \RangeCatcodeInvalid{123}{255}%
+ \catcode`\@=12 %
+ \catcode`\\=0 %
+ \catcode`\{=1 %
+ \catcode`\}=2 %
+ \catcode`\#=6 %
+ \catcode`\[=12 %
+ \catcode`\]=12 %
+ \catcode`\%=14 %
+ \catcode`\ =10 %
+ \catcode13=5 %
+ \input embedfile.sty\relax
+ \RestoreCatcodes
+}
+\Test
+\csname @@end\endcsname
+\end
+% \end{macrocode}
+% \begin{macrocode}
+%</test1>
+% \end{macrocode}
+%
+% \subsection{Simple test}
+%
+% \begin{macrocode}
+%<*test2>
+\input embedfile.sty\relax
+\embedfile[%
+ stringmethod=escape,%
+ mimetype=plain/text,%
+ desc={LaTeX docstrip source archive for package `embedfile'}%
+]{embedfile.dtx}
+\nopagenumbers
+Test (plain-\TeX): {\tt embedfile.dtx} should be embedded.%
+\embedfilefinish
+\bye
+%</test2>
+% \end{macrocode}
+% \begin{macrocode}
+%<*test3>
+\NeedsTeXFormat{LaTeX2e}
+\let\SavedJobname\jobname
+\def\jobname{embedfile}
+\RequirePackage{dtx-attach}[2007/09/09]
+\let\jobname\SavedJobname
+\documentclass{minimal}
+\begin{document}
+ Test (\LaTeX): \texttt{embedfile.dtx} should be embedded.%
+\end{document}
+%</test3>
+% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
@@ -798,6 +984,9 @@ This example document contains three embedded files.
% dtx-attach.sty & tex/latex/oberdiek/dtx-attach.sty\\
% embedfile.pdf & doc/latex/oberdiek/embedfile.pdf\\
% embedfile-example-plain.tex & doc/latex/oberdiek/embedfile-example-plain.tex\\
+% embedfile-test1.tex & doc/latex/oberdiek/embedfile-test1.tex\\
+% embedfile-test2.tex & doc/latex/oberdiek/embedfile-test2.tex\\
+% embedfile-test3.tex & doc/latex/oberdiek/embedfile-test3.tex\\
% embedfile.dtx & source/latex/oberdiek/embedfile.dtx\\
% \end{tabular}^^A
% }^^A
@@ -956,6 +1145,12 @@ This example document contains three embedded files.
% \item
% Line ends sanitized.
% \end{Version}
+% \begin{Version}{2007/09/09 v1.2}
+% \item
+% Fixes for plain-TeX, wrapper for package \xpackage{keyval} added.
+% \item
+% Catcode section rewritten.
+% \end{Version}
% \end{History}
%
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/oberdiek/engord.dtx b/Master/texmf-dist/source/latex/oberdiek/engord.dtx
index 02dd0afd063..a8ef4e5e11f 100644
--- a/Master/texmf-dist/source/latex/oberdiek/engord.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/engord.dtx
@@ -17,7 +17,8 @@
%
% This work consists of the main source file engord.dtx
% and the derived files
-% engord.sty, engord.pdf, engord.ins, engord.drv.
+% engord.sty, engord.pdf, engord.ins, engord.drv,
+% engord-test1.tex.
%
% Distribution:
% CTAN:macros/latex/contrib/oberdiek/engord.dtx
@@ -52,6 +53,7 @@
% Installation:
% TDS:tex/generic/oberdiek/engord.sty
% TDS:doc/latex/oberdiek/engord.pdf
+% TDS:doc/latex/oberdiek/engord-test1.tex
% TDS:source/latex/oberdiek/engord.dtx
%
%<*ignore>
@@ -67,7 +69,7 @@
\input docstrip.tex
\Msg{************************************************************************}
\Msg{* Installation}
-\Msg{* Package: engord 2007/04/26 v1.4 Provides the ifpdf switch (HO)}
+\Msg{* Package: engord 2007/09/09 v1.5 Provides the ifpdf switch (HO)}
\Msg{************************************************************************}
\keepsilent
@@ -94,7 +96,8 @@ This Current Maintainer of this work is Heiko Oberdiek.
This work consists of the main source file engord.dtx
and the derived files
- engord.sty, engord.pdf, engord.ins, engord.drv.
+ engord.sty, engord.pdf, engord.ins, engord.drv,
+ engord-test1.tex.
\endpreamble
@@ -103,6 +106,8 @@ and the derived files
\file{engord.drv}{\from{engord.dtx}{driver}}%
\usedir{tex/generic/oberdiek}%
\file{engord.sty}{\from{engord.dtx}{package}}%
+ \usedir{doc/latex/oberdiek}%
+ \file{engord-test1.tex}{\from{engord.dtx}{test1}}%
}
\obeyspaces
@@ -128,7 +133,7 @@ and the derived files
%<*driver>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{engord.drv}%
- [2007/04/26 v1.4 Provides the ifpdf switch (HO)]%
+ [2007/09/09 v1.5 Provides the ifpdf switch (HO)]%
\documentclass{ltxdoc}
\usepackage{holtxdoc}
\begin{document}
@@ -137,7 +142,7 @@ and the derived files
%</driver>
% \fi
%
-% \CheckSum{281}
+% \CheckSum{369}
%
% \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
@@ -158,7 +163,7 @@ and the derived files
% \GetFileInfo{engord.drv}
%
% \title{The \xpackage{engord} package}
-% \date{2007/04/26 v1.4}
+% \date{2007/09/09 v1.5}
% \author{Heiko Oberdiek\\\xemail{oberdiek@uni-freiburg.de}}
%
% \maketitle
@@ -318,18 +323,33 @@ and the derived files
\fi
\expandafter\x\csname ver@engord.sty\endcsname
\ProvidesPackage{engord}%
- [2007/04/26 v1.4 Provides the ifpdf switch (HO)]
+ [2007/09/09 v1.5 Provides the ifpdf switch (HO)]
% \end{macrocode}
%
% \subsection{Help commands for plain compatibility}
%
-% \begin{macro}{\EO@atcode}
-% Save catcode of |@|.
% \begin{macrocode}
-\expandafter\chardef\csname EO@atcode\endcsname\catcode`\@
-\catcode`\@=11 %
+\expandafter\edef\csname EO@AtEnd\endcsname{%
+ \catcode64 \the\catcode64\relax
+}
+\catcode64 11 % @
+\def\TMP@EnsureCode#1#2{%
+ \edef\EO@AtEnd{%
+ \EO@AtEnd
+ \catcode#1 \the\catcode#1\relax
+ }%
+ \catcode#1 #2\relax
+}
+\TMP@EnsureCode{33}{12}% !
+\TMP@EnsureCode{36}{3}% $
+\TMP@EnsureCode{39}{12}% '
+\TMP@EnsureCode{42}{12}% *
+\TMP@EnsureCode{46}{12}% .
+\TMP@EnsureCode{47}{12}% /
+\TMP@EnsureCode{60}{12}% <
+\TMP@EnsureCode{94}{7}% ^(superscript)
+\TMP@EnsureCode{96}{12}% `
% \end{macrocode}
-% \end{macro}
%
% \begin{macro}{\EO@def}
% Definitions, \cs{newcommand} does not exist in \plainTeX.
@@ -350,7 +370,7 @@ and the derived files
\expandafter\ifx\csname RequirePackage\endcsname\relax
\input infwarerr.sty\relax
\else
- \RequirePackage{infwarerr}%
+ \RequirePackage{infwarerr}[2007/09/09]%
\fi
% \end{macrocode}
%
@@ -556,14 +576,68 @@ and the derived files
% \end{macrocode}
% \end{macro}
%
-% Restore catcode of |@|.
% \begin{macrocode}
-\catcode`\@=\EO@atcode
+\EO@AtEnd
% \end{macrocode}
%
% \begin{macrocode}
%</package>
% \end{macrocode}
+%
+% \section{Test}
+%
+% \subsection{Catcode checks for loading}
+%
+% \begin{macrocode}
+%<*test1>
+% \end{macrocode}
+% \begin{macrocode}
+\catcode`\@=11 %
+\def\RestoreCatcodes{}
+\count@=0 %
+\loop
+ \edef\RestoreCatcodes{%
+ \RestoreCatcodes
+ \catcode\the\count@=\the\catcode\count@\relax
+ }%
+\ifnum\count@<255 %
+ \advance\count@\@ne
+\repeat
+
+\def\RangeCatcodeInvalid#1#2{%
+ \count@=#1\relax
+ \loop
+ \catcode\count@=15 %
+ \ifnum\count@<#2\relax
+ \advance\count@\@ne
+ \repeat
+}
+\def\Test{%
+ \RangeCatcodeInvalid{0}{47}%
+ \RangeCatcodeInvalid{58}{64}%
+ \RangeCatcodeInvalid{91}{96}%
+ \RangeCatcodeInvalid{123}{255}%
+ \catcode`\@=12 %
+ \catcode`\\=0 %
+ \catcode`\{=1 %
+ \catcode`\}=2 %
+ \catcode`\#=6 %
+ \catcode`\[=12 %
+ \catcode`\]=12 %
+ \catcode`\%=14 %
+ \catcode`\ =10 %
+ \catcode13=5 %
+ \input engord.sty\relax
+ \RestoreCatcodes
+}
+\Test
+\csname @@end\endcsname
+\end
+% \end{macrocode}
+% \begin{macrocode}
+%</test1>
+% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
@@ -625,6 +699,7 @@ and the derived files
% \begin{tabular}{@{}>{\ttfamily}l@{ $\rightarrow$ }>{\ttfamily}l@{}}
% engord.sty & tex/generic/oberdiek/engord.sty\\
% engord.pdf & doc/latex/oberdiek/engord.pdf\\
+% engord-test1.tex & doc/latex/oberdiek/engord-test1.tex\\
% engord.dtx & source/latex/oberdiek/engord.dtx\\
% \end{tabular}^^A
% }^^A
@@ -774,6 +849,10 @@ and the derived files
% \item
% Use of package \xpackage{infwarerr}.
% \end{Version}
+% \begin{Version}{2007/09/09 v1.5}
+% \item
+% Catcode section added.
+% \end{Version}
% \end{History}
%
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/oberdiek/epstopdf.dtx b/Master/texmf-dist/source/latex/oberdiek/epstopdf.dtx
index affab181594..3bc81e31388 100644
--- a/Master/texmf-dist/source/latex/oberdiek/epstopdf.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/epstopdf.dtx
@@ -467,6 +467,7 @@ and the derived files
% \begin{macrocode}
%</package>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
diff --git a/Master/texmf-dist/source/latex/oberdiek/etexcmds.dtx b/Master/texmf-dist/source/latex/oberdiek/etexcmds.dtx
index e37941d6f5c..d2e94c4b67f 100644
--- a/Master/texmf-dist/source/latex/oberdiek/etexcmds.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/etexcmds.dtx
@@ -17,7 +17,8 @@
% This work consists of the main source file etexcmds.dtx
% and the derived files
% etexcmds.sty, etexcmds.pdf, etexcmds.ins, etexcmds.drv,
-% etexcmds-test1.tex, etexcmds-test2.tex, etexcmds-test3.tex.
+% etexcmds-test1.tex, etexcmds-test2.tex, etexcmds-test3.tex,
+% etexcmds-test4.tex.
%
% Distribution:
% CTAN:macros/latex/contrib/oberdiek/etexcmds.dtx
@@ -55,6 +56,7 @@
% TDS:doc/latex/oberdiek/etexcmds-test1.tex
% TDS:doc/latex/oberdiek/etexcmds-test2.tex
% TDS:doc/latex/oberdiek/etexcmds-test3.tex
+% TDS:doc/latex/oberdiek/etexcmds-test4.tex
% TDS:source/latex/oberdiek/etexcmds.dtx
%
%<*ignore>
@@ -70,7 +72,7 @@
\input docstrip.tex
\Msg{************************************************************************}
\Msg{* Installation}
-\Msg{* Package: etexcmds 2007/05/06 v1.0 Providing prefix for e-TeX command names (HO)}
+\Msg{* Package: etexcmds 2007/09/09 v1.1 Providing prefix for e-TeX command names (HO)}
\Msg{************************************************************************}
\keepsilent
@@ -97,7 +99,8 @@ This Current Maintainer of this work is Heiko Oberdiek.
This work consists of the main source file etexcmds.dtx
and the derived files
etexcmds.sty, etexcmds.pdf, etexcmds.ins, etexcmds.drv,
- etexcmds-test1.tex, etexcmds-test2.tex, etexcmds-test3.tex.
+ etexcmds-test1.tex, etexcmds-test2.tex, etexcmds-test3.tex,
+ etexcmds-test4.tex.
\endpreamble
@@ -110,6 +113,7 @@ and the derived files
\file{etexcmds-test1.tex}{\from{etexcmds.dtx}{test1}}%
\file{etexcmds-test2.tex}{\from{etexcmds.dtx}{test2}}%
\file{etexcmds-test3.tex}{\from{etexcmds.dtx}{test3}}%
+ \file{etexcmds-test4.tex}{\from{etexcmds.dtx}{test4}}%
}
\obeyspaces
@@ -135,7 +139,7 @@ and the derived files
%<*driver>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{etexcmds.drv}%
- [2007/05/06 v1.0 Providing prefix for e-TeX command names (HO)]%
+ [2007/09/09 v1.1 Providing prefix for e-TeX command names (HO)]%
\documentclass{ltxdoc}
\usepackage{holtxdoc}
\begin{document}
@@ -144,7 +148,7 @@ and the derived files
%</driver>
% \fi
%
-% \CheckSum{252}
+% \CheckSum{315}
%
% \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
@@ -165,7 +169,7 @@ and the derived files
% \GetFileInfo{etexcmds.drv}
%
% \title{The \xpackage{etexcmds} package}
-% \date{2007/05/06 v1.0}
+% \date{2007/09/09 v1.1}
% \author{Heiko Oberdiek\\\xemail{oberdiek@uni-freiburg.de}}
%
% \maketitle
@@ -181,6 +185,8 @@ and the derived files
%
% \section{Documentation}
%
+% \begin{declcs}{etex@unexpanded}
+% \end{declcs}
% New primitive commands are introduced in \eTeX. Unhappily
% \cs{unexpanded} collides with a macro in Con\TeX t with the
% same name. This also affects the \LaTeX\ world. For example,
@@ -188,6 +194,16 @@ and the derived files
% that redefines \cs{unexpanded}. Thus this package defines
% \cs{etex@unexpanded} to get rid of the name clash.
%
+% \begin{declcs}{ifetex@unexpanded}
+% \end{declcs}
+% Package \xpackage{etexcmds} can be loaded even if \eTeX\ is not
+% present or \cs{unexpanded} cannot be found. The switch
+% \cs{ifetex@unexpanded} tells whether it is safe to use
+% \cs{etex@unexpanded}.
+% The switch is true (\cs{iftrue}) only if the
+% primitive \cs{unexpanded} has been found and \cs{etex@unexpanded}
+% is available.
+%
% \StopEventually{
% }
%
@@ -255,25 +271,28 @@ and the derived files
\fi
\expandafter\x\csname ver@etexcmds.sty\endcsname
\ProvidesPackage{etexcmds}%
- [2007/05/06 v1.0 Providing prefix for e-TeX command names (HO)]
+ [2007/09/09 v1.1 Providing prefix for e-TeX command names (HO)]
% \end{macrocode}
%
% \subsection{Catcodes}
%
% \begin{macrocode}
-\expandafter\edef\csname etexcmds@End\endcsname{%
- \catcode44 \the\catcode44\relax % ,
- \catcode45 \the\catcode45\relax % -
- \catcode46 \the\catcode46\relax % .
- \catcode61 \the\catcode61\relax % =
- \catcode64 \the\catcode64\relax % @
- \noexpand\endinput
+\expandafter\edef\csname etexcmds@AtEnd\endcsname{%
+ \catcode64 \the\catcode64\relax
}
-\catcode44 12 % ,
-\catcode45 12 % -
-\catcode46 12 % .
-\catcode61 12 % =
\catcode64 11 % @
+\def\TMP@EnsureCode#1#2{%
+ \edef\etexcmds@AtEnd{%
+ \etexcmds@AtEnd
+ \catcode#1 \the\catcode#1\relax
+ }%
+ \catcode#1 #2\relax
+}
+\TMP@EnsureCode{44}{12}% ,
+\TMP@EnsureCode{45}{12}% -
+\TMP@EnsureCode{46}{12}% .
+\TMP@EnsureCode{47}{12}% /
+\TMP@EnsureCode{61}{12}% =
% \end{macrocode}
%
% \subsection{Load package \xpackage{infwarerr}}
@@ -283,7 +302,7 @@ and the derived files
\expandafter\ifx\csname RequirePackage\endcsname\relax
\input infwarerr.sty\relax
\else
- \RequirePackage{infwarerr}%
+ \RequirePackage{infwarerr}[2007/09/09]%
\fi
% \end{macrocode}
%
@@ -333,47 +352,101 @@ and the derived files
% \end{macro}
%
% \begin{macrocode}
-\InfWarErr@End
+\etexcmds@AtEnd
%</package>
% \end{macrocode}
%
% \section{Test}
%
+% \subsection{Catcode checks for loading}
+%
% \begin{macrocode}
%<*test1>
-\immediate\write16{etexcmds-test1.tex: test file for plainTeX}
+% \end{macrocode}
+% \begin{macrocode}
+\catcode`\@=11 %
+\def\RestoreCatcodes{}
+\count@=0 %
+\loop
+ \edef\RestoreCatcodes{%
+ \RestoreCatcodes
+ \catcode\the\count@=\the\catcode\count@\relax
+ }%
+\ifnum\count@<255 %
+ \advance\count@\@ne
+\repeat
+
+\def\RangeCatcodeInvalid#1#2{%
+ \count@=#1\relax
+ \loop
+ \catcode\count@=15 %
+ \ifnum\count@<#2\relax
+ \advance\count@\@ne
+ \repeat
+}
+\def\Test{%
+ \RangeCatcodeInvalid{0}{47}%
+ \RangeCatcodeInvalid{58}{64}%
+ \RangeCatcodeInvalid{91}{96}%
+ \RangeCatcodeInvalid{123}{255}%
+ \catcode`\@=12 %
+ \catcode`\\=0 %
+ \catcode`\{=1 %
+ \catcode`\}=2 %
+ \catcode`\#=6 %
+ \catcode`\[=12 %
+ \catcode`\]=12 %
+ \catcode`\%=14 %
+ \catcode`\ =10 %
+ \catcode13=5 %
+ \input etexcmds.sty\relax
+ \RestoreCatcodes
+}
+\Test
+\csname @@end\endcsname
+\end
+% \end{macrocode}
+% \begin{macrocode}
+%</test1>
+% \end{macrocode}
+%
+% \subsection{Macro tests}
+%
+% \begin{macrocode}
+%<*test2>
+\immediate\write16{etexcmds-test2.tex: test file for plainTeX}
\input etexcmds.sty\relax
\catcode`\@=11 %
\edef\x{\string\unexpanded}
\edef\y{\meaning\etex@unexpanded}
\ifx\x\y
\else
- \@PackageError{etexcmds-test1}{Test failed}\@ehc
+ \@PackageError{etexcmds-test2}{Test failed}\@ehc
\fi
\end
-%</test1>
+%</test2>
% \end{macrocode}
%
% \begin{macrocode}
-%<*test2>
+%<*test3>
\NeedsTeXFormat{LaTeX2e}
-\ProvidesFile{etexcmds-test2.tex}[2007/05/06 v1.0 Test file for LaTeX]
+\ProvidesFile{etexcmds-test3.tex}[2007/09/09 v1.1 Test file for LaTeX]
\RequirePackage{etexcmds}
\makeatletter
\edef\x{\string\unexpanded}
\edef\y{\meaning\etex@unexpanded}
\ifx\x\y
\else
- \@PackageError{etexcmds-test2}{Test failed}\@ehc
+ \@PackageError{etexcmds-test3}{Test failed}\@ehc
\fi
\stop
-%</test2>
+%</test3>
% \end{macrocode}
%
% \begin{macrocode}
-%<*test3>
+%<*test4>
\NeedsTeXFormat{LaTeX2e}
-\ProvidesFile{etexcmds-test3.tex}[2007/05/06 v1.0 Test file for LaTeX]
+\ProvidesFile{etexcmds-test4.tex}[2007/09/09 v1.1 Test file for LaTeX]
\documentclass{article}
\usepackage{m-pictex}
\usepackage{m-ch-de}
@@ -384,16 +457,17 @@ and the derived files
\edef\y{\meaning\etex@unexpanded}%
\ifx\x\y
\else
- \@PackageWarningNoLine{etexcmds-test3}{Test failed}%
+ \@PackageWarningNoLine{etexcmds-test4}{Test failed}%
\fi
\else
- \@PackageWarningNoLine{etexcmds-test3}{%
+ \@PackageWarningNoLine{etexcmds-test4}{%
Test failed because of ConTeXt%
}%
\fi
\stop
-%</test3>
+%</test4>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
@@ -458,6 +532,7 @@ and the derived files
% etexcmds-test1.tex & doc/latex/oberdiek/etexcmds-test1.tex\\
% etexcmds-test2.tex & doc/latex/oberdiek/etexcmds-test2.tex\\
% etexcmds-test3.tex & doc/latex/oberdiek/etexcmds-test3.tex\\
+% etexcmds-test4.tex & doc/latex/oberdiek/etexcmds-test4.tex\\
% etexcmds.dtx & source/latex/oberdiek/etexcmds.dtx\\
% \end{tabular}^^A
% }^^A
@@ -583,6 +658,12 @@ and the derived files
% \item
% First version.
% \end{Version}
+% \begin{Version}{2007/09/09 v1.1}
+% \item
+% Documentation for \cs{ifetex@unexpanded} added.
+% \item
+% Catcode section rewritten.
+% \end{Version}
% \end{History}
%
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/oberdiek/flags.dtx b/Master/texmf-dist/source/latex/oberdiek/flags.dtx
index 60ddb3ac2fa..234d4ea98de 100644
--- a/Master/texmf-dist/source/latex/oberdiek/flags.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/flags.dtx
@@ -431,6 +431,7 @@ and the derived files
% \begin{macrocode}
%</package>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
diff --git a/Master/texmf-dist/source/latex/oberdiek/grffile.dtx b/Master/texmf-dist/source/latex/oberdiek/grffile.dtx
index baede332a65..0f5dc8745ff 100644
--- a/Master/texmf-dist/source/latex/oberdiek/grffile.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/grffile.dtx
@@ -643,6 +643,7 @@ and the derived files
% \begin{macrocode}
%</package>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
diff --git a/Master/texmf-dist/source/latex/oberdiek/holtxdoc.dtx b/Master/texmf-dist/source/latex/oberdiek/holtxdoc.dtx
index de76eaddd8a..dac8723d0f9 100644
--- a/Master/texmf-dist/source/latex/oberdiek/holtxdoc.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/holtxdoc.dtx
@@ -391,6 +391,7 @@ and the derived files
% \begin{macrocode}
%</package>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
diff --git a/Master/texmf-dist/source/latex/oberdiek/hycolor.dtx b/Master/texmf-dist/source/latex/oberdiek/hycolor.dtx
index 9e3d71e3edd..582f287166d 100644
--- a/Master/texmf-dist/source/latex/oberdiek/hycolor.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/hycolor.dtx
@@ -1335,6 +1335,7 @@ and the derived files
\end{document}
%</test>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
diff --git a/Master/texmf-dist/source/latex/oberdiek/hypbmsec.dtx b/Master/texmf-dist/source/latex/oberdiek/hypbmsec.dtx
index 8f92c730904..2bd47a42786 100644
--- a/Master/texmf-dist/source/latex/oberdiek/hypbmsec.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/hypbmsec.dtx
@@ -571,6 +571,7 @@ and the derived files
% \begin{macrocode}
%</package>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
diff --git a/Master/texmf-dist/source/latex/oberdiek/hypcap.dtx b/Master/texmf-dist/source/latex/oberdiek/hypcap.dtx
index 8219306ed6a..aee84cf8f25 100644
--- a/Master/texmf-dist/source/latex/oberdiek/hypcap.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/hypcap.dtx
@@ -435,6 +435,7 @@ and the derived files
% \begin{macrocode}
%</package>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
diff --git a/Master/texmf-dist/source/latex/oberdiek/hypdestopt.dtx b/Master/texmf-dist/source/latex/oberdiek/hypdestopt.dtx
index 6957f95abda..426adabbeb1 100644
--- a/Master/texmf-dist/source/latex/oberdiek/hypdestopt.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/hypdestopt.dtx
@@ -685,6 +685,7 @@ and the derived files
% \begin{macrocode}
%</package>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
diff --git a/Master/texmf-dist/source/latex/oberdiek/hypdoc.dtx b/Master/texmf-dist/source/latex/oberdiek/hypdoc.dtx
index 4c062061bb3..b5909672545 100644
--- a/Master/texmf-dist/source/latex/oberdiek/hypdoc.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/hypdoc.dtx
@@ -813,6 +813,7 @@ and the derived files
% \begin{macrocode}
%</package>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
diff --git a/Master/texmf-dist/source/latex/oberdiek/ifdraft.dtx b/Master/texmf-dist/source/latex/oberdiek/ifdraft.dtx
index 8831cea3e66..1a9383cc958 100644
--- a/Master/texmf-dist/source/latex/oberdiek/ifdraft.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/ifdraft.dtx
@@ -308,6 +308,7 @@ and the derived files
% \begin{macrocode}
%</package>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
diff --git a/Master/texmf-dist/source/latex/oberdiek/iflang.dtx b/Master/texmf-dist/source/latex/oberdiek/iflang.dtx
index 9932f23a351..94a700a37b5 100644
--- a/Master/texmf-dist/source/latex/oberdiek/iflang.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/iflang.dtx
@@ -17,7 +17,8 @@
% This work consists of the main source file iflang.dtx
% and the derived files
% iflang.sty, iflang.pdf, iflang.ins, iflang.drv,
-% iflang-test1.tex, iflang-test2.tex, iflang-test3.tex.
+% iflang-test1.tex, iflang-test2.tex, iflang-test3.tex,
+% iflang-test4.tex, iflang-test5.tex.
%
% Distribution:
% CTAN:macros/latex/contrib/oberdiek/iflang.dtx
@@ -55,6 +56,8 @@
% TDS:doc/latex/oberdiek/iflang-test1.tex
% TDS:doc/latex/oberdiek/iflang-test2.tex
% TDS:doc/latex/oberdiek/iflang-test3.tex
+% TDS:doc/latex/oberdiek/iflang-test4.tex
+% TDS:doc/latex/oberdiek/iflang-test5.tex
% TDS:source/latex/oberdiek/iflang.dtx
%
%<*ignore>
@@ -70,7 +73,7 @@
\input docstrip.tex
\Msg{************************************************************************}
\Msg{* Installation}
-\Msg{* Package: iflang 2007/04/26 v1.3 Language checks (HO)}
+\Msg{* Package: iflang 2007/09/09 v1.4 Language checks (HO)}
\Msg{************************************************************************}
\keepsilent
@@ -97,7 +100,8 @@ This Current Maintainer of this work is Heiko Oberdiek.
This work consists of the main source file iflang.dtx
and the derived files
iflang.sty, iflang.pdf, iflang.ins, iflang.drv,
- iflang-test1.tex, iflang-test2.tex, iflang-test3.tex.
+ iflang-test1.tex, iflang-test2.tex, iflang-test3.tex,
+ iflang-test4.tex, iflang-test5.tex.
\endpreamble
@@ -110,6 +114,8 @@ and the derived files
\file{iflang-test1.tex}{\from{iflang.dtx}{test1}}%
\file{iflang-test2.tex}{\from{iflang.dtx}{test2}}%
\file{iflang-test3.tex}{\from{iflang.dtx}{test3}}%
+ \file{iflang-test4.tex}{\from{iflang.dtx}{test4}}%
+ \file{iflang-test5.tex}{\from{iflang.dtx}{test5}}%
}
\obeyspaces
@@ -135,7 +141,7 @@ and the derived files
%<*driver>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{iflang.drv}%
- [2007/04/26 v1.3 Language checks (HO)]%
+ [2007/09/09 v1.4 Language checks (HO)]%
\documentclass{ltxdoc}
\usepackage{holtxdoc}
\begin{document}
@@ -144,7 +150,7 @@ and the derived files
%</driver>
% \fi
%
-% \CheckSum{608}
+% \CheckSum{727}
%
% \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
@@ -165,7 +171,7 @@ and the derived files
% \GetFileInfo{iflang.drv}
%
% \title{The \xpackage{iflang} package}
-% \date{2007/04/26 v1.3}
+% \date{2007/09/09 v1.4}
% \author{Heiko Oberdiek\\\xemail{oberdiek@uni-freiburg.de}}
%
% \maketitle
@@ -316,23 +322,29 @@ and the derived files
\fi
\expandafter\x\csname ver@iflang.sty\endcsname
\ProvidesPackage{iflang}%
- [2007/04/26 v1.3 Language checks (HO)]
+ [2007/09/09 v1.4 Language checks (HO)]
% \end{macrocode}
%
% \begin{macrocode}
-\expandafter\edef\csname IfLang@endinput\endcsname{%
- \catcode39 \the\catcode39\relax % '
- \catcode40 \the\catcode40\relax % (
- \catcode41 \the\catcode41\relax % )
- \catcode61 \the\catcode61\relax % =
- \catcode64 \the\catcode64\relax % @
- \noexpand\endinput
+\expandafter\edef\csname IfLang@AtEnd\endcsname{%
+ \catcode64 \the\catcode64\relax
}
-\catcode39 12\relax % '
-\catcode40 12\relax % (
-\catcode41 12\relax % )
-\catcode61 12\relax % =
-\catcode64 11\relax % @
+\catcode64 11 % @
+\def\TMP@EnsureCode#1#2{%
+ \edef\IfLang@AtEnd{%
+ \IfLang@AtEnd
+ \catcode#1 \the\catcode#1\relax
+ }%
+ \catcode#1 #2\relax
+}
+\TMP@EnsureCode{39}{12}% '
+\TMP@EnsureCode{40}{12}% (
+\TMP@EnsureCode{41}{12}% )
+\TMP@EnsureCode{44}{12}% ,
+\TMP@EnsureCode{46}{12}% .
+\TMP@EnsureCode{47}{12}% /
+\TMP@EnsureCode{58}{12}% :
+\TMP@EnsureCode{61}{12}% =
% \end{macrocode}
%
% \subsection{Tools}
@@ -400,7 +412,7 @@ and the derived files
\expandafter\ifx\csname RequirePackage\endcsname\relax
\input infwarerr.sty\relax
\else
- \RequirePackage{infwarerr}%
+ \RequirePackage{infwarerr}[2007/09/09]%
\fi
% \end{macrocode}
%
@@ -535,7 +547,7 @@ and the derived files
% \begin{macrocode}
\def\IfLanguageName#1{%
\ifnum\IfLang@IfDefined{languagename}{%
- \if\expandafter\IfLang@strequal\expandafter%
+ \if\expandafter\IfLang@StrEqual\expandafter%
{\languagename}{#1}%
0%
\else
@@ -586,19 +598,72 @@ and the derived files
% \end{macrocode}
%
% \begin{macrocode}
-\IfLang@endinput
+\IfLang@AtEnd
%</package>
% \end{macrocode}
%
% \section{Test}
%
-% \subsection{Test with \LaTeX}
+% \subsection{Catcode checks for loading}
%
% \begin{macrocode}
%<*test1>
% \end{macrocode}
% \begin{macrocode}
+\catcode`\@=11 %
+\def\RestoreCatcodes{}
+\count@=0 %
+\loop
+ \edef\RestoreCatcodes{%
+ \RestoreCatcodes
+ \catcode\the\count@=\the\catcode\count@\relax
+ }%
+\ifnum\count@<255 %
+ \advance\count@\@ne
+\repeat
+
+\def\RangeCatcodeInvalid#1#2{%
+ \count@=#1\relax
+ \loop
+ \catcode\count@=15 %
+ \ifnum\count@<#2\relax
+ \advance\count@\@ne
+ \repeat
+}
+\def\Test{%
+ \RangeCatcodeInvalid{0}{47}%
+ \RangeCatcodeInvalid{58}{64}%
+ \RangeCatcodeInvalid{91}{96}%
+ \RangeCatcodeInvalid{123}{255}%
+ \catcode`\@=12 %
+ \catcode`\\=0 %
+ \catcode`\{=1 %
+ \catcode`\}=2 %
+ \catcode`\#=6 %
+ \catcode`\[=12 %
+ \catcode`\]=12 %
+ \catcode`\%=14 %
+ \catcode`\ =10 %
+ \catcode13=5 %
+ \input iflang.sty\relax
+ \RestoreCatcodes
+}
+\Test
+\csname @@end\endcsname
+\end
+% \end{macrocode}
+% \begin{macrocode}
+%</test1>
+% \end{macrocode}
+%
+% \subsection{Test with \LaTeX}
+%
+% \begin{macrocode}
+%<*test2|test3>
+% \end{macrocode}
+% \begin{macrocode}
\NeedsTeXFormat{LaTeX2e}
+%<test3>\let\pdfstrcmp\relax
\nofiles
\documentclass{minimal}
\usepackage{qstest}
@@ -626,6 +691,40 @@ and the derived files
\test{ngerman}{false}%
\test{naustrian}{true}%
\test{foobar}{false}%
+ %
+ \def\languagename{naustrian}%
+ \test{naustrian}{true}%
+ \test{ngerman}{false}%
+ %
+ \edef\languagename{\string naustrian}%
+ \test{naustrian}{true}%
+ \test{ngerman}{false}%
+ %
+ \def\languagename{naustrian}%
+ \makeatletter
+ \@onelevel@sanitize\languagename
+ \test{naustrian}{true}%
+ \test{ngerman}{false}%
+ %
+ \def\languagename{naustrian}%
+ \def\xaustrian{naustrian}%
+ \def\xgerman{ngerman}%
+ \test{\xaustrian}{true}%
+ \test{\xgerman}{false}%
+ %
+ \def\languagename{\xaustrian}%
+ \test{naustrian}{true}%
+ \test{ngerman}{false}%
+ \test{\xaustrian}{true}%
+ \test{\xgerman}{false}%
+ \test{\languagename}{true}%
+ \test{\languagename\space}{false}%
+ %
+ \def\languagename{\empty\xaustrian\empty}%
+ \test{naustrian}{true}%
+ \test{ngerman}{false}%
+ \test{\empty\xaustrian\empty}{true}%
+ \test{\empty\xgerman\empty}{false}%
\end{qstest}
\begin{qstest}{IfDefined}{defined}
\makeatletter
@@ -640,13 +739,13 @@ and the derived files
\end{document}
% \end{macrocode}
% \begin{macrocode}
-%</test1>
+%</test2|test3>
% \end{macrocode}
%
% \subsection{Test with \plainTeX\ and \eTeX}
%
% \begin{macrocode}
-%<*test2>
+%<*test4>
% \end{macrocode}
% \begin{macrocode}
%% Format `etex' based on `language.def'
@@ -684,13 +783,13 @@ and the derived files
\end
% \end{macrocode}
% \begin{macrocode}
-%</test2>
+%</test4>
% \end{macrocode}
%
% \subsection{Test with \plainTeX\ and without \eTeX/\pdfTeX}
%
% \begin{macrocode}
-%<*test3>
+%<*test5>
% \end{macrocode}
% \begin{macrocode}
%% Format `tex' (vanilla plain-TeX)
@@ -755,8 +854,9 @@ and the derived files
\end
% \end{macrocode}
% \begin{macrocode}
-%</test3>
+%</test5>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
@@ -821,6 +921,8 @@ and the derived files
% iflang-test1.tex & doc/latex/oberdiek/iflang-test1.tex\\
% iflang-test2.tex & doc/latex/oberdiek/iflang-test2.tex\\
% iflang-test3.tex & doc/latex/oberdiek/iflang-test3.tex\\
+% iflang-test4.tex & doc/latex/oberdiek/iflang-test4.tex\\
+% iflang-test5.tex & doc/latex/oberdiek/iflang-test5.tex\\
% iflang.dtx & source/latex/oberdiek/iflang.dtx\\
% \end{tabular}^^A
% }^^A
@@ -968,6 +1070,13 @@ and the derived files
% \item
% Use of package \xpackage{infwarerr}.
% \end{Version}
+% \begin{Version}{2007/09/09 v1.4}
+% \item
+% Bug fix: \cs{IfLang@StrEqual} $\rightarrow$ \cs{IfLangStrEqual}
+% (Gabriele Balducci).
+% \item
+% Catcode section rewritten.
+% \end{Version}
% \end{History}
%
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/oberdiek/ifpdf.dtx b/Master/texmf-dist/source/latex/oberdiek/ifpdf.dtx
index cd1020fce89..51c1870ecb6 100644
--- a/Master/texmf-dist/source/latex/oberdiek/ifpdf.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/ifpdf.dtx
@@ -17,7 +17,8 @@
%
% This work consists of the main source file ifpdf.dtx
% and the derived files
-% ifpdf.sty, ifpdf.pdf, ifpdf.ins, ifpdf.drv.
+% ifpdf.sty, ifpdf.pdf, ifpdf.ins, ifpdf.drv,
+% ifpdf-test1.tex.
%
% Distribution:
% CTAN:macros/latex/contrib/oberdiek/ifpdf.dtx
@@ -52,6 +53,7 @@
% Installation:
% TDS:tex/generic/oberdiek/ifpdf.sty
% TDS:doc/latex/oberdiek/ifpdf.pdf
+% TDS:doc/latex/oberdiek/ifpdf-test1.tex
% TDS:source/latex/oberdiek/ifpdf.dtx
%
%<*ignore>
@@ -67,7 +69,7 @@
\input docstrip.tex
\Msg{************************************************************************}
\Msg{* Installation}
-\Msg{* Package: ifpdf 2006/02/20 v1.4 Provides the ifpdf switch (HO)}
+\Msg{* Package: ifpdf 2007/09/09 v1.5 Provides the ifpdf switch (HO)}
\Msg{************************************************************************}
\keepsilent
@@ -94,7 +96,8 @@ This Current Maintainer of this work is Heiko Oberdiek.
This work consists of the main source file ifpdf.dtx
and the derived files
- ifpdf.sty, ifpdf.pdf, ifpdf.ins, ifpdf.drv.
+ ifpdf.sty, ifpdf.pdf, ifpdf.ins, ifpdf.drv,
+ ifpdf-test1.tex.
\endpreamble
@@ -103,6 +106,8 @@ and the derived files
\file{ifpdf.drv}{\from{ifpdf.dtx}{driver}}%
\usedir{tex/generic/oberdiek}%
\file{ifpdf.sty}{\from{ifpdf.dtx}{package}}%
+ \usedir{doc/latex/oberdiek}%
+ \file{ifpdf-test1.tex}{\from{ifpdf.dtx}{test1}}%
}
\obeyspaces
@@ -128,7 +133,7 @@ and the derived files
%<*driver>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{ifpdf.drv}%
- [2006/02/20 v1.4 Provides the ifpdf switch (HO)]%
+ [2007/09/09 v1.5 Provides the ifpdf switch (HO)]%
\documentclass{ltxdoc}
\usepackage{holtxdoc}
\begin{document}
@@ -137,7 +142,7 @@ and the derived files
%</driver>
% \fi
%
-% \CheckSum{169}
+% \CheckSum{271}
%
% \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
@@ -158,7 +163,7 @@ and the derived files
% \GetFileInfo{ifpdf.drv}
%
% \title{The \xpackage{ifpdf} package}
-% \date{2006/02/20 v1.4}
+% \date{2007/09/09 v1.5}
% \author{Heiko Oberdiek\\\xemail{oberdiek@uni-freiburg.de}}
%
% \maketitle
@@ -366,7 +371,34 @@ and the derived files
\fi
\expandafter\x\csname ver@ifpdf.sty\endcsname
\ProvidesPackage{ifpdf}%
- [2006/02/20 v1.4 Provides the ifpdf switch (HO)]
+ [2007/09/09 v1.5 Provides the ifpdf switch (HO)]
+% \end{macrocode}
+%
+% \subsection{Catcodes}
+%
+% \begin{macrocode}
+\expandafter\edef\csname ifpdf@AtEnd\endcsname{%
+ \catcode64 \the\catcode64\relax
+}
+\catcode64 11 % @
+\def\TMP@EnsureCode#1#2{%
+ \edef\ifpdf@AtEnd{%
+ \ifpdf@AtEnd
+ \catcode#1 \the\catcode#1\relax
+ }%
+ \catcode#1 #2\relax
+}
+\TMP@EnsureCode{10}{12}% ^^J
+\TMP@EnsureCode{39}{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{61}{12}% =
+\TMP@EnsureCode{94}{7}% ^
+\TMP@EnsureCode{96}{12}% `
% \end{macrocode}
%
% \subsection{Check for previously defined \cs{ifpdf}}
@@ -395,6 +427,7 @@ and the derived files
therefore package loading is aborted.%
}%
\endgroup
+ \ifpdf@AtEnd
\expandafter\endinput
\fi
\endgroup
@@ -445,8 +478,66 @@ and the derived files
\endgroup
% \end{macrocode}
% \begin{macrocode}
+\ifpdf@AtEnd
+% \end{macrocode}
+% \begin{macrocode}
%</package>
% \end{macrocode}
+%
+% \section{Test}
+%
+% \subsection{Catcode checks for loading}
+%
+% \begin{macrocode}
+%<*test1>
+% \end{macrocode}
+% \begin{macrocode}
+\catcode`\@=11 %
+\def\RestoreCatcodes{}
+\count@=0 %
+\loop
+ \edef\RestoreCatcodes{%
+ \RestoreCatcodes
+ \catcode\the\count@=\the\catcode\count@\relax
+ }%
+\ifnum\count@<255 %
+ \advance\count@\@ne
+\repeat
+
+\def\RangeCatcodeInvalid#1#2{%
+ \count@=#1\relax
+ \loop
+ \catcode\count@=15 %
+ \ifnum\count@<#2\relax
+ \advance\count@\@ne
+ \repeat
+}
+\def\Test{%
+ \RangeCatcodeInvalid{0}{47}%
+ \RangeCatcodeInvalid{58}{64}%
+ \RangeCatcodeInvalid{91}{96}%
+ \RangeCatcodeInvalid{123}{255}%
+ \catcode`\@=12 %
+ \catcode`\\=0 %
+ \catcode`\{=1 %
+ \catcode`\}=2 %
+ \catcode`\#=6 %
+ \catcode`\[=12 %
+ \catcode`\]=12 %
+ \catcode`\%=14 %
+ \catcode`\ =10 %
+ \catcode13=5 %
+ \input ifpdf.sty\relax
+ \RestoreCatcodes
+}
+\Test
+\csname @@end\endcsname
+\end
+% \end{macrocode}
+% \begin{macrocode}
+%</test1>
+% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
@@ -508,6 +599,7 @@ and the derived files
% \begin{tabular}{@{}>{\ttfamily}l@{ $\rightarrow$ }>{\ttfamily}l@{}}
% ifpdf.sty & tex/generic/oberdiek/ifpdf.sty\\
% ifpdf.pdf & doc/latex/oberdiek/ifpdf.pdf\\
+% ifpdf-test1.tex & doc/latex/oberdiek/ifpdf-test1.tex\\
% ifpdf.dtx & source/latex/oberdiek/ifpdf.dtx\\
% \end{tabular}^^A
% }^^A
@@ -664,6 +756,10 @@ and the derived files
% \item
% Extended documentation.
% \end{Version}
+% \begin{Version}{2007/09/09 v1.5}
+% \item
+% Catcode settings added.
+% \end{Version}
% \end{History}
%
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/oberdiek/ifvtex.dtx b/Master/texmf-dist/source/latex/oberdiek/ifvtex.dtx
index 7c49345733b..3b81603977f 100644
--- a/Master/texmf-dist/source/latex/oberdiek/ifvtex.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/ifvtex.dtx
@@ -17,7 +17,8 @@
%
% This work consists of the main source file ifvtex.dtx
% and the derived files
-% ifvtex.sty, ifvtex.pdf, ifvtex.ins, ifvtex.drv.
+% ifvtex.sty, ifvtex.pdf, ifvtex.ins, ifvtex.drv,
+% ifvtex-test1.tex.
%
% Distribution:
% CTAN:macros/latex/contrib/oberdiek/ifvtex.dtx
@@ -52,6 +53,7 @@
% Installation:
% TDS:tex/generic/oberdiek/ifvtex.sty
% TDS:doc/latex/oberdiek/ifvtex.pdf
+% TDS:doc/latex/oberdiek/ifvtex-test1.tex
% TDS:source/latex/oberdiek/ifvtex.dtx
%
%<*ignore>
@@ -67,7 +69,7 @@
\input docstrip.tex
\Msg{************************************************************************}
\Msg{* Installation}
-\Msg{* Package: ifvtex 2007/01/10 v1.2 Switches for detecting VTeX and its modes (HO)}
+\Msg{* Package: ifvtex 2007/09/09 v1.3 Switches for detecting VTeX and its modes (HO)}
\Msg{************************************************************************}
\keepsilent
@@ -94,7 +96,8 @@ This Current Maintainer of this work is Heiko Oberdiek.
This work consists of the main source file ifvtex.dtx
and the derived files
- ifvtex.sty, ifvtex.pdf, ifvtex.ins, ifvtex.drv.
+ ifvtex.sty, ifvtex.pdf, ifvtex.ins, ifvtex.drv,
+ ifvtex-test1.tex.
\endpreamble
@@ -103,6 +106,8 @@ and the derived files
\file{ifvtex.drv}{\from{ifvtex.dtx}{driver}}%
\usedir{tex/generic/oberdiek}%
\file{ifvtex.sty}{\from{ifvtex.dtx}{package}}%
+ \usedir{doc/latex/oberdiek}%
+ \file{ifvtex-test1.tex}{\from{ifvtex.dtx}{test1}}%
}
\obeyspaces
@@ -128,7 +133,7 @@ and the derived files
%<*driver>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{ifvtex.drv}%
- [2007/01/10 v1.2 Switches for detecting VTeX and its modes (HO)]%
+ [2007/09/09 v1.3 Switches for detecting VTeX and its modes (HO)]%
\documentclass{ltxdoc}
\usepackage{holtxdoc}
\begin{document}
@@ -137,7 +142,7 @@ and the derived files
%</driver>
% \fi
%
-% \CheckSum{237}
+% \CheckSum{340}
%
% \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
@@ -158,7 +163,7 @@ and the derived files
% \GetFileInfo{ifvtex.drv}
%
% \title{The \xpackage{ifvtex} package}
-% \date{2007/01/10 v1.2}
+% \date{2007/09/09 v1.3}
% \author{Heiko Oberdiek\\\xemail{oberdiek@uni-freiburg.de}}
%
% \maketitle
@@ -277,9 +282,36 @@ and the derived files
\fi
\expandafter\x\csname ver@ifvtex.sty\endcsname
\ProvidesPackage{ifvtex}%
- [2007/01/10 v1.2 Switches for detecting VTeX and its modes (HO)]
+ [2007/09/09 v1.3 Switches for detecting VTeX and its modes (HO)]
% \end{macrocode}
%
+% \subsection{Catcodes}
+%
+% \begin{macrocode}
+\expandafter\edef\csname ifvtex@AtEnd\endcsname{%
+ \catcode64 \the\catcode64\relax
+}
+\catcode64 11 % @
+\def\TMP@EnsureCode#1#2{%
+ \edef\ifvtex@AtEnd{%
+ \ifvtex@AtEnd
+ \catcode#1 \the\catcode#1\relax
+ }%
+ \catcode#1 #2\relax
+}
+\TMP@EnsureCode{10}{12}% ^^J
+\TMP@EnsureCode{39}{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{61}{12}% =
+\TMP@EnsureCode{62}{12}% >
+\TMP@EnsureCode{94}{7}% ^
+\TMP@EnsureCode{96}{12}% `
+% \end{macrocode}
%
% \subsection{Check for previously defined \cs{ifvtex}}
%
@@ -307,6 +339,7 @@ and the derived files
therefore package loading is aborted.%
}%
\endgroup
+ \ifvtex@AtEnd
\expandafter\endinput
\fi
\endgroup
@@ -394,8 +427,64 @@ and the derived files
% \end{macrocode}
%
% \begin{macrocode}
+\ifvtex@AtEnd
%</package>
% \end{macrocode}
+%
+% \section{Test}
+%
+% \subsection{Catcode checks for loading}
+%
+% \begin{macrocode}
+%<*test1>
+% \end{macrocode}
+% \begin{macrocode}
+\catcode`\@=11 %
+\def\RestoreCatcodes{}
+\count@=0 %
+\loop
+ \edef\RestoreCatcodes{%
+ \RestoreCatcodes
+ \catcode\the\count@=\the\catcode\count@\relax
+ }%
+\ifnum\count@<255 %
+ \advance\count@\@ne
+\repeat
+
+\def\RangeCatcodeInvalid#1#2{%
+ \count@=#1\relax
+ \loop
+ \catcode\count@=15 %
+ \ifnum\count@<#2\relax
+ \advance\count@\@ne
+ \repeat
+}
+\def\Test{%
+ \RangeCatcodeInvalid{0}{47}%
+ \RangeCatcodeInvalid{58}{64}%
+ \RangeCatcodeInvalid{91}{96}%
+ \RangeCatcodeInvalid{123}{255}%
+ \catcode`\@=12 %
+ \catcode`\\=0 %
+ \catcode`\{=1 %
+ \catcode`\}=2 %
+ \catcode`\#=6 %
+ \catcode`\[=12 %
+ \catcode`\]=12 %
+ \catcode`\%=14 %
+ \catcode`\ =10 %
+ \catcode13=5 %
+ \input ifvtex.sty\relax
+ \RestoreCatcodes
+}
+\Test
+\csname @@end\endcsname
+\end
+% \end{macrocode}
+% \begin{macrocode}
+%</test1>
+% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
@@ -457,6 +546,7 @@ and the derived files
% \begin{tabular}{@{}>{\ttfamily}l@{ $\rightarrow$ }>{\ttfamily}l@{}}
% ifvtex.sty & tex/generic/oberdiek/ifvtex.sty\\
% ifvtex.pdf & doc/latex/oberdiek/ifvtex.pdf\\
+% ifvtex-test1.tex & doc/latex/oberdiek/ifvtex-test1.tex\\
% ifvtex.dtx & source/latex/oberdiek/ifvtex.dtx\\
% \end{tabular}^^A
% }^^A
@@ -592,6 +682,10 @@ and the derived files
% \item
% Fix of the \cs{ProvidesPackage} description.
% \end{Version}
+% \begin{Version}{2007/09/09 v1.3}
+% \item
+% Catcode section added.
+% \end{Version}
% \end{History}
%
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/oberdiek/infwarerr.dtx b/Master/texmf-dist/source/latex/oberdiek/infwarerr.dtx
index 52e9e4fae56..6d9adc0fae2 100644
--- a/Master/texmf-dist/source/latex/oberdiek/infwarerr.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/infwarerr.dtx
@@ -17,7 +17,8 @@
% This work consists of the main source file infwarerr.dtx
% and the derived files
% infwarerr.sty, infwarerr.pdf, infwarerr.ins, infwarerr.drv,
-% infwarerr-test1.tex, infwarerr-test2.tex.
+% infwarerr-test1.tex, infwarerr-test2.tex,
+% infwarerr-test3.tex.
%
% Distribution:
% CTAN:macros/latex/contrib/oberdiek/infwarerr.dtx
@@ -54,6 +55,7 @@
% TDS:doc/latex/oberdiek/infwarerr.pdf
% TDS:doc/latex/oberdiek/infwarerr-test1.tex
% TDS:doc/latex/oberdiek/infwarerr-test2.tex
+% TDS:doc/latex/oberdiek/infwarerr-test3.tex
% TDS:source/latex/oberdiek/infwarerr.dtx
%
%<*ignore>
@@ -69,7 +71,7 @@
\input docstrip.tex
\Msg{************************************************************************}
\Msg{* Installation}
-\Msg{* Package: infwarerr 2007/06/14 v1.1 Providing info/warning/message (HO)}
+\Msg{* Package: infwarerr 2007/09/09 v1.2 Providing info/warning/message (HO)}
\Msg{************************************************************************}
\keepsilent
@@ -96,7 +98,8 @@ This Current Maintainer of this work is Heiko Oberdiek.
This work consists of the main source file infwarerr.dtx
and the derived files
infwarerr.sty, infwarerr.pdf, infwarerr.ins, infwarerr.drv,
- infwarerr-test1.tex, infwarerr-test2.tex.
+ infwarerr-test1.tex, infwarerr-test2.tex,
+ infwarerr-test3.tex.
\endpreamble
@@ -108,6 +111,7 @@ and the derived files
\usedir{doc/latex/oberdiek}%
\file{infwarerr-test1.tex}{\from{infwarerr.dtx}{test1}}%
\file{infwarerr-test2.tex}{\from{infwarerr.dtx}{test2}}%
+ \file{infwarerr-test3.tex}{\from{infwarerr.dtx}{test3}}%
}
\obeyspaces
@@ -133,7 +137,7 @@ and the derived files
%<*driver>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{infwarerr.drv}%
- [2007/06/14 v1.1 Providing info/warning/message (HO)]%
+ [2007/09/09 v1.2 Providing info/warning/message (HO)]%
\documentclass{ltxdoc}
\usepackage{holtxdoc}
\begin{document}
@@ -142,7 +146,7 @@ and the derived files
%</driver>
% \fi
%
-% \CheckSum{657}
+% \CheckSum{692}
%
% \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
@@ -163,7 +167,7 @@ and the derived files
% \GetFileInfo{infwarerr.drv}
%
% \title{The \xpackage{infwarerr} package}
-% \date{2007/06/14 v1.1}
+% \date{2007/09/09 v1.2}
% \author{Heiko Oberdiek\\\xemail{oberdiek@uni-freiburg.de}}
%
% \maketitle
@@ -270,39 +274,35 @@ and the derived files
\fi
\expandafter\x\csname ver@infwarerr.sty\endcsname
\ProvidesPackage{infwarerr}%
- [2007/06/14 v1.1 Providing info/warning/message (HO)]
+ [2007/09/09 v1.2 Providing info/warning/message (HO)]
% \end{macrocode}
%
% \subsection{Catcodes}
%
% \begin{macrocode}
-\expandafter\edef\csname InfWarErr@End\endcsname{%
- \catcode39 \the\catcode39\relax % '
- \catcode40 \the\catcode40\relax % (
- \catcode41 \the\catcode41\relax % )
- \catcode44 \the\catcode44\relax % ,
- \catcode45 \the\catcode45\relax % -
- \catcode46 \the\catcode46\relax % .
- \catcode58 \the\catcode58\relax % :
- \catcode60 \the\catcode60\relax % <
- \catcode61 \the\catcode61\relax % =
- \catcode62 \the\catcode62\relax % >
- \catcode64 \the\catcode64\relax % @
- \catcode94 \the\catcode94\relax % ^
- \noexpand\endinput
+\expandafter\edef\csname InfWarErr@AtEnd\endcsname{%
+ \catcode64 \the\catcode64\relax
}
-\catcode39 12 % '
-\catcode40 12 % (
-\catcode41 12 % )
-\catcode44 12 % ,
-\catcode45 12 % -
-\catcode46 12 % .
-\catcode58 12 % :
-\catcode60 12 % <
-\catcode61 12 % =
-\catcode62 12 % >
\catcode64 11 % @
-\catcode94 7 % ^
+\def\TMP@EnsureCode#1#2{%
+ \edef\InfWarErr@AtEnd{%
+ \InfWarErr@AtEnd
+ \catcode#1 \the\catcode#1\relax
+ }%
+ \catcode#1 #2\relax
+}
+\TMP@EnsureCode{10}{12}% ^^J
+\TMP@EnsureCode{39}{12}% '
+\TMP@EnsureCode{40}{12}% (
+\TMP@EnsureCode{41}{12}% )
+\TMP@EnsureCode{44}{12}% ,
+\TMP@EnsureCode{45}{12}% -
+\TMP@EnsureCode{46}{12}% .
+\TMP@EnsureCode{58}{12}% :
+\TMP@EnsureCode{60}{12}% <
+\TMP@EnsureCode{61}{12}% =
+\TMP@EnsureCode{62}{12}% >
+\TMP@EnsureCode{94}{7}% ^
% \end{macrocode}
%
% \subsection{\LaTeX\ detection}
@@ -388,8 +388,8 @@ and the derived files
% \end{macrocode}
% \end{macro}
% \begin{macrocode}
- \csname fi\endcsname
- \InfWarErr@End
+ \InfWarErr@AtEnd
+ \expandafter\endinput
\fi
% \end{macrocode}
%
@@ -604,38 +604,92 @@ and the derived files
% \end{macro}
%
% \begin{macrocode}
-\InfWarErr@End
+\InfWarErr@AtEnd
%</package>
% \end{macrocode}
%
% \section{Test}
%
+% \subsection{Catcode checks for loading}
+%
% \begin{macrocode}
%<*test1>
+% \end{macrocode}
+% \begin{macrocode}
+\catcode`\@=11 %
+\def\RestoreCatcodes{}
+\count@=0 %
+\loop
+ \edef\RestoreCatcodes{%
+ \RestoreCatcodes
+ \catcode\the\count@=\the\catcode\count@\relax
+ }%
+\ifnum\count@<255 %
+ \advance\count@\@ne
+\repeat
+
+\def\RangeCatcodeInvalid#1#2{%
+ \count@=#1\relax
+ \loop
+ \catcode\count@=15 %
+ \ifnum\count@<#2\relax
+ \advance\count@\@ne
+ \repeat
+}
+\def\Test{%
+ \RangeCatcodeInvalid{0}{47}%
+ \RangeCatcodeInvalid{58}{64}%
+ \RangeCatcodeInvalid{91}{96}%
+ \RangeCatcodeInvalid{123}{255}%
+ \catcode`\@=12 %
+ \catcode`\\=0 %
+ \catcode`\{=1 %
+ \catcode`\}=2 %
+ \catcode`\#=6 %
+ \catcode`\[=12 %
+ \catcode`\]=12 %
+ \catcode`\%=14 %
+ \catcode`\ =10 %
+ \catcode13=5 %
+ \input infwarerr.sty\relax
+ \RestoreCatcodes
+}
+\Test
+\csname @@end\endcsname
+\end
+% \end{macrocode}
+% \begin{macrocode}
+%</test1>
+% \end{macrocode}
+%
+% \subsection{Macro tests}
+%
+% \begin{macrocode}
+%<*test2>
\let\PackageInfo\relax
\input infwarerr.sty\relax
\let\OrgWrite\write
\chardef\WriteUnused=16 %
\def\msg#{\immediate\OrgWrite\WriteUnused}
-\msg{File: infwarerr-test1.tex 2007/06/14 v1.1 Test file for plain-TeX}
+\msg{File: infwarerr-test2.tex 2007/09/09 v1.2 Test file for plain-TeX}
\catcode64=11 %
-%</test1>
+%</test2>
% \end{macrocode}
%
% \begin{macrocode}
-%<*test2>
+%<*test3>
\NeedsTeXFormat{LaTeX2e}
-\ProvidesFile{infwarerr-test2.tex}[2007/06/14 v1.1 Test file for LaTeX]
-\RequirePackage{infwarerr}
+\ProvidesFile{infwarerr-test3.tex}[2007/09/09 v1.2 Test file for LaTeX]
+\RequirePackage{infwarerr}[2007/09/09]
\makeatletter
\let\OrgWrite\write
\chardef\WriteUnused=\@unused
\def\msg#{\immediate\OrgWrite\WriteUnused}
-%</test2>
+%</test3>
% \end{macrocode}
%
% \begin{macrocode}
-%<*test1|test2>
+%<*test2|test3>
\def\pkgname{PACKAGE}
\def\clsname{CLASS}
\def\msgtext{MESSAGE\MessageBreak SECOND LINE}
@@ -736,9 +790,9 @@ and the derived files
}%
}
\def\TestError{%
-%<test2> \let\write\OrgWrite
-%<test2> \def\plaindots{}
-%<test1> \def\plaindots{.^^J ...^^J}
+%<test3> \let\write\OrgWrite
+%<test3> \def\plaindots{}
+%<test2> \def\plaindots{.^^J ...^^J}
\@PackageError\pkgname\msgtext\hlptext
\@TestError\@PackageError{%
! Package PACKAGE Error: MESSAGE^^J%
@@ -788,8 +842,8 @@ and the derived files
\begingroup
\let~\space
\edef\x{#2}%
-%<test2> \@onelevel@sanitize\x
-%<test2> \@onelevel@sanitize\ErrMessage
+%<test3> \@onelevel@sanitize\x
+%<test3> \@onelevel@sanitize\ErrMessage
\ifx\x\ErrMessage
\else
\msg{}%
@@ -813,11 +867,12 @@ and the derived files
\TestInfo
\TestWarning
\TestError
-%</test1|test2>
-%<test1>\end
-%<test2>\@@end
+%</test2|test3>
+%<test2>\end
+%<test3>\@@end
% \end{macrocode}
%
+%
% \section{Installation}
%
% \subsection{Download}
@@ -881,6 +936,7 @@ and the derived files
% infwarerr.pdf & doc/latex/oberdiek/infwarerr.pdf\\
% infwarerr-test1.tex & doc/latex/oberdiek/infwarerr-test1.tex\\
% infwarerr-test2.tex & doc/latex/oberdiek/infwarerr-test2.tex\\
+% infwarerr-test3.tex & doc/latex/oberdiek/infwarerr-test3.tex\\
% infwarerr.dtx & source/latex/oberdiek/infwarerr.dtx\\
% \end{tabular}^^A
% }^^A
@@ -1008,7 +1064,11 @@ and the derived files
% \end{Version}
% \begin{Version}{2007/06/14 v1.1}
% \item
-% Small fixes
+% Small fixes.
+% \end{Version}
+% \begin{Version}{2007/09/09 v1.2}
+% \item
+% Catcode section extended.
% \end{Version}
% \end{History}
%
diff --git a/Master/texmf-dist/source/latex/oberdiek/inputenx.dtx b/Master/texmf-dist/source/latex/oberdiek/inputenx.dtx
index 4f400d15f0c..002832059c4 100644
--- a/Master/texmf-dist/source/latex/oberdiek/inputenx.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/inputenx.dtx
@@ -10168,6 +10168,7 @@ and the derived files
% \begin{macrocode}
%</dfudoc>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
diff --git a/Master/texmf-dist/source/latex/oberdiek/intcalc.dtx b/Master/texmf-dist/source/latex/oberdiek/intcalc.dtx
new file mode 100644
index 00000000000..2cef807d937
--- /dev/null
+++ b/Master/texmf-dist/source/latex/oberdiek/intcalc.dtx
@@ -0,0 +1,3701 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2007 by Heiko Oberdiek <oberdiek@uni-freiburg.de>
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either
+% version 1.3 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.3 or later is part of all distributions of
+% LaTeX version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status "maintained".
+%
+% This Current Maintainer of this work is Heiko Oberdiek.
+%
+% This work consists of the main source file intcalc.dtx
+% and the derived files
+% intcalc.sty, intcalc.pdf, intcalc.ins, intcalc.drv,
+% intcalc-test1.tex, intcalc-test2.tex, intcalc-test3.tex,
+% intcalc-test4.tex.
+%
+% Distribution:
+% CTAN:macros/latex/contrib/oberdiek/intcalc.dtx
+% CTAN:macros/latex/contrib/oberdiek/intcalc.pdf
+%
+% Unpacking:
+% (a) If intcalc.ins is present:
+% tex intcalc.ins
+% (b) Without intcalc.ins:
+% tex intcalc.dtx
+% (c) If you insist on using LaTeX
+% latex \let\install=y\input{intcalc.dtx}
+% (quote the arguments according to the demands of your shell)
+%
+% Documentation:
+% (a) If intcalc.drv is present:
+% latex intcalc.drv
+% (b) Without intcalc.drv:
+% latex intcalc.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 intcalc.dtx
+% makeindex -s gind.ist intcalc.idx
+% pdflatex intcalc.dtx
+% makeindex -s gind.ist intcalc.idx
+% pdflatex intcalc.dtx
+%
+% Installation:
+% TDS:tex/generic/oberdiek/intcalc.sty
+% TDS:doc/latex/oberdiek/intcalc.pdf
+% TDS:doc/latex/oberdiek/intcalc-test1.tex
+% TDS:doc/latex/oberdiek/intcalc-test2.tex
+% TDS:doc/latex/oberdiek/intcalc-test3.tex
+% TDS:doc/latex/oberdiek/intcalc-test4.tex
+% TDS:source/latex/oberdiek/intcalc.dtx
+%
+%<*ignore>
+\begingroup
+ \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: intcalc 2007/09/09 v1.0 Expandable integer calculations (HO)}
+\Msg{************************************************************************}
+
+\keepsilent
+\askforoverwritefalse
+
+\preamble
+
+This is a generated file.
+
+Copyright (C) 2007 by Heiko Oberdiek <oberdiek@uni-freiburg.de>
+
+This work may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either
+version 1.3 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.3 or later is part of all distributions of
+LaTeX version 2005/12/01 or later.
+
+This work has the LPPL maintenance status "maintained".
+
+This Current Maintainer of this work is Heiko Oberdiek.
+
+This work consists of the main source file intcalc.dtx
+and the derived files
+ intcalc.sty, intcalc.pdf, intcalc.ins, intcalc.drv,
+ intcalc-test1.tex, intcalc-test2.tex, intcalc-test3.tex,
+ intcalc-test4.tex.
+
+\endpreamble
+
+\generate{%
+ \file{intcalc.ins}{\from{intcalc.dtx}{install}}%
+ \file{intcalc.drv}{\from{intcalc.dtx}{driver}}%
+ \usedir{tex/generic/oberdiek}%
+ \file{intcalc.sty}{\from{intcalc.dtx}{package}}%
+ \usedir{doc/latex/oberdiek}%
+ \file{intcalc-test1.tex}{\from{intcalc.dtx}{test1}}%
+ \file{intcalc-test2.tex}{\from{intcalc.dtx}{test2,etex}}%
+ \file{intcalc-test3.tex}{\from{intcalc.dtx}{test3,noetex}}%
+ \file{intcalc-test4.tex}{\from{intcalc.dtx}{test4,etex}}%
+}
+
+\obeyspaces
+\Msg{************************************************************************}
+\Msg{*}
+\Msg{* To finish the installation you have to move the following}
+\Msg{* file into a directory searched by TeX:}
+\Msg{*}
+\Msg{* intcalc.sty}
+\Msg{*}
+\Msg{* To produce the documentation run the file `intcalc.drv'}
+\Msg{* through LaTeX.}
+\Msg{*}
+\Msg{* Happy TeXing!}
+\Msg{*}
+\Msg{************************************************************************}
+
+\endbatchfile
+%</install>
+%<*ignore>
+\fi
+%</ignore>
+%<*driver>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesFile{intcalc.drv}%
+ [2007/09/09 v1.0 Expandable integer calculations (HO)]%
+\documentclass{ltxdoc}
+\usepackage{holtxdoc}
+\usepackage{wasysym}
+\let\iint\relax
+\let\iiint\relax
+\usepackage[fleqn]{amsmath}
+
+\DeclareMathOperator{\opInv}{Inv}
+\DeclareMathOperator{\opAbs}{Abs}
+\DeclareMathOperator{\opSgn}{Sgn}
+\DeclareMathOperator{\opMin}{Min}
+\DeclareMathOperator{\opMax}{Max}
+\DeclareMathOperator{\opCmp}{Cmp}
+\DeclareMathOperator{\opInc}{Inc}
+\DeclareMathOperator{\opDec}{Dec}
+\DeclareMathOperator{\opAdd}{Add}
+\DeclareMathOperator{\opSub}{Sub}
+\DeclareMathOperator{\opShl}{Shl}
+\DeclareMathOperator{\opShr}{Shr}
+\DeclareMathOperator{\opMul}{Mul}
+\DeclareMathOperator{\opSqr}{Sqr}
+\DeclareMathOperator{\opFac}{Fac}
+\DeclareMathOperator{\opPow}{Pow}
+\DeclareMathOperator{\opDiv}{Div}
+\DeclareMathOperator{\opMod}{Mod}
+\DeclareMathOperator{\opInt}{Int}
+\DeclareMathOperator{\opOdd}{ifodd}
+
+\newcommand*{\Def}{%
+ \ensuremath{%
+ \mathrel{\mathop{:}}=%
+ }%
+}
+\newcommand*{\op}[1]{%
+ \textsf{#1}%
+}
+\begin{document}
+ \DocInput{intcalc.dtx}%
+\end{document}
+%</driver>
+% \fi
+%
+% \CheckSum{2665}
+%
+% \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{intcalc.drv}
+%
+% \title{The \xpackage{intcalc} package}
+% \date{2007/09/09 v1.0}
+% \author{Heiko Oberdiek\\\xemail{oberdiek@uni-freiburg.de}}
+%
+% \maketitle
+%
+% \begin{abstract}
+% This package provides expandable arithmetic operations
+% with integers.
+% \end{abstract}
+%
+% \tableofcontents
+%
+% \section{Documentation}
+%
+% \subsection{Introduction}
+%
+% Package \xpackage{intcalc} defines arithmetic operations
+% that deal with integers. Integers mean numbers in \TeX.
+% The same restrictions apply, the range is limited to
+% [-2147483647, 2147483647].
+%
+% The operations have the form of macros that take one or
+% two integers as parameter and return the integer result.
+% The macro name is a three letter operation name prefixed
+% by the package name, e.g. \cs{intcalcAdd}{10}{43} returns
+% |53|.
+%
+% The macros are fully expandable, exactly two expansion
+% steps generate the result. Therefore the operations
+% may be used nearly everywhere in \TeX, even inside
+% \cs{number}, \cs{csname}, file names, or other
+% expandable contexts.
+%
+% The package contains two implementations of the operations.
+% If \eTeX\ is detected then the macros are implemented
+% using its features (\cs{numexpr}). Otherwise the slower
+% implementation without \eTeX's help is choosen.
+%
+% \subsection{Conditions}
+%
+% \subsubsection{Preconditions}
+%
+% \begin{itemize}
+% \item
+% Arguments can be anything that \TeX\ interprets as ``number''.
+% Examples: plain numbers, count or length register, macros
+% that expands to a number.
+% \item
+% The arguments are limited to the range
+% -2147483647 until 2147483647. These numbers belong to the range.
+% Note that some operations
+% have additionals restrictions to the range.
+% \item
+% The argument may be expressions that \cs{numexpr}
+% understands if \eTeX\ is available.
+% \item
+% The resulting number must fit in the allowed range.
+% \end{itemize}
+%
+% \subsubsection{Postconditions}
+%
+% Additional properties of the macros apart from calculating
+% a correct result (of course \smiley):
+% \begin{itemize}
+% \item
+% The macros are fully expandable. Thus they can
+% be used inside \cs{edef}, \cs{csname}, after \cs{number},
+% for example.
+% \item
+% Furthermore exactly two expansion steps calculate the result.
+% \item
+% The number consists of one optional minus sign and one to
+% ten digits. The first digit is larger than zero for
+% numbers that consists of more than one digit.
+%
+% In short, the number format is exactly the same as
+% \cs{number} generates. And the tokens (minus sign, digits)
+% have catcode 12 (other).
+% \item
+% Call by value is simulated. First the arguments are
+% converted to numbers. Then these numbers are used
+% in the calculations.
+%
+% Remember that arguments
+% may contain expensive macros or \eTeX\ expressions.
+% This strategy avoids multiple evaluations of such
+% arguments.
+% \end{itemize}
+%
+% \subsection{Error handling}
+%
+% There are two kinds of errors if a precondition is violated:
+% Some errors are detected by the macros, example: division by zero.
+% In this cases an undefined control sequence is called and causes
+% a TeX error message, example: \cs{IntCalcError:DivisionByZero}.
+% The name of the control sequence contains
+% the reason for the error. The \TeX\ error may be ignored.
+% Then the operation returns zero as result.
+% Because the macros are supposed to work in expandible contexts.
+% An traditional error message, however, is not expandable and
+% would break these contexts.
+%
+% If a number exceeds the range of -2147483647 until 2147483647, then
+% \TeX\ throws an error ``Number too big'' and recovers by
+% using biggest allowed value.
+% Example for the negative number -3000000000 is replaced
+% by -2147483647.
+%
+% \subsection{Operations}
+%
+% Some definition equations below use the function $\opInt$
+% that converts a real number to an integer. The number
+% is truncated that means rounding to zero:
+% \begin{gather*}
+% \opInt(x) \Def
+% \begin{cases}
+% \lfloor x\rfloor & \text{if $x\geq0$}\\
+% \lceil x\rceil & \text{otherwise}
+% \end{cases}
+% \end{gather*}
+%
+% \subsubsection{\op{Inv}, \op{Abs}, \op{Sgn}}
+%
+% \begin{declcs}{intcalcInv} \M{x}
+% \end{declcs}
+% Macro \cs{intcalcInv} switches the sign.
+% \begin{gather*}
+% \opInv(x) \Def -x
+% \end{gather*}
+%
+% \begin{declcs}{intcalcAbs} \M{x}
+% \end{declcs}
+% Macro \cs{intcalcAbs} returns the absolute value
+% of integer \meta{x}.
+% \begin{gather*}
+% \opAbs(x) \Def \vert x\vert
+% \end{gather*}
+%
+% \begin{declcs}{intcalcSgn} \M{x}
+% \end{declcs}
+% Macro \cs{intcalcSgn} encodes the sign of \meta{x} as number.
+% \begin{gather*}
+% \opSgn(x) \Def
+% \begin{cases}
+% -1& \text{if $x<0$}\\
+% 0& \text{if $x=0$}\\
+% 1& \text{if $x>0$}
+% \end{cases}
+% \end{gather*}
+% These return values can easily be distinguished by \cs{ifcase}:
+%\begin{quote}
+%\begin{verbatim}
+%\ifcase\intcalcSgn{<x>}
+% $x=0$
+%\or
+% $x>0$
+%\else
+% $x<0$
+%\fi
+%\end{verbatim}
+%\end{quote}
+%
+% \subsubsection{\op{Min}, \op{Max}, \op{Cmp}}
+%
+% \begin{declcs}{intcalcMin} \M{x} \M{y}
+% \end{declcs}
+% Macro \cs{intcalcMin} returns the smaller of the two integers.
+% \begin{gather*}
+% \opMin(x,y) \Def
+% \begin{cases}
+% x & \text{if $x<y$}\\
+% y & \text{otherwise}
+% \end{cases}
+% \end{gather*}
+%
+% \begin{declcs}{intcalcMax} \M{x} \M{y}
+% \end{declcs}
+% Macro \cs{intcalcMax} returns the larger of the two integers.
+% \begin{gather*}
+% \opMax(x,y) \Def
+% \begin{cases}
+% x & \text{if $x>y$}\\
+% y & \text{otherwise}
+% \end{cases}
+% \end{gather*}
+%
+% \begin{declcs}{intcalcCmp} \M{x} \M{y}
+% \end{declcs}
+% Macro \cs{intcalcCmp} encodes the comparison result as number:
+% \begin{gather*}
+% \opCmp(x,y) \Def
+% \begin{cases}
+% -1 & \text{if $x<y$}\\
+% 0 & \text{if $x=y$}\\
+% 1 & \text{if $x>y$}
+% \end{cases}
+% \end{gather*}
+% These values can be distinguished by \cs{ifcase}:
+%\begin{quote}
+%\begin{verbatim}
+%\ifcase\intcalcCmp{<x>}{<y>}
+% $x=y$
+%\or
+% $x>y$
+%\else
+% $x<y$
+%\fi
+%\end{verbatim}
+%\end{quote}
+%
+% \subsubsection{\op{Inc}, \op{Dec}, \op{Add}, \op{Sub}}
+%
+% \begin{declcs}{intcalcInc} \M{x}
+% \end{declcs}
+% Macro \cs{intcalcInc} increments \meta{x} by one.
+% \begin{gather*}
+% \opInc(x) \Def x + 1
+% \end{gather*}
+%
+% \begin{declcs}{intcalcDec} \M{x}
+% \end{declcs}
+% Macro \cs{intcalcDec} decrements \meta{x} by one.
+% \begin{gather*}
+% \opDec(x) \Def x - 1
+% \end{gather*}
+%
+% \begin{declcs}{intcalcAdd} \M{x} \M{y}
+% \end{declcs}
+% Macro \cs{intcalcAdd} adds the two numbers.
+% \begin{gather*}
+% \opAdd(x, y) \Def x + y
+% \end{gather*}
+%
+% \begin{declcs}{intcalcSub} \M{x} \M{y}
+% \end{declcs}
+% Macro \cs{intcalcSub} calculates the difference.
+% \begin{gather*}
+% \opSub(x, y) \Def x - y
+% \end{gather*}
+%
+% \subsubsection{\op{Shl}, \op{Shr}}
+%
+% \begin{declcs}{intcalcShl} \M{x}
+% \end{declcs}
+% Macro \cs{intcalcShl} implements shifting to the left that
+% means the number is multiplied by two. Overflow is possible.
+% Negative values are not permitted.
+% \begin{gather*}
+% \opShl(x) \Def x*2\qquad\text{for $x\geq0$}
+% \end{gather*}
+%
+% \begin{declcs}{intcalcShr} \M{x}
+% \end{declcs}
+% Macro \cs{intcalcShr} implements shifting to the right.
+% That is equivalent to an integer division by two.
+% Negative values are not permitted.
+% \begin{gather*}
+% \opShr(x) \Def \opInt(x/2)\qquad\text{for $x\geq0$}
+% \end{gather*}
+%
+% \subsubsection{\op{Mul}, \op{Sqr}, \op{Fac}, \op{Pow}}
+%
+% \begin{declcs}{intcalcMul} \M{x} \M{y}
+% \end{declcs}
+% Macro \cs{intcalcMul} calculates the product of
+% \meta{x} and \meta{y}.
+% \begin{gather*}
+% \opMul(x,y) \Def x*y
+% \end{gather*}
+%
+% \begin{declcs}{intcalcSqr} \M{x}
+% \end{declcs}
+% Macro \cs{intcalcSqr} returns the square product.
+% \begin{gather*}
+% \opSqr(x) \Def x^2
+% \end{gather*}
+%
+% \begin{declcs}{intcalcFac} \M{x}
+% \end{declcs}
+% Macro \cs{intcalcFac} returns the factorial of \meta{x}.
+% Negative numbers are not permitted.
+% \begin{gather*}
+% \opFac(x) \Def x!\qquad\text{for $x\geq0$}
+% \end{gather*}
+% ($0! = 1$)
+%
+% \begin{declcs}{intcalcPow} M{x} M{y}
+% \end{declcs}
+% Macro \cs{intcalcPow} calculates the value of \meta{x} to the
+% power of \meta{y}. The error ``division by zero'' is thrown
+% if \meta{x} is zero and \meta{y} is negative.
+% permitted:
+% \begin{gather*}
+% \opPow(x,y) \Def
+% \opInt(x^y)\qquad\text{for $x\neq0$ or $y\geq0$}
+% \end{gather*}
+% ($0^0 = 1$)
+%
+% \subsubsection{\op{Div}, \op{Mul}}
+%
+% \begin{declcs}{intcalcDiv} \M{x} \M{y}
+% \end{declcs}
+% Macro \cs{intcalcDiv} performs an integer division.
+% Argument \meta{y} must not be zero.
+% \begin{gather*}
+% \opDiv(x,y) \Def \opInt(x/y)\qquad\text{for $y\neq0$}
+% \end{gather*}
+%
+% \begin{declcs}{intcalcMod} \M{x} \M{y}
+% \end{declcs}
+% Macro \cs{intcalcMod} gets the remainder of the integer
+% division. The sign follows the divisor \meta{y}.
+% Argument \meta{y} must not be zero.
+% \begin{gather*}
+% \opMod(x,y) \Def x\mathrel{\%}y\qquad\text{for $y\neq0$}
+% \end{gather*}
+% The result ranges:
+% \begin{gather*}
+% -\vert y\vert < \opMod(x,y) \leq 0\qquad\text{for $y<0$}\\
+% 0 \leq \opMod(x,y) < y\qquad\text{for $y\geq0$}
+% \end{gather*}
+%
+% \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
+ \catcode44 12 % ,
+ \catcode45 12 % -
+ \catcode46 12 % .
+ \catcode58 12 % :
+ \catcode64 11 % @
+ \expandafter\let\expandafter\x\csname ver@intcalc.sty\endcsname
+ \ifcase 0%
+ \ifx\x\relax % plain
+ \else
+ \ifx\x\empty % LaTeX
+ \else
+ 1%
+ \fi
+ \fi
+ \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{intcalc}{The package is already loaded}%
+ \endgroup
+ \expandafter\endinput
+ \fi
+\endgroup
+% \end{macrocode}
+% Package identification:
+% \begin{macrocode}
+\begingroup
+ \catcode40 12 % (
+ \catcode41 12 % )
+ \catcode44 12 % ,
+ \catcode45 12 % -
+ \catcode46 12 % .
+ \catcode47 12 % /
+ \catcode58 12 % :
+ \catcode64 11 % @
+ \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\relax
+ \xdef#1{#3}%
+ \fi
+ }%
+ \fi
+\expandafter\x\csname ver@intcalc.sty\endcsname
+\ProvidesPackage{intcalc}%
+ [2007/09/09 v1.0 Expandable integer calculations (HO)]
+% \end{macrocode}
+%
+% \subsection{Catcodes}
+%
+% \begin{macrocode}
+\expandafter\edef\csname IntCalc@AtEnd\endcsname{%
+ \catcode64 \the\catcode64\relax
+}
+\catcode64 11 % @
+\def\TMP@EnsureCode#1#2{%
+ \edef\IntCalc@AtEnd{%
+ \IntCalc@AtEnd
+ \catcode#1 \the\catcode#1\relax
+ }%
+ \catcode#1 #2\relax
+}
+\TMP@EnsureCode{33}{12}% !
+\TMP@EnsureCode{40}{12}% (
+\TMP@EnsureCode{41}{12}% )
+\TMP@EnsureCode{42}{12}% *
+\TMP@EnsureCode{43}{12}% +
+\TMP@EnsureCode{45}{12}% -
+\TMP@EnsureCode{47}{12}% /
+\TMP@EnsureCode{58}{11}% : (letter!)
+\TMP@EnsureCode{60}{12}% <
+\TMP@EnsureCode{61}{12}% =
+\TMP@EnsureCode{62}{12}% >
+\TMP@EnsureCode{63}{14}% ? (comment!)
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname IntCalc@TestMode\endcsname\relax
+\else
+ \catcode63=9 % ? (ignore)
+\fi
+? \let\IntCalc@@TestMode\IntCalc@TestMode
+% \end{macrocode}
+%
+% \subsection{Macros independent of \eTeX}
+%
+% \begin{macro}{\IntCalc@Space}
+% \begin{macrocode}
+\def\IntCalc@Space{ }
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{\op{Abs}, \op{Sgn}}
+%
+% \begin{macro}{\IntCalc@Abs}
+% \begin{macrocode}
+\def\IntCalc@Abs#1#2!{%
+ \ifx#1-%
+ #2%
+ \else
+ #1#2%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\IntCalc@Sgn}
+% \begin{macrocode}
+\def\IntCalc@Sgn#1#2!{%
+ \ifx#1-%
+ -1%
+ \else
+ \ifx#10%
+ 0%
+ \else
+ 1%
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{\op{Min}, \op{Max}, \op{Cmp}}
+%
+% \begin{macro}{\IntCalc@Min}
+% \begin{macrocode}
+\def\IntCalc@Min#1!#2!{%
+ \ifnum#1<#2 %
+ #1%
+ \else
+ #2%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\IntCalc@Max}
+% \begin{macrocode}
+\def\IntCalc@Max#1!#2!{%
+ \ifnum#1>#2 %
+ #1%
+ \else
+ #2%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\IntCalc@Cmp}
+% \begin{macrocode}
+\def\IntCalc@Cmp#1!#2!{%
+ \ifnum#1=#2 %
+ 0%
+ \else
+ \ifnum#1<#2 %
+ -%
+ \fi
+ 1%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{\op{Fac}}
+%
+% \begin{macro}{\IntCalc@Fac}
+% It does not make much sense to calculate the
+% faculty by an general algorithm. The allowed
+% range of arguments is too low because of the
+% limited integer domain.
+% \begin{macrocode}
+\def\IntCalc@Fac#1!{%
+ \ifcase#1 1% 0!
+ \or 1% 1!
+ \or 2% 2!
+ \or 6% 3!
+ \or 24% 4!
+ \or 120% 5!
+ \or 720% 6!
+ \or 5040% 7!
+ \or 40320% 8!
+ \or 362880% 9!
+ \or 3628800% 10!
+ \or 39916800% 11!
+ \or 479001600% 12!
+ \else
+ \ifnum#1<\z@
+ 0\IntCalcError:FacNegative%
+ \else
+ 0\IntCalcError:FacOverflow%
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Implementation based on \eTeX}
+%
+% Only \cs{numexpr} is used from \eTeX.
+% \begin{macrocode}
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname numexpr\endcsname\relax
+\else
+% \end{macrocode}
+%
+% \subsubsection{\op{Inv}, \op{Abs}, \op{Sgn}}
+%
+% \begin{macro}{\intcalcInv}
+% \begin{macrocode}
+ \def\intcalcInv#1{%
+ \number-\the\numexpr#1\relax\IntCalc@Space
+ }%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\intcalcAbs}
+% \begin{macrocode}
+ \def\intcalcAbs#1{%
+ \number\expandafter\IntCalc@Abs\the\numexpr#1! %
+ }%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\intcalcSgn}
+% \begin{macrocode}
+ \def\intcalcSgn#1{%
+ \number\expandafter\IntCalc@Sgn\the\numexpr#1! %
+ }%
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{\op{Min}, \op{Max}, \op{Cmp}}
+%
+% \begin{macro}{\intcalcMin}
+% \begin{macrocode}
+ \def\intcalcMin#1#2{%
+ \number\expandafter\IntCalc@Min
+ \the\numexpr#1\expandafter!%
+ \the\numexpr#2! %
+ }%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\intcalcMax}
+% \begin{macrocode}
+ \def\intcalcMax#1#2{%
+ \number\expandafter\IntCalc@Max
+ \the\numexpr#1\expandafter!%
+ \the\numexpr#2! %
+ }%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\intcalcCmp}
+% \begin{macrocode}
+ \def\intcalcCmp#1#2{%
+ \number\expandafter\IntCalc@Cmp
+ \the\numexpr#1\expandafter!\the\numexpr#2! %
+ }%
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{\op{Inc}, \op{Dec}}
+%
+% \begin{macro}{\intcalcInc}
+% \begin{macrocode}
+ \def\intcalcInc#1{%
+ \the\numexpr#1+1\relax
+ }%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\intcalcDec}
+% \begin{macrocode}
+ \def\intcalcDec#1{%
+ \the\numexpr#1-1\relax
+ }%
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{\op{Add}, \op{Sub}}
+%
+% \begin{macro}{\intcalcAdd}
+% \begin{macrocode}
+ \def\intcalcAdd#1#2{%
+ \the\numexpr#1+(#2)\relax
+ }%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\intcalcSub}
+% \begin{macrocode}
+ \def\intcalcSub#1#2{%
+ \the\numexpr#1-(#2)\relax
+ }%
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{\op{Shl}, \op{Shr}}
+%
+% \begin{macro}{\intcalcShl}
+% \begin{macrocode}
+ \def\intcalcShl#1{%
+ \number\expandafter\IntCalc@Shl\the\numexpr#1! %
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@Shl}
+% \begin{macrocode}
+ \def\IntCalc@Shl#1#2!{%
+ \ifx#1-%
+ 0\IntCalcError:ShlNegativeNumber%
+ \else
+ \the\numexpr#1#2*2\relax
+ \fi
+ }%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\intcalcShr}
+% \begin{macrocode}
+ \def\intcalcShr#1{%
+ \number\expandafter\IntCalc@Shr\the\numexpr#1! %
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@Shr}
+% \begin{macrocode}
+ \def\IntCalc@Shr#1#2!{%
+ \ifx#1-%
+ 0\IntCalcError:ShrNegativeNumber%
+ \else
+ \ifodd#1#2 %
+ \the\numexpr(#1#2-1)/2\relax
+ \else
+ \the\numexpr#1#2/2\relax
+ \fi
+ \fi
+ }%
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{\op{Mul}, \op{Sqr}, \op{Fac}}
+%
+% \begin{macro}{\intcalcMul}
+% \begin{macrocode}
+ \def\intcalcMul#1#2{%
+ \the\numexpr(#1)*(#2)\relax
+ }%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\intcalcSqr}
+% \begin{macrocode}
+ \def\intcalcSqr#1{%
+ \number\expandafter\IntCalc@Sqr\the\numexpr#1! %
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@Sqr}
+% \begin{macrocode}
+ \def\IntCalc@Sqr#1!{%
+ \the\numexpr#1*#1\relax
+ }%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\intcalcFac}
+% \begin{macrocode}
+ \def\intcalcFac#1{%
+ \number\expandafter\IntCalc@Fac\the\numexpr#1! %
+ }%
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{\op{Pow}}
+%
+% \begin{macro}{\intcalcPow}
+% \begin{macrocode}
+ \def\intcalcPow#1#2{%
+ \number\expandafter\IntCalc@Pow
+ \the\numexpr#1\expandafter!%
+ \the\numexpr#2! %
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@Pow}
+% \begin{macrocode}
+ \def\IntCalc@Pow#1#2!#3#4!{%
+ \ifcase#3#4 % power = 0
+ 1%
+ \or % power = 1
+ #1#2%
+ \or % power = 2
+ \the\numexpr#1#2*#1#2\relax
+ \else
+ \ifcase#1#2 % basis = 0, power <> 0
+ 0%
+ \ifx#3-% power < 0
+ 0\IntCalcError:DivisionByZero%
+ \fi
+ \or
+ 1% basis = 1
+ \else
+ \ifnum#1#2=\m@ne % basis = -1
+ \ifodd#3#4 %
+ -%
+ \fi
+ 1%
+ \else % |basis| > 1
+ \ifx#3-% power < 0
+ 0%
+ \else % power > 2
+ \IntCalc@PowRec#1#2!#3#4!1!%
+ \fi
+ \fi
+ \fi
+ \fi
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@PowRec}
+%\begin{quote}
+%\begin{verbatim}
+%Pow(b, p) {
+% PowRec(b, p, 1)
+%}
+%PowRec(b, p, r) {
+% if p == 1 then
+% return r
+% else
+% ifodd p then
+% return PowRec(b*b, (p-1)/2, r*b) % p div 2 = (p-1)/2
+% else
+% return PowRec(b*b, (p-1)/2, r)
+% fi
+% fi
+%}
+%\end{verbatim}
+%\end{quote}
+% \begin{macrocode}
+ \def\IntCalc@PowRec#1!#2!#3!{%
+ \ifnum#2=\@ne
+ \the\numexpr#1*#3\relax
+ \else
+ \ifodd#2 %
+ \expandafter\IntCalc@PowRec
+ \the\numexpr#1*#1\expandafter!%
+ \the\numexpr(#2-1)/2\expandafter!%
+ \the\numexpr#1*#3\expandafter\expandafter\expandafter!%
+ \else
+ \expandafter\IntCalc@PowRec
+ \the\numexpr#1*#1\expandafter!%
+ \the\numexpr(#2-1)/2\expandafter!%
+ \number#3\expandafter\expandafter\expandafter!%
+ \fi
+ \fi
+ }%
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{\op{Div}, \op{Mod}}
+%
+% \TeX's \cs{divide} truncates,
+% \eTeX's \cs{numexpr} rounds the result of a division.
+% The rounding method is called ``Symmetric Arithmetic Rounding''
+% or ``Round-Half-Up'' (``Kaufm\"annisches Runden'' in German):
+% \begin{quote}
+% | 1 = 3 divide 2 = 1.5 = numexpr 3/2 = 2|\\
+% |-1 = -3 divide 2 = -1.5 = numexpr -3/2 = -2|
+% \end{quote}
+% Macro \cs{intcalcDiv} follows \TeX\ and truncates.
+% The calculation is done by the following formula:
+% \begin{gather}
+% \opDiv(X,Y) = (X - (Y-1)/2)/Y\qquad\text{for $X, Y > 0$}
+% \end{gather}
+% The operator `/' is \cs{numexpr}'s division.
+% \begin{macro}{\intcalcDiv}
+% \begin{macrocode}
+ \def\intcalcDiv#1#2{%
+ \number\expandafter\IntCalc@Div
+ \the\numexpr#1\expandafter!%
+ \the\numexpr#2! %
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@Div}
+% \begin{macrocode}
+ \def\IntCalc@Div#1!#2!{%
+ \ifcase#2 %
+ 0\IntCalcError:DivisionByZero%
+ \else
+ \ifcase#1 %
+ 0%
+ \else
+ \expandafter\IntCalc@@Div
+ \romannumeral 0%
+ \ifnum#1<\z@
+ \expandafter-\number-#1%
+ \else
+ \expandafter+\number#1%
+ \fi
+ \expandafter!%
+ \romannumeral 0%
+ \ifnum#2<\z@
+ \expandafter-\number-#2%
+ \else
+ \expandafter+\number#2%
+ \fi
+ !%
+ \fi
+ \fi
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@@Div}
+% \begin{macrocode}
+ \def\IntCalc@@Div#1#2!#3#4!{%
+ #1#3%
+ \the\numexpr(#2-(#4-1)/2)/#4\relax
+ }%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\intcalcMod}
+% \begin{macrocode}
+ \def\intcalcMod#1#2{%
+ \number\expandafter\IntCalc@Mod
+ \the\numexpr#1\expandafter!%
+ \the\numexpr#2! %
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@Mod}
+% \begin{macrocode}
+ \def\IntCalc@Mod#1!#2!{%
+ \ifcase#2 %
+ 0\IntCalcError:DivisionByZero%
+ \else
+ \ifcase#1 %
+ 0%
+ \else
+ \expandafter\IntCalc@@Mod
+ \romannumeral 0%
+ \ifnum#1<\z@
+ \expandafter-\number-#1%
+ \else
+ \expandafter+\number#1%
+ \fi
+ \expandafter!%
+ \romannumeral 0%
+ \ifnum#2<\z@
+ \expandafter-\number-#2%
+ \else
+ \expandafter+\number#2%
+ \fi
+ !%
+ \fi
+ \fi
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@@Mod}
+% \begin{macrocode}
+ \def\IntCalc@@Mod#1#2!#3#4!{%
+ \if#3+%
+ \if#1+%
+ \the\numexpr#2-\IntCalc@@Div+#2!+#4!*#4\relax
+ \else
+ \expandafter\IntCalc@ModX
+ \the\numexpr-#2+\IntCalc@@Div+#2!+#4!*#4!#4!%
+ \fi
+ \else
+ -%
+ \if#1+%
+ \expandafter\IntCalc@ModX
+ \the\numexpr-#2+\IntCalc@@Div+#2!+#4!*#4!#4!%
+ \else
+ \the\numexpr#2-\IntCalc@@Div+#2!+#4!*#4\relax
+ \fi
+ \fi
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@ModX}
+% \begin{macrocode}
+ \def\IntCalc@ModX#1!#2!{%
+ \ifcase#1 %
+ 0%
+ \else
+ \the\numexpr#1+#2\relax
+ \fi
+ }%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+ \IntCalc@AtEnd
+ \expandafter\endinput
+\fi
+% \end{macrocode}
+%
+% \subsection{Implementation without \eTeX}
+%
+% \subsubsection{\op{Inv}, \op{Abs}, \op{Sgn}}
+%
+% \begin{macro}{\intcalcInv}
+% \begin{macrocode}
+\def\intcalcInv#1{%
+ \number\expandafter\IntCalc@Inv\number-#1! %
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@Inv}
+% \begin{macrocode}
+\def\IntCalc@Inv#1!{#1}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\intcalcAbs}
+% \begin{macrocode}
+\def\intcalcAbs#1{%
+ \number\expandafter\IntCalc@Abs\number#1! %
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\intcalcSgn}
+% \begin{macrocode}
+\def\intcalcSgn#1{%
+ \number\expandafter\IntCalc@Sgn\number#1! %
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{\op{Min}, \op{Max}, \op{Cmp}}
+%
+% \begin{macro}{\intcalcMin}
+% \begin{macrocode}
+\def\intcalcMin#1#2{%
+ \number\expandafter\IntCalc@Min
+ \number\number#1\expandafter!\number#2! %
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\intcalcMax}
+% \begin{macrocode}
+\def\intcalcMax#1#2{%
+ \number\expandafter\IntCalc@Max
+ \number\number#1\expandafter!\number#2! %
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\intcalcCmp}
+% \begin{macrocode}
+\def\intcalcCmp#1#2{%
+ \number\expandafter\IntCalc@Cmp
+ \number\number#1\expandafter!\number#2! %
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{\op{Inc}, \op{Dec}}
+%
+% \begin{macro}{\intcalcInc}
+% \begin{macrocode}
+\def\intcalcInc#1{%
+ \number\expandafter\IntCalc@IncSwitch\number#1! %
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@IncSwitch}
+% \begin{macrocode}
+\def\IntCalc@IncSwitch#1#2!{%
+ \ifx#1-%
+ -%
+ \csname IntCalc@Empty%
+ \IntCalc@Dec#2!%
+ \else
+ \csname IntCalc@Empty%
+ \IntCalc@Inc#1#2!%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\intcalcDec}
+% \begin{macrocode}
+\def\intcalcDec#1{%
+ \number\expandafter\IntCalc@DecSwitch\number#1! %
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@DecSwitch}
+% \begin{macrocode}
+\def\IntCalc@DecSwitch#1#2!{%
+ \ifx#1-%
+ -%
+ \csname IntCalc@Empty%
+ \expandafter\IntCalc@Inc#2!%
+ \else
+ \ifx#10%
+ -1%
+ \else
+ \csname IntCalc@Empty%
+ \IntCalc@Dec#1#2!%
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\IntCalc@Inc}
+% \begin{macrocode}
+\def\IntCalc@Inc#1#2{%
+ \ifx#2!%
+ \csname IntCalc@IncDigit#1\endcsname1%
+ \else
+ \csname IntCalc@IncDigit#1%
+ \expandafter\IntCalc@Inc\expandafter#2%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@IncDigit[0-8]}
+% \begin{macrocode}
+\def\IntCalc@Temp#1#2{%
+ \expandafter\def\csname IntCalc@IncDigit#1\endcsname##1{%
+ \endcsname
+ 0%
+ \ifcase##1 %
+ #1%
+ \else
+ #2%
+ \fi
+ }%
+}
+\IntCalc@Temp 01
+\IntCalc@Temp 12
+\IntCalc@Temp 23
+\IntCalc@Temp 34
+\IntCalc@Temp 45
+\IntCalc@Temp 56
+\IntCalc@Temp 67
+\IntCalc@Temp 78
+\IntCalc@Temp 89
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@IncDigit9}
+% \begin{macrocode}
+\expandafter\def\csname IntCalc@IncDigit9\endcsname#1{%
+ \expandafter\endcsname
+ \ifcase#1 %
+ 09%
+ \else
+ 10%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\IntCalc@Dec}
+% \begin{macrocode}
+\def\IntCalc@Dec#1#2{%
+ \ifx#2!%
+ \csname IntCalc@DecDigit#1\endcsname1%
+ \else
+ \csname IntCalc@DecDigit#1%
+ \expandafter\IntCalc@Dec\expandafter#2%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@DecDigit[1-9]}
+% \begin{macrocode}
+\def\IntCalc@Temp#1#2{%
+ \expandafter\def\csname IntCalc@DecDigit#1\endcsname##1{%
+ \endcsname
+ 0%
+ \ifcase##1 %
+ #1%
+ \else
+ #2%
+ \fi
+ }%
+}
+\IntCalc@Temp 98
+\IntCalc@Temp 87
+\IntCalc@Temp 76
+\IntCalc@Temp 65
+\IntCalc@Temp 54
+\IntCalc@Temp 43
+\IntCalc@Temp 32
+\IntCalc@Temp 21
+\IntCalc@Temp 10
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@DecDigit0}
+% \begin{macrocode}
+\expandafter\def\csname IntCalc@DecDigit0\endcsname#1{%
+ \expandafter\endcsname
+ \ifcase#1 %
+ 00%
+ \else
+ 19%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{\op{Add}, \op{Sub}}
+%
+% \begin{macro}{\intcalcAdd}
+% \begin{macrocode}
+\def\intcalcAdd#1#2{%
+ \number
+ \expandafter\IntCalc@AddSwitch
+ \number\number#1\expandafter!%
+ \number#2!%
+ \IntCalc@Space
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\intcalcSub}
+% \begin{macrocode}
+\def\intcalcSub#1#2{%
+ \number
+ \expandafter\IntCalc@AddSwitch
+ \number\number#1\expandafter!%
+ \number-\number#2!%
+ \IntCalc@Space
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\IntCalc@AddSwitch}
+% Decision table for \cs{IntCalc@AddSwitch}.
+% By using less than zero operations, the sign
+% of negative numbers can be removed by a simple \cs{IntCalc@Gobble}
+% instead of the more expensive |\number-|.
+% \begin{quote}
+% \begin{tabular}[t]{@{}|l|l|l|l|l|@{}}
+% \hline
+% $x<0$ & $y<0$ & $ x< y$ & $-$ & $\opAdd(-x,-y)$\\
+% \cline{3-3}\cline{5-5}
+% & & else & & $\opAdd(-y,-x)$\\
+% \cline{2-5}
+% & else & $-x> y$ & $-$ & $\opSub(-x, y)$\\
+% \cline{3-5}
+% & & else & $+$ & $\opSub( y,-x)$\\
+% \hline
+% else & $y<0$ & $ x>-y$ & $+$ & $\opSub( x,-y)$\\
+% \cline{3-5}
+% & & else & $-$ & $\opSub(-y, x)$\\
+% \cline{2-5}
+% & else & $ x> y$ & $+$ & $\opAdd( x, y)$\\
+% \cline{3-3}\cline{5-5}
+% & & else & & $\opAdd( y, x)$\\
+% \hline
+% \end{tabular}
+% \end{quote}
+% \begin{macrocode}
+\def\IntCalc@AddSwitch#1!#2!{%
+ \ifnum#1<\z@
+ \ifnum#2<\z@
+ -%
+ \ifnum#1<#2 %
+ \expandafter\IntCalc@Add\number-#1\expandafter!%
+ \IntCalc@Gobble#2!%
+ \else
+ \expandafter\IntCalc@Add\number-#2\expandafter!%
+ \IntCalc@Gobble#1!%
+ \fi
+ \else
+ \ifnum-#1>#2 %
+ -%
+ \expandafter\IntCalc@Sub\IntCalc@Gobble#1!#2!%
+ \else
+ \expandafter\IntCalc@Sub\number#2\expandafter!%
+ \IntCalc@Gobble#1!%
+ \fi
+ \fi
+ \else
+ \ifnum#2<\z@
+ \ifnum#1>-#2 %
+ \expandafter\IntCalc@Sub\number#1\expandafter!%
+ \IntCalc@Gobble#2!%
+ \else
+ -%
+ \expandafter\IntCalc@Sub\IntCalc@Gobble#2!#1!%
+ \fi
+ \else
+ \ifnum#1>#2 %
+ \IntCalc@Add#1!#2!%
+ \else
+ \IntCalc@Add#2!#1!%
+ \fi
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@Add}
+% \begin{macrocode}
+\def\IntCalc@Add#1!#2!{%
+ \ifcase#2 %
+ #1%
+ \else
+ \IntCalc@@Add#1!#2!000000000\IntCalc@Space
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@Sub}
+% \begin{macrocode}
+\def\IntCalc@Sub#1!#2!{%
+ \ifnum#1=#2 %
+ 0%
+ \else
+ \IntCalc@@Sub#1!#2!000000000\IntCalc@Space
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@@Add}
+% \begin{macrocode}
+\def\IntCalc@@Add#1!#2#3!{%
+ \ifx\IntCalc@Empty#3\IntCalc@Empty
+ \@ReturnAfterElseFi{%
+ \IntCalc@@@Add!!#1!#2%
+ }%
+ \else
+ \@ReturnAfterFi{%
+ \IntCalc@@Add#1!#3!#2%
+ }%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@@Sub}
+% \begin{macrocode}
+\def\IntCalc@@Sub#1!#2#3!{%
+ \ifx\IntCalc@Empty#3\IntCalc@Empty
+ \@ReturnAfterElseFi{%
+ \IntCalc@@@Sub!!#1!#2%
+ }%
+ \else
+ \@ReturnAfterFi{%
+ \IntCalc@@Sub#1!#3!#2%
+ }%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\IntCalc@@@Add}
+% \begin{macrocode}
+\def\IntCalc@@@Add#1!#2!#3#4!#5{%
+ \ifx\IntCalc@Empty#4\IntCalc@Empty
+ \csname IntCalc@Empty%
+ \@ReturnAfterElseFi{%
+ \IntCalc@ProcessAdd#1#3!#5#2%
+ }%
+ \else
+ \@ReturnAfterFi{%
+ \IntCalc@@@Add#1#3!#5#2!#4!%
+ }%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@@@Sub}
+% \begin{macrocode}
+\def\IntCalc@@@Sub#1!#2!#3#4!#5{%
+ \ifx\IntCalc@Empty#4\IntCalc@Empty
+ \csname IntCalc@Gobble%
+ \@ReturnAfterElseFi{%
+ \IntCalc@ProcessSub#1#3!#5#2%
+ }%
+ \else
+ \@ReturnAfterFi{%
+ \IntCalc@@@Sub#1#3!#5#2!#4!%
+ }%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\IntCalc@ProcessAdd}
+% \begin{macrocode}
+\def\IntCalc@ProcessAdd#1#2!#3#4{%
+ \ifx\IntCalc@Empty#2\IntCalc@Empty
+ \csname IntCalc@AddDigit#1\endcsname#3%
+ \romannumeral0#4%
+ \else
+ \csname IntCalc@AddDigit#1\csname IntCalc@DigitCarry#3%
+ \@ReturnAfterFi{%
+ \IntCalc@ProcessAdd#2!#4%
+ }%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@ProcessSub}
+% \begin{macrocode}
+\def\IntCalc@ProcessSub#1#2!#3#4{%
+ \ifx\IntCalc@Empty#2\IntCalc@Empty
+ \csname IntCalc@SubDigit#1\endcsname#3%
+ \romannumeral0#4%
+ \else
+ \csname IntCalc@SubDigit#1\csname IntCalc@DigitCarry#3%
+ \@ReturnAfterFi{%
+ \IntCalc@ProcessSub#2!#4%
+ }%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@DigitCarry[0-9]}
+% \begin{macrocode}
+\def\IntCalc@Temp#1#2{%
+ \expandafter\def\csname IntCalc@DigitCarry#1\endcsname##1{%
+ \ifcase##1 %
+ \endcsname#1%
+ \else
+ \endcsname#2%
+ \fi
+ }%
+}
+\IntCalc@Temp 01
+\IntCalc@Temp 12
+\IntCalc@Temp 23
+\IntCalc@Temp 34
+\IntCalc@Temp 45
+\IntCalc@Temp 56
+\IntCalc@Temp 67
+\IntCalc@Temp 78
+\IntCalc@Temp 89
+\IntCalc@Temp 9{{10}}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\IntCalc@AddDigit0}
+% \begin{macrocode}
+\expandafter\def\csname IntCalc@AddDigit0\endcsname#1{%
+ \ifnum#1>9 %
+ \endcsname10%
+ \else
+ \endcsname0#1%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@AddDigit[1-9]}
+% \begin{macrocode}
+\def\IntCalc@Temp#1#2#3{%
+ \expandafter\def\csname IntCalc@AddDigit#1\endcsname##1{%
+ \ifnum##1>#2 %
+ \endcsname 1%
+ \else
+ \endcsname 0%
+ \fi
+ \ifcase##1 #1% 0
+ #3%
+ \else #1% 10
+ \fi
+ }%
+}
+\IntCalc@Temp 18{%
+ \or 2% 1
+ \or 3% 2
+ \or 4% 3
+ \or 5% 4
+ \or 6% 5
+ \or 7% 6
+ \or 8% 7
+ \or 9% 8
+ \or 0% 9
+}%
+\IntCalc@Temp 27{%
+ \or 3% 1
+ \or 4% 2
+ \or 5% 3
+ \or 6% 4
+ \or 7% 5
+ \or 8% 6
+ \or 9% 7
+ \or 0% 8
+ \or 1% 9
+}%
+\IntCalc@Temp 36{%
+ \or 4% 1
+ \or 5% 2
+ \or 6% 3
+ \or 7% 4
+ \or 8% 5
+ \or 9% 6
+ \or 0% 7
+ \or 1% 8
+ \or 2% 9
+}%
+\IntCalc@Temp 45{%
+ \or 5% 1
+ \or 6% 2
+ \or 7% 3
+ \or 8% 4
+ \or 9% 5
+ \or 0% 6
+ \or 1% 7
+ \or 2% 8
+ \or 3% 9
+}%
+\IntCalc@Temp 54{%
+ \or 6% 1
+ \or 7% 2
+ \or 8% 3
+ \or 9% 4
+ \or 0% 5
+ \or 1% 6
+ \or 2% 7
+ \or 3% 8
+ \or 4% 9
+}%
+\IntCalc@Temp 63{%
+ \or 7% 1
+ \or 8% 2
+ \or 9% 3
+ \or 0% 4
+ \or 1% 5
+ \or 2% 6
+ \or 3% 7
+ \or 4% 8
+ \or 5% 9
+}%
+\IntCalc@Temp 72{%
+ \or 8% 1
+ \or 9% 2
+ \or 0% 3
+ \or 1% 4
+ \or 2% 5
+ \or 3% 6
+ \or 4% 7
+ \or 5% 8
+ \or 6% 9
+}%
+\IntCalc@Temp 81{%
+ \or 9% 1
+ \or 0% 2
+ \or 1% 3
+ \or 2% 4
+ \or 3% 5
+ \or 4% 6
+ \or 5% 7
+ \or 6% 8
+ \or 7% 9
+}%
+\IntCalc@Temp 90{%
+ \or 0% 1
+ \or 1% 2
+ \or 2% 3
+ \or 3% 4
+ \or 4% 5
+ \or 5% 6
+ \or 6% 7
+ \or 7% 8
+ \or 8% 9
+}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\IntCalc@SubDigit[0-9]}
+% \begin{macrocode}
+\def\IntCalc@Temp#1#2{%
+ \expandafter\def\csname IntCalc@SubDigit#1\endcsname##1{%
+ \ifnum##1>#1 %
+ \endcsname 1%
+ \else
+ \endcsname 0%
+ \fi
+ \ifcase##1 #1% 0
+ #2%
+ \else #1% 10
+ \fi
+ }%
+}
+\IntCalc@Temp 0{%
+ \or 9% 1
+ \or 8% 2
+ \or 7% 3
+ \or 6% 4
+ \or 5% 5
+ \or 4% 6
+ \or 3% 7
+ \or 2% 8
+ \or 1% 9
+}
+\IntCalc@Temp 1{%
+ \or 0% 1
+ \or 9% 2
+ \or 8% 3
+ \or 7% 4
+ \or 6% 5
+ \or 5% 6
+ \or 4% 7
+ \or 3% 8
+ \or 2% 9
+}
+\IntCalc@Temp 2{%
+ \or 1% 1
+ \or 0% 2
+ \or 9% 3
+ \or 8% 4
+ \or 7% 5
+ \or 6% 6
+ \or 5% 7
+ \or 4% 8
+ \or 3% 9
+}
+\IntCalc@Temp 3{%
+ \or 2% 1
+ \or 1% 2
+ \or 0% 3
+ \or 9% 4
+ \or 8% 5
+ \or 7% 6
+ \or 6% 7
+ \or 5% 8
+ \or 4% 9
+}
+\IntCalc@Temp 4{%
+ \or 3% 1
+ \or 2% 2
+ \or 1% 3
+ \or 0% 4
+ \or 9% 5
+ \or 8% 6
+ \or 7% 7
+ \or 6% 8
+ \or 5% 9
+}
+\IntCalc@Temp 5{%
+ \or 4% 1
+ \or 3% 2
+ \or 2% 3
+ \or 1% 4
+ \or 0% 5
+ \or 9% 6
+ \or 8% 7
+ \or 7% 8
+ \or 6% 9
+}
+\IntCalc@Temp 6{%
+ \or 5% 1
+ \or 4% 2
+ \or 3% 3
+ \or 2% 4
+ \or 1% 5
+ \or 0% 6
+ \or 9% 7
+ \or 8% 8
+ \or 7% 9
+}
+\IntCalc@Temp 7{%
+ \or 6% 1
+ \or 5% 2
+ \or 4% 3
+ \or 3% 4
+ \or 2% 5
+ \or 1% 6
+ \or 0% 7
+ \or 9% 8
+ \or 8% 9
+}
+\IntCalc@Temp 8{%
+ \or 7% 1
+ \or 6% 2
+ \or 5% 3
+ \or 4% 4
+ \or 3% 5
+ \or 2% 6
+ \or 1% 7
+ \or 0% 8
+ \or 9% 9
+}
+\IntCalc@Temp 9{%
+ \or 8% 1
+ \or 7% 2
+ \or 6% 3
+ \or 5% 4
+ \or 4% 5
+ \or 3% 6
+ \or 2% 7
+ \or 1% 8
+ \or 0% 9
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{\op{Shl}, \op{Shr}}
+%
+% \begin{macro}{\intcalcShl}
+% \begin{macrocode}
+\def\intcalcShl#1{%
+ \number\expandafter\IntCalc@ShlSwitch\number#1! %
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@ShlSwitch}
+% \begin{macrocode}
+\def\IntCalc@ShlSwitch#1!{%
+ \ifnum#1<\z@
+ 0\IntCalcError:ShlNegativeNumber%
+ \else
+ \csname IntCalc@Empty%
+ \IntCalc@Shl#1!%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCal@ShlDigit}
+% \begin{macrocode}
+\def\IntCalc@Shl#1#2{%
+ \ifx#2!%
+ \csname IntCalc@ShlDigit#1\endcsname0%
+ \else
+ \csname IntCalc@ShlDigit#1%
+ \@ReturnAfterFi{%
+ \IntCalc@Shl#2%
+ }%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@ShlDigit0}
+% \begin{macrocode}
+\expandafter\def\csname IntCalc@ShlDigit0\endcsname{%
+ \endcsname0%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@ShlDigit[1-9]}
+% \begin{macrocode}
+\def\IntCalc@Temp#1#2#3#4#5{%
+ \expandafter\def\csname IntCalc@ShlDigit#1\endcsname##1{%
+ \expandafter\endcsname
+ \ifcase##1 %
+ #2#3%
+ \else
+ #4#5%
+ \fi
+ }%
+}
+\IntCalc@Temp 10203
+\IntCalc@Temp 20405
+\IntCalc@Temp 30607
+\IntCalc@Temp 40809
+\IntCalc@Temp 51011
+\IntCalc@Temp 61213
+\IntCalc@Temp 71415
+\IntCalc@Temp 81617
+\IntCalc@Temp 91819
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\intcalcShr}
+% \begin{macrocode}
+\def\intcalcShr#1{%
+ \number\expandafter\IntCalc@ShrSwitch\number#1! %
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@ShrSwitch}
+% \begin{macrocode}
+\def\IntCalc@ShrSwitch#1!{%
+ \ifnum#1<\z@
+ 0\IntCalcError:ShrNegativeNumber%
+ \else
+ \IntCalc@Shr#1!%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@Shr}
+% \begin{macrocode}
+\def\IntCalc@Shr#1#2{%
+ \IntCalc@ShrDigit#1!%
+ \ifx#2!%
+ \else
+ \@ReturnAfterFi{%
+ \ifodd#1 %
+ \@ReturnAfterElseFi{%
+ \IntCalc@Shr{1#2}%
+ }%
+ \else
+ \expandafter\IntCalc@Shr\expandafter#2%
+ \fi
+ }%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+\def\IntCalc@ShrDigit#1!{%
+ \ifcase#1 0% 0
+ \or 0% 1
+ \or 1% 2
+ \or 1% 3
+ \or 2% 4
+ \or 2% 5
+ \or 3% 6
+ \or 3% 7
+ \or 4% 8
+ \or 4% 9
+ \or 5% 10
+ \or 5% 11
+ \or 6% 12
+ \or 6% 13
+ \or 7% 14
+ \or 7% 15
+ \or 8% 16
+ \or 8% 17
+ \or 9% 18
+ \or 9% 19
+ \fi
+}
+% \end{macrocode}
+%
+% \subsubsection{\cs{IntCalc@Tim}}
+%
+% \begin{macro}{\IntCalc@Tim}
+% Macro \cs{IntCalc@Tim} implements
+% ``Number \emph{tim}es digit''.
+% \begin{macrocode}
+\def\IntCalc@Tim#1#2{%
+ \number
+ \ifcase#2 % 0
+ 0%
+ \or % 1
+ #1%
+ \else % 2-9
+ \csname IntCalc@Empty%
+ \IntCalc@ProcessTim#2#1!%
+ \fi
+ \IntCalc@Space
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@ProcessTim}
+% \begin{macrocode}
+\def\IntCalc@ProcessTim#1#2#3{%
+ \ifx#3!%
+ \csname IntCalc@TimDigit#2\endcsname#10%
+ \else
+ \csname IntCalc@TimDigit#2\csname IntCalc@Param#1%
+ \@ReturnAfterFi{%
+ \IntCalc@ProcessTim#1#3%
+ }%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@Param[0-9]}
+% \begin{macrocode}
+\def\IntCalc@Temp#1{%
+ \expandafter\def\csname IntCalc@Param#1\endcsname{%
+ \endcsname#1%
+ }%
+}
+\IntCalc@Temp 0%
+\IntCalc@Temp 1%
+\IntCalc@Temp 2%
+\IntCalc@Temp 3%
+\IntCalc@Temp 4%
+\IntCalc@Temp 5%
+\IntCalc@Temp 6%
+\IntCalc@Temp 7%
+\IntCalc@Temp 8%
+\IntCalc@Temp 9%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@TimDigit0}
+% \begin{macrocode}
+\expandafter\def\csname IntCalc@TimDigit0\endcsname#1#2{%
+ \endcsname
+ 0#2%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@TimDigit1}
+% \begin{macrocode}
+\expandafter\def\csname IntCalc@TimDigit1\endcsname#1#2{%
+ \ifcase#2 %
+ \endcsname 0#1%
+ \else
+ \csname IntCalc@AddDigit#1\endcsname #2%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@TimDigit[2-9]}
+% \begin{macrocode}
+\def\IntCalc@Temp#1#2{%
+ \expandafter\def\csname IntCalc@TimDigit#1\endcsname##1{%
+ \expandafter\IntCalc@TimDigitCarry
+ \number
+ \ifcase##1 0% 0
+ #2%
+ \fi
+ !%
+ }%
+}
+\IntCalc@Temp 2{%
+ \or 2% 1
+ \or 4% 2
+ \or 6% 3
+ \or 8% 4
+ \or 10% 5
+ \or 12% 6
+ \or 14% 7
+ \or 16% 8
+ \or 18% 9
+}
+\IntCalc@Temp 3{%
+ \or 3% 1
+ \or 6% 2
+ \or 9% 3
+ \or 12% 4
+ \or 15% 5
+ \or 18% 6
+ \or 21% 7
+ \or 24% 8
+ \or 27% 9
+}
+\IntCalc@Temp 4{%
+ \or 4% 1
+ \or 8% 2
+ \or 12% 3
+ \or 16% 4
+ \or 20% 5
+ \or 24% 6
+ \or 28% 7
+ \or 32% 8
+ \or 36% 9
+}
+\IntCalc@Temp 5{%
+ \or 5% 1
+ \or 10% 2
+ \or 15% 3
+ \or 20% 4
+ \or 25% 5
+ \or 30% 6
+ \or 35% 7
+ \or 40% 8
+ \or 45% 9
+}
+\IntCalc@Temp 6{%
+ \or 6% 1
+ \or 12% 2
+ \or 18% 3
+ \or 24% 4
+ \or 30% 5
+ \or 36% 6
+ \or 42% 7
+ \or 48% 8
+ \or 54% 9
+}
+\IntCalc@Temp 7{%
+ \or 7% 1
+ \or 14% 2
+ \or 21% 3
+ \or 28% 4
+ \or 35% 5
+ \or 42% 6
+ \or 49% 7
+ \or 56% 8
+ \or 63% 9
+}
+\IntCalc@Temp 8{%
+ \or 8% 1
+ \or 16% 2
+ \or 24% 3
+ \or 32% 4
+ \or 40% 5
+ \or 48% 6
+ \or 56% 7
+ \or 64% 8
+ \or 72% 9
+}
+\IntCalc@Temp 9{%
+ \or 9% 1
+ \or 18% 2
+ \or 27% 3
+ \or 36% 4
+ \or 45% 5
+ \or 54% 6
+ \or 63% 7
+ \or 72% 8
+ \or 81% 9
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@TimDigitCarry}
+% \begin{macrocode}
+\def\IntCalc@TimDigitCarry#1!{%
+ \ifnum#1<10 %
+ \csname IntCalc@AddDigit#1\expandafter\endcsname
+ \else
+ \@ReturnAfterFi{%
+ \IntCalc@@TimDigitCarry#1!%
+ }%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@@TimDigitCarry}
+% \begin{macrocode}
+\def\IntCalc@@TimDigitCarry#1#2!#3{%
+ \csname IntCalc@DigitCarry#1%
+ \csname IntCalc@AddDigit#2\endcsname #3%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{\op{Mul}}
+%
+% \begin{macro}{\intcalcMul}
+% \begin{macrocode}
+\def\intcalcMul#1#2{%
+ \number
+ \expandafter\IntCalc@MulSwitch
+ \number\number#1\expandafter!%
+ \number#2!%
+ \IntCalc@Space
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\IntCalc@MulSwitch}
+% Decision table for \cs{IntCalc@MulSwitch}.
+% \begin{quote}
+% \begin{tabular}[t]{@{}|l|l|l|l|l|@{}}
+% \hline
+% $x<0$ & $y<0$ & $ x< y$ & $+$ & $\opMul(-x,-y)$\\
+% \cline{3-3}\cline{5-5}
+% & & else & & $\opMul(-y,-x)$\\
+% \cline{2-5}
+% & else & $-x> y$ & $-$ & $\opMul(-x, y)$\\
+% \cline{3-3}\cline{5-5}
+% & & else & & $\opMul( y,-x)$\\
+% \hline
+% else & $y<0$ & $ x>-y$ & $-$ & $\opMul( x,-y)$\\
+% \cline{3-3}\cline{5-5}
+% & & else & & $\opMul(-y, x)$\\
+% \cline{2-5}
+% & else & $ x> y$ & $+$ & $\opMul( x, y)$\\
+% \cline{3-3}\cline{5-5}
+% & & else & & $\opMul( y, x)$\\
+% \hline
+% \end{tabular}
+% \end{quote}
+% \begin{macrocode}
+\def\IntCalc@MulSwitch#1!#2!{%
+ \ifnum#1<\z@
+ \ifnum#2<\z@
+ \ifnum#1<#2 %
+ \expandafter\IntCalc@Mul\number-#1\expandafter!%
+ \IntCalc@Gobble#2!%
+ \else
+ \expandafter\IntCalc@Mul\number-#2\expandafter!%
+ \IntCalc@Gobble#1!%
+ \fi
+ \else
+ -%
+ \ifnum-#1>#2 %
+ \expandafter\IntCalc@Mul\IntCalc@Gobble#1!#2!%
+ \else
+ \expandafter\IntCalc@Mul\number#2\expandafter!%
+ \IntCalc@Gobble#1!%
+ \fi
+ \fi
+ \else
+ \ifnum#2<\z@
+ -%
+ \ifnum#1>-#2 %
+ \expandafter\IntCalc@Mul\number#1\expandafter!%
+ \IntCalc@Gobble#2!%
+ \else
+ \expandafter\IntCalc@Mul\IntCalc@Gobble#2!#1!%
+ \fi
+ \else
+ \ifnum#1>#2 %
+ \IntCalc@Mul#1!#2!%
+ \else
+ \IntCalc@Mul#2!#1!%
+ \fi
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@Mul}
+% \begin{macrocode}
+\def\IntCalc@Mul#1!#2!{%
+ \ifcase#2 %
+ 0%
+ \or
+ #1%
+ \or
+ \csname IntCalc@Empty%
+ \expandafter\IntCalc@Shl#1!%
+ \else
+ \ifnum#2<10 %
+ \IntCalc@Tim{#1}#2%
+ \else
+ \IntCalc@ProcessMul!#2!#1!%
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@Mul}
+% \begin{macrocode}
+\def\IntCalc@ProcessMul#1!#2#3!#4!{%
+ \ifx\IntCalc@Empty#3\IntCalc@Empty
+ \expandafter\IntCalc@Add\number
+ #10\expandafter\expandafter\expandafter!%
+ \IntCalc@Tim{#4}#2!%
+ \else
+ \ifx\IntCalc@Empty#1\IntCalc@Empty
+ \expandafter\expandafter\expandafter\IntCalc@ProcessMul
+ \IntCalc@Tim{#4}#2!%
+ #3!#4!%
+ \else
+ \expandafter\IntCalc@ProcessMul\number
+ \expandafter\IntCalc@Add\number%
+ #10\expandafter\expandafter\expandafter!%
+ \IntCalc@Tim{#4}#2!!%
+ #3!#4!%
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{\op{Sqr}, \op{Fac}}
+%
+% \begin{macro}{\intcalcSqr}
+% \begin{macrocode}
+\def\intcalcSqr#1{%
+ \number\expandafter\IntCalc@Sqr\number#1! %
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@Sqr}
+% \begin{macrocode}
+\def\IntCalc@Sqr#1#2!{%
+ \ifx#1-%
+ \IntCalc@Mul#2!#2!%
+ \else
+ \IntCalc@Mul#1#2!#1#2!%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\intcalcFac}
+% \begin{macrocode}
+\def\intcalcFac#1{%
+ \number\expandafter\IntCalc@Fac\number#1! %
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{\op{Pow}}
+%
+% \begin{macro}{\intcalcPow}
+% \begin{macrocode}
+\def\intcalcPow#1#2{%
+ \number\expandafter\IntCalc@Pow
+ \number\number#1\expandafter!%
+ \number#2! %
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@Pow}
+% \begin{macrocode}
+\def\IntCalc@Pow#1#2!#3#4!{%
+ \ifcase#3#4 % power = 0
+ 1%
+ \or % power = 1
+ #1#2%
+ \or % power = 2
+ \ifx#1-%
+ \IntCalc@Mul#2!#2!%
+ \else
+ \IntCalc@Mul#1#2!#1#2!%
+ \fi
+ \else
+ \ifcase#1#2 % basis = 0, power <> 0
+ 0%
+ \ifx#3-% power < 0
+ 0\IntCalcError:DivisionByZero%
+ \fi
+ \or
+ 1% basis = 1
+ \else
+ \ifnum#1#2=\m@ne % basis = -1
+ \ifodd#3#4 %
+ -%
+ \fi
+ 1%
+ \else % |basis| > 1
+ \ifx#3-% power < 0
+ 0%
+ \else % power > 2
+ \ifx#1-% basis < 0
+ \ifodd#3#4 %
+ -%
+ \fi
+ \IntCalc@PowRec#2!#3#4!1!%
+ \else
+ \IntCalc@PowRec#1#2!#3#4!1!%
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@PowRec}
+%\begin{quote}
+%\begin{verbatim}
+%Pow(b, p) {
+% PowRec(b, p, 1)
+%}
+%PowRec(b, p, r) {
+% if p == 1 then
+% return r
+% else
+% ifodd p then
+% return PowRec(b*b, p div 2, r*b) % p div 2 = (p-1)/2
+% else
+% return PowRec(b*b, p div 2, r)
+% fi
+% fi
+%}
+%\end{verbatim}
+%\end{quote}
+% \begin{macrocode}
+\def\IntCalc@PowRec#1!#2!#3!{%
+ \ifnum#2=\@ne
+ \ifnum#1>#3 %
+ \IntCalc@Mul#1!#3!%
+ \else
+ \IntCalc@Mul#3!#1!%
+ \fi
+ \else
+ \expandafter\IntCalc@PowRec
+ \number\IntCalc@Mul#1!#1!\expandafter!%
+ \number\intcalcShr{#2}\expandafter!%
+ \number
+ \ifodd#2 %
+ \ifnum#1>#3 %
+ \IntCalc@Mul#1!#3!%
+ \else
+ \IntCalc@Mul#3!#1!%
+ \fi
+ \else
+ #3%
+ \fi
+ \expandafter!%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{\op{Div}}
+%
+% \begin{macro}{\intcalcDiv}
+% \begin{macrocode}
+\def\intcalcDiv#1#2{%
+ \number\expandafter\IntCalc@Div
+ \number\number#1\expandafter!%
+ \number#2! %
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@Div}
+% \begin{macrocode}
+\def\IntCalc@Div#1!#2!{%
+ \ifcase#2 %
+ 0\IntCalcError:DivisionByZero%
+ \else
+ \ifcase#1 %
+ 0%
+ \else
+ \expandafter\IntCalc@DivSwitch
+ \number#1\expandafter!%
+ \number#2!%
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@DivSwitch}
+% Decision table for \cs{IntCalc@DivSwitch}.
+% \begin{quote}
+% \begin{tabular}[t]{@{}|l|l|l|l|l|@{}}
+% \hline
+% $x<0$ & $y<0$ & $ x< y$ & $+$ & $\opDiv(-x,-y)$\\
+% \cline{3-3}\cline{5-5}
+% & & else & & $\opDiv(-y,-x)$\\
+% \cline{2-5}
+% & else & $-x> y$ & $-$ & $\opDiv(-x, y)$\\
+% \cline{3-3}\cline{5-5}
+% & & else & & $\opDiv( y,-x)$\\
+% \hline
+% else & $y<0$ & $ x>-y$ & $-$ & $\opDiv( x,-y)$\\
+% \cline{3-3}\cline{5-5}
+% & & else & & $\opDiv(-y, x)$\\
+% \cline{2-5}
+% & else & $ x> y$ & $+$ & $\opDiv( x, y)$\\
+% \cline{3-3}\cline{5-5}
+% & & else & & $\opDiv( y, x)$\\
+% \hline
+% \end{tabular}
+% \end{quote}
+% \begin{macrocode}
+\def\IntCalc@DivSwitch#1!#2!{%
+ \ifnum#1<\z@
+ \ifnum#2<\z@
+ \expandafter\IntCalc@@Div\number-#1\expandafter!%
+ \IntCalc@Gobble#2!%
+ \else
+ -%
+ \expandafter\IntCalc@@Div\IntCalc@Gobble#1!#2!%
+ \fi
+ \else
+ \ifnum#2<\z@
+ -%
+ \expandafter\IntCalc@@Div\number#1\expandafter!%
+ \IntCalc@Gobble#2!%
+ \else
+ \IntCalc@@Div#1!#2!%
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@@Div}
+% \begin{macrocode}
+\def\IntCalc@@Div#1!#2!{%
+ \ifnum#1>#2 %
+ \ifcase#2 % 0 already catched
+? \IntCalcError:ThisCannotHappen%
+ \or % 1
+ #1%
+ \or % 2
+ \IntCalc@Shr#1!%
+ \else
+ \IntCalc@DivStart!#1!#2!#2!%
+ \fi
+ \else
+ \ifnum#1=#2 %
+ 1%
+ \else
+ 0%
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@DivStart}
+% \begin{macrocode}
+\def\IntCalc@DivStart#1!#2#3!#4#5{%
+ \ifx#5!%
+ \@ReturnAfterElseFi{%
+ \IntCalc@DivStartI{#1#2}#3=!%
+ }%
+ \else
+ \@ReturnAfterFi{%
+ \IntCalc@DivStart{#1#2}!#3!#5%
+ }%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@StartI}
+% \begin{macrocode}
+\def\IntCalc@DivStartI#1!#2!{%
+ \expandafter\IntCalc@DivStartII
+ \number#2\expandafter\expandafter\expandafter!%
+ \intcalcShl{#2}!%
+ #1!%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@StartII}
+% \begin{macrocode}
+\def\IntCalc@DivStartII#1!#2!{%
+ \expandafter\IntCalc@DivStartIII
+ \number#1\expandafter!%
+ \number#2\expandafter\expandafter\expandafter!%
+ \intcalcShl{#2}!%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@StartIII}
+% \begin{macrocode}
+\def\IntCalc@DivStartIII#1!#2!#3!{%
+ \expandafter\IntCalc@DivStartIV
+ \number#1\expandafter!%
+ \number#2\expandafter!%
+ \number#3\expandafter!%
+ \number\IntCalc@Add#3!#2!\expandafter\expandafter\expandafter!%
+ \intcalcShl{#3}!%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@StartIV}
+% \begin{macrocode}
+\def\IntCalc@DivStartIV#1!#2!#3!#4!#5!#6!{%
+ \IntCalc@ProcessDiv#6!#1!#2!#3!#4!#5!/%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@ProcessDiv}
+% \begin{macrocode}
+\def\IntCalc@ProcessDiv#1#2#3!#4!#5!#6!#7!#8!#9/{%
+ #9%
+ \ifnum#1<#4 % 0
+ 0%
+ \ifx#2=%
+ \else
+ \IntCalc@ProcessDiv{#1#2}#3!#4!#5!#6!#7!#8!%
+ \fi
+ \else % 1-9
+ \ifnum#1<#5 % 1
+ 1%
+ \ifx#2=%
+ \else
+ \expandafter\IntCalc@ProcessDiv\expandafter{%
+ \number\IntCalc@Sub#1!#4!%
+ #2%
+ }#3!#4!#5!#6!#7!#8!%
+ \fi
+ \else % 2-9
+ \ifnum#1<#7 % 2 3 4 5
+ \ifnum#1<#6 % 2 3
+ \@ReturnAfterElseFi{%
+ \expandafter\IntCalc@@ProcessDiv
+ \number\IntCalc@Sub#1!#5!!%
+ 23%
+ }%
+ \else % 4 5
+ \@ReturnAfterFi{%
+ \expandafter\IntCalc@@ProcessDiv
+ \number\IntCalc@Sub#1!#6!!%
+ 45%
+ }%
+ \fi
+ #2#3!#4!#5!#6!#7!#8!%
+ \else % 6 7 8 9
+ \ifnum#1<#8 % 6 7
+ \@ReturnAfterElseFi{%
+ \expandafter\IntCalc@@ProcessDiv
+ \number\IntCalc@Sub#1!#7!!%
+ 67%
+ }%
+ \else % 8 9
+ \@ReturnAfterFi{%
+ \expandafter\IntCalc@@ProcessDiv
+ \number\IntCalc@Sub#1!#8!!%
+ 89%
+ }%
+ \fi
+ #2#3!#4!#5!#6!#7!#8!%
+ \fi
+ \fi
+ \fi
+ \ifx#2=%
+ \expandafter\IntCalc@Gobble
+ \fi
+ /%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@@ProcessDiv}
+% \begin{macrocode}
+\def\IntCalc@@ProcessDiv#1!#2#3#4#5!#6!{%
+ \ifnum#1<#6 %
+ #2%
+ \@ReturnAfterElseFi{%
+ \ifx#4=%
+ \expandafter\IntCalc@CleanupIV
+ \else
+ \@ReturnAfterFi{%
+ \IntCalc@ProcessDiv{#1#4}#5!#6!%
+ }%
+ \fi
+ }%
+ \else
+ #3%
+ \@ReturnAfterFi{%
+ \ifx#4=%
+ \expandafter\IntCalc@CleanupIV
+ \else
+ \@ReturnAfterFi{%
+ \expandafter\IntCalc@ProcessDiv\expandafter{%
+ \number\IntCalc@Sub#1!#6!\IntCalc@Space
+ #4%
+ }#5!#6!%
+ }%
+ \fi
+ }%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@CleanupIV}
+% \begin{macrocode}
+\def\IntCalc@CleanupIV#1!#2!#3!#4!{}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{\op{Mod}}
+%
+% \begin{macro}{\intcalcMod}
+% \begin{macrocode}
+\def\intcalcMod#1#2{%
+ \number\expandafter\IntCalc@Mod
+ \number\number#1\expandafter!%
+ \number#2! %
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\intcalc@Mod}
+% Pseudocode/decision table for \cs{intcalc@Mod}.
+% \begin{quote}
+% \begin{tabular}{@{}lll@{}}
+% if & $y=0$ & DivisionByZero\\
+% elsif & $y<0$ & $-\opMod(-x,-y)$\\
+% elsif & $x=0$ & 0\\
+% elsif & $y=1$ & 0\\
+% elsif & $y=2$ & $\opOdd(x)\mathbin{?}1\mathbin{:}0$\\
+% elsif & $x<0$ &
+% $z\leftarrow x+(x/y)*x;\quad (z<0)\mathbin{?}z+x\mathbin{:}z$\\
+% else & & $x-(x/y)*x$\\
+% \\
+% \end{tabular}
+% \end{quote}
+% \begin{macrocode}
+\def\IntCalc@Mod#1!#2!{%
+ \ifcase#2 %
+ 0\IntCalcError:DivisionByZero%
+ \else
+ \ifnum#2<\z@
+ -%
+ \expandafter\IntCalc@Mod
+ \number-#1\expandafter!%
+ \number-#2!%
+ \else
+ \ifcase#1 %
+ 0%
+ \else
+ \ifcase#2 % 0 already catched
+? \IntCalcError:ThisCannotHappen%
+ \or % 1
+ 0%
+ \or % 2
+ \ifodd#1 %
+ 1%
+ \else
+ 0%
+ \fi
+ \else
+ \ifnum#1<\z@
+ \expandafter\IntCalc@ModShift
+ \number-%
+ \expandafter\IntCalc@Sub
+ \number\IntCalc@Gobble#1\expandafter!%
+ \number\intcalcMul{#2}{%
+ \expandafter\IntCalc@Div\IntCalc@Gobble#1!#2!%
+ }!%
+ !#2!%
+ \else
+ \expandafter\IntCalc@Sub\number#1\expandafter!%
+ \number\intcalcMul{#2}{\IntCalc@Div#1!#2!}!%
+ \fi
+ \fi
+ \fi
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@ModShift}
+% \begin{macrocode}
+\def\IntCalc@ModShift#1!#2!{%
+ \ifnum#1<\z@
+ \expandafter\IntCalc@Sub\number#2\expandafter!%
+ \IntCalc@Gobble#1!%
+ \else
+ #1%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Help macros}
+%
+% \begin{macro}{\IntCalc@Empty}
+% \begin{macrocode}
+\def\IntCalc@Empty{}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\IntCalc@Gobble}
+% \begin{macrocode}
+\def\IntCalc@Gobble#1{}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@ReturnAfterFi}
+% \begin{macrocode}
+\long\def\@ReturnAfterFi#1\fi{\fi#1}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@ReturnAfterElseFi}
+% \begin{macrocode}
+\long\def\@ReturnAfterElseFi#1\else#2\fi{\fi#1}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\IntCalc@AtEnd
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+% \section{Test}
+%
+% \subsection{Catcode checks for loading}
+%
+% \begin{macrocode}
+%<*test1>
+% \end{macrocode}
+% \begin{macrocode}
+\catcode`\@=11 %
+\def\RestoreCatcodes{}
+\count@=0 %
+\loop
+ \edef\RestoreCatcodes{%
+ \RestoreCatcodes
+ \catcode\the\count@=\the\catcode\count@\relax
+ }%
+\ifnum\count@<255 %
+ \advance\count@\@ne
+\repeat
+
+\def\RangeCatcodeInvalid#1#2{%
+ \count@=#1\relax
+ \loop
+ \catcode\count@=15 %
+ \ifnum\count@<#2\relax
+ \advance\count@\@ne
+ \repeat
+}
+\def\Test{%
+ \RangeCatcodeInvalid{0}{47}%
+ \RangeCatcodeInvalid{58}{64}%
+ \RangeCatcodeInvalid{91}{96}%
+ \RangeCatcodeInvalid{123}{255}%
+ \catcode`\@=12 %
+ \catcode`\\=0 %
+ \catcode`\{=1 %
+ \catcode`\}=2 %
+ \catcode`\#=6 %
+ \catcode`\[=12 %
+ \catcode`\]=12 %
+ \catcode`\%=14 %
+ \catcode`\ =10 %
+ \catcode13=5 %
+ \input intcalc.sty\relax
+ \RestoreCatcodes
+}
+\Test
+\csname @@end\endcsname
+\end
+% \end{macrocode}
+% \begin{macrocode}
+%</test1>
+% \end{macrocode}
+%
+% \subsection{Macro tests}
+%
+% \subsubsection{Preamble with test macro definitions}
+%
+% \begin{macrocode}
+%<*test2|test3|test4>
+\NeedsTeXFormat{LaTeX2e}
+\nofiles
+\documentclass{article}
+%<noetex>\let\SavedNumexpr\numexpr
+%<noetex>\let\numexpr\UNDEFINED
+\makeatletter
+\chardef\IntCalc@TestMode=1 %
+\makeatother
+\usepackage{intcalc}[2007/09/09]
+%<noetex>\let\numexpr\SavedNumexpr
+\usepackage{qstest}
+\IncludeTests{*}
+\LogTests{log}{*}{*}
+%</test2|test3|test4>
+%<*test2|test3>
+\newcommand*{\TestSpaceAtEnd}[1]{%
+%<noetex> \let\SavedNumexpr\numexpr
+%<noetex> \let\numexpr\UNDEFINED
+ \edef\resultA{#1}%
+ \edef\resultB{#1 }%
+%<noetex> \let\numexpr\SavedNumexpr
+ \Expect*{\resultA\space}*{\resultB}%
+}
+\newcommand*{\TestResult}[2]{%
+%<noetex> \let\SavedNumexpr\numexpr
+%<noetex> \let\numexpr\UNDEFINED
+ \edef\result{#1}%
+%<noetex> \let\numexpr\SavedNumexpr
+ \Expect*{\result}{#2}%
+}
+\newcommand*{\TestResultTwoExpansions}[2]{%
+%<*noetex>
+ \begingroup
+ \let\numexpr\UNDEFINED
+ \expandafter\expandafter\expandafter
+ \endgroup
+%</noetex>
+ \expandafter\expandafter\expandafter\Expect
+ \expandafter\expandafter\expandafter{#1}{#2}%
+}
+\newcount\TestCount
+%<etex>\newcommand*{\TestArg}[1]{\numexpr#1\relax}
+%<noetex>\newcommand*{\TestArg}[1]{#1}
+\newcommand*{\TestTeXDivide}[2]{%
+ \TestCount=\TestArg{#1}\relax
+ \divide\TestCount by \TestArg{#2}\relax
+ \Expect*{\intcalcDiv{#1}{#2}}*{\the\TestCount}%
+}
+\newcommand*{\Test}[2]{%
+ \TestResult{#1}{#2}%
+ \TestResultTwoExpansions{#1}{#2}%
+ \TestSpaceAtEnd{#1}%
+}
+\newcommand*{\TestExch}[2]{\Test{#2}{#1}}
+\newcommand*{\TestInv}[2]{%
+ \Test{\intcalcInv{#1}}{#2}%
+}
+\newcommand*{\TestAbs}[2]{%
+ \Test{\intcalcAbs{#1}}{#2}%
+}
+\newcommand*{\TestSgn}[2]{%
+ \Test{\intcalcSgn{#1}}{#2}%
+}
+\newcommand*{\TestMin}[3]{%
+ \Test{\intcalcMin{#1}{#2}}{#3}%
+}
+\newcommand*{\TestMax}[3]{%
+ \Test{\intcalcMax{#1}{#2}}{#3}%
+}
+\newcommand*{\TestCmp}[3]{%
+ \Test{\intcalcCmp{#1}{#2}}{#3}%
+}
+\newcommand*{\TestInc}[2]{%
+ \Test{\intcalcInc{#1}}{#2}%
+}
+\newcommand*{\TestDec}[2]{%
+ \Test{\intcalcDec{#1}}{#2}%
+}
+\newcommand*{\TestAdd}[3]{%
+ \Test{\intcalcAdd{#1}{#2}}{#3}%
+}
+\newcommand*{\TestSub}[3]{%
+ \Test{\intcalcSub{#1}{#2}}{#3}%
+}
+\newcommand*{\TestShl}[2]{%
+ \Test{\intcalcShl{#1}}{#2}%
+}
+\newcommand*{\TestShr}[2]{%
+ \Test{\intcalcShr{#1}}{#2}%
+}
+\newcommand*{\TestMul}[3]{%
+ \Test{\intcalcMul{#1}{#2}}{#3}%
+}
+\newcommand*{\TestSqr}[2]{%
+ \Test{\intcalcSqr{#1}}{#2}%
+}
+\newcommand*{\TestFac}[2]{%
+ \expandafter\TestExch\expandafter{\the\numexpr#2}{\intcalcFac{#1}}%
+}
+\newcommand*{\TestPow}[3]{%
+ \Test{\intcalcPow{#1}{#2}}{#3}%
+}
+\newcommand*{\TestDiv}[3]{%
+ \Test{\intcalcDiv{#1}{#2}}{#3}%
+ \TestTeXDivide{#1}{#2}%
+}
+\newcommand*{\TestMod}[3]{%
+ \Test{\intcalcMod{#1}{#2}}{#3}%
+}
+%</test2|test3>
+%<*test4>
+\newcommand*{\TestDo}[2]{%
+ \ifcase\numexpr#2\relax
+ \else
+ \edef\temp{\intcalcMod{#1}{#2}}%
+ \Expect*{%
+ \the\numexpr
+ \intcalcMul{%
+ \intcalcDiv{\intcalcAbs{#1}}{\intcalcAbs{#2}}%
+ }{\intcalcAbs{#2}}%
+ +\intcalcMod{\intcalcAbs{#1}}{\intcalcAbs{#2}}\relax
+ }*{\the\numexpr\intcalcAbs{#1}\relax}%
+ \fi
+}
+\newcommand*{\TestOne}[2]{%
+ \TestDo{#1}{#1}%
+}
+\newcommand*{\TestTwo}[3]{%
+ \TestDo{#1}{#2}%
+ \TestDo{#2}{#1}%
+}
+\let\TestInv\TestOne
+\let\TestAbs\TestOne
+\let\TestSgn\TestOne
+\let\TestMin\TestTwo
+\let\TestMax\TestTwo
+\let\TestCmp\TestTwo
+\let\TestInc\TestOne
+\let\TestDec\TestOne
+\let\TestAdd\TestTwo
+\let\TestSub\TestTwo
+\let\TestShl\TestOne
+\let\TestShr\TestOne
+\let\TestMul\TestTwo
+\let\TestSqr\TestOne
+\def\TestFac#1#2{}
+\let\TestPow\TestTwo
+\let\TestDiv\TestTwo
+\let\TestMod\TestTwo
+%</test4>
+% \end{macrocode}
+%
+% \subsubsection{Test sets}
+%
+% \begin{macrocode}
+%<*test2|test3|test4>
+\makeatletter
+
+\begin{qstest}{inv}{inv}%
+ \TestInv{0}{0}%
+ \TestInv{1}{-1}%
+ \TestInv{-1}{1}%
+ \TestInv{10}{-10}%
+ \TestInv{-10}{10}%
+ \TestInv{2147483647}{-2147483647}%
+ \TestInv{-2147483647}{2147483647}%
+ \TestInv{ 0 }{0}%
+ \TestInv{ 1 }{-1}%
+ \TestInv{--1}{-1}%
+ \TestInv{\z@}{0}%
+ \TestInv{\@ne}{-1}%
+ \TestInv{\m@ne}{1}%
+%<*etex>
+ \TestInv{-10+30}{-20}%
+ \TestInv{10-30}{20}%
+%</etex>
+\end{qstest}
+
+\begin{qstest}{abs}{abs}%
+ \TestAbs{0}{0}%
+ \TestAbs{1}{1}%
+ \TestAbs{-1}{1}%
+ \TestAbs{10}{10}%
+ \TestAbs{-10}{10}%
+ \TestAbs{2147483647}{2147483647}%
+ \TestAbs{-2147483647}{2147483647}%
+ \TestAbs{ 0 }{0}%
+ \TestAbs{ 1 }{1}%
+ \TestAbs{--1}{1}%
+ \TestAbs{\z@}{0}%
+ \TestAbs{\@ne}{1}%
+ \TestAbs{\m@ne}{1}%
+%<*etex>
+ \TestAbs{-10+30}{20}%
+ \TestAbs{10-30}{20}%
+%</etex>
+\end{qstest}
+
+\begin{qstest}{sign}{sign}%
+ \TestSgn{0}{0}%
+ \TestSgn{1}{1}%
+ \TestSgn{-1}{-1}%
+ \TestSgn{10}{1}%
+ \TestSgn{-10}{-1}%
+ \TestSgn{2147483647}{1}%
+ \TestSgn{-2147483647}{-1}%
+ \TestSgn{ 0 }{0}%
+ \TestSgn{ 2 }{1}%
+ \TestSgn{ -2 }{-1}%
+ \TestSgn{--2}{1}%
+ \TestSgn{\z@}{0}%
+ \TestSgn{\@ne}{1}%
+ \TestSgn{\m@ne}{-1}%
+%<*etex>
+ \TestSgn{-10+30}{1}%
+ \TestSgn{10-30}{-1}%
+%</etex>
+\end{qstest}
+
+\begin{qstest}{min}{min}%
+ \TestMin{0}{1}{0}%
+ \TestMin{1}{0}{0}%
+ \TestMin{-10}{-20}{-20}%
+ \TestMin{ 1 }{ 2 }{1}%
+ \TestMin{ 2 }{ 1 }{1}%
+ \TestMin{1}{1}{1}%
+ \TestMin{\z@}{\@ne}{0}%
+ \TestMin{\@ne}{\m@ne}{-1}%
+%<*etex>
+ \TestMin{1+2}{3+4}{3}%
+%</etex>
+\end{qstest}
+
+\begin{qstest}{max}{max}%
+ \TestMax{0}{1}{1}%
+ \TestMax{1}{0}{1}%
+ \TestMax{-10}{-20}{-10}%
+ \TestMax{ 1 }{ 2 }{2}%
+ \TestMax{ 2 }{ 1 }{2}%
+ \TestMax{1}{1}{1}%
+ \TestMax{\z@}{\@ne}{1}%
+ \TestMax{\@ne}{\m@ne}{1}%
+%<*etex>
+ \TestMax{1+2}{3+4}{7}%
+%</etex>
+\end{qstest}
+
+\begin{qstest}{cmp}{cmp}%
+ \TestCmp{0}{0}{0}%
+ \TestCmp{-21}{17}{-1}%
+ \TestCmp{3}{4}{-1}%
+ \TestCmp{-10}{-10}{0}%
+ \TestCmp{-10}{-11}{1}%
+ \TestCmp{100}{5}{1}%
+ \TestCmp{2147483647}{-2147483647}{1}%
+ \TestCmp{-2147483647}{2147483647}{-1}%
+ \TestCmp{2147483647}{2147483647}{0}%
+ \TestCmp{\z@}{\@ne}{-1}%
+ \TestCmp{\@ne}{\m@ne}{1}%
+ \TestCmp{ 4 }{ 5 }{-1}%
+ \TestCmp{ -3 }{ -7 }{1}%
+%<*etex>
+ \TestCmp{1+2}{3+4}{-1}%
+%</etex>
+\end{qstest}
+
+\begin{qstest}{fac}{fac}
+ \TestFac{0}{1}%
+ \TestFac{1}{1}%
+ \TestFac{2}{2}%
+ \TestFac{3}{2*3}%
+ \TestFac{4}{2*3*4}%
+ \TestFac{5}{2*3*4*5}%
+ \TestFac{6}{2*3*4*5*6}%
+ \TestFac{7}{2*3*4*5*6*7}%
+ \TestFac{8}{2*3*4*5*6*7*8}%
+ \TestFac{9}{2*3*4*5*6*7*8*9}%
+ \TestFac{10}{2*3*4*5*6*7*8*9*10}%
+ \TestFac{11}{2*3*4*5*6*7*8*9*10*11}%
+ \TestFac{12}{2*3*4*5*6*7*8*9*10*11*12}%
+\end{qstest}
+
+\begin{qstest}{inc}{inc}%
+ \TestInc{0}{1}%
+ \TestInc{1}{2}%
+ \TestInc{-1}{0}%
+ \TestInc{10}{11}%
+ \TestInc{-10}{-9}%
+ \TestInc{999}{1000}%
+ \TestInc{-1000}{-999}%
+ \TestInc{129}{130}%
+ \TestInc{2147483646}{2147483647}%
+ \TestInc{-2147483647}{-2147483646}%
+\end{qstest}
+
+\begin{qstest}{dec}{dec}%
+ \TestDec{0}{-1}%
+ \TestDec{1}{0}%
+ \TestDec{-1}{-2}%
+ \TestDec{10}{9}%
+ \TestDec{-10}{-11}%
+ \TestDec{1000}{999}%
+ \TestDec{-999}{-1000}%
+ \TestDec{130}{129}%
+ \TestDec{2147483647}{2147483646}%
+ \TestDec{-2147483646}{-2147483647}%
+\end{qstest}
+
+\begin{qstest}{add}{add}%
+ \TestAdd{0}{0}{0}%
+ \TestAdd{1}{0}{1}%
+ \TestAdd{0}{1}{1}%
+ \TestAdd{1}{2}{3}%
+ \TestAdd{-1}{-1}{-2}%
+ \TestAdd{2147483646}{1}{2147483647}%
+ \TestAdd{-2147483647}{2147483647}{0}%
+ \TestAdd{20}{-5}{15}%
+ \TestAdd{-4}{-1}{-5}%
+ \TestAdd{-1}{-4}{-5}%
+ \TestAdd{-4}{1}{-3}%
+ \TestAdd{-1}{4}{3}%
+ \TestAdd{4}{-1}{3}%
+ \TestAdd{1}{-4}{-3}%
+ \TestAdd{-4}{-1}{-5}%
+ \TestAdd{-1}{-4}{-5}%
+ \TestAdd{ -4 }{ -1 }{-5}%
+ \TestAdd{ -1 }{ -4 }{-5}%
+ \TestAdd{ -4 }{ 1 }{-3}%
+ \TestAdd{ -1 }{ 4 }{3}%
+ \TestAdd{ 4 }{ -1 }{3}%
+ \TestAdd{ 1 }{ -4 }{-3}%
+ \TestAdd{ -4 }{ -1 }{-5}%
+ \TestAdd{ -1 }{ -4 }{-5}%
+ \TestAdd{876543210}{111111111}{987654321}%
+ \TestAdd{999999999}{2}{1000000001}%
+%<*etex>
+ \TestAdd{100}{50+150}{300}%
+ \TestAdd{2147483647}{10-2147483647}{10}%
+%</etex>
+\end{qstest}
+
+\begin{qstest}{sub}{sub}
+ \TestSub{0}{0}{0}%
+ \TestSub{1}{0}{1}%
+ \TestSub{1}{2}{-1}%
+ \TestSub{-1}{-1}{0}%
+ \TestSub{2147483646}{-1}{2147483647}%
+ \TestSub{-2147483647}{-2147483647}{0}%
+ \TestSub{-4}{-1}{-3}%
+ \TestSub{-1}{-4}{3}%
+ \TestSub{-4}{1}{-5}%
+ \TestSub{-1}{4}{-5}%
+ \TestSub{4}{-1}{5}%
+ \TestSub{1}{-4}{5}%
+ \TestSub{-4}{-1}{-3}%
+ \TestSub{-1}{-4}{3}%
+ \TestSub{ -4 }{ -1 }{-3}%
+ \TestSub{ -1 }{ -4 }{3}%
+ \TestSub{ -4 }{ 1 }{-5}%
+ \TestSub{ -1 }{ 4 }{-5}%
+ \TestSub{ 4 }{ -1 }{5}%
+ \TestSub{ 1 }{ -4 }{5}%
+ \TestSub{ -4 }{ -1 }{-3}%
+ \TestSub{ -1 }{ -4 }{3}%
+ \TestSub{1000000000}{2}{999999998}%
+ \TestSub{987654321}{111111111}{876543210}%
+%<*etex>
+ \TestSub{100}{50+150}{-100}%
+ \TestSub{2147483647}{-10+2147483647}{10}%
+%</etex>
+\end{qstest}
+
+\begin{qstest}{shl}{shl}
+ \TestShl{0}{0}%
+ \TestShl{1}{2}%
+ \TestShl{5621}{11242}%
+ \TestShl{1073741823}{2147483646}%
+\end{qstest}
+
+\begin{qstest}{shr}{shr}
+ \TestShr{0}{0}%
+ \TestShr{1}{0}%
+ \TestShr{2}{1}%
+ \TestShr{3}{1}%
+ \TestShr{4}{2}%
+ \TestShr{5}{2}%
+ \TestShr{6}{3}%
+ \TestShr{7}{3}%
+ \TestShr{8}{4}%
+ \TestShr{9}{4}%
+ \TestShr{10}{5}%
+ \TestShr{11}{5}%
+ \TestShr{12}{6}%
+ \TestShr{13}{6}%
+ \TestShr{14}{7}%
+ \TestShr{15}{7}%
+ \TestShr{16}{8}%
+ \TestShr{17}{8}%
+ \TestShr{18}{9}%
+ \TestShr{19}{9}%
+ \TestShr{20}{10}%
+ \TestShr{21}{10}%
+ \TestShr{22}{11}%
+ \TestShr{11241}{5620}%
+ \TestShr{73054202}{36527101}%
+ \TestShr{2147483646}{1073741823}%
+\end{qstest}
+
+\begin{qstest}{mul}{mul}
+ \TestMul{0}{0}{0}%
+ \TestMul{1}{0}{0}%
+ \TestMul{0}{1}{0}%
+ \TestMul{1}{1}{1}%
+ \TestMul{3}{1}{3}%
+ \TestMul{1}{-3}{-3}%
+ \TestMul{-4}{-5}{20}%
+ \TestMul{3}{7}{21}%
+ \TestMul{7}{3}{21}%
+ \TestMul{3}{-7}{-21}%
+ \TestMul{7}{-3}{-21}%
+ \TestMul{-3}{7}{-21}%
+ \TestMul{-7}{3}{-21}%
+ \TestMul{-3}{-7}{21}%
+ \TestMul{-7}{-3}{21}%
+ \TestMul{12}{11}{132}%
+ \TestMul{999}{333}{332667}%
+ \TestMul{1000}{4321}{4321000}%
+ \TestMul{12345}{173955}{2147474475}%
+ \TestMul{1073741823}{2}{2147483646}%
+ \TestMul{2}{1073741823}{2147483646}%
+ \TestMul{-1073741823}{2}{-2147483646}%
+ \TestMul{2}{-1073741823}{-2147483646}%
+%<*etex>
+ \TestMul{2+3}{5+7}{60}%
+ \TestMul{2147483647}{2147483647/2147483647}{2147483647}%
+%</etex>
+\end{qstest}
+
+\begin{qstest}{sqr}{sqr}
+ \TestSqr{0}{0}%
+ \TestSqr{1}{1}%
+ \TestSqr{2}{4}%
+ \TestSqr{3}{9}%
+ \TestSqr{4}{16}%
+ \TestSqr{9}{81}%
+ \TestSqr{10}{100}%
+ \TestSqr{46340}{2147395600}%
+ \TestSqr{-1}{1}%
+ \TestSqr{-2}{4}%
+ \TestSqr{-46340}{2147395600}%
+\end{qstest}
+
+\begin{qstest}{pow}{pow}
+ \TestPow{-2}{0}{1}%
+ \TestPow{-1}{0}{1}%
+ \TestPow{0}{0}{1}%
+ \TestPow{1}{0}{1}%
+ \TestPow{2}{0}{1}%
+ \TestPow{3}{0}{1}%
+ \TestPow{-2}{1}{-2}%
+ \TestPow{-1}{1}{-1}%
+ \TestPow{1}{1}{1}%
+ \TestPow{2}{1}{2}%
+ \TestPow{3}{1}{3}%
+ \TestPow{-2}{2}{4}%
+ \TestPow{-1}{2}{1}%
+ \TestPow{0}{2}{0}%
+ \TestPow{1}{2}{1}%
+ \TestPow{2}{2}{4}%
+ \TestPow{3}{2}{9}%
+ \TestPow{0}{1}{0}%
+ \TestPow{1}{-2}{1}%
+ \TestPow{1}{-1}{1}%
+ \TestPow{-1}{-2}{1}%
+ \TestPow{-1}{-1}{-1}%
+ \TestPow{-1}{3}{-1}%
+ \TestPow{-1}{4}{1}%
+ \TestPow{-2}{-1}{0}%
+ \TestPow{-2}{-2}{0}%
+ \TestPow{2}{3}{8}%
+ \TestPow{2}{4}{16}%
+ \TestPow{2}{5}{32}%
+ \TestPow{2}{6}{64}%
+ \TestPow{2}{7}{128}%
+ \TestPow{2}{8}{256}%
+ \TestPow{2}{9}{512}%
+ \TestPow{2}{10}{1024}%
+ \TestPow{-2}{3}{-8}%
+ \TestPow{-2}{4}{16}%
+ \TestPow{-2}{5}{-32}%
+ \TestPow{-2}{6}{64}%
+ \TestPow{-2}{7}{-128}%
+ \TestPow{-2}{8}{256}%
+ \TestPow{-2}{9}{-512}%
+ \TestPow{-2}{10}{1024}%
+ \TestPow{3}{3}{27}%
+ \TestPow{3}{4}{81}%
+ \TestPow{3}{5}{243}%
+ \TestPow{-3}{3}{-27}%
+ \TestPow{-3}{4}{81}%
+ \TestPow{-3}{5}{-243}%
+ \TestPow{2}{30}{1073741824}%
+ \TestPow{-3}{19}{-1162261467}%
+ \TestPow{5}{13}{1220703125}%
+ \TestPow{-7}{11}{-1977326743}%
+\end{qstest}
+
+\begin{qstest}{div}{div}
+ \TestDiv{1}{1}{1}%
+ \TestDiv{2}{1}{2}%
+ \TestDiv{-2}{1}{-2}%
+ \TestDiv{2}{-1}{-2}%
+ \TestDiv{-2}{-1}{2}%
+ \TestDiv{15}{2}{7}%
+ \TestDiv{-16}{2}{-8}%
+ \TestDiv{1}{2}{0}%
+ \TestDiv{1}{3}{0}%
+ \TestDiv{2}{3}{0}%
+ \TestDiv{-2}{3}{0}%
+ \TestDiv{2}{-3}{0}%
+ \TestDiv{-2}{-3}{0}%
+ \TestDiv{13}{3}{4}%
+ \TestDiv{-13}{-3}{4}%
+ \TestDiv{-13}{3}{-4}%
+ \TestDiv{-6}{5}{-1}%
+ \TestDiv{-5}{5}{-1}%
+ \TestDiv{-4}{5}{0}%
+ \TestDiv{-3}{5}{0}%
+ \TestDiv{-2}{5}{0}%
+ \TestDiv{-1}{5}{0}%
+ \TestDiv{0}{5}{0}%
+ \TestDiv{1}{5}{0}%
+ \TestDiv{2}{5}{0}%
+ \TestDiv{3}{5}{0}%
+ \TestDiv{4}{5}{0}%
+ \TestDiv{5}{5}{1}%
+ \TestDiv{6}{5}{1}%
+ \TestDiv{-5}{4}{-1}%
+ \TestDiv{-4}{4}{-1}%
+ \TestDiv{-3}{4}{0}%
+ \TestDiv{-2}{4}{0}%
+ \TestDiv{-1}{4}{0}%
+ \TestDiv{0}{4}{0}%
+ \TestDiv{1}{4}{0}%
+ \TestDiv{2}{4}{0}%
+ \TestDiv{3}{4}{0}%
+ \TestDiv{4}{4}{1}%
+ \TestDiv{5}{4}{1}%
+ \TestDiv{12345}{678}{18}%
+ \TestDiv{32372}{5952}{5}%
+ \TestDiv{284271294}{18162}{15651}%
+ \TestDiv{217652429}{12561}{17327}%
+ \TestDiv{462028434}{5439}{84947}%
+ \TestDiv{2147483647}{1000}{2147483}%
+ \TestDiv{2147483647}{-1000}{-2147483}%
+ \TestDiv{-2147483647}{1000}{-2147483}%
+ \TestDiv{-2147483647}{-1000}{2147483}%
+\end{qstest}
+
+\begin{qstest}{mod}{mod}
+ \TestMod{-6}{5}{4}%
+ \TestMod{-5}{5}{0}%
+ \TestMod{-4}{5}{1}%
+ \TestMod{-3}{5}{2}%
+ \TestMod{-2}{5}{3}%
+ \TestMod{-1}{5}{4}%
+ \TestMod{0}{5}{0}%
+ \TestMod{1}{5}{1}%
+ \TestMod{2}{5}{2}%
+ \TestMod{3}{5}{3}%
+ \TestMod{4}{5}{4}%
+ \TestMod{5}{5}{0}%
+ \TestMod{6}{5}{1}%
+ \TestMod{-5}{4}{3}%
+ \TestMod{-4}{4}{0}%
+ \TestMod{-3}{4}{1}%
+ \TestMod{-2}{4}{2}%
+ \TestMod{-1}{4}{3}%
+ \TestMod{0}{4}{0}%
+ \TestMod{1}{4}{1}%
+ \TestMod{2}{4}{2}%
+ \TestMod{3}{4}{3}%
+ \TestMod{4}{4}{0}%
+ \TestMod{5}{4}{1}%
+ \TestMod{-6}{-5}{-1}%
+ \TestMod{-5}{-5}{0}%
+ \TestMod{-4}{-5}{-4}%
+ \TestMod{-3}{-5}{-3}%
+ \TestMod{-2}{-5}{-2}%
+ \TestMod{-1}{-5}{-1}%
+ \TestMod{0}{-5}{0}%
+ \TestMod{1}{-5}{-4}%
+ \TestMod{2}{-5}{-3}%
+ \TestMod{3}{-5}{-2}%
+ \TestMod{4}{-5}{-1}%
+ \TestMod{5}{-5}{0}%
+ \TestMod{6}{-5}{-4}%
+ \TestMod{-5}{-4}{-1}%
+ \TestMod{-4}{-4}{0}%
+ \TestMod{-3}{-4}{-3}%
+ \TestMod{-2}{-4}{-2}%
+ \TestMod{-1}{-4}{-1}%
+ \TestMod{0}{-4}{0}%
+ \TestMod{1}{-4}{-3}%
+ \TestMod{2}{-4}{-2}%
+ \TestMod{3}{-4}{-1}%
+ \TestMod{4}{-4}{0}%
+ \TestMod{5}{-4}{-3}%
+ \TestMod{2147483647}{1000}{647}%
+ \TestMod{2147483647}{-1000}{-353}%
+ \TestMod{-2147483647}{1000}{353}%
+ \TestMod{-2147483647}{-1000}{-647}%
+ \TestMod{ 0 }{ 4 }{0}%
+ \TestMod{ 1 }{ 4 }{1}%
+ \TestMod{ -1 }{ 4 }{3}%
+ \TestMod{ 0 }{ -4 }{0}%
+ \TestMod{ 1 }{ -4 }{-3}%
+ \TestMod{ -1 }{ -4 }{-1}%
+%<*etex>
+ \TestMod{1+2}{1+3}{3}%
+ \TestMod{1-2}{1+3}{3}%
+ \TestMod{1-2}{1-4}{-1}%
+ \TestMod{1+2}{1-4}{0}%
+ \TestMod{1+2}{1-5}{-1}%
+%</etex>
+\end{qstest}
+%</test2|test3|test4>
+
+%<*test2|test3>
+\newcommand*{\TestError}[2]{%
+ \begingroup
+ \expandafter\def\csname IntCalcError:#1\endcsname{}%
+ \Expect*{#2}{0}%
+ \expandafter\def\csname IntCalcError:#1\endcsname{ERROR}%
+ \Expect*{#2}{0ERROR }%
+ \endgroup
+}
+\begin{qstest}{error}{error}
+ \TestError{FacNegative}{\intcalcFac{-1}}%
+ \TestError{FacNegative}{\intcalcFac{-2147483647}}%
+ \TestError{FacOverflow}{\intcalcFac{13}}%
+ \TestError{FacOverflow}{\intcalcFac{2147483647}}%
+ \TestError{ShlNegativeNumber}{\intcalcShl{-1}}%
+ \TestError{ShrNegativeNumber}{\intcalcShr{-1}}%
+ \TestError{DivisionByZero}{\intcalcPow{0}{-1}}%
+ \TestError{DivisionByZero}{\intcalcDiv{1}{0}}%
+ \TestError{DivisionByZero}{\intcalcMod{1}{0}}%
+\end{qstest}
+%</test2|test3>
+
+%<*test2|test3|test4>
+\begin{document}
+\end{document}
+%</test2|test3|test4>
+% \end{macrocode}
+%
+% \section{Installation}
+%
+% \subsection{Download}
+%
+% \paragraph{Package.} This package is available on
+% CTAN\footnote{\url{ftp://ftp.ctan.org/tex-archive/}}:
+% \begin{description}
+% \item[\CTAN{macros/latex/contrib/oberdiek/intcalc.dtx}] The source file.
+% \item[\CTAN{macros/latex/contrib/oberdiek/intcalc.pdf}] Documentation.
+% \end{description}
+%
+%
+% \paragraph{Bundle.} All the packages of the bundle `oberdiek'
+% 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[\CTAN{macros/latex/contrib/oberdiek/oberdiek-tds.zip}]
+% \end{description}
+% \emph{TDS} refers to the standard ``A Directory Structure
+% for \TeX\ Files'' (\CTAN{tds/tds.pdf}). Directories
+% with \xfile{texmf} in their name are usually organized this way.
+%
+% \subsection{Bundle installation}
+%
+% \paragraph{Unpacking.} Unpack the \xfile{oberdiek-tds.zip} in the
+% TDS tree (also known as \xfile{texmf} tree) of your choice.
+% Example (linux):
+% \begin{quote}
+% |unzip oberdiek-tds.zip -d ~/texmf|
+% \end{quote}
+%
+% \paragraph{Script installation.}
+% Check the directory \xfile{TDS:scripts/oberdiek/} for
+% scripts that need further installation steps.
+% Package \xpackage{attachfile2} comes with the Perl script
+% \xfile{pdfatfi.pl} that should be installed in such a way
+% that it can be called as \texttt{pdfatfi}.
+% Example (linux):
+% \begin{quote}
+% |chmod +x scripts/oberdiek/pdfatfi.pl|\\
+% |cp scripts/oberdiek/pdfatfi.pl /usr/local/bin/|
+% \end{quote}
+%
+% \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 intcalc.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@{}}
+% intcalc.sty & tex/generic/oberdiek/intcalc.sty\\
+% intcalc.pdf & doc/latex/oberdiek/intcalc.pdf\\
+% intcalc-test1.tex & doc/latex/oberdiek/intcalc-test1.tex\\
+% intcalc-test2.tex & doc/latex/oberdiek/intcalc-test2.tex\\
+% intcalc-test3.tex & doc/latex/oberdiek/intcalc-test3.tex\\
+% intcalc-test4.tex & doc/latex/oberdiek/intcalc-test4.tex\\
+% intcalc.dtx & source/latex/oberdiek/intcalc.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
+% (\teTeX, \mikTeX, \dots) relies on file name databases, you must refresh
+% these. For example, \teTeX\ users run \verb|texhash| or
+% \verb|mktexlsr|.
+%
+% \subsection{Some details for the interested}
+%
+% \paragraph{Attached source.}
+%
+% The PDF documentation on CTAN also includes the
+% \xfile{.dtx} source file. It can be extracted by
+% AcrobatReader 6 or higher. Another option is \textsf{pdftk},
+% e.g. unpack the file into the current directory:
+% \begin{quote}
+% \verb|pdftk intcalc.pdf unpack_files output .|
+% \end{quote}
+%
+% \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{intcalc.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 intcalc.dtx
+%makeindex -s gind.ist intcalc.idx
+%pdflatex intcalc.dtx
+%makeindex -s gind.ist intcalc.idx
+%pdflatex intcalc.dtx
+%\end{verbatim}
+% \end{quote}
+%
+% \begin{History}
+% \begin{Version}{2007/09/09 v1.0}
+% \item
+% First version.
+% \end{Version}
+% \end{History}
+%
+% \PrintIndex
+%
+% \Finale
+\endinput
diff --git a/Master/texmf-dist/source/latex/oberdiek/kvoptions.dtx b/Master/texmf-dist/source/latex/oberdiek/kvoptions.dtx
index 556725c570f..03b34445f49 100644
--- a/Master/texmf-dist/source/latex/oberdiek/kvoptions.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/kvoptions.dtx
@@ -2151,6 +2151,7 @@ and the derived files
% \begin{macrocode}
%</package>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
diff --git a/Master/texmf-dist/source/latex/oberdiek/kvsetkeys.dtx b/Master/texmf-dist/source/latex/oberdiek/kvsetkeys.dtx
index 6af482fd905..6d9d13470f6 100644
--- a/Master/texmf-dist/source/latex/oberdiek/kvsetkeys.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/kvsetkeys.dtx
@@ -1,6 +1,6 @@
% \iffalse meta-comment
%
-% Copyright (C) 2006 by Heiko Oberdiek <oberdiek@uni-freiburg.de>
+% Copyright (C) 2006, 2007 by Heiko Oberdiek <oberdiek@uni-freiburg.de>
%
% This work may be distributed and/or modified under the
% conditions of the LaTeX Project Public License, either
@@ -17,7 +17,7 @@
% This work consists of the main source file kvsetkeys.dtx
% and the derived files
% kvsetkeys.sty, kvsetkeys.pdf, kvsetkeys.ins, kvsetkeys.drv,
-% kvsetkeys-example.tex.
+% kvsetkeys-example.tex, kvsetkeys-test1.tex.
%
% Distribution:
% CTAN:macros/latex/contrib/oberdiek/kvsetkeys.dtx
@@ -53,6 +53,7 @@
% TDS:tex/generic/oberdiek/kvsetkeys.sty
% TDS:doc/latex/oberdiek/kvsetkeys.pdf
% TDS:doc/latex/oberdiek/kvsetkeys-example.tex
+% TDS:doc/latex/oberdiek/kvsetkeys-test1.tex
% TDS:source/latex/oberdiek/kvsetkeys.dtx
%
%<*ignore>
@@ -68,7 +69,7 @@
\input docstrip.tex
\Msg{************************************************************************}
\Msg{* Installation}
-\Msg{* Package: kvsetkeys 2006/10/19 v1.1 Key value parser with default handler support (HO)}
+\Msg{* Package: kvsetkeys 2007/09/09 v1.2 Key value parser with default handler support (HO)}
\Msg{************************************************************************}
\keepsilent
@@ -78,7 +79,7 @@
This is a generated file.
-Copyright (C) 2006 by Heiko Oberdiek <oberdiek@uni-freiburg.de>
+Copyright (C) 2006, 2007 by Heiko Oberdiek <oberdiek@uni-freiburg.de>
This work may be distributed and/or modified under the
conditions of the LaTeX Project Public License, either
@@ -95,7 +96,7 @@ This Current Maintainer of this work is Heiko Oberdiek.
This work consists of the main source file kvsetkeys.dtx
and the derived files
kvsetkeys.sty, kvsetkeys.pdf, kvsetkeys.ins, kvsetkeys.drv,
- kvsetkeys-example.tex.
+ kvsetkeys-example.tex, kvsetkeys-test1.tex.
\endpreamble
@@ -106,6 +107,7 @@ and the derived files
\file{kvsetkeys.sty}{\from{kvsetkeys.dtx}{package}}%
\usedir{doc/latex/oberdiek}%
\file{kvsetkeys-example.tex}{\from{kvsetkeys.dtx}{example}}%
+ \file{kvsetkeys-test1.tex}{\from{kvsetkeys.dtx}{test1}}%
}
\obeyspaces
@@ -131,7 +133,7 @@ and the derived files
%<*driver>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{kvsetkeys.drv}%
- [2006/10/19 v1.1 Key value parser with default handler support (HO)]%
+ [2007/09/09 v1.2 Key value parser with default handler support (HO)]%
\documentclass{ltxdoc}
\usepackage{holtxdoc}
\begin{document}
@@ -140,7 +142,7 @@ and the derived files
%</driver>
% \fi
%
-% \CheckSum{598}
+% \CheckSum{625}
%
% \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
@@ -161,7 +163,7 @@ and the derived files
% \GetFileInfo{kvsetkeys.drv}
%
% \title{The \xpackage{kvsetkeys} package}
-% \date{2006/10/19 v1.1}
+% \date{2007/09/09 v1.2}
% \author{Heiko Oberdiek\\\xemail{oberdiek@uni-freiburg.de}}
%
% \maketitle
@@ -437,28 +439,29 @@ and the derived files
\fi
\expandafter\x\csname ver@kvsetkeys.sty\endcsname
\ProvidesPackage{kvsetkeys}%
- [2006/10/19 v1.1 Key value parser with default handler support (HO)]
+ [2007/09/09 v1.2 Key value parser with default handler support (HO)]
% \end{macrocode}
%
% \begin{macrocode}
-\expandafter\edef\csname KVS@endinput\endcsname{%
- \catcode39 \the\catcode39 % '
- \catcode44 \the\catcode44 % ,
- \catcode61 \the\catcode61 % =
- \catcode64 \the\catcode64 % @
- \catcode94 \the\catcode94 % ^
- \catcode96 \the\catcode96 % `
- \catcode126 \the\catcode126 % ~
- \relax
- \noexpand\endinput
+\expandafter\edef\csname KVS@AtEnd\endcsname{%
+ \catcode64 \the\catcode64\relax
}
-\catcode39 12 % '
-\catcode44 12 % ,
-\catcode61 12 % =
\catcode64 11 % @
-\catcode94 7 % ^
-\catcode96 12 % `
-\catcode126 13 % ~
+\def\TMP@EnsureCode#1#2{%
+ \edef\KVS@AtEnd{%
+ \KVS@AtEnd
+ \catcode#1 \the\catcode#1\relax
+ }%
+ \catcode#1 #2\relax
+}
+\TMP@EnsureCode{39}{12}% '
+\TMP@EnsureCode{44}{12}% ,
+\TMP@EnsureCode{46}{12}% .
+\TMP@EnsureCode{47}{12}% /
+\TMP@EnsureCode{61}{12}% =
+\TMP@EnsureCode{94}{7}% ^ (superscript)
+\TMP@EnsureCode{96}{12}% `
+\TMP@EnsureCode{126}{13}% ~ (active)
% \end{macrocode}
%
% \begin{macrocode}
@@ -754,54 +757,40 @@ and the derived files
%
% \subsection{Error handling}
%
-% \begin{macro}{\kv@error@novalue}
-% Only a poor \cs{PackageError} is provided by \xfile{miniltx.tex}.
% \begin{macrocode}
-\expandafter\ifx\csname MessageBreak\endcsname\relax
- \def\MessageBreak{^^J}%
-\fi
-\expandafter\ifx\csname @ehc\endcsname\relax
- \def\@ehc{%
- Try typing \space\string<return\string> %
- \space to proceed.\MessageBreak
- If that doesn't work, type \space X %
- \string<return\string> \space to quit\string.%
- }%
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname RequirePackage\endcsname\relax
+ \input infwarerr.sty\relax
+\else
+ \RequirePackage{infwarerr}[2007/09/09]%
\fi
+% \end{macrocode}
+%
+% \begin{macro}{\kv@error@novalue}
+% \begin{macrocode}
\def\kv@error@novalue{%
\kv@error@generic{No value specified for}%
}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\kv@error@unknownkey}
+% \begin{macrocode}
\def\kv@error@unknownkey{%
\kv@error@generic{Undefined}%
}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\kv@error@generic}
+% \begin{macrocode}
\def\kv@error@generic#1#2#3{%
- \begingroup
- \newlinechar=10 %
- \def\MessageBreak{^^J}%
- \expandafter\ifx\csname PackageError\endcsname\relax
- \edef\x{%
- \errhelp{%
- The keyval family of the key `#3' is `#2'.\MessageBreak
- \MessageBreak
- \@ehc
- }%
- }%
- \x
- \errmessage{kvsetkeys: #1 key `#3'}%
- \else
- \edef\x{%
- \noexpand\PackageError{kvsetkeys}{%
- #1 key `#3'%
- }{%
- The keyval family of the key `#3' is `#2'.\MessageBreak
- \MessageBreak
- \@ehc
- }%
- }%
- \x
- \fi
- \endgroup
-}%
+ \@PackageError{kvsetkeys}{%
+ #1 key `#3'%
+ }{%
+ The keyval family of the key `#3' is `#2'.\MessageBreak
+ \MessageBreak
+ \@ehc
+ }%
+}
% \end{macrocode}
% \end{macro}
%
@@ -816,9 +805,64 @@ and the derived files
% \end{macro}
%
% \begin{macrocode}
-\KVS@endinput
+\KVS@AtEnd
%</package>
% \end{macrocode}
+%
+% \section{Test}
+%
+% \subsection{Catcode checks for loading}
+%
+% \begin{macrocode}
+%<*test1>
+% \end{macrocode}
+% \begin{macrocode}
+\catcode`\@=11 %
+\def\RestoreCatcodes{}
+\count@=0 %
+\loop
+ \edef\RestoreCatcodes{%
+ \RestoreCatcodes
+ \catcode\the\count@=\the\catcode\count@\relax
+ }%
+\ifnum\count@<255 %
+ \advance\count@\@ne
+\repeat
+
+\def\RangeCatcodeInvalid#1#2{%
+ \count@=#1\relax
+ \loop
+ \catcode\count@=15 %
+ \ifnum\count@<#2\relax
+ \advance\count@\@ne
+ \repeat
+}
+\def\Test{%
+ \RangeCatcodeInvalid{0}{47}%
+ \RangeCatcodeInvalid{58}{64}%
+ \RangeCatcodeInvalid{91}{96}%
+ \RangeCatcodeInvalid{123}{255}%
+ \catcode`\@=12 %
+ \catcode`\\=0 %
+ \catcode`\{=1 %
+ \catcode`\}=2 %
+ \catcode`\#=6 %
+ \catcode`\[=12 %
+ \catcode`\]=12 %
+ \catcode`\%=14 %
+ \catcode`\ =10 %
+ \catcode13=5 %
+ \input kvsetkeys.sty\relax
+ \RestoreCatcodes
+}
+\Test
+\csname @@end\endcsname
+\end
+% \end{macrocode}
+% \begin{macrocode}
+%</test1>
+% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
@@ -881,6 +925,7 @@ and the derived files
% kvsetkeys.sty & tex/generic/oberdiek/kvsetkeys.sty\\
% kvsetkeys.pdf & doc/latex/oberdiek/kvsetkeys.pdf\\
% kvsetkeys-example.tex & doc/latex/oberdiek/kvsetkeys-example.tex\\
+% kvsetkeys-test1.tex & doc/latex/oberdiek/kvsetkeys-test1.tex\\
% kvsetkeys.dtx & source/latex/oberdiek/kvsetkeys.dtx\\
% \end{tabular}^^A
% }^^A
@@ -1022,6 +1067,12 @@ and the derived files
% \item
% Example added.
% \end{Version}
+% \begin{Version}{2007/09/09 v1.2}
+% \item
+% Using package \xpackage{infwarerr} for error messages.
+% \item
+% Catcode section rewritten.
+% \end{Version}
% \end{History}
%
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/oberdiek/makerobust.dtx b/Master/texmf-dist/source/latex/oberdiek/makerobust.dtx
index 08ab6cb3c80..3783bafc84f 100644
--- a/Master/texmf-dist/source/latex/oberdiek/makerobust.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/makerobust.dtx
@@ -293,6 +293,7 @@ Second page.
% \begin{macrocode}
%</package>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
diff --git a/Master/texmf-dist/source/latex/oberdiek/oberdiek.ins b/Master/texmf-dist/source/latex/oberdiek/oberdiek.ins
index 9371e53e31d..6e1f3d9784a 100644
--- a/Master/texmf-dist/source/latex/oberdiek/oberdiek.ins
+++ b/Master/texmf-dist/source/latex/oberdiek/oberdiek.ins
@@ -1,5 +1,5 @@
% oberdiek.ins
-% 2007/08/16
+% 2007/09/14
%
% Copyright (C) 1999, 2001, 2006 by
% Heiko Oberdiek <oberdiek@uni-freiburg.de>
@@ -55,12 +55,16 @@
\batchinput{ifvtex.dtx}
\batchinput{infwarerr.dtx}
\batchinput{inputenx.dtx}
+\batchinput{intcalc.dtx}
\batchinput{kvoptions.dtx}
\batchinput{kvsetkeys.dtx}
\batchinput{makerobust.dtx}
\batchinput{pagesel.dtx}
+\batchinput{pdfcol.dtx}
\batchinput{pdfcolfoot.dtx}
\batchinput{pdfcolmk.dtx}
+\batchinput{pdfcolparallel.dtx}
+\batchinput{pdfcolparcolumns.dtx}
\batchinput{pdfcrypt.dtx}
\batchinput{pdfescape.dtx}
\batchinput{pdflscape.dtx}
@@ -70,6 +74,7 @@
\batchinput{selinput.dtx}
\batchinput{setouterhbox.dtx}
\batchinput{settobox.dtx}
+\batchinput{soulutf8.dtx}
\batchinput{stackrel.dtx}
\batchinput{stringenc.dtx}
\batchinput{tabularht.dtx}
diff --git a/Master/texmf-dist/source/latex/oberdiek/oberdiek.tex b/Master/texmf-dist/source/latex/oberdiek/oberdiek.tex
index e1eafdfba25..fcad0f2255d 100644
--- a/Master/texmf-dist/source/latex/oberdiek/oberdiek.tex
+++ b/Master/texmf-dist/source/latex/oberdiek/oberdiek.tex
@@ -6,7 +6,7 @@
\newcommand*{\Subject}{CTAN:\CTANdir}
\newcommand*{\Author}{Heiko Oberdiek}
\newcommand*{\Email}{oberdiek@uni-freiburg.de}
-\newcommand*{\Date}{2007/08/16}
+\newcommand*{\Date}{2007/09/14}
% Copyright (C) 2006 by
% Heiko Oberdiek <oberdiek@uni-freiburg.de>
@@ -160,9 +160,9 @@
[\entrysep]
\entry{aliascnt}{2006/09/25}{1.2}{Alias counter}%
[\entrysep]
-\entry{alphalph}{2007/04/11}{1.5}{Converting numbers to letters}%
+\entry{alphalph}{2007/04/11}{2.0}{Converting numbers to letters}%
[\entrysep]
-\entry{atbegshi}{2007/06/06}{1.5}{At begin shipout hook}%
+\entry{atbegshi}{2007/09/09}{1.6}{At begin shipout hook}%
[\entrysep]
\entry{atenddvi}{2007/04/17}{1.1}{At end DVI hook}%
[\entrysep]
@@ -174,7 +174,7 @@
[\entrysep]
\entry{bookmark}{2007/07/13}{1.1}{PDF bookmarks}%
[\entrysep]
-\entry{catchfile}{2007/05/30}{1.0}{Catches the contents of a file}%
+\entry{catchfile}{2007/09/09}{1.1}{Catches the contents of a file}%
[\entrysep]
\entry{centernot}{2007/05/31}{1.1}{Centers the not symbol horizontally}%
[\entrysep]
@@ -186,13 +186,13 @@
[\entrysep]
\entry{dvipscol}{2006/02/20}{1.1}{Fix for dvips.def}%
[\entrysep]
-\entry{embedfile}{2007/04/11}{1.1}{embed files into PDF}%
+\entry{embedfile}{2007/09/09}{1.2}{embed files into PDF}%
[\entrysep]
-\entry{engord}{2007/04/26}{1.4}{Provides the ifpdf switch}%
+\entry{engord}{2007/09/09}{1.5}{Provides the ifpdf switch}%
[\entrysep]
\entry{epstopdf}{2007/04/26}{1.4}{Conversion with epstopdf on the fly}%
[\entrysep]
-\entry{etexcmds}{2007/05/06}{1.0}{Providing prefix for e-TeX command names}%
+\entry{etexcmds}{2007/09/09}{1.1}{Providing prefix for e-TeX command names}%
[\entrysep]
\entry{flags}{2007/03/07}{0.3}{Flag setting in bit fields}%
[\entrysep]
@@ -212,31 +212,39 @@
[\entrysep]
\entry{ifdraft}{2006/02/20}{1.2}{Switch for option draft}%
[\entrysep]
-\entry{iflang}{2007/04/26}{1.3}{Language checks}%
+\entry{iflang}{2007/09/09}{1.4}{Language checks}%
[\entrysep]
-\entry{ifpdf}{2006/02/20}{1.4}{Provides the ifpdf switch}%
+\entry{ifpdf}{2007/09/09}{1.5}{Provides the ifpdf switch}%
[\entrysep]
-\entry{ifvtex}{2007/01/10}{1.2}{Switches for detecting VTeX and its modes}%
+\entry{ifvtex}{2007/09/09}{1.3}{Switches for detecting VTeX and its modes}%
[\entrysep]
-\entry{infwarerr}{2007/06/14}{1.1}{Providing info/warning/message}%
+\entry{infwarerr}{2007/09/09}{1.2}{Providing info/warning/message}%
[\entrysep]
\entry{inputenx}{2007/08/16}{1.3}{Enhanced input encoding handling}%
[\entrysep]
+\entry{intcalc}{2007/09/09}{1.0}{Expandable integer calculations}%
+[\entrysep]
\entry{kvoptions}{2007/06/11}{2.7}{Connects package keyval with \LaTeX{} options}%
[\entrysep]
-\entry{kvsetkeys}{2006/10/19}{1.1}{Key value parser with default handler support}%
+\entry{kvsetkeys}{2007/09/09}{1.2}{Key value parser with default handler support}%
[\entrysep]
\entry{makerobust}{2006/03/18}{1.0}{Making a macro robust}%
[\entrysep]
\entry{pagesel}{2007/04/12}{1.7}{Selecting shipout output pages}%
[\entrysep]
-\entry{pdfcolfoot}{2007/01/08}{1.0}{pdfTeX's color stack for footnotes}%
+\entry{pdfcol}{2007/09/09}{1.0}{Maintaining additional color stacks for pdfTeX}%
+[\entrysep]
+\entry{pdfcolfoot}{2007/09/09}{1.1}{pdfTeX's color stack for footnotes}%
[\entrysep]
\entry{pdfcolmk}{2007/04/11}{1.1}{PDFtex COLor MarK}%
[\entrysep]
+\entry{pdfcolparallel}{2007/09/09}{1.0}{Color stacks support for parallel}%
+[\entrysep]
+\entry{pdfcolparcolumns}{2007/09/09}{1.1}{Color stacks support for parcolumns}%
+[\entrysep]
\entry{pdfcrypt}{2007/04/26}{1.0}{Setting pdf encryption}%
[\entrysep]
-\entry{pdfescape}{2007/04/21}{1.4}{Provides hex, PDF name and string conversions}%
+\entry{pdfescape}{2007/09/09}{1.6}{Provides hex, PDF name and string conversions}%
[\entrysep]
\entry{pdflscape}{2007/04/17}{0.8}{Landscape pages in PDF}%
[\entrysep]
@@ -246,21 +254,23 @@
[\entrysep]
\entry{refcount}{2006/02/20}{3.0}{Data extraction from references}%
[\entrysep]
-\entry{selinput}{2007/06/20}{1.1}{Select input encoding}%
+\entry{selinput}{2007/09/09}{1.2}{Select input encoding}%
[\entrysep]
-\entry{setouterhbox}{2007/05/17}{1.6}{Set hbox in outer horizontal mode}%
+\entry{setouterhbox}{2007/09/09}{1.7}{Set hbox in outer horizontal mode}%
[\entrysep]
\entry{settobox}{2007/04/11}{1.3}{Getting box sizes}%
[\entrysep]
+\entry{soulutf8}{2007/09/09}{1.0}{Adding support for UTF-8 to soul}%
+[\entrysep]
\entry{stackrel}{2007/05/06}{1.1}{Adding subscript option to stackrel}%
[\entrysep]
-\entry{stringenc}{2007/06/16}{1.1}{Converts strings between encodings}%
+\entry{stringenc}{2007/09/09}{1.2}{Converts strings between encodings}%
[\entrysep]
\entry{tabularht}{2007/04/11}{2.5}{Tabular with height specification}%
[\entrysep]
\entry{tabularkv}{2006/02/20}{1.1}{Key value interface for tabular parameters}%
[\entrysep]
-\entry{telprint}{2007/04/11}{1.8}{Formatting of German phone numbers}%
+\entry{telprint}{2007/09/09}{1.9}{Formatting of German phone numbers}%
[\entrysep]
\entry{transparent}{2007/01/08}{1.0}{Using a pdfTeX's color stack for transparency}%
[\entrysep]
@@ -296,9 +306,8 @@ share the same counter register and clear list.
\subsection{\pkgsectformat{alphalph}}
\label{alphalph}
\begin{abstract}
-The package provides the new expandable commands \cs{alphalph}
-and \cs{AlphAlph}. They are like \cs{number}, but the expansion
-consists of lowercase and uppercase letters respectively.
+The package provides methods to represent numbers with a limited
+set of symbols. Both \LaTeX\ and \plainTeX are supported.
\end{abstract}
\tocinclude{alphalph}
@@ -439,7 +448,7 @@ uses of the stack to avoid the error ``out of coor stack space''.
\label{embedfile}
\begin{abstract}
This package embeds files to a PDF document.
-Currently \pdfTeX\ >= 1.30 in PDF mode is supported only.
+Currently the only supported driver is \pdfTeX\ $>=$ 1.30 in PDF mode.
\end{abstract}
\tocinclude{embedfile}
@@ -622,6 +631,15 @@ serves as more uptodate replacement for package \xpackage{inputenc}.
\tocinclude{inputenx}
\newpage
+\subsection{\pkgsectformat{intcalc}}
+\label{intcalc}
+\begin{abstract}
+This package provides expandable arithmetic operations
+with integers.
+\end{abstract}
+\tocinclude{intcalc}
+
+\newpage
\subsection{\pkgsectformat{kvoptions}}
\label{kvoptions}
\begin{abstract}
@@ -660,6 +678,18 @@ Single pages or page areas can be selected for output.
\tocinclude{pagesel}
\newpage
+\subsection{\pkgsectformat{pdfcol}}
+\label{pdfcol}
+\begin{abstract}
+Since version 1.40 \pdfTeX\ supports color stacks.
+The driver file \xfile{pdftex.def} for package \xpackage{color}
+defines and uses a main color stack since version v0.04b.
+Package \xpackage{pdfcol} is intended for package writers.
+It defines macros for setting and maintaining new color stacks.
+\end{abstract}
+\tocinclude{pdfcol}
+
+\newpage
\subsection{\pkgsectformat{pdfcolfoot}}
\label{pdfcolfoot}
\begin{abstract}
@@ -679,6 +709,26 @@ stack of \pdfTeX.
\tocinclude{pdfcolmk}
\newpage
+\subsection{\pkgsectformat{pdfcolparallel}}
+\label{pdfcolparallel}
+\begin{abstract}
+Since version 1.40 \pdfTeX\ supports several color stacks.
+This package uses them to fix color problems in
+package \xpackage{parallel}.
+\end{abstract}
+\tocinclude{pdfcolparallel}
+
+\newpage
+\subsection{\pkgsectformat{pdfcolparcolumns}}
+\label{pdfcolparcolumns}
+\begin{abstract}
+Since version 1.40 \pdfTeX\ supports several color stacks.
+This package uses them to fix color problems in
+package \xpackage{parcolumns}.
+\end{abstract}
+\tocinclude{pdfcolparcolumns}
+
+\newpage
\subsection{\pkgsectformat{pdfcrypt}}
\label{pdfcrypt}
\begin{abstract}
@@ -772,6 +822,17 @@ to \LaTeX's \cs{settowidth} commands.
\tocinclude{settobox}
\newpage
+\subsection{\pkgsectformat{soulutf8}}
+\label{soulutf8}
+\begin{abstract}
+This package extends package \xpackage{soul} and adds some support
+for UTF-8. Namely the input encodings \xfile{utf8.def}
+from package \xpackage{inputenc} and
+package \xpackage{ucs}'s \xfile{utf8x.def} are supported.
+\end{abstract}
+\tocinclude{soulutf8}
+
+\newpage
\subsection{\pkgsectformat{stackrel}}
\label{stackrel}
\begin{abstract}
diff --git a/Master/texmf-dist/source/latex/oberdiek/pagesel.dtx b/Master/texmf-dist/source/latex/oberdiek/pagesel.dtx
index 02f8721db94..f1c0b78606e 100644
--- a/Master/texmf-dist/source/latex/oberdiek/pagesel.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/pagesel.dtx
@@ -607,6 +607,7 @@ and the derived files
% \begin{macrocode}
%</package>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
diff --git a/Master/texmf-dist/source/latex/oberdiek/pdfcol.dtx b/Master/texmf-dist/source/latex/oberdiek/pdfcol.dtx
new file mode 100644
index 00000000000..76caa82f6b4
--- /dev/null
+++ b/Master/texmf-dist/source/latex/oberdiek/pdfcol.dtx
@@ -0,0 +1,942 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2007 by Heiko Oberdiek <oberdiek@uni-freiburg.de>
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either
+% version 1.3 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.3 or later is part of all distributions of
+% LaTeX version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status "maintained".
+%
+% This Current Maintainer of this work is Heiko Oberdiek.
+%
+% This work consists of the main source file pdfcol.dtx
+% and the derived files
+% pdfcol.sty, pdfcol.pdf, pdfcol.ins, pdfcol.drv,
+% pdfcol-test1.tex, pdfcol-test2.tex, pdfcol-test3.tex.
+%
+% Distribution:
+% CTAN:macros/latex/contrib/oberdiek/pdfcol.dtx
+% CTAN:macros/latex/contrib/oberdiek/pdfcol.pdf
+%
+% Unpacking:
+% (a) If pdfcol.ins is present:
+% tex pdfcol.ins
+% (b) Without pdfcol.ins:
+% tex pdfcol.dtx
+% (c) If you insist on using LaTeX
+% latex \let\install=y\input{pdfcol.dtx}
+% (quote the arguments according to the demands of your shell)
+%
+% Documentation:
+% (a) If pdfcol.drv is present:
+% latex pdfcol.drv
+% (b) Without pdfcol.drv:
+% latex pdfcol.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 pdfcol.dtx
+% makeindex -s gind.ist pdfcol.idx
+% pdflatex pdfcol.dtx
+% makeindex -s gind.ist pdfcol.idx
+% pdflatex pdfcol.dtx
+%
+% Installation:
+% TDS:tex/generic/oberdiek/pdfcol.sty
+% TDS:doc/latex/oberdiek/pdfcol.pdf
+% TDS:doc/latex/oberdiek/pdfcol-test1.tex
+% TDS:doc/latex/oberdiek/pdfcol-test2.tex
+% TDS:doc/latex/oberdiek/pdfcol-test3.tex
+% TDS:source/latex/oberdiek/pdfcol.dtx
+%
+%<*ignore>
+\begingroup
+ \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: pdfcol 2007/09/09 v1.0 Maintaining additional color stacks for pdfTeX (HO)}
+\Msg{************************************************************************}
+
+\keepsilent
+\askforoverwritefalse
+
+\preamble
+
+This is a generated file.
+
+Copyright (C) 2007 by Heiko Oberdiek <oberdiek@uni-freiburg.de>
+
+This work may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either
+version 1.3 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.3 or later is part of all distributions of
+LaTeX version 2005/12/01 or later.
+
+This work has the LPPL maintenance status "maintained".
+
+This Current Maintainer of this work is Heiko Oberdiek.
+
+This work consists of the main source file pdfcol.dtx
+and the derived files
+ pdfcol.sty, pdfcol.pdf, pdfcol.ins, pdfcol.drv,
+ pdfcol-test1.tex, pdfcol-test2.tex, pdfcol-test3.tex.
+
+\endpreamble
+
+\generate{%
+ \file{pdfcol.ins}{\from{pdfcol.dtx}{install}}%
+ \file{pdfcol.drv}{\from{pdfcol.dtx}{driver}}%
+ \usedir{tex/generic/oberdiek}%
+ \file{pdfcol.sty}{\from{pdfcol.dtx}{package}}%
+ \usedir{doc/latex/oberdiek}%
+ \file{pdfcol-test1.tex}{\from{pdfcol.dtx}{test1}}%
+ \file{pdfcol-test2.tex}{\from{pdfcol.dtx}{test2}}%
+ \file{pdfcol-test3.tex}{\from{pdfcol.dtx}{test3}}%
+}
+
+\obeyspaces
+\Msg{************************************************************************}
+\Msg{*}
+\Msg{* To finish the installation you have to move the following}
+\Msg{* file into a directory searched by TeX:}
+\Msg{*}
+\Msg{* pdfcol.sty}
+\Msg{*}
+\Msg{* To produce the documentation run the file `pdfcol.drv'}
+\Msg{* through LaTeX.}
+\Msg{*}
+\Msg{* Happy TeXing!}
+\Msg{*}
+\Msg{************************************************************************}
+
+\endbatchfile
+%</install>
+%<*ignore>
+\fi
+%</ignore>
+%<*driver>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesFile{pdfcol.drv}%
+ [2007/09/09 v1.0 Maintaining additional color stacks for pdfTeX (HO)]%
+\documentclass{ltxdoc}
+\usepackage{holtxdoc}
+\begin{document}
+ \DocInput{pdfcol.dtx}%
+\end{document}
+%</driver>
+% \fi
+%
+% \CheckSum{499}
+%
+% \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{pdfcol.drv}
+%
+% \title{The \xpackage{pdfcol} package}
+% \date{2007/09/09 v1.0}
+% \author{Heiko Oberdiek\\\xemail{oberdiek@uni-freiburg.de}}
+%
+% \maketitle
+%
+% \begin{abstract}
+% Since version 1.40 \pdfTeX\ supports color stacks.
+% The driver file \xfile{pdftex.def} for package \xpackage{color}
+% defines and uses a main color stack since version v0.04b.
+% Package \xpackage{pdfcol} is intended for package writers.
+% It defines macros for setting and maintaining new color stacks.
+% \end{abstract}
+%
+% \tableofcontents
+%
+% \section{Documentation}
+%
+% Version 1.40 of \pdfTeX\ adds new primitives \cs{pdfcolorstackinit}
+% and \cs{pdfcolorstack}. Now color stacks can be defined and used.
+% A main color stack is maintained by the driver file \xfile{pdftex.def}
+% similar to dvips or dvipdfm. However the number of color stacks
+% is not limited to one in \pdfTeX. Thus further color problems
+% can now be solved, such as footnotes across pages or text
+% that is set in parallel columns (e.g. packages \xpackage{parallel}
+% or \xpackage{parcolumn}). Unlike the main color stack,
+% the support by additional color stacks cannot be done in
+% a transparent manner.
+%
+% This package \xpackage{pdfcol} provides an easier interface to
+% additional color stacks without the need to use the
+% low level primitives.
+%
+% \subsection{Requirements}
+% \label{sec:req}
+%
+% \begin{itemize}
+% \item
+% \pdfTeX\ 1.40 or greater.
+% \item
+% \pdfTeX in PDF mode. (I don't know a DVI driver that
+% support several color stacks.)
+% \item
+% \xfile{pdftex.def} 2007/01/02 v0.04b.
+% \end{itemize}
+% Package \xpackage{pdfcol} checks the requirements and
+% sets switch \cs{ifpdfcolAvailable} accordingly.
+%
+% \subsection{Interface}
+%
+% \begin{declcs}{ifpdfcolAvailable}
+% \end{declcs}
+% If the requirements of section \ref{sec:req} are met the
+% switch \cs{ifpdfcolAvailable} behaves as \cs{iftrue}.
+% Otherwise the other interface macros in this section will
+% be disabled with a message. Also the first use of such a
+% macro will print a message. The messages are print to
+% the \xext{.log} file only if \pdfTeX\ is not used in PDF mode.
+%
+% \begin{declcs}{pdfcolErrorNoStacks}
+% \end{declcs}
+% The first call of \cs{pdfcolErrorNoStacks} prints an error
+% message, if color stacks are not available.
+%
+% \begin{declcs}{pdfcolInitStack} \M{name}
+% \end{declcs}
+% A new color stack is initialized by \cs{pdfcolInitStack}.
+% The \meta{name} is used for indentifying the stack. It usually
+% consists of letters and digits. (The name must survive a \cs{csname}.)
+%
+% The intension of the macro is the definition of an additional
+% color stack. Thus the stack is not page bounded like the
+% main color stack. Black (\texttt{0 g 0 G}) is used as initial
+% color value. And colors are written with modifier \texttt{direct}
+% that means without setting the current transfer matrix and changing
+% the current point (see documentation of \pdfTeX\ for
+% |\pdfliteral direct{...}|).
+%
+% \begin{declcs}{pdfcolIfStackExists} \M{name} \M{then} \M{else}
+% \end{declcs}
+% Macro \cs{pdfcolIfStackExists} checks whether color stack \meta{name}
+% exists. In case of success argument \meta{then} is executed
+% and \meta{else} otherwise.
+%
+% \begin{declcs}{pdfcolSwitchStack} \M{name}
+% \end{declcs}
+% Macro \cs{pdfcolSwitchStack} switches the color stack. The color macros
+% of package \xpackage{color} (or \xpackage{xcolor}) now uses the
+% new color stack with name \meta{name}.
+%
+% \begin{declcs}{pdfcolSetCurrent} \M{name}
+% \end{declcs}
+% Macro \cs{pdfcolSetCurrent} sets the color that is read in
+% the top-most entry of color stack \meta{name}. If \meta{name}
+% is empty, the default color stack is used.
+%
+% \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
+ \catcode44 12 % ,
+ \catcode45 12 % -
+ \catcode46 12 % .
+ \catcode58 12 % :
+ \catcode64 11 % @
+ \expandafter\let\expandafter\x\csname ver@pdfcol.sty\endcsname
+ \ifcase 0%
+ \ifx\x\relax % plain
+ \else
+ \ifx\x\empty % LaTeX
+ \else
+ 1%
+ \fi
+ \fi
+ \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{pdfcol}{The package is already loaded}%
+ \endgroup
+ \expandafter\endinput
+ \fi
+\endgroup
+% \end{macrocode}
+% Package identification:
+% \begin{macrocode}
+\begingroup
+ \catcode40 12 % (
+ \catcode41 12 % )
+ \catcode44 12 % ,
+ \catcode45 12 % -
+ \catcode46 12 % .
+ \catcode47 12 % /
+ \catcode58 12 % :
+ \catcode64 11 % @
+ \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\relax
+ \xdef#1{#3}%
+ \fi
+ }%
+ \fi
+\expandafter\x\csname ver@pdfcol.sty\endcsname
+\ProvidesPackage{pdfcol}%
+ [2007/09/09 v1.0 Maintaining additional color stacks for pdfTeX (HO)]
+% \end{macrocode}
+%
+% \subsection{Catcodes}
+%
+% \begin{macrocode}
+\expandafter\edef\csname PDFCOL@AtEnd\endcsname{%
+ \catcode64 \the\catcode64\relax
+}
+\catcode64 11 % @
+\def\TMP@EnsureCode#1#2{%
+ \edef\PDFCOL@AtEnd{%
+ \PDFCOL@AtEnd
+ \catcode#1 \the\catcode#1\relax
+ }%
+ \catcode#1 #2\relax
+}
+\TMP@EnsureCode{39}{12}% '
+\TMP@EnsureCode{40}{12}% (
+\TMP@EnsureCode{41}{12}% )
+\TMP@EnsureCode{43}{12}% +
+\TMP@EnsureCode{44}{12}% ,
+\TMP@EnsureCode{46}{12}% .
+\TMP@EnsureCode{47}{12}% /
+\TMP@EnsureCode{61}{12}% =
+\TMP@EnsureCode{96}{12}% `
+% \end{macrocode}
+%
+% \subsection{Check requirements}
+%
+% \begin{macro}{ifpdfcolAvailable}
+% \begin{macrocode}
+\newif\ifpdfcolAvailable
+\pdfcolAvailabletrue
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PDFCOL@RequirePackage}
+% \begin{macrocode}
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname RequirePackage\endcsname\relax
+ \def\PDFCOL@RequirePackage#1[#2]{\input #1.sty\relax}%
+\else
+ \def\PDFCOL@RequirePackage#1[#2]{%
+ \RequirePackage{#1}[{#2}]%
+ }%
+\fi
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Check PDF mode}
+%
+% \begin{macrocode}
+\PDFCOL@RequirePackage{infwarerr}[2007/09/09]
+\PDFCOL@RequirePackage{ifpdf}[2007/09/09]
+\ifpdf
+ \def\PDFCOL@Message{%
+ \@PackageWarningNoLine{pdfcol}%
+ }%
+\else
+ \pdfcolAvailablefalse
+ \def\PDFCOL@Message{%
+ \@PackageInfoNoLine{pdfcol}%
+ }%
+ \PDFCOL@Message{%
+ Interface disabled because of missing PDF mode of pdfTeX%
+ }%
+\fi
+% \end{macrocode}
+%
+% \subsubsection{Check version of \pdfTeX}
+%
+% \begin{macrocode}
+\ifpdfcolAvailable
+ \begingroup\expandafter\expandafter\expandafter\endgroup
+ \expandafter\ifx\csname pdfcolorstack\endcsname\relax
+ \pdfcolAvailablefalse
+ \PDFCOL@Message{%
+ Interface disabled because of too old pdfTeX.\MessageBreak
+ Required is version 1.40+ for \string\pdfcolorstack
+ }%
+ \fi
+\fi
+\ifpdfcolAvailable
+ \begingroup\expandafter\expandafter\expandafter\endgroup
+ \expandafter\ifx\csname pdfcolorstack\endcsname\relax
+ \pdfcolAvailablefalse
+ \PDFCOL@Message{%
+ Interface disabled because of too old pdfTeX.\MessageBreak
+ Required is version 1.40+ for \string\pdfcolorstackinit
+ }%
+ \fi
+\fi
+% \end{macrocode}
+%
+% \subsubsection{Check \xfile{pdftex.def}}
+%
+% \begin{macrocode}
+\ifpdfcolAvailable
+ \begingroup\expandafter\expandafter\expandafter\endgroup
+ \expandafter\ifx\csname @pdfcolorstack\endcsname\relax
+% \end{macrocode}
+% Try to load package color if it is not yet loaded (\LaTeX\ case).
+% \begin{macrocode}
+ \begingroup\expandafter\expandafter\expandafter\endgroup
+ \expandafter\ifx\csname ver@color.sty\endcsname\relax
+ \begingroup\expandafter\expandafter\expandafter\endgroup
+ \expandafter\ifx\csname documentclass\endcsname\relax
+ \else
+ \RequirePackage[pdftex]{color}\relax
+ \fi
+ \fi
+ \begingroup\expandafter\expandafter\expandafter\endgroup
+ \expandafter\ifx\csname @pdfcolorstack\endcsname\relax
+ \pdfcolAvailablefalse
+ \PDFCOL@Message{%
+ Interface disabled because `pdftex.def'\MessageBreak
+ is not loaded or it is too old.\MessageBreak
+ Required is version 0.04b or greater%
+ }%
+ \fi
+ \fi
+\fi
+% \end{macrocode}
+%
+% \begin{macrocode}
+\let\pdfcolAvailabletrue\relax
+\let\pdfcolAvailablefalse\relax
+% \end{macrocode}
+%
+% \subsection{Enabled interface macros}
+%
+% \begin{macrocode}
+\ifpdfcolAvailable
+% \end{macrocode}
+%
+% \begin{macro}{\pdfcolErrorNoStacks}
+% \begin{macrocode}
+ \let\pdfcolErrorNoStacks\relax
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\pdfcol@Value}
+% \begin{macrocode}
+ \expandafter\ifx\csname pdfcol@Value\endcsname\relax
+ \def\pdfcol@Value{0 g 0 G}%
+ \fi
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\pdfcol@LiteralModifier}
+% \begin{macrocode}
+ \expandafter\ifx\csname pdfcol@LiteralModifier\endcsname\relax
+ \def\pdfcol@LiteralModifier{direct}%
+ \fi
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\pdfcolInitStack}
+% \begin{macrocode}
+ \def\pdfcolInitStack#1{%
+ \expandafter\ifx\csname pdfcol@Stack@#1\endcsname\relax
+ \global\expandafter\chardef\csname pdfcol@Stack@#1\endcsname=%
+ \pdfcolorstackinit\pdfcol@LiteralModifier{\pdfcol@Value}%
+ \relax
+ \@PackageInfo{pdfcol}{%
+ New color stack `#1' = \number\csname pdfcol@Stack@#1\endcsname
+ }%
+ \else
+ \@PackageError{pdfcol}{%
+ Stack `#1' is already defined%
+ }\@ehc
+ \fi
+ }%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\pdfcolIfStackExists}
+% \begin{macrocode}
+ \def\pdfcolIfStackExists#1{%
+ \expandafter\ifx\csname pdfcol@Stack@#1\endcsname\relax
+ \expandafter\@secondoftwo
+ \else
+ \expandafter\@firstoftwo
+ \fi
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@firstoftwo}
+% \begin{macrocode}
+ \expandafter\ifx\csname @firstoftwo\endcsname\relax
+ \long\def\@firstoftwo#1#2{#1}%
+ \fi
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\@secondoftwo}
+% \begin{macrocode}
+ \expandafter\ifx\csname @secondoftwo\endcsname\relax
+ \long\def\@secondoftwo#1#2{#2}%
+ \fi
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\pdfcolSwitchStack}
+% \begin{macrocode}
+ \def\pdfcolSwitchStack#1{%
+ \pdfcolIfStackExists{#1}{%
+ \expandafter\let\expandafter\@pdfcolorstack
+ \csname pdfcol@Stack@#1\endcsname
+ }{%
+ \pdfcol@ErrorNoStack{#1}%
+ }%
+ }%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\pdfcolSetCurrent}
+% \begin{macrocode}
+ \def\pdfcolSetCurrent#1{%
+ \ifx\\#1\\%
+ \pdfcolorstack\@pdfcolorstack current\relax
+ \else
+ \pdfcolIfStackExists{#1}{%
+ \pdfcolorstack\csname pdfcol@Stack@#1\endcsname current\relax
+ }{%
+ \pdfcol@ErrorNoStack{#1}%
+ }%
+ \fi
+ }%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\pdfcol@ErrorNoStack}
+% \begin{macrocode}
+ \def\pdfcol@ErrorNoStack#1{%
+ \@PackageError{pdfcol}{Stack `#1' does not exists}\@ehc
+ }%
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Disabled interface macros}
+%
+% \begin{macrocode}
+\else
+% \end{macrocode}
+%
+% \begin{macro}{\pdfcolErrorNoStacks}
+% \begin{macrocode}
+ \def\pdfcolErrorNoStacks{%
+ \@PackageError{pdfcol}{%
+ Color stacks are not available%
+ }{%
+ Update pdfTeX (1.40) and `pdftex.def' (0.04b) %
+ if necessary.\MessageBreak
+ Ensure that `pdftex.def' is loaded %
+ (package `color' or `xcolor').\MessageBreak
+ Further messages can be found in TeX's %
+ protocol file `\jobname.log'.\MessageBreak
+ \MessageBreak
+ \@ehc
+ }%
+ \global\let\pdfcolErrorNoStacks\relax
+ }%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\PDFCOL@Disabled}
+% \begin{macrocode}
+ \def\PDFCOL@Disabled{%
+ \PDFCOL@Message{%
+ pdfTeX's color stacks are not available%
+ }%
+ \global\let\PDFCOL@Disabled\relax
+ }%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\pdfcolInitStack}
+% \begin{macrocode}
+ \def\pdfcolInitStack#1{%
+ \PDFCOL@Disabled
+ }%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\pdfcolIfStackExists}
+% \begin{macrocode}
+ \long\def\pdfcolIfStackExists#1#2#3{#3}%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\pdfcolSwitchStack}
+% \begin{macrocode}
+ \def\pdfcolSwitchStack#1{%
+ \PDFCOL@Disabled
+ }%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\pdfcolSetCurrent}
+% \begin{macrocode}
+ \def\pdfcolSetCurrent#1{%
+ \PDFCOL@Disabled
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+\fi
+% \end{macrocode}
+%
+% \begin{macrocode}
+\PDFCOL@AtEnd
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+% \section{Test}
+%
+% \subsection{Catcode checks for loading}
+%
+% \begin{macrocode}
+%<*test1>
+% \end{macrocode}
+% \begin{macrocode}
+\catcode`\@=11 %
+\def\RestoreCatcodes{}
+\count@=0 %
+\loop
+ \edef\RestoreCatcodes{%
+ \RestoreCatcodes
+ \catcode\the\count@=\the\catcode\count@\relax
+ }%
+\ifnum\count@<255 %
+ \advance\count@\@ne
+\repeat
+
+\def\RangeCatcodeInvalid#1#2{%
+ \count@=#1\relax
+ \loop
+ \catcode\count@=15 %
+ \ifnum\count@<#2\relax
+ \advance\count@\@ne
+ \repeat
+}
+\def\Test{%
+ \RangeCatcodeInvalid{0}{47}%
+ \RangeCatcodeInvalid{58}{64}%
+ \RangeCatcodeInvalid{91}{96}%
+ \RangeCatcodeInvalid{123}{255}%
+ \catcode`\@=12 %
+ \catcode`\\=0 %
+ \catcode`\{=1 %
+ \catcode`\}=2 %
+ \catcode`\#=6 %
+ \catcode`\[=12 %
+ \catcode`\]=12 %
+ \catcode`\%=14 %
+ \catcode`\ =10 %
+ \catcode13=5 %
+ \input pdfcol.sty\relax
+ \RestoreCatcodes
+}
+\Test
+\csname @@end\endcsname
+\end
+% \end{macrocode}
+% \begin{macrocode}
+%</test1>
+% \end{macrocode}
+%
+% \subsection{Very simple test}
+%
+% \begin{macrocode}
+%<*test2|test3>
+\NeedsTeXFormat{LaTeX2e}
+\nofiles
+\documentclass{article}
+\usepackage{pdfcol}[2007/09/09]
+\usepackage{qstest}
+\IncludeTests{*}
+\LogTests{log}{*}{*}
+\begin{document}
+ \begin{qstest}{pdfcol}{}%
+ \makeatletter
+%<*test2>
+ \Expect*{\ifpdfcolAvailable true\else false\fi}{false}%
+%</test2>
+%<*test3>
+ \Expect*{\ifpdfcolAvailable true\else false\fi}{true}%
+ \Expect*{\number\@pdfcolorstack}{0}%
+%</test3>
+ \setbox0=\hbox{%
+ \pdfcolInitStack{test}%
+%<*test3>
+ \Expect*{\number\pdfcol@Stack@test}{1}%
+ \Expect*{\number\@pdfcolorstack}{0}%
+%</test3>
+ \pdfcolSwitchStack{test}%
+%<*test3>
+ \Expect*{\number\@pdfcolorstack}{1}%
+%</test3>
+ \pdfcolSetCurrent{test}%
+ \pdfcolSetCurrent{}%
+ }%
+ \Expect*{\the\wd0}{0.0pt}%
+%<*test3>
+ \Expect*{\number\@pdfcolorstack}{0}%
+ \Expect*{\number\pdfcol@Stack@test}{1}%
+ \Expect*{\pdfcolIfStackExists{test}{true}{false}}{true}%
+%</test3>
+ \Expect*{\pdfcolIfStackExists{dummy}{true}{false}}{false}%
+ \end{qstest}%
+\end{document}
+%</test2|test3>
+% \end{macrocode}
+%
+% \section{Installation}
+%
+% \subsection{Download}
+%
+% \paragraph{Package.} This package is available on
+% CTAN\footnote{\url{ftp://ftp.ctan.org/tex-archive/}}:
+% \begin{description}
+% \item[\CTAN{macros/latex/contrib/oberdiek/pdfcol.dtx}] The source file.
+% \item[\CTAN{macros/latex/contrib/oberdiek/pdfcol.pdf}] Documentation.
+% \end{description}
+%
+%
+% \paragraph{Bundle.} All the packages of the bundle `oberdiek'
+% 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[\CTAN{macros/latex/contrib/oberdiek/oberdiek-tds.zip}]
+% \end{description}
+% \emph{TDS} refers to the standard ``A Directory Structure
+% for \TeX\ Files'' (\CTAN{tds/tds.pdf}). Directories
+% with \xfile{texmf} in their name are usually organized this way.
+%
+% \subsection{Bundle installation}
+%
+% \paragraph{Unpacking.} Unpack the \xfile{oberdiek-tds.zip} in the
+% TDS tree (also known as \xfile{texmf} tree) of your choice.
+% Example (linux):
+% \begin{quote}
+% |unzip oberdiek-tds.zip -d ~/texmf|
+% \end{quote}
+%
+% \paragraph{Script installation.}
+% Check the directory \xfile{TDS:scripts/oberdiek/} for
+% scripts that need further installation steps.
+% Package \xpackage{attachfile2} comes with the Perl script
+% \xfile{pdfatfi.pl} that should be installed in such a way
+% that it can be called as \texttt{pdfatfi}.
+% Example (linux):
+% \begin{quote}
+% |chmod +x scripts/oberdiek/pdfatfi.pl|\\
+% |cp scripts/oberdiek/pdfatfi.pl /usr/local/bin/|
+% \end{quote}
+%
+% \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 pdfcol.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@{}}
+% pdfcol.sty & tex/generic/oberdiek/pdfcol.sty\\
+% pdfcol.pdf & doc/latex/oberdiek/pdfcol.pdf\\
+% pdfcol-test1.tex & doc/latex/oberdiek/pdfcol-test1.tex\\
+% pdfcol-test2.tex & doc/latex/oberdiek/pdfcol-test2.tex\\
+% pdfcol-test3.tex & doc/latex/oberdiek/pdfcol-test3.tex\\
+% pdfcol.dtx & source/latex/oberdiek/pdfcol.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
+% (\teTeX, \mikTeX, \dots) relies on file name databases, you must refresh
+% these. For example, \teTeX\ users run \verb|texhash| or
+% \verb|mktexlsr|.
+%
+% \subsection{Some details for the interested}
+%
+% \paragraph{Attached source.}
+%
+% The PDF documentation on CTAN also includes the
+% \xfile{.dtx} source file. It can be extracted by
+% AcrobatReader 6 or higher. Another option is \textsf{pdftk},
+% e.g. unpack the file into the current directory:
+% \begin{quote}
+% \verb|pdftk pdfcol.pdf unpack_files output .|
+% \end{quote}
+%
+% \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{pdfcol.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 pdfcol.dtx
+%makeindex -s gind.ist pdfcol.idx
+%pdflatex pdfcol.dtx
+%makeindex -s gind.ist pdfcol.idx
+%pdflatex pdfcol.dtx
+%\end{verbatim}
+% \end{quote}
+%
+% \begin{History}
+% \begin{Version}{2007/09/09 v1.0}
+% \item
+% First version.
+% \end{Version}
+% \end{History}
+%
+% \PrintIndex
+%
+% \Finale
+\endinput
diff --git a/Master/texmf-dist/source/latex/oberdiek/pdfcolfoot.dtx b/Master/texmf-dist/source/latex/oberdiek/pdfcolfoot.dtx
index d21afa50a89..2b30d204b11 100644
--- a/Master/texmf-dist/source/latex/oberdiek/pdfcolfoot.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/pdfcolfoot.dtx
@@ -16,7 +16,8 @@
%
% This work consists of the main source file pdfcolfoot.dtx
% and the derived files
-% pdfcolfoot.sty, pdfcolfoot.pdf, pdfcolfoot.ins, pdfcolfoot.drv.
+% pdfcolfoot.sty, pdfcolfoot.pdf, pdfcolfoot.ins, pdfcolfoot.drv,
+% pdfcolfoot-test1.tex.
%
% Distribution:
% CTAN:macros/latex/contrib/oberdiek/pdfcolfoot.dtx
@@ -51,6 +52,7 @@
% Installation:
% TDS:tex/latex/oberdiek/pdfcolfoot.sty
% TDS:doc/latex/oberdiek/pdfcolfoot.pdf
+% TDS:doc/latex/oberdiek/pdfcolfoot-test1.tex
% TDS:source/latex/oberdiek/pdfcolfoot.dtx
%
%<*ignore>
@@ -66,7 +68,7 @@
\input docstrip.tex
\Msg{************************************************************************}
\Msg{* Installation}
-\Msg{* Package: pdfcolfoot 2007/01/08 v1.0 pdfTeX's color stack for footnotes (HO)}
+\Msg{* Package: pdfcolfoot 2007/09/09 v1.1 pdfTeX's color stack for footnotes (HO)}
\Msg{************************************************************************}
\keepsilent
@@ -92,7 +94,8 @@ This Current Maintainer of this work is Heiko Oberdiek.
This work consists of the main source file pdfcolfoot.dtx
and the derived files
- pdfcolfoot.sty, pdfcolfoot.pdf, pdfcolfoot.ins, pdfcolfoot.drv.
+ pdfcolfoot.sty, pdfcolfoot.pdf, pdfcolfoot.ins, pdfcolfoot.drv,
+ pdfcolfoot-test1.tex.
\endpreamble
@@ -101,6 +104,8 @@ and the derived files
\file{pdfcolfoot.drv}{\from{pdfcolfoot.dtx}{driver}}%
\usedir{tex/latex/oberdiek}%
\file{pdfcolfoot.sty}{\from{pdfcolfoot.dtx}{package}}%
+ \usedir{doc/latex/oberdiek}%
+ \file{pdfcolfoot-test1.tex}{\from{pdfcolfoot.dtx}{test1}}%
}
\obeyspaces
@@ -126,7 +131,7 @@ and the derived files
%<*driver>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{pdfcolfoot.drv}%
- [2007/01/08 v1.0 pdfTeX's color stack for footnotes (HO)]%
+ [2007/09/09 v1.1 pdfTeX's color stack for footnotes (HO)]%
\documentclass{ltxdoc}
\usepackage{holtxdoc}
\begin{document}
@@ -135,7 +140,7 @@ and the derived files
%</driver>
% \fi
%
-% \CheckSum{249}
+% \CheckSum{238}
%
% \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
@@ -156,7 +161,7 @@ and the derived files
% \GetFileInfo{pdfcolfoot.drv}
%
% \title{The \xpackage{pdfcolfoot} package}
-% \date{2007/01/08 v1.0}
+% \date{2007/09/09 v1.1}
% \author{Heiko Oberdiek\\\xemail{oberdiek@uni-freiburg.de}}
%
% \maketitle
@@ -255,46 +260,17 @@ and the derived files
%<*package>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{pdfcolfoot}%
- [2007/01/08 v1.0 pdfTeX's color stack for footnotes (HO)]%
+ [2007/09/09 v1.1 pdfTeX's color stack for footnotes (HO)]%
% \end{macrocode}
%
-% \subsection{Initial checks}
+% \subsection{Load package \xpackage{pdfcol}}
%
-% \subsubsection{Check for \pdfTeX\ in PDF mode}
% \begin{macrocode}
-\RequirePackage{ifpdf}
-\ifpdf
+\RequirePackage{pdfcol}[2007/09/09]
+\ifpdfcolAvailable
\else
- \PackageWarningNoLine{pdfcolfoot}{%
- Loading aborted, because pdfTeX is not running in PDF mode%
- }%
- \expandafter\endinput
-\fi
-% \end{macrocode}
-%
-% \subsubsection{Check \pdfTeX\ version}
-% \begin{macrocode}
-\begingroup\expandafter\expandafter\expandafter\endgroup
-\expandafter\ifx\csname pdfcolorstackinit\endcsname\relax
- \PackageWarningNoLine{pdfcolfoot}{%
- Your pdfTeX version does not support color stacks%
- }%
- \expandafter\endinput
-\fi
-% \end{macrocode}
-%
-% \subsubsection{Check \xfile{pdftex.def} version}
-% Force loading of package color with \xfile{pdftex.def}, if this
-% is not already done.
-% \begin{macrocode}
-\@ifpackageloaded{color}{}{\RequirePackage[pdftex]{color}}
-% \end{macrocode}
-% Now we can check the minimal version requirement of \xfile{pdftex.def}.
-% \begin{macrocode}
-\begingroup\expandafter\expandafter\expandafter\endgroup
-\expandafter\ifx\csname @pdfcolorstack\endcsname\relax
- \PackageWarningNoLine{pdfcolfoot}{%
- Your pdftex.def is too old, you need at least 2007/01/02 v0.04b%
+ \PackageInfo{pdfcolfoot}{%
+ Loading aborted, because color stacks are not available%
}%
\expandafter\endinput
\fi
@@ -302,21 +278,11 @@ and the derived files
%
% \subsection{Color stack for footnotes}
%
-% I do not know, why pdftex.def (or other drivers do not define
-% \cs{default@color}. Instead they are defining \cs{current@color}.
-% Therefore it is assumed that in the preamble this color for black
-% is still valid.
+% Version 1.0 has used \cs{current@color} as initial color stack
+% value, since version 1.1 package \xpackage{pdfcol} with its
+% default setting is used.
% \begin{macrocode}
-\newcommand{\pdfcolfoot@stack}{}
-\edef\pdfcolfoot@stack{%
- \pdfcolorstackinit direct{\current@color}%
-}
-\begingroup
- \let\on@line\@empty
- \PackageInfo{pdfcolfoot}{%
- Color stack number: \pdfcolfoot@stack
- }%
-\endgroup
+\pdfcolInitStack{foot}
% \end{macrocode}
%
% \subsection{Patch \cs{@makefntext}}
@@ -326,7 +292,7 @@ and the derived files
% color calls uses the color stack for footnotes.
% \begin{macrocode}
\newcommand*{\pdfcolfoot@switch}{%
- \let\@pdfcolorstack\pdfcolfoot@stack
+ \pdfcolSwitchStack{foot}%
}
% \end{macrocode}
% \end{macro}
@@ -355,7 +321,7 @@ and the derived files
% is available on the current top of the color stack.
% \begin{macrocode}
\newcommand*{\pdfcolfoot@current}{%
- \pdfcolorstack\pdfcolfoot@stack current\relax
+ \pdfcolSetCurrent{foot}%
}
% \end{macrocode}
% \end{macro}
@@ -505,6 +471,34 @@ and the derived files
% \begin{macrocode}
%</package>
% \end{macrocode}
+%
+% \section{Test}
+%
+% \begin{macrocode}
+%<*test1>
+\NeedsTeXFormat{LaTeX2e}
+\AtEndDocument{%
+ \typeout{}%
+ \typeout{**************************************}%
+ \typeout{*** \space Check the PDF file manually! \space ***}%
+ \typeout{**************************************}%
+ \typeout{}%
+}
+\begingroup\expandafter\expandafter\expandafter\endgroup
+\expandafter\ifx\csname pdfcompresslevel\endcsname\relax
+\else
+ \pdfcompresslevel=0 %
+\fi
+\documentclass[12pt,a5paper]{article}
+\usepackage{pdfcolfoot}[2007/09/09]
+\dimen\footins=\baselineskip % for testing
+\begin{document}
+ Black\footnote{Black \textcolor{blue}{Blue\\Blue} Black} %
+ \textcolor{red}{Red\newpage Red} Black%
+\end{document}
+%</test1>
+% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
@@ -566,6 +560,7 @@ and the derived files
% \begin{tabular}{@{}>{\ttfamily}l@{ $\rightarrow$ }>{\ttfamily}l@{}}
% pdfcolfoot.sty & tex/latex/oberdiek/pdfcolfoot.sty\\
% pdfcolfoot.pdf & doc/latex/oberdiek/pdfcolfoot.pdf\\
+% pdfcolfoot-test1.tex & doc/latex/oberdiek/pdfcolfoot-test1.tex\\
% pdfcolfoot.dtx & source/latex/oberdiek/pdfcolfoot.dtx\\
% \end{tabular}^^A
% }^^A
@@ -686,11 +681,26 @@ and the derived files
%\end{verbatim}
% \end{quote}
%
+% \begin{thebibliography}{9}
+%
+% \bibitem{pdfcol}
+% Heiko Oberdiek: \textit{The \xpackage{pdfcol} package};
+% 2007/09/09;\\
+% \CTAN{macros/latex/contrib/oberdiek/pdfcol.pdf}.
+%
+% \end{thebibliography}
+%
% \begin{History}
% \begin{Version}{2007/01/08 v1.0}
% \item
% First version.
% \end{Version}
+% \begin{Version}{2007/09/09 v1.1}
+% \item
+% Use of package \xpackage{pdfcol}.
+% \item
+% Test file added.
+% \end{Version}
% \end{History}
%
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/oberdiek/pdfcolmk.dtx b/Master/texmf-dist/source/latex/oberdiek/pdfcolmk.dtx
index 25cc7817acf..387a2a58298 100644
--- a/Master/texmf-dist/source/latex/oberdiek/pdfcolmk.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/pdfcolmk.dtx
@@ -742,6 +742,7 @@ and the derived files
% \begin{macrocode}
%</package>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
diff --git a/Master/texmf-dist/source/latex/oberdiek/pdfcolparallel.dtx b/Master/texmf-dist/source/latex/oberdiek/pdfcolparallel.dtx
new file mode 100644
index 00000000000..55f23261284
--- /dev/null
+++ b/Master/texmf-dist/source/latex/oberdiek/pdfcolparallel.dtx
@@ -0,0 +1,890 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2007 by Heiko Oberdiek <oberdiek@uni-freiburg.de>
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either
+% version 1.3 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.3 or later is part of all distributions of
+% LaTeX version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status "maintained".
+%
+% This Current Maintainer of this work is Heiko Oberdiek.
+%
+% This work consists of the main source file pdfcolparallel.dtx
+% and the derived files
+% pdfcolparallel.sty, pdfcolparallel.pdf, pdfcolparallel.ins, pdfcolparallel.drv,
+% pdfcolparallel-test1.tex.
+%
+% Distribution:
+% CTAN:macros/latex/contrib/oberdiek/pdfcolparallel.dtx
+% CTAN:macros/latex/contrib/oberdiek/pdfcolparallel.pdf
+%
+% Unpacking:
+% (a) If pdfcolparallel.ins is present:
+% tex pdfcolparallel.ins
+% (b) Without pdfcolparallel.ins:
+% tex pdfcolparallel.dtx
+% (c) If you insist on using LaTeX
+% latex \let\install=y\input{pdfcolparallel.dtx}
+% (quote the arguments according to the demands of your shell)
+%
+% Documentation:
+% (a) If pdfcolparallel.drv is present:
+% latex pdfcolparallel.drv
+% (b) Without pdfcolparallel.drv:
+% latex pdfcolparallel.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 pdfcolparallel.dtx
+% makeindex -s gind.ist pdfcolparallel.idx
+% pdflatex pdfcolparallel.dtx
+% makeindex -s gind.ist pdfcolparallel.idx
+% pdflatex pdfcolparallel.dtx
+%
+% Installation:
+% TDS:tex/latex/oberdiek/pdfcolparallel.sty
+% TDS:doc/latex/oberdiek/pdfcolparallel.pdf
+% TDS:doc/latex/oberdiek/pdfcolparallel-test1.tex
+% TDS:source/latex/oberdiek/pdfcolparallel.dtx
+%
+%<*ignore>
+\begingroup
+ \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: pdfcolparallel 2007/09/09 v1.0 Color stacks support for parallel (HO)}
+\Msg{************************************************************************}
+
+\keepsilent
+\askforoverwritefalse
+
+\preamble
+
+This is a generated file.
+
+Copyright (C) 2007 by Heiko Oberdiek <oberdiek@uni-freiburg.de>
+
+This work may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either
+version 1.3 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.3 or later is part of all distributions of
+LaTeX version 2005/12/01 or later.
+
+This work has the LPPL maintenance status "maintained".
+
+This Current Maintainer of this work is Heiko Oberdiek.
+
+This work consists of the main source file pdfcolparallel.dtx
+and the derived files
+ pdfcolparallel.sty, pdfcolparallel.pdf, pdfcolparallel.ins, pdfcolparallel.drv,
+ pdfcolparallel-test1.tex.
+
+\endpreamble
+
+\generate{%
+ \file{pdfcolparallel.ins}{\from{pdfcolparallel.dtx}{install}}%
+ \file{pdfcolparallel.drv}{\from{pdfcolparallel.dtx}{driver}}%
+ \usedir{tex/latex/oberdiek}%
+ \file{pdfcolparallel.sty}{\from{pdfcolparallel.dtx}{package}}%
+ \usedir{doc/latex/oberdiek}%
+ \file{pdfcolparallel-test1.tex}{\from{pdfcolparallel.dtx}{test1}}%
+}
+
+\obeyspaces
+\Msg{************************************************************************}
+\Msg{*}
+\Msg{* To finish the installation you have to move the following}
+\Msg{* file into a directory searched by TeX:}
+\Msg{*}
+\Msg{* pdfcolparallel.sty}
+\Msg{*}
+\Msg{* To produce the documentation run the file `pdfcolparallel.drv'}
+\Msg{* through LaTeX.}
+\Msg{*}
+\Msg{* Happy TeXing!}
+\Msg{*}
+\Msg{************************************************************************}
+
+\endbatchfile
+%</install>
+%<*ignore>
+\fi
+%</ignore>
+%<*driver>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesFile{pdfcolparallel.drv}%
+ [2007/09/09 v1.0 Color stacks support for parallel (HO)]%
+\documentclass{ltxdoc}
+\usepackage{holtxdoc}
+\begin{document}
+ \DocInput{pdfcolparallel.dtx}%
+\end{document}
+%</driver>
+% \fi
+%
+% \CheckSum{582}
+%
+% \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{pdfcolparallel.drv}
+%
+% \title{The \xpackage{pdfcolparallel} package}
+% \date{2007/09/09 v1.0}
+% \author{Heiko Oberdiek\\\xemail{oberdiek@uni-freiburg.de}}
+%
+% \maketitle
+%
+% \begin{abstract}
+% Since version 1.40 \pdfTeX\ supports several color stacks.
+% This package uses them to fix color problems in
+% package \xpackage{parallel}.
+% \end{abstract}
+%
+% \tableofcontents
+%
+% \section{Usage}
+%
+% \begin{quote}
+% |\usepackage{pdfcolparallel}|
+% \end{quote}
+% The package \xpackage{pdfcolparallel} loads package \xpackage{parallel}
+% \cite{parallel}. If color stacks are available then the
+% macros of \xpackage{parallel} are patched to add support
+% for color stacks.
+%
+% \subsection{Future}
+%
+% If there will be a new version of package \xpackage{parallel}
+% that adds support for color stacks, then this package may become
+% obsolete.
+%
+% \StopEventually{
+% }
+%
+% \section{Implementation}
+%
+% \subsection{Identification}
+%
+% \begin{macrocode}
+%<*package>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{pdfcolparallel}%
+ [2007/09/09 v1.0 Color stacks support for parallel (HO)]%
+% \end{macrocode}
+%
+% \subsection{Load packages}
+%
+% \subsubsection{Package \xpackage{parallel}}
+%
+% Package \xpackage{parallel} is loaded. Before options of package
+% \xpackage{pdfcolparallel} are passed to package \xpackage{parallel}.
+% \begin{macrocode}
+\DeclareOption*{%
+ \PassoptionsToPackage{\CurrentOption}{parallel}%
+}
+\ProcessOptions\relax
+\RequirePackage{parallel}[2003/04/13]
+% \end{macrocode}
+%
+% \subsubsection{Package \xpackage{pdfcol}}
+%
+% \begin{macrocode}
+\RequirePackage{pdfcol}[2007/09/09]
+\ifpdfcolAvailable
+\else
+ \PackageInfo{pdfcolparallel}{%
+ Loading aborted, because color stacks are not available%
+ }%
+ \expandafter\endinput
+\fi
+% \end{macrocode}
+%
+% \subsubsection{Package \xpackage{infwarerr}}
+%
+% \begin{macrocode}
+\RequirePackage{infwarerr}[2007/09/09]
+% \end{macrocode}
+%
+% \subsection{Color stack macros}
+%
+% \begin{macrocode}
+\pdfcolInitStack{pcp@Left}
+\pdfcolInitStack{pcp@Right}
+% \end{macrocode}
+% \begin{macro}{\pcp@SwitchStack}
+% \begin{macrocode}
+\def\pcp@SwitchStack#1{%
+ \pdfcolSwitchStack{pcp@#1}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\pcp@SetCurrent}
+% \begin{macrocode}
+\def\pcp@SetCurrent#1{%
+ \ifx\\#1\\%
+ \pdfcolSetCurrent{}%
+ \else
+ \pdfcolSetCurrent{pcp@#1}%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Redefinitions}
+%
+% \begin{macro}{\pcp@CmdCheckRedef}
+% \begin{macrocode}
+\def\pcp@CmdCheckRedef#1{%
+ \begingroup
+ \def\pcp@cmd{#1}%
+ \afterassignment\pcp@CmdDo
+ \long\def\reserved@a
+}
+\def\pcp@CmdDo{%
+ \expandafter\ifx\pcp@cmd\reserved@a
+ \else
+ \edef\x*{\expandafter\string\pcp@cmd}%
+ \@PackageWarningNoLine{pdfcolparallel}{%
+ Command \x* has changed.\MessageBreak
+ Supported versions of package `parallel':\MessageBreak
+ \space\space 2003/04/13\MessageBreak
+ The redefinition of \x* may\MessageBreak
+ not behave correctly depending on the changes%
+ }%
+ \fi
+ \expandafter\endgroup
+ \expandafter\def\pcp@cmd
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ParallelLText}
+% \begin{macrocode}
+\pcp@CmdCheckRedef\ParallelLText{%
+ \everypar{}%
+ \@restorepar
+ \begingroup
+ \hbadness=3000 %
+ \let\footnote=\ParallelLFootnote
+ \ParallelWhichBox=0 %
+ \global\setbox\ParallelLBox=\vbox\bgroup
+ \hsize=\ParallelLWidth
+ \aftergroup\ParallelAfterText
+ \begingroup
+ \afterassignment\ParallelCheckOpenBrace
+ \let\x=%
+}{%
+ \everypar{}%
+ \@restorepar
+ \begingroup
+ \hbadness=3000 %
+ \let\footnote=\ParallelLFootnote
+ \ParallelWhichBox=0 %
+ \global\setbox\ParallelLBox=\vbox\bgroup
+ \hsize=\ParallelLWidth
+ \pcp@SwitchStack{Left}%
+ \aftergroup\ParallelAfterText
+ \begingroup
+ \afterassignment\ParallelCheckOpenBrace
+ \let\x=%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ParallelRText}
+% \begin{macrocode}
+\pcp@CmdCheckRedef\ParallelRText{%
+ \everypar{}%
+ \@restorepar
+ \begingroup
+ \hbadness=3000 %
+ \ifnum\ParallelFNMode=\@ne
+ \let\footnote=\ParallelRFootnote
+ \else
+ \let\footnote=\ParallelLFootnote
+ \fi
+ \ParallelWhichBox=\@ne
+ \global\setbox\ParallelRBox=\vbox\bgroup
+ \hsize=\ParallelRWidth
+ \aftergroup\ParallelAfterText
+ \begingroup
+ \afterassignment\ParallelCheckOpenBrace
+ \let\x=%
+}{%
+ \everypar{}%
+ \@restorepar
+ \begingroup
+ \hbadness=3000 %
+ \ifnum\ParallelFNMode=\@ne
+ \let\footnote=\ParallelRFootnote
+ \else
+ \let\footnote=\ParallelLFootnote
+ \fi
+ \ParallelWhichBox=\@ne
+ \global\setbox\ParallelRBox=\vbox\bgroup
+ \hsize=\ParallelRWidth
+ \pcp@SwitchStack{Right}%
+ \aftergroup\ParallelAfterText
+ \begingroup
+ \afterassignment\ParallelCheckOpenBrace
+ \let\x=%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ParallelParOnePage}
+% \begin{macrocode}
+\pcp@CmdCheckRedef\ParallelParOnePage{%
+ \ifnum\ParallelBoolVar=\@ne
+ \par
+ \begingroup
+ \leftmargin=\z@
+ \rightmargin=\z@
+ \parskip=\z@skip
+ \parindent=\z@
+ \vbadness=10000 %
+ \vfuzz=3ex %
+ \splittopskip=\z@skip
+ \loop
+ \ifnum\ParallelBoolVar=\@ne
+ \noindent
+ \hbox to\textwidth{%
+ \hskip\ParallelLeftMargin
+ \hbox to\ParallelTextWidth{%
+ \ifvoid\ParallelLBox
+ \hskip\ParallelLWidth
+ \else
+ \ParallelWhichBox=\z@
+ \vbox{%
+ \setbox\ParallelBoxVar
+ =\vsplit\ParallelLBox to\dp\strutbox
+ \unvbox\ParallelBoxVar
+ }%
+ \fi
+ \strut
+ \ifnum\ParallelBoolMid=\@ne
+ \hskip\ParallelMainMidSkip
+ \vrule
+ \else
+ \hss
+ \fi
+ \hss
+ \ifvoid\ParallelRBox
+ \hskip\ParallelRWidth
+ \else
+ \ParallelWhichBox=\@ne
+ \vbox{%
+ \setbox\ParallelBoxVar
+ =\vsplit\ParallelRBox to\dp\strutbox
+ \unvbox\ParallelBoxVar
+ }%
+ \fi
+ }%
+ }%
+ \ifvoid\ParallelLBox
+ \ifvoid\ParallelRBox
+ \global\ParallelBoolVar=\z@
+ \fi
+ \fi%
+ \fi%
+ \ifnum\ParallelBoolVar=\@ne
+ \penalty\interlinepenalty
+ \repeat
+ \par
+ \endgroup
+ \fi
+}{%
+ \ifnum\ParallelBoolVar=\@ne
+ \par
+ \begingroup
+ \leftmargin=\z@
+ \rightmargin=\z@
+ \parskip=\z@skip
+ \parindent=\z@
+ \vbadness=10000 %
+ \vfuzz=3ex %
+ \splittopskip=\z@skip
+ \loop
+ \ifnum\ParallelBoolVar=\@ne
+ \noindent
+ \hbox to\textwidth{%
+ \hskip\ParallelLeftMargin
+ \hbox to\ParallelTextWidth{%
+ \ifvoid\ParallelLBox
+ \hskip\ParallelLWidth
+ \else
+ \pcp@SetCurrent{Left}%
+ \ParallelWhichBox=\z@
+ \vbox{%
+ \setbox\ParallelBoxVar
+ =\vsplit\ParallelLBox to\dp\strutbox
+ \unvbox\ParallelBoxVar
+ }%
+ \fi
+ \strut
+ \ifnum\ParallelBoolMid=\@ne
+ \hskip\ParallelMainMidSkip
+ \vrule
+ \else
+ \hss
+ \fi
+ \hss
+ \ifvoid\ParallelRBox
+ \hskip\ParallelRWidth
+ \else
+ \pcp@SetCurrent{Right}%
+ \ParallelWhichBox=\@ne
+ \vbox{%
+ \setbox\ParallelBoxVar
+ =\vsplit\ParallelRBox to\dp\strutbox
+ \unvbox\ParallelBoxVar
+ }%
+ \fi
+ }%
+ }%
+ \ifvoid\ParallelLBox
+ \ifvoid\ParallelRBox
+ \global\ParallelBoolVar=\z@
+ \fi
+ \fi%
+ \fi%
+ \ifnum\ParallelBoolVar=\@ne
+ \penalty\interlinepenalty
+ \repeat
+ \par
+ \endgroup
+ \pcp@SetCurrent{}%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\ParallelParTwoPages}
+% \begin{macrocode}
+\pcp@CmdCheckRedef\ParallelParTwoPages{%
+ \ifnum\ParallelBoolVar=\@ne
+ \par
+ \begingroup
+ \global\ParallelWhichBox=\@ne
+ \newpage
+ \vbadness=10000 %
+ \vfuzz=3ex %
+ \splittopskip=\z@skip
+ \loop%
+ \ifnum\ParallelBoolVar=\@ne%
+ \ifnum\ParallelWhichBox=\@ne
+ \ifvoid\ParallelLBox
+ \mbox{} %
+ \newpage
+ \else
+ \global\ParallelWhichBox=\z@
+ \fi
+ \else
+ \ifvoid\ParallelRBox
+ \mbox{} %
+ \newpage
+ \else
+ \global\ParallelWhichBox=\@ne
+ \fi
+ \fi
+ \ifnum\ParallelWhichBox=\z@
+ \ifodd\thepage
+ \mbox{} %
+ \newpage
+ \fi
+ \hbox to\textwidth{%
+ \vbox{\vsplit\ParallelLBox to.98\textheight}%
+ }%
+ \else
+ \ifodd\thepage\relax
+ \else
+ \mbox{} %
+ \newpage
+ \fi
+ \hbox to\textwidth{%
+ \vbox{\vsplit\ParallelRBox to.98\textheight}%
+ }%
+ \fi
+ \vspace*{\fill}%
+ \newpage
+ \fi
+ \ifvoid\ParallelLBox
+ \ifvoid\ParallelRBox
+ \global\ParallelBoolVar=\z@
+ \fi
+ \fi
+ \ifnum\ParallelBoolVar=\@ne
+ \repeat
+ \par
+ \endgroup
+ \fi
+}{%
+% \end{macrocode}
+% Additional fixes:
+% \begin{itemize}
+% \item Unnecessary white space removed.
+% \item |\ifodd\thepage| changed to |\ifodd\value{page}|.
+% \end{itemize}
+% \begin{macrocode}
+ \ifnum\ParallelBoolVar=\@ne
+ \par
+ \begingroup
+ \global\ParallelWhichBox=\@ne
+ \newpage
+ \vbadness=10000 %
+ \vfuzz=3ex %
+ \splittopskip=\z@skip
+ \loop%
+ \ifnum\ParallelBoolVar=\@ne%
+ \ifnum\ParallelWhichBox=\@ne
+ \ifvoid\ParallelLBox
+ \mbox{}%
+ \newpage
+ \else
+ \global\ParallelWhichBox=\z@
+ \fi
+ \else
+ \ifvoid\ParallelRBox
+ \mbox{}%
+ \newpage
+ \else
+ \global\ParallelWhichBox=\@ne
+ \fi
+ \fi
+ \ifnum\ParallelWhichBox=\z@
+ \ifodd\value{page}%
+ \mbox{}%
+ \newpage
+ \fi
+ \hbox to\textwidth{%
+ \pcp@SetCurrent{Left}%
+ \vbox{\vsplit\ParallelLBox to.98\textheight}%
+ }%
+ \else
+ \ifodd\value{page}%
+ \else
+ \mbox{}%
+ \newpage
+ \fi
+ \hbox to\textwidth{%
+ \pcp@SetCurrent{Right}%
+ \vbox{\vsplit\ParallelRBox to.98\textheight}%
+ }%
+ \fi
+ \vspace*{\fill}%
+ \newpage
+ \fi
+ \ifvoid\ParallelLBox
+ \ifvoid\ParallelRBox
+ \global\ParallelBoolVar=\z@
+ \fi
+ \fi
+ \ifnum\ParallelBoolVar=\@ne
+ \repeat
+ \par
+ \endgroup
+ \pcp@SetCurrent{}%
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+% \section{Test}
+%
+% The test file is a modified version of the file that
+% Alexander Hirsch has posted in \xnewsgroup{de.comp.text.tex}.
+% \begin{macrocode}
+%<*test1>
+\AtEndDocument{%
+ \typeout{}%
+ \typeout{**************************************}%
+ \typeout{*** \space Check the PDF file manually! \space ***}%
+ \typeout{**************************************}%
+ \typeout{}%
+}
+\documentclass{article}
+\usepackage{xcolor}
+\usepackage{pdfcolparallel}[2007/09/09]
+
+\begin{document}
+ \color{green}%
+ Green%
+ \begin{Parallel}{0.47\textwidth}{0.47\textwidth}%
+ \ParallelLText{%
+ \textcolor{red}{%
+ Ein Absatz, der sich ueber zwei Zeilen erstrecken soll. %
+ Ein Absatz, der sich ueber zwei Zeilen erstrecken soll.%
+ }%
+ }%
+ \ParallelRText{%
+ \textcolor{blue}{%
+ Ein Absatz, der sich ueber zwei Zeilen erstrecken soll. %
+ Ein Absatz, der sich ueber zwei Zeilen erstrecken soll.%
+ }%
+ }%
+ \end{Parallel}%
+ Green%
+ \begin{Parallel}[p]{\textwidth}{\textwidth}%
+ \ParallelLText{%
+ \textcolor{red}{%
+ Ein Absatz, der sich ueber zwei Zeilen erstrecken soll. %
+ Ein Absatz, der sich ueber zwei Zeilen erstrecken soll. %
+ Foo bar bla bla bla.%
+ }%
+ }%
+ \ParallelRText{%
+ \textcolor{blue}{%
+ Ein Absatz, der sich ueber zwei Zeilen erstrecken soll. %
+ Ein Absatz, der sich ueber zwei Zeilen erstrecken soll. %
+ Foo bar bla bla bla.%
+ }%
+ }%
+ \end{Parallel}%
+ Green%
+\end{document}
+%</test1>
+% \end{macrocode}
+%
+% \section{Installation}
+%
+% \subsection{Download}
+%
+% \paragraph{Package.} This package is available on
+% CTAN\footnote{\url{ftp://ftp.ctan.org/tex-archive/}}:
+% \begin{description}
+% \item[\CTAN{macros/latex/contrib/oberdiek/pdfcolparallel.dtx}] The source file.
+% \item[\CTAN{macros/latex/contrib/oberdiek/pdfcolparallel.pdf}] Documentation.
+% \end{description}
+%
+%
+% \paragraph{Bundle.} All the packages of the bundle `oberdiek'
+% 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[\CTAN{macros/latex/contrib/oberdiek/oberdiek-tds.zip}]
+% \end{description}
+% \emph{TDS} refers to the standard ``A Directory Structure
+% for \TeX\ Files'' (\CTAN{tds/tds.pdf}). Directories
+% with \xfile{texmf} in their name are usually organized this way.
+%
+% \subsection{Bundle installation}
+%
+% \paragraph{Unpacking.} Unpack the \xfile{oberdiek-tds.zip} in the
+% TDS tree (also known as \xfile{texmf} tree) of your choice.
+% Example (linux):
+% \begin{quote}
+% |unzip oberdiek-tds.zip -d ~/texmf|
+% \end{quote}
+%
+% \paragraph{Script installation.}
+% Check the directory \xfile{TDS:scripts/oberdiek/} for
+% scripts that need further installation steps.
+% Package \xpackage{attachfile2} comes with the Perl script
+% \xfile{pdfatfi.pl} that should be installed in such a way
+% that it can be called as \texttt{pdfatfi}.
+% Example (linux):
+% \begin{quote}
+% |chmod +x scripts/oberdiek/pdfatfi.pl|\\
+% |cp scripts/oberdiek/pdfatfi.pl /usr/local/bin/|
+% \end{quote}
+%
+% \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 pdfcolparallel.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@{}}
+% pdfcolparallel.sty & tex/latex/oberdiek/pdfcolparallel.sty\\
+% pdfcolparallel.pdf & doc/latex/oberdiek/pdfcolparallel.pdf\\
+% pdfcolparallel-test1.tex & doc/latex/oberdiek/pdfcolparallel-test1.tex\\
+% pdfcolparallel.dtx & source/latex/oberdiek/pdfcolparallel.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
+% (\teTeX, \mikTeX, \dots) relies on file name databases, you must refresh
+% these. For example, \teTeX\ users run \verb|texhash| or
+% \verb|mktexlsr|.
+%
+% \subsection{Some details for the interested}
+%
+% \paragraph{Attached source.}
+%
+% The PDF documentation on CTAN also includes the
+% \xfile{.dtx} source file. It can be extracted by
+% AcrobatReader 6 or higher. Another option is \textsf{pdftk},
+% e.g. unpack the file into the current directory:
+% \begin{quote}
+% \verb|pdftk pdfcolparallel.pdf unpack_files output .|
+% \end{quote}
+%
+% \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{pdfcolparallel.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 pdfcolparallel.dtx
+%makeindex -s gind.ist pdfcolparallel.idx
+%pdflatex pdfcolparallel.dtx
+%makeindex -s gind.ist pdfcolparallel.idx
+%pdflatex pdfcolparallel.dtx
+%\end{verbatim}
+% \end{quote}
+%
+% \begin{thebibliography}{9}
+%
+% \bibitem{parallel}
+% Matthias Eckermann: \textit{The \xpackage{parallel}-package};
+% 2003/04/13;\\
+% \CTAN{macros/latex/contrib/parallel/}.
+%
+% \bibitem{pdfcol}
+% Heiko Oberdiek: \textit{The \xpackage{pdfcol} package};
+% 2007/09/09;\\
+% \CTAN{macros/latex/contrib/oberdiek/pdfcol.pdf}.
+%
+% \end{thebibliography}
+%
+% \begin{History}
+% \begin{Version}{2007/09/09 v1.0}
+% \item
+% First version.
+% \end{Version}
+% \end{History}
+%
+% \PrintIndex
+%
+% \Finale
+\endinput
diff --git a/Master/texmf-dist/source/latex/oberdiek/pdfcolparcolumns.dtx b/Master/texmf-dist/source/latex/oberdiek/pdfcolparcolumns.dtx
new file mode 100644
index 00000000000..c52373c9e25
--- /dev/null
+++ b/Master/texmf-dist/source/latex/oberdiek/pdfcolparcolumns.dtx
@@ -0,0 +1,686 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2007 by Heiko Oberdiek <oberdiek@uni-freiburg.de>
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either
+% version 1.3 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.3 or later is part of all distributions of
+% LaTeX version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status "maintained".
+%
+% This Current Maintainer of this work is Heiko Oberdiek.
+%
+% This work consists of the main source file pdfcolparcolumns.dtx
+% and the derived files
+% pdfcolparcolumns.sty, pdfcolparcolumns.pdf, pdfcolparcolumns.ins, pdfcolparcolumns.drv,
+% pdfcolparcolumns-test1.tex.
+%
+% Distribution:
+% CTAN:macros/latex/contrib/oberdiek/pdfcolparcolumns.dtx
+% CTAN:macros/latex/contrib/oberdiek/pdfcolparcolumns.pdf
+%
+% Unpacking:
+% (a) If pdfcolparcolumns.ins is present:
+% tex pdfcolparcolumns.ins
+% (b) Without pdfcolparcolumns.ins:
+% tex pdfcolparcolumns.dtx
+% (c) If you insist on using LaTeX
+% latex \let\install=y\input{pdfcolparcolumns.dtx}
+% (quote the arguments according to the demands of your shell)
+%
+% Documentation:
+% (a) If pdfcolparcolumns.drv is present:
+% latex pdfcolparcolumns.drv
+% (b) Without pdfcolparcolumns.drv:
+% latex pdfcolparcolumns.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 pdfcolparcolumns.dtx
+% makeindex -s gind.ist pdfcolparcolumns.idx
+% pdflatex pdfcolparcolumns.dtx
+% makeindex -s gind.ist pdfcolparcolumns.idx
+% pdflatex pdfcolparcolumns.dtx
+%
+% Installation:
+% TDS:tex/latex/oberdiek/pdfcolparcolumns.sty
+% TDS:doc/latex/oberdiek/pdfcolparcolumns.pdf
+% TDS:doc/latex/oberdiek/pdfcolparcolumns-test1.tex
+% TDS:source/latex/oberdiek/pdfcolparcolumns.dtx
+%
+%<*ignore>
+\begingroup
+ \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: pdfcolparcolumns 2007/09/09 v1.1 Color stacks support for parcolumns (HO)}
+\Msg{************************************************************************}
+
+\keepsilent
+\askforoverwritefalse
+
+\preamble
+
+This is a generated file.
+
+Copyright (C) 2007 by Heiko Oberdiek <oberdiek@uni-freiburg.de>
+
+This work may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either
+version 1.3 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.3 or later is part of all distributions of
+LaTeX version 2005/12/01 or later.
+
+This work has the LPPL maintenance status "maintained".
+
+This Current Maintainer of this work is Heiko Oberdiek.
+
+This work consists of the main source file pdfcolparcolumns.dtx
+and the derived files
+ pdfcolparcolumns.sty, pdfcolparcolumns.pdf, pdfcolparcolumns.ins, pdfcolparcolumns.drv,
+ pdfcolparcolumns-test1.tex.
+
+\endpreamble
+
+\generate{%
+ \file{pdfcolparcolumns.ins}{\from{pdfcolparcolumns.dtx}{install}}%
+ \file{pdfcolparcolumns.drv}{\from{pdfcolparcolumns.dtx}{driver}}%
+ \usedir{tex/latex/oberdiek}%
+ \file{pdfcolparcolumns.sty}{\from{pdfcolparcolumns.dtx}{package}}%
+ \usedir{doc/latex/oberdiek}%
+ \file{pdfcolparcolumns-test1.tex}{\from{pdfcolparcolumns.dtx}{test1}}%
+}
+
+\obeyspaces
+\Msg{************************************************************************}
+\Msg{*}
+\Msg{* To finish the installation you have to move the following}
+\Msg{* file into a directory searched by TeX:}
+\Msg{*}
+\Msg{* pdfcolparcolumns.sty}
+\Msg{*}
+\Msg{* To produce the documentation run the file `pdfcolparcolumns.drv'}
+\Msg{* through LaTeX.}
+\Msg{*}
+\Msg{* Happy TeXing!}
+\Msg{*}
+\Msg{************************************************************************}
+
+\endbatchfile
+%</install>
+%<*ignore>
+\fi
+%</ignore>
+%<*driver>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesFile{pdfcolparcolumns.drv}%
+ [2007/09/09 v1.1 Color stacks support for parcolumns (HO)]%
+\documentclass{ltxdoc}
+\usepackage{holtxdoc}
+\begin{document}
+ \DocInput{pdfcolparcolumns.dtx}%
+\end{document}
+%</driver>
+% \fi
+%
+% \CheckSum{263}
+%
+% \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{pdfcolparcolumns.drv}
+%
+% \title{The \xpackage{pdfcolparcolumns} package}
+% \date{2007/09/09 v1.1}
+% \author{Heiko Oberdiek\\\xemail{oberdiek@uni-freiburg.de}}
+%
+% \maketitle
+%
+% \begin{abstract}
+% Since version 1.40 \pdfTeX\ supports several color stacks.
+% This package uses them to fix color problems in
+% package \xpackage{parcolumns}.
+% \end{abstract}
+%
+% \tableofcontents
+%
+% \section{Usage}
+%
+% \begin{quote}
+% |\usepackage{pdfcolparcolumns}|
+% \end{quote}
+% The package \xpackage{pdfcolparcolumns} loads package \xpackage{parcolums}
+% \cite{parcolumns}. If color stacks are available then the
+% macros of \xpackage{parcolumns} are patched to add support
+% for color stacks.
+%
+% \subsection{Future}
+%
+% Currently package \xpackage{parcolumns} does not seem to be
+% maintained. Nevertheless if there will be a new version that
+% adds support for color stacks, then this package may become
+% obsolete.
+%
+% \StopEventually{
+% }
+%
+% \section{Implementation}
+%
+% \subsection{Identification}
+%
+% \begin{macrocode}
+%<*package>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{pdfcolparcolumns}%
+ [2007/09/09 v1.1 Color stacks support for parcolumns (HO)]%
+% \end{macrocode}
+%
+% \subsection{Load packages}
+%
+% \subsubsection{Package \xpackage{parcolumns}}
+%
+% Currently package \xpackage{parcolumns} does not define options.
+% Thus it is just a precaution that the options of
+% package \xpackage{pdfcolparcolumns} are passed to
+% package \xpackage{parcolumns}.
+% \begin{macrocode}
+\DeclareOption*{%
+ \PassoptionsToPackage{\CurrentOption}{parcolumns}%
+}
+\ProcessOptions\relax
+\RequirePackage{parcolumns}[2004/11/25]
+% \end{macrocode}
+%
+% \subsubsection{Package \xpackage{pdfcol}}
+%
+% \begin{macrocode}
+\RequirePackage{pdfcol}[2007/09/09]
+\ifpdfcolAvailable
+\else
+ \PackageInfo{pdfcolparcolumns}{%
+ Loading aborted, because color stacks are not available%
+ }%
+ \expandafter\endinput
+\fi
+% \end{macrocode}
+%
+% \subsubsection{Package \xpackage{infwarerr}}
+%
+% \begin{macrocode}
+\RequirePackage{infwarerr}[2007/09/09]
+% \end{macrocode}
+%
+% \subsection{Color stack macros}
+%
+% \begin{macro}{\pcpc@MaxStack}
+% Macro \cs{pcpc@MaxStack} holds the highest number of
+% allocated stacks.
+% \begin{macrocode}
+\global\chardef\pcpc@MaxStack=\z@
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\pcpc@InitStacks}
+% Macro \cs{pcpc@InitStacks} takes the number of columns
+% as argument and ensures that there are enough color
+% stacks for all columns.
+% \begin{macrocode}
+\def\pcpc@InitStacks#1{%
+ \ifnum#1>\pcpc@MaxStack
+ \begingroup
+ \count@\pcpc@MaxStack
+ \loop
+ \advance\count@\@ne
+ \pdfcolInitStack{pcpc@\the\count@}%
+ \ifnum#1>\count@
+ \repeat
+ \global\chardef\pcpc@MaxStack=\count@
+ \endgroup
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\pcpc@SwitchStack}
+% \begin{macrocode}
+\def\pcpc@SwitchStack#1{%
+ \pdfcolSwitchStack{pcpc@\number#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\pcpc@SetCurrent}
+% \begin{macrocode}
+\def\pcpc@SetCurrent#1{%
+ \pdfcolSetCurrent{pcpc@\number#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Patches}
+%
+% Now the color stack macros are patched into the macros
+% of package \xpackage{parcolumns}.
+%
+% \subsubsection{Init stacks}
+%
+% \cs{pcpc@InitStacks} should go into the definition of
+% environment |parcolumns|. \cs{pc@alloccolumns} is executed
+% there and nowhere else, thus we hook into it.
+% \begin{macrocode}
+\g@addto@macro\pc@alloccolumns{%
+ \pcpc@InitStacks\pc@columncount
+}
+% \end{macrocode}
+%
+% \subsubsection{Switch stack}
+%
+% \cs{pcpc@SwitchStack} should be called by marco \cs{colchunk@}.
+% However it is easier to patch \cs{pc@setcolumnwidth} that
+% is executed in \cs{colchunk@} only.
+% \begin{macrocode}
+\g@addto@macro\pc@setcolumnwidth{%
+ \pcpc@SwitchStack\pc@columnctr
+}
+% \end{macrocode}
+%
+% \subsubsection{Set current stack color}
+%
+% \cs{pcpc@SetCurrent} is set at the begin of each line.
+% It must be inserted into \cs{pc@placeboxes}. Unhappily
+% there is no easy way. Therefore we check and
+% redefine \cs{pc@placeboxes}.
+% \begin{macrocode}
+\begingroup
+ \def\x{%
+ \global\let\@tempa\relax
+ \count@\z@
+ \hb@xt@\linewidth{%
+ \vfuzz30ex %
+ \vbadness\@M
+ \splittopskip\z@skip
+ \loop
+ \ifnum\count@<\pc@columncount
+ \advance\count@\@ne
+ \expandafter\ifvoid\csname pc@column@\number\count@\endcsname
+ \hskip\csname pc@column@width@\number\count@\endcsname
+ \else
+ \expandafter\setbox\expandafter\@tempboxa\expandafter
+ \vsplit\csname pc@column@\number\count@\endcsname
+ to \dp\strutbox
+ \vbox{%
+ \unvbox\@tempboxa
+ }%
+ \fi
+ \expandafter\ifvoid\csname pc@column@\number\count@\endcsname
+ \else
+ \global\let\@tempa\pc@placeboxes
+ \fi
+ \ifnum\count@<\pc@columncount
+ \strut
+ \hfill
+ \ifpc@rulebetween
+ \vrule
+ \hfill
+ \fi
+ \fi
+ \repeat
+ }%
+ \@tempa
+ }%
+ \ifx\x\pc@placeboxes
+ \else
+ \@PackageWarningNoLine{pdfcolparcolumns}{%
+ Command \string\pc@placeboxes\space has changed.\MessageBreak
+ Supported versions of package `parcolumns':\MessageBreak
+ \space\space 2004/08/05.\MessageBreak
+ The redefinition of \string\pc@placeboxes\space may not%
+ \MessageBreak
+ behave correctly depending on the changes%
+ }%
+ \fi
+\endgroup
+% \end{macrocode}
+% \begin{macro}{\pc@placeboxes}
+% \begin{macrocode}
+\renewcommand*{\pc@placeboxes}{%
+ \global\let\@tempa\relax
+ \count@\z@
+ \hb@xt@\linewidth{%
+ \vfuzz30ex %
+ \vbadness\@M
+ \splittopskip\z@skip
+ \loop
+ \ifnum\count@<\pc@columncount
+ \advance\count@\@ne
+ \expandafter\ifvoid\csname pc@column@\number\count@\endcsname
+ \hskip\csname pc@column@width@\number\count@\endcsname
+ \else
+ \expandafter\setbox\expandafter\@tempboxa\expandafter
+ \vsplit\csname pc@column@\number\count@\endcsname
+ to \dp\strutbox
+ \vbox{%
+ \pcpc@SetCurrent\count@
+ \unvbox\@tempboxa
+ }%
+ \fi
+ \expandafter\ifvoid\csname pc@column@\number\count@\endcsname
+ \else
+ \global\let\@tempa\pc@placeboxes
+ \fi
+ \ifnum\count@<\pc@columncount
+ \strut
+ \hfill
+ \ifpc@rulebetween
+ \vrule
+ \hfill
+ \fi
+ \fi
+ \repeat
+ }%
+ \@tempa
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+% \section{Test}
+%
+% The test file is a modified version of the file that
+% Donald Goodman has posted in \xnewsgroup{comp.text.tex}.
+% \begin{macrocode}
+%<*test1>
+\NeedsTeXFormat{LaTeX2e}
+\AtEndDocument{%
+ \typeout{}%
+ \typeout{**************************************}%
+ \typeout{*** \space Check the PDF file manually! \space ***}%
+ \typeout{**************************************}%
+ \typeout{}%
+}
+\documentclass{article}
+\usepackage{xcolor}
+\usepackage{pdfcolparcolumns}
+
+\newcommand{\instruct}[1]{%
+ \noindent
+ \footnotesize
+ \textcolor{red}{#1}%
+}
+
+\begin{document}
+ \begin{parcolumns}[colwidths={1=2.3in,2=2.3in},sloppy]{2}%
+ \colchunk[1]{%
+ \instruct{Et non dicitur versus} %
+ Fidelium anim\ae\ %
+ \instruct{%
+ sed immediate subiungitur antiphona finalis %
+ beat\ae\ Mari\ae\ Virginis%
+ } %
+ 100.%
+ }%
+ \colchunk[2]{%
+ \instruct{%
+ And the verse %
+ \textcolor{black}{May the souls of the faithful} %
+ is not said, but the final antiphon of the %
+ Blessed Virgin Mary, %
+ \textcolor{black}{100,} %
+ is immediately joined.%
+ }%
+ }%
+ \end{parcolumns}%
+\end{document}
+%</test1>
+% \end{macrocode}
+%
+% \section{Installation}
+%
+% \subsection{Download}
+%
+% \paragraph{Package.} This package is available on
+% CTAN\footnote{\url{ftp://ftp.ctan.org/tex-archive/}}:
+% \begin{description}
+% \item[\CTAN{macros/latex/contrib/oberdiek/pdfcolparcolumns.dtx}] The source file.
+% \item[\CTAN{macros/latex/contrib/oberdiek/pdfcolparcolumns.pdf}] Documentation.
+% \end{description}
+%
+%
+% \paragraph{Bundle.} All the packages of the bundle `oberdiek'
+% 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[\CTAN{macros/latex/contrib/oberdiek/oberdiek-tds.zip}]
+% \end{description}
+% \emph{TDS} refers to the standard ``A Directory Structure
+% for \TeX\ Files'' (\CTAN{tds/tds.pdf}). Directories
+% with \xfile{texmf} in their name are usually organized this way.
+%
+% \subsection{Bundle installation}
+%
+% \paragraph{Unpacking.} Unpack the \xfile{oberdiek-tds.zip} in the
+% TDS tree (also known as \xfile{texmf} tree) of your choice.
+% Example (linux):
+% \begin{quote}
+% |unzip oberdiek-tds.zip -d ~/texmf|
+% \end{quote}
+%
+% \paragraph{Script installation.}
+% Check the directory \xfile{TDS:scripts/oberdiek/} for
+% scripts that need further installation steps.
+% Package \xpackage{attachfile2} comes with the Perl script
+% \xfile{pdfatfi.pl} that should be installed in such a way
+% that it can be called as \texttt{pdfatfi}.
+% Example (linux):
+% \begin{quote}
+% |chmod +x scripts/oberdiek/pdfatfi.pl|\\
+% |cp scripts/oberdiek/pdfatfi.pl /usr/local/bin/|
+% \end{quote}
+%
+% \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 pdfcolparcolumns.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@{}}
+% pdfcolparcolumns.sty & tex/latex/oberdiek/pdfcolparcolumns.sty\\
+% pdfcolparcolumns.pdf & doc/latex/oberdiek/pdfcolparcolumns.pdf\\
+% pdfcolparcolumns-test1.tex & doc/latex/oberdiek/pdfcolparcolumns-test1.tex\\
+% pdfcolparcolumns.dtx & source/latex/oberdiek/pdfcolparcolumns.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
+% (\teTeX, \mikTeX, \dots) relies on file name databases, you must refresh
+% these. For example, \teTeX\ users run \verb|texhash| or
+% \verb|mktexlsr|.
+%
+% \subsection{Some details for the interested}
+%
+% \paragraph{Attached source.}
+%
+% The PDF documentation on CTAN also includes the
+% \xfile{.dtx} source file. It can be extracted by
+% AcrobatReader 6 or higher. Another option is \textsf{pdftk},
+% e.g. unpack the file into the current directory:
+% \begin{quote}
+% \verb|pdftk pdfcolparcolumns.pdf unpack_files output .|
+% \end{quote}
+%
+% \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{pdfcolparcolumns.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 pdfcolparcolumns.dtx
+%makeindex -s gind.ist pdfcolparcolumns.idx
+%pdflatex pdfcolparcolumns.dtx
+%makeindex -s gind.ist pdfcolparcolumns.idx
+%pdflatex pdfcolparcolumns.dtx
+%\end{verbatim}
+% \end{quote}
+%
+% \begin{thebibliography}{9}
+%
+% \bibitem{parcolumns}
+% Jonathan Sauer: \textit{The \xpackage{parcolumns} package};
+% 2004/11/25;\\
+% \CTAN{macros/latex/contrib/sauerj/parcolumns.pdf}.
+%
+% \bibitem{pdfcol}
+% Heiko Oberdiek: \textit{The \xpackage{pdfcol} package};
+% 2007/09/09;\\
+% \CTAN{macros/latex/contrib/oberdiek/pdfcol.pdf}.
+%
+% \end{thebibliography}
+%
+% \begin{History}
+% \begin{Version}{2007/07/26 v1.0}
+% \item
+% First version, published in the newsgroup \texttt{comp.text.tex}
+% with the name \xpackage{parcolumns-colorstack}.
+% \end{Version}
+% \begin{Version}{2007/09/09 v1.1}
+% \item
+% CTAN version, package name renamed to \xpackage{pdfcolparcolumns}.
+% \item
+% Uses package \xpackage{pdfcol}.
+% \item
+% Documentation added.
+% \item
+% Test file added.
+% \end{Version}
+% \end{History}
+%
+% \PrintIndex
+%
+% \Finale
+\endinput
diff --git a/Master/texmf-dist/source/latex/oberdiek/pdfcrypt.dtx b/Master/texmf-dist/source/latex/oberdiek/pdfcrypt.dtx
index 68581f4d4e7..4512d07ab15 100644
--- a/Master/texmf-dist/source/latex/oberdiek/pdfcrypt.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/pdfcrypt.dtx
@@ -676,7 +676,7 @@ and the derived files
}%
|gdef|pc@EscapeRemove#1\#2#3|@nil{%
#1#2%
- |ifx|\#3|\%
+ |ifx|\#3|\%%
|else
|@ReturnAfterFi{%
|pc@EscapeRemove#3|@nil
@@ -837,6 +837,7 @@ and the derived files
% \begin{macrocode}
%</package>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
diff --git a/Master/texmf-dist/source/latex/oberdiek/pdfescape.dtx b/Master/texmf-dist/source/latex/oberdiek/pdfescape.dtx
index a385bc92828..e5c75987403 100644
--- a/Master/texmf-dist/source/latex/oberdiek/pdfescape.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/pdfescape.dtx
@@ -18,7 +18,7 @@
% and the derived files
% pdfescape.sty, pdfescape.pdf, pdfescape.ins, pdfescape.drv,
% pdfescape-test1.tex, pdfescape-test2.tex,
-% pdfescape-test3.tex.
+% pdfescape-test3.tex, pdfescape-test4.tex.
%
% Distribution:
% CTAN:macros/latex/contrib/oberdiek/pdfescape.dtx
@@ -56,6 +56,7 @@
% TDS:doc/latex/oberdiek/pdfescape-test1.tex
% TDS:doc/latex/oberdiek/pdfescape-test2.tex
% TDS:doc/latex/oberdiek/pdfescape-test3.tex
+% TDS:doc/latex/oberdiek/pdfescape-test4.tex
% TDS:source/latex/oberdiek/pdfescape.dtx
%
%<*ignore>
@@ -71,7 +72,7 @@
\input docstrip.tex
\Msg{************************************************************************}
\Msg{* Installation}
-\Msg{* Package: pdfescape 2007/04/21 v1.4 Provides hex, PDF name and string conversions (HO)}
+\Msg{* Package: pdfescape 2007/09/09 v1.6 Provides hex, PDF name and string conversions (HO)}
\Msg{************************************************************************}
\keepsilent
@@ -99,7 +100,7 @@ This work consists of the main source file pdfescape.dtx
and the derived files
pdfescape.sty, pdfescape.pdf, pdfescape.ins, pdfescape.drv,
pdfescape-test1.tex, pdfescape-test2.tex,
- pdfescape-test3.tex.
+ pdfescape-test3.tex, pdfescape-test4.tex.
\endpreamble
@@ -112,6 +113,7 @@ and the derived files
\file{pdfescape-test1.tex}{\from{pdfescape.dtx}{test1}}%
\file{pdfescape-test2.tex}{\from{pdfescape.dtx}{test2}}%
\file{pdfescape-test3.tex}{\from{pdfescape.dtx}{test3}}%
+ \file{pdfescape-test4.tex}{\from{pdfescape.dtx}{test4}}%
}
\obeyspaces
@@ -137,7 +139,7 @@ and the derived files
%<*driver>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{pdfescape.drv}%
- [2007/04/21 v1.4 Provides hex, PDF name and string conversions (HO)]%
+ [2007/09/09 v1.6 Provides hex, PDF name and string conversions (HO)]%
\documentclass{ltxdoc}
\usepackage{holtxdoc}
\begin{document}
@@ -146,7 +148,7 @@ and the derived files
%</driver>
% \fi
%
-% \CheckSum{1815}
+% \CheckSum{1889}
%
% \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
@@ -167,7 +169,7 @@ and the derived files
% \GetFileInfo{pdfescape.drv}
%
% \title{The \xpackage{pdfescape} package}
-% \date{2007/04/21 v1.4}
+% \date{2007/09/09 v1.6}
% \author{Heiko Oberdiek\\\xemail{oberdiek@uni-freiburg.de}}
%
% \maketitle
@@ -213,7 +215,7 @@ and the derived files
%
% \subsection{Additional unescape macros}
%
-% \begin{declcs}{EdefUnescapeName} \M{cmd} \M{string}\\
+% \begin{declcs}{EdefUnescapeName} \M{cmd} \M{string}
% \end{declcs}
% Sequences of a hash sign with two hexadecimal digits are
% converted to the corresponding character (PDF-1.2).
@@ -222,13 +224,21 @@ and the derived files
% TeX's conventions. The space has catcode 10 (space) and
% the other characters have catcode 12 (other).
%
-% \begin{declcs}{EdefUnescapeString} \M{cmd} \M{string}\\
+% \begin{declcs}{EdefUnescapeString} \M{cmd} \M{string}
% \end{declcs}
% Macro \meta{cmd} stores the unescaped string in \meta{string}.
% All the rules for literal strings are implemented, see
% PDF specification.
% The catcodes in the result string follow TeX's conventions.
%
+% \subsection{Sanitizing macro}
+%
+% \begin{declcs}{EdefSanitize} \M{cmd} \M{string}
+% \end{declcs}
+% Argument \meta{string} is expanded, converted to a string
+% of tokens with catcode 12 (other) and space tokens, and
+% stored in macro \meta{cmd}.
+%
% \StopEventually{
% }
%
@@ -238,35 +248,6 @@ and the derived files
%<*package>
% \end{macrocode}
%
-% \subsection{Catcodes}
-%
-% \begin{macrocode}
-\expandafter\edef\csname PE@AtEnd\endcsname{%
- \catcode64 \the\catcode64\relax
-}
-\catcode64 11 % @
-\def\PE@EnsureCode#1#2#3{%
- \edef\PE@AtEnd{%
- \PE@AtEnd
- #1#2 \the#1#2\relax
- }%
- #1#2 #3\relax
-}
-\PE@EnsureCode\catcode{0}{12}% ^^@
-\PE@EnsureCode\catcode{34}{12}% "
-\PE@EnsureCode\catcode{42}{12}% *
-\PE@EnsureCode\catcode{45}{12}% -
-\PE@EnsureCode\catcode{46}{12}% .
-\PE@EnsureCode\catcode{60}{12}% <
-\PE@EnsureCode\catcode{61}{12}% =
-\PE@EnsureCode\catcode{62}{12}% >
-\PE@EnsureCode\catcode{94}{7}% ^
-\PE@EnsureCode\catcode{96}{12}% `
-\PE@EnsureCode\uccode{34}{0}% "
-\PE@EnsureCode\uccode{48}{0}% 0
-\PE@EnsureCode\uccode{61}{0}% =
-% \end{macrocode}
-%
% \subsection{Reload check and package identification}
% Reload check, especially if the package is not used with \LaTeX.
% \begin{macrocode}
@@ -325,19 +306,49 @@ and the derived files
\fi
\expandafter\x\csname ver@pdfescape.sty\endcsname
\ProvidesPackage{pdfescape}%
- [2007/04/21 v1.4 Provides hex, PDF name and string conversions (HO)]
+ [2007/09/09 v1.6 Provides hex, PDF name and string conversions (HO)]
+% \end{macrocode}
+%
+% \subsection{Catcodes}
+%
+% \begin{macrocode}
+\expandafter\edef\csname PE@AtEnd\endcsname{%
+ \catcode64 \the\catcode64\relax
+}
+\catcode64 11 % @
+\def\TMP@EnsureCode#1#2#3{%
+ \edef\PE@AtEnd{%
+ \PE@AtEnd
+ #1#2 \the#1#2\relax
+ }%
+ #1#2 #3\relax
+}
+\TMP@EnsureCode\catcode{0}{12}% ^^@
+\TMP@EnsureCode\catcode{34}{12}% "
+\TMP@EnsureCode\catcode{39}{12}% '
+\TMP@EnsureCode\catcode{42}{12}% *
+\TMP@EnsureCode\catcode{45}{12}% -
+\TMP@EnsureCode\catcode{46}{12}% .
+\TMP@EnsureCode\catcode{60}{12}% <
+\TMP@EnsureCode\catcode{61}{12}% =
+\TMP@EnsureCode\catcode{62}{12}% >
+\TMP@EnsureCode\catcode{94}{7}% ^
+\TMP@EnsureCode\catcode{96}{12}% `
+\TMP@EnsureCode\uccode{34}{0}% "
+\TMP@EnsureCode\uccode{48}{0}% 0
+\TMP@EnsureCode\uccode{61}{0}% =
% \end{macrocode}
%
% \subsection{Sanitizing}
%
-% \begin{macro}{\PE@sanitize}
-% Macro \cs{PE@sanitize} takes |#2|, entirely converts
+% \begin{macro}{\EdefSanitize}
+% Macro \cs{EdefSanitize} takes |#2|, entirely converts
% it to token with catcode 12 (other) and stores the
% result in macro |#1|.
% \begin{macrocode}
\begingroup\expandafter\expandafter\expandafter\endgroup
\expandafter\ifx\csname detokenize\endcsname\relax
- \long\def\PE@sanitize#1#2{%
+ \long\def\EdefSanitize#1#2{%
\begingroup
\csname @safe@activestrue\endcsname
\edef#1{#2}%
@@ -355,7 +366,7 @@ and the derived files
\let\PE@onelevel@sanitize\@onelevel@sanitize
\fi
\else
- \long\def\PE@sanitize#1#2{%
+ \long\def\EdefSanitize#1#2{%
\begingroup
\csname @safe@activestrue\endcsname
\edef#1{#2}%
@@ -369,6 +380,13 @@ and the derived files
\fi
% \end{macrocode}
% \end{macro}
+% \begin{macro}{\PE@sanitize}
+% Macro \cs{PE@sanitize} is only defined for
+% compatibility with version 1.4. Its use is deprecated.
+% \begin{macrocode}
+\let\PE@sanitize\EdefSanitize
+% \end{macrocode}
+% \end{macro}
%
% \subsubsection{Space characters}
%
@@ -421,7 +439,7 @@ and the derived files
% \begin{macro}{\EdefUnescapeName}
% \begin{macrocode}
\def\EdefUnescapeName#1#2{%
- \PE@sanitize#1{#2}%
+ \EdefSanitize#1{#2}%
\PE@SanitizeSpaceOther#1%
\PE@UnescapeName#1%
\PE@onelevel@sanitize#1%
@@ -543,7 +561,7 @@ and the derived files
% \begin{macro}{\EdefUnescapeString}
% \begin{macrocode}
\def\EdefUnescapeString#1#2{%
- \PE@sanitize#1{#2}%
+ \EdefSanitize#1{#2}%
\PE@SanitizeSpaceOther#1%
\PE@NormalizeLineEnd#1%
\PE@UnescapeString#1%
@@ -731,7 +749,7 @@ and the derived files
% \begin{macro}{\EdefEscapeHex}
% \begin{macrocode}
\long\def\EdefEscapeHex#1#2{%
- \PE@sanitize#1{#2}%
+ \EdefSanitize#1{#2}%
\PE@SanitizeSpaceOther#1%
\PE@EscapeHex#1%
}%
@@ -740,7 +758,7 @@ and the derived files
% \begin{macro}{\EdefUnescapeHex}
% \begin{macrocode}
\def\EdefUnescapeHex#1#2{%
- \PE@sanitize#1{#2}%
+ \EdefSanitize#1{#2}%
\PE@UnescapeHex#1%
}%
% \end{macrocode}
@@ -748,7 +766,7 @@ and the derived files
% \begin{macro}{\EdefEscapeName}
% \begin{macrocode}
\long\def\EdefEscapeName#1#2{%
- \PE@sanitize#1{#2}%
+ \EdefSanitize#1{#2}%
\PE@SanitizeSpaceOther#1%
\PE@EscapeName#1%
}%
@@ -757,7 +775,7 @@ and the derived files
% \begin{macro}{\EdefEscapeString}
% \begin{macrocode}
\long\def\EdefEscapeString#1#2{%
- \PE@sanitize#1{#2}%
+ \EdefSanitize#1{#2}%
\PE@SanitizeSpaceOther#1%
\PE@EscapeString#1%
}%
@@ -1158,8 +1176,62 @@ and the derived files
%
% \section{Test}
%
+% \subsection{Catcode checks for loading}
+%
+% \begin{macrocode}
+%<*test1>
+% \end{macrocode}
+% \begin{macrocode}
+\catcode`\@=11 %
+\def\RestoreCatcodes{}
+\count@=0 %
+\loop
+ \edef\RestoreCatcodes{%
+ \RestoreCatcodes
+ \catcode\the\count@=\the\catcode\count@\relax
+ }%
+\ifnum\count@<255 %
+ \advance\count@\@ne
+\repeat
+
+\def\RangeCatcodeInvalid#1#2{%
+ \count@=#1\relax
+ \loop
+ \catcode\count@=15 %
+ \ifnum\count@<#2\relax
+ \advance\count@\@ne
+ \repeat
+}
+\def\Test{%
+ \RangeCatcodeInvalid{0}{47}%
+ \RangeCatcodeInvalid{58}{64}%
+ \RangeCatcodeInvalid{91}{96}%
+ \RangeCatcodeInvalid{123}{255}%
+ \catcode`\@=12 %
+ \catcode`\\=0 %
+ \catcode`\{=1 %
+ \catcode`\}=2 %
+ \catcode`\#=6 %
+ \catcode`\[=12 %
+ \catcode`\]=12 %
+ \catcode`\%=14 %
+ \catcode`\ =10 %
+ \catcode13=5 %
+ \input pdfescape.sty\relax
+ \RestoreCatcodes
+}
+\Test
+\csname @@end\endcsname
+\end
+% \end{macrocode}
+% \begin{macrocode}
+%</test1>
+% \end{macrocode}
+%
+% \subsection{Macro tests}
+%
% \begin{macrocode}
-%<*test1|test2|test3>
+%<*test2|test3|test4>
\NeedsTeXFormat{LaTeX2e}
\makeatletter
% \end{macrocode}
@@ -1167,28 +1239,28 @@ and the derived files
% \subsection{Test with \cs{pdfescape...} commands}
%
% \begin{macrocode}
-%<*test1>
+%<*test2>
\ProvidesFile{pdfescape-test1.tex}%
- [2007/04/21 v1.4 Test with \string\pdfescape... commands]%
-%</test1>
+ [2007/09/09 v1.6 Test with \string\pdfescape... commands]%
+%</test2>
% \end{macrocode}
%
% \subsection{Test without \cs{pdfescape...}, with \eTeX}
%
% \begin{macrocode}
-%<*test2>
+%<*test3>
\ProvidesFile{pdfescape-test2.tex}%
- [2007/04/21 v1.4 Test without \string\pdfescape..., with e-TeX]%
-%</test2>
+ [2007/09/09 v1.6 Test without \string\pdfescape..., with e-TeX]%
+%</test3>
% \end{macrocode}
%
% \subsection{Test without \cs{pdfescape...} and \eTeX}
%
% \begin{macrocode}
-%<*test3>
+%<*test4>
\ProvidesFile{pdfescape-test3.tex}%
- [2007/04/21 v1.4 Test without \string\pdfescape... and e-TeX]%
-%</test3>
+ [2007/09/09 v1.6 Test without \string\pdfescape... and e-TeX]%
+%</test4>
% \end{macrocode}
%
% \subsection{Check/ensure test preconditions}
@@ -1196,35 +1268,35 @@ and the derived files
% \subsubsection{Check \cs{pdfescape...}}
%
% \begin{macrocode}
-%<*test1>
+%<*test2>
\@ifundefined{pdfescapehex}{%
\PackageError{pdfescape-test1}{%
Missing \string\pdfescape... commands%
}{Test aborted.}%
\stop
}{}
-%</test1>
+%</test2>
% \end{macrocode}
% \begin{macrocode}
-%<*test2|test3>
+%<*test3|test4>
\let\pdfescapehex\@undefined
\let\pdfunescapehex\@undefined
\let\pdfescapename\@undefined
\let\pdfescapestring\@undefined
-%</test2|test3>
+%</test3|test4>
% \end{macrocode}
%
% \subsubsection{Check \eTeX}
%
% \begin{macrocode}
-%<*test2>
+%<*test3>
\@ifundefined{numexpr}{%
\PackageError{pdfescape-test2}{%
Missing \eTeX
}{Test aborted.}%
\stop
}{}
-%</test2>
+%</test3>
% \end{macrocode}
% Package \xpackage{qstest} uses \eTeX, thus \eTeX's features
% can only be disabled later during loading of package \xpackage{pdfescape}.
@@ -1343,17 +1415,17 @@ and the derived files
|endgroup
\@onelevel@sanitize\AllBytesString
-%<*test3>
+%<*test4>
\let\org@detokenize\detokenize
\let\detokenize\@undefined
\let\org@numexpr\numexpr
\let\numexpr\@undefined
-%</test3>
+%</test4>
\RequirePackage{pdfescape}
-%<*test3>
+%<*test4>
\let\detokenize\org@detokenize
\let\numexpr\org@numexpr
-%</test3>
+%</test4>
\begin{qstest}{all-hex}{\AllBytes, escapehex}
\EdefEscapeHex\x{\AllBytes}%
@@ -1406,7 +1478,7 @@ and the derived files
\@onelevel@sanitize\y
\ExpectVar\x\y
}%
-%<*test1>
+%<*test2>
\edef\x{\pdfunescapehex{4X}}%
\edef\y{\string @}%
\ifx\x\y
@@ -1419,7 +1491,7 @@ and the derived files
\typeout{************************************}%
\def\test#1#2{}%
\fi
-%</test1>
+%</test2>
\test{X}{}%
\test{XY}{}%
\test{XYZ}{}%
@@ -1593,8 +1665,9 @@ and the derived files
% \end{macrocode}
%
% \begin{macrocode}
-%</test1|test2|test3>
+%</test2|test3|test4>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
@@ -1659,6 +1732,7 @@ and the derived files
% pdfescape-test1.tex & doc/latex/oberdiek/pdfescape-test1.tex\\
% pdfescape-test2.tex & doc/latex/oberdiek/pdfescape-test2.tex\\
% pdfescape-test3.tex & doc/latex/oberdiek/pdfescape-test3.tex\\
+% pdfescape-test4.tex & doc/latex/oberdiek/pdfescape-test4.tex\\
% pdfescape.dtx & source/latex/oberdiek/pdfescape.dtx\\
% \end{tabular}^^A
% }^^A
@@ -1814,6 +1888,14 @@ and the derived files
% \item
% \cs{EdefUnescapeName} and \cs{EdefUnescapeString} added.
% \end{Version}
+% \begin{Version}{2007/08/27 v1.5}
+% \item
+% \cs{EdefSanitize} added (replaces \cs{PE@sanitize}).
+% \end{Version}
+% \begin{Version}{2007/09/09 v1.6}
+% \item
+% Fix in catcode setup.
+% \end{Version}
% \end{History}
%
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/oberdiek/pdflscape.dtx b/Master/texmf-dist/source/latex/oberdiek/pdflscape.dtx
index b8e6f39a367..b0d102478bd 100644
--- a/Master/texmf-dist/source/latex/oberdiek/pdflscape.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/pdflscape.dtx
@@ -533,6 +533,7 @@ and the derived files
% \begin{macrocode}
%</package>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
diff --git a/Master/texmf-dist/source/latex/oberdiek/picture.dtx b/Master/texmf-dist/source/latex/oberdiek/picture.dtx
index 0842b56f771..7e02a938c18 100644
--- a/Master/texmf-dist/source/latex/oberdiek/picture.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/picture.dtx
@@ -521,6 +521,7 @@ and the derived files
% \begin{macrocode}
%</package>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
diff --git a/Master/texmf-dist/source/latex/oberdiek/pmboxdraw.dtx b/Master/texmf-dist/source/latex/oberdiek/pmboxdraw.dtx
index a78aaa5c443..dd2d9c394e7 100644
--- a/Master/texmf-dist/source/latex/oberdiek/pmboxdraw.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/pmboxdraw.dtx
@@ -1677,6 +1677,7 @@ and the derived files
% \begin{macrocode}
%</utf8>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
diff --git a/Master/texmf-dist/source/latex/oberdiek/refcount.dtx b/Master/texmf-dist/source/latex/oberdiek/refcount.dtx
index f6ba87789ee..bd224367a77 100644
--- a/Master/texmf-dist/source/latex/oberdiek/refcount.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/refcount.dtx
@@ -424,6 +424,7 @@ and the derived files
\def\rc@@extract@title#1\TR@TitleReference#2#3#4\@nil{#3}
%</package>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
diff --git a/Master/texmf-dist/source/latex/oberdiek/selinput.dtx b/Master/texmf-dist/source/latex/oberdiek/selinput.dtx
index 42e49bfafe2..bfb5daca727 100644
--- a/Master/texmf-dist/source/latex/oberdiek/selinput.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/selinput.dtx
@@ -73,7 +73,7 @@
\input docstrip.tex
\Msg{************************************************************************}
\Msg{* Installation}
-\Msg{* Package: selinput 2007/06/20 v1.1 Select input encoding (HO)}
+\Msg{* Package: selinput 2007/09/09 v1.2 Select input encoding (HO)}
\Msg{************************************************************************}
\keepsilent
@@ -141,7 +141,7 @@ and the derived files
%<*driver>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{selinput.drv}%
- [2007/06/20 v1.1 Select input encoding (HO)]%
+ [2007/09/09 v1.2 Select input encoding (HO)]%
\documentclass{ltxdoc}
\usepackage{holtxdoc}
\usepackage[T1]{fontenc}
@@ -175,7 +175,7 @@ and the derived files
% \GetFileInfo{selinput.drv}
%
% \title{The \xpackage{selinput} package}
-% \date{2007/06/20 v1.1}
+% \date{2007/09/09 v1.2}
% \author{Heiko Oberdiek\\\xemail{oberdiek@uni-freiburg.de}}
%
% \maketitle
@@ -352,7 +352,7 @@ and the derived files
%<*package>
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{selinput}
- [2007/06/20 v1.1 Select input encoding (HO)]%
+ [2007/09/09 v1.2 Select input encoding (HO)]%
% \end{macrocode}
%
% \begin{macrocode}
@@ -396,7 +396,7 @@ and the derived files
\ifx\SIE@Encoding\@empty
\StringEncodingConvertTest\SIE@temp\SIE@StringDest
{ascii}{utf16be}{%
- \def\SIE@Encoding{ascii}
+ \def\SIE@Encoding{ascii}%
\SIE@Info{selinput}{%
Matching encoding not found, but input characters%
\MessageBreak
@@ -665,7 +665,7 @@ and the derived files
\sbox2{#2}%
\Expect*{wd:\the\wd0, ht:\the\ht0, dp:\the\dp0}%
*{wd:\the\wd2, ht:\the\ht2, dp:\the\dp2}%
- [#1=##1] %
+ [#1=##1] % hash-ok
}%
}
\RequirePackage{keyval}
@@ -674,7 +674,7 @@ and the derived files
\TestKey{Euro}{\texteuro}
\makeatother
\usepackage[
- warning,
+ warning,%
%<test2> utf8=utf-8,
%<test3> ucs,
]{selinput}
@@ -683,20 +683,20 @@ and the derived files
%<test3>\usepackage{ucs}
\begin{qstest}{preamble}{}
\TestEncoding{x-iso-8859-15}{%
- adieresis=^^e4,
- germandbls=^^df,
- Euro=^^a4,
+ adieresis=^^e4,%
+ germandbls=^^df,%
+ Euro=^^a4,%
}%
\TestEncoding{x-cp1252}{%
- adieresis=^^e4,
- germandbls=^^df,
- Euro=^^80,
+ adieresis=^^e4,%
+ germandbls=^^df,%
+ Euro=^^80,%
}%
%<test1> \TestEncoding{utf8}{%
%<test2> \TestEncoding{utf-8}{%
%<test3> \TestEncoding{utf8x}{%
- adieresis=^^c3^^a4,
- germandbls=^^c3^^9f,
+ adieresis=^^c3^^a4,%
+ germandbls=^^c3^^9f,%
%<!test2> Euro=^^e2^^82^^ac,
}%
\end{qstest}
@@ -713,17 +713,17 @@ and the derived files
%<*test4>
\usepackage[warning,ucs]{selinput}
\SelectInputMappings{
- adieresis=^^c3^^a4,
- germandbls=^^c3^^9f,
- Euro=^^e2^^82^^ac,
+ adieresis=^^c3^^a4,%
+ germandbls=^^c3^^9f,%
+ Euro=^^e2^^82^^ac,%
}
\begin{qstest}{encoding}{}
\Expect*{\inputencodingname}{utf8x}%
\end{qstest}
\begin{document}
- adieresis=^^c3^^a4,
- germandbls=^^c3^^9f,
- Euro=^^e2^^82^^ac
+ adieresis=^^c3^^a4, %
+ germandbls=^^c3^^9f, %
+ Euro=^^e2^^82^^ac%
%</test4>
% \end{macrocode}
%
@@ -731,17 +731,17 @@ and the derived files
%<*test5>
\usepackage[warning,ucs]{selinput}
\SelectInputMappings{
- adieresis={\"a},
- germandbls={{\ss}},
- Euro=\texteuro{},
+ adieresis={\"a},%
+ germandbls={{\ss}},%
+ Euro=\texteuro{},%
}
\begin{qstest}{encoding}{}
\Expect*{\inputencodingname}{ascii}%
\end{qstest}
\begin{document}
- adieresis={\"a},
- germandbls={{\ss}},
- Euro=\texteuro{}
+ adieresis={\"a}, %
+ germandbls={{\ss}}, %
+ Euro=\texteuro{}%
%</test5>
% \end{macrocode}
%
@@ -749,6 +749,7 @@ and the derived files
\end{document}
%</test>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
@@ -967,6 +968,10 @@ and the derived files
% \item
% Requested date for package \xpackage{stringenc} fixed.
% \end{Version}
+% \begin{Version}{2007/09/09 v1.2}
+% \item
+% Line end fixed.
+% \end{Version}
% \end{History}
%
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/oberdiek/setouterhbox.dtx b/Master/texmf-dist/source/latex/oberdiek/setouterhbox.dtx
index bc616933a0f..039f226328e 100644
--- a/Master/texmf-dist/source/latex/oberdiek/setouterhbox.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/setouterhbox.dtx
@@ -18,7 +18,8 @@
% This work consists of the main source file setouterhbox.dtx
% and the derived files
% setouterhbox.sty, setouterhbox.pdf, setouterhbox.ins, setouterhbox.drv,
-% setouterhbox-example.tex.
+% setouterhbox-example.tex, setouterhbox-test1.tex,
+% setouterhbox-test2.tex.
%
% Distribution:
% CTAN:macros/latex/contrib/oberdiek/setouterhbox.dtx
@@ -54,6 +55,8 @@
% TDS:tex/generic/oberdiek/setouterhbox.sty
% TDS:doc/latex/oberdiek/setouterhbox.pdf
% TDS:doc/latex/oberdiek/setouterhbox-example.tex
+% TDS:doc/latex/oberdiek/setouterhbox-test1.tex
+% TDS:doc/latex/oberdiek/setouterhbox-test2.tex
% TDS:source/latex/oberdiek/setouterhbox.dtx
%
%<*ignore>
@@ -69,7 +72,7 @@
\input docstrip.tex
\Msg{************************************************************************}
\Msg{* Installation}
-\Msg{* Package: setouterhbox 2007/05/17 v1.6 Set hbox in outer horizontal mode (HO)}
+\Msg{* Package: setouterhbox 2007/09/09 v1.7 Set hbox in outer horizontal mode (HO)}
\Msg{************************************************************************}
\keepsilent
@@ -97,7 +100,8 @@ This Current Maintainer of this work is Heiko Oberdiek.
This work consists of the main source file setouterhbox.dtx
and the derived files
setouterhbox.sty, setouterhbox.pdf, setouterhbox.ins, setouterhbox.drv,
- setouterhbox-example.tex.
+ setouterhbox-example.tex, setouterhbox-test1.tex,
+ setouterhbox-test2.tex.
\endpreamble
@@ -108,6 +112,8 @@ and the derived files
\file{setouterhbox.sty}{\from{setouterhbox.dtx}{package}}%
\usedir{doc/latex/oberdiek}%
\file{setouterhbox-example.tex}{\from{setouterhbox.dtx}{example}}%
+ \file{setouterhbox-test1.tex}{\from{setouterhbox.dtx}{test1}}%
+ \file{setouterhbox-test2.tex}{\from{setouterhbox.dtx}{test2}}%
}
\obeyspaces
@@ -133,7 +139,7 @@ and the derived files
%<*driver>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{setouterhbox.drv}%
- [2007/05/17 v1.6 Set hbox in outer horizontal mode (HO)]%
+ [2007/09/09 v1.7 Set hbox in outer horizontal mode (HO)]%
\documentclass{ltxdoc}
\usepackage{holtxdoc}
\begin{document}
@@ -142,7 +148,7 @@ and the derived files
%</driver>
% \fi
%
-% \CheckSum{334}
+% \CheckSum{461}
%
% \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
@@ -163,7 +169,7 @@ and the derived files
% \GetFileInfo{setouterhbox.drv}
%
% \title{The \xpackage{setouterhbox} package}
-% \date{2007/05/17 v1.6}
+% \date{2007/09/09 v1.7}
% \author{Heiko Oberdiek\\\xemail{oberdiek@uni-freiburg.de}}
%
% \maketitle
@@ -401,9 +407,36 @@ by/a/very_long_long_long_path.html}%
\fi
\expandafter\x\csname ver@setouterhbox.sty\endcsname
\ProvidesPackage{setouterhbox}%
- [2007/05/17 v1.6 Set hbox in outer horizontal mode (HO)]
+ [2007/09/09 v1.7 Set hbox in outer horizontal mode (HO)]
% \end{macrocode}
%
+% \begin{macrocode}
+\expandafter\edef\csname setouterhboxAtEnd\endcsname{%
+ \catcode64 \the\catcode64\relax
+}
+\catcode64 11 % @
+\def\TMP@EnsureCode#1#2{%
+ \edef\setouterhboxAtEnd{%
+ \setouterhboxAtEnd
+ \catcode#1 \the\catcode#1\relax
+ }%
+ \catcode#1 #2\relax
+}
+\TMP@EnsureCode{40}{12}% (
+\TMP@EnsureCode{41}{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{61}{12}% =
+\TMP@EnsureCode{62}{12}% >
+\TMP@EnsureCode{96}{12}% `
+% \end{macrocode}
+%
+% \subsection{Interface macros}
+%
% \begin{macro}{\setouterhboxBox}
% The method requires a global box assignment. To be on the
% safe side, a new box register is allocated for this
@@ -420,7 +453,7 @@ by/a/very_long_long_long_path.html}%
\expandafter\ifx\csname RequirePackage\endcsname\relax
\input infwarerr.sty\relax
\else
- \RequirePackage{infwarerr}%
+ \RequirePackage{infwarerr}[2007/09/09]%
\fi
\edef\setouterhboxFailure#1#2{%
\expandafter\noexpand\csname @PackageError\endcsname
@@ -660,6 +693,7 @@ E \egroup
\expandafter\endgroup
\ifx\x\fmtname
\else
+ \setouterhboxAtEnd
\expandafter\endinput
\fi
% \end{macrocode}
@@ -679,8 +713,100 @@ E \egroup
% \end{macrocode}
%
% \begin{macrocode}
+\setouterhboxAtEnd
%</package>
% \end{macrocode}
+%
+% \section{Test}
+%
+% \subsection{Catcode checks for loading}
+%
+% \begin{macrocode}
+%<*test1>
+% \end{macrocode}
+% \begin{macrocode}
+\catcode`\@=11 %
+\def\RestoreCatcodes{}
+\count@=0 %
+\loop
+ \edef\RestoreCatcodes{%
+ \RestoreCatcodes
+ \catcode\the\count@=\the\catcode\count@\relax
+ }%
+\ifnum\count@<255 %
+ \advance\count@\@ne
+\repeat
+
+\def\RangeCatcodeInvalid#1#2{%
+ \count@=#1\relax
+ \loop
+ \catcode\count@=15 %
+ \ifnum\count@<#2\relax
+ \advance\count@\@ne
+ \repeat
+}
+\def\Test{%
+ \RangeCatcodeInvalid{0}{47}%
+ \RangeCatcodeInvalid{58}{64}%
+ \RangeCatcodeInvalid{91}{96}%
+ \RangeCatcodeInvalid{123}{255}%
+ \catcode`\@=12 %
+ \catcode`\\=0 %
+ \catcode`\{=1 %
+ \catcode`\}=2 %
+ \catcode`\#=6 %
+ \catcode`\[=12 %
+ \catcode`\]=12 %
+ \catcode`\%=14 %
+ \catcode`\ =10 %
+ \catcode13=5 %
+ \input setouterhbox.sty\relax
+ \RestoreCatcodes
+}
+\Test
+\csname @@end\endcsname
+\end
+% \end{macrocode}
+% \begin{macrocode}
+%</test1>
+% \end{macrocode}
+%
+% \subsection{Test with package \xpackage{url}}
+%
+% \begin{macrocode}
+%<*test2>
+\nofiles
+\documentclass[a5paper]{article}
+\usepackage{url}[2005/06/27]
+\usepackage{setouterhbox}
+
+\newsavebox{\testbox}
+
+\setlength{\parindent}{0pt}
+\setlength{\parskip}{2em}
+
+\begin{document}
+\raggedright
+
+\url{http://this.is.a.very.long.host.name/followed/%
+by/a/very_long_long_long_path.html}%
+
+\sbox\testbox{%
+ \url{http://this.is.a.very.long.host.name/followed/%
+ by/a/very_long_long_long_path.html}%
+}%
+\unhbox\testbox
+
+\begin{setouterhbox}{\testbox}%
+ \url{http://this.is.a.very.long.host.name/followed/%
+ by/a/very_long_long_long_path.html}%
+\end{setouterhbox}
+\unhbox\testbox
+
+\end{document}
+%</test2>
+% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
@@ -743,6 +869,8 @@ E \egroup
% setouterhbox.sty & tex/generic/oberdiek/setouterhbox.sty\\
% setouterhbox.pdf & doc/latex/oberdiek/setouterhbox.pdf\\
% setouterhbox-example.tex & doc/latex/oberdiek/setouterhbox-example.tex\\
+% setouterhbox-test1.tex & doc/latex/oberdiek/setouterhbox-test1.tex\\
+% setouterhbox-test2.tex & doc/latex/oberdiek/setouterhbox-test2.tex\\
% setouterhbox.dtx & source/latex/oberdiek/setouterhbox.dtx\\
% \end{tabular}^^A
% }^^A
@@ -923,6 +1051,10 @@ E \egroup
% \item
% Standard header part for generic files.
% \end{Version}
+% \begin{Version}{2007/09/09 v1.7}
+% \item
+% Catcode section added.
+% \end{Version}
% \end{History}
%
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/oberdiek/settobox.dtx b/Master/texmf-dist/source/latex/oberdiek/settobox.dtx
index 5f4bc332c88..31ea14d36a4 100644
--- a/Master/texmf-dist/source/latex/oberdiek/settobox.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/settobox.dtx
@@ -515,6 +515,7 @@ and the derived files
% \begin{macrocode}
%</package>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
diff --git a/Master/texmf-dist/source/latex/oberdiek/soulutf8.dtx b/Master/texmf-dist/source/latex/oberdiek/soulutf8.dtx
new file mode 100644
index 00000000000..567ec5de4ad
--- /dev/null
+++ b/Master/texmf-dist/source/latex/oberdiek/soulutf8.dtx
@@ -0,0 +1,1760 @@
+% \iffalse meta-comment
+%
+% Copyright (C) 2007 by Heiko Oberdiek <oberdiek@uni-freiburg.de>
+%
+% This work may be distributed and/or modified under the
+% conditions of the LaTeX Project Public License, either
+% version 1.3 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.3 or later is part of all distributions of
+% LaTeX version 2005/12/01 or later.
+%
+% This work has the LPPL maintenance status "maintained".
+%
+% This Current Maintainer of this work is Heiko Oberdiek.
+%
+% This work consists of the main source file soulutf8.dtx
+% and the derived files
+% soulutf8.sty, soulutf8.pdf, soulutf8.ins, soulutf8.drv,
+% soulutf8-test1.tex, soulutf8-test2.tex, soulutf8-test3.tex,
+% soulutf8-test4.tex, soulutf8-test5.tex.
+%
+% Distribution:
+% CTAN:macros/latex/contrib/oberdiek/soulutf8.dtx
+% CTAN:macros/latex/contrib/oberdiek/soulutf8.pdf
+%
+% Unpacking:
+% (a) If soulutf8.ins is present:
+% tex soulutf8.ins
+% (b) Without soulutf8.ins:
+% tex soulutf8.dtx
+% (c) If you insist on using LaTeX
+% latex \let\install=y\input{soulutf8.dtx}
+% (quote the arguments according to the demands of your shell)
+%
+% Documentation:
+% (a) If soulutf8.drv is present:
+% latex soulutf8.drv
+% (b) Without soulutf8.drv:
+% latex soulutf8.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 soulutf8.dtx
+% makeindex -s gind.ist soulutf8.idx
+% pdflatex soulutf8.dtx
+% makeindex -s gind.ist soulutf8.idx
+% pdflatex soulutf8.dtx
+%
+% Installation:
+% TDS:tex/generic/oberdiek/soulutf8.sty
+% TDS:doc/latex/oberdiek/soulutf8.pdf
+% TDS:doc/latex/oberdiek/soulutf8-test1.tex
+% TDS:doc/latex/oberdiek/soulutf8-test2.tex
+% TDS:doc/latex/oberdiek/soulutf8-test3.tex
+% TDS:doc/latex/oberdiek/soulutf8-test4.tex
+% TDS:doc/latex/oberdiek/soulutf8-test5.tex
+% TDS:source/latex/oberdiek/soulutf8.dtx
+%
+%<*ignore>
+\begingroup
+ \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: soulutf8 2007/09/09 v1.0 Adding support for UTF-8 to soul (HO)}
+\Msg{************************************************************************}
+
+\keepsilent
+\askforoverwritefalse
+
+\preamble
+
+This is a generated file.
+
+Copyright (C) 2007 by Heiko Oberdiek <oberdiek@uni-freiburg.de>
+
+This work may be distributed and/or modified under the
+conditions of the LaTeX Project Public License, either
+version 1.3 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.3 or later is part of all distributions of
+LaTeX version 2005/12/01 or later.
+
+This work has the LPPL maintenance status "maintained".
+
+This Current Maintainer of this work is Heiko Oberdiek.
+
+This work consists of the main source file soulutf8.dtx
+and the derived files
+ soulutf8.sty, soulutf8.pdf, soulutf8.ins, soulutf8.drv,
+ soulutf8-test1.tex, soulutf8-test2.tex, soulutf8-test3.tex,
+ soulutf8-test4.tex, soulutf8-test5.tex.
+
+\endpreamble
+
+\generate{%
+ \file{soulutf8.ins}{\from{soulutf8.dtx}{install}}%
+ \file{soulutf8.drv}{\from{soulutf8.dtx}{driver}}%
+ \usedir{tex/generic/oberdiek}%
+ \file{soulutf8.sty}{\from{soulutf8.dtx}{package}}%
+ \usedir{doc/latex/oberdiek}%
+ \file{soulutf8-test1.tex}{\from{soulutf8.dtx}{test1}}%
+ \file{soulutf8-test2.tex}{\from{soulutf8.dtx}{test2,utf8}}%
+ \file{soulutf8-test3.tex}{\from{soulutf8.dtx}{test3,utf8x}}%
+ \file{soulutf8-test4.tex}{\from{soulutf8.dtx}{test4,utf8,noetex}}%
+ \file{soulutf8-test5.tex}{\from{soulutf8.dtx}{test5,utf8x,noetex}}%
+}
+
+\obeyspaces
+\Msg{************************************************************************}
+\Msg{*}
+\Msg{* To finish the installation you have to move the following}
+\Msg{* file into a directory searched by TeX:}
+\Msg{*}
+\Msg{* soulutf8.sty}
+\Msg{*}
+\Msg{* To produce the documentation run the file `soulutf8.drv'}
+\Msg{* through LaTeX.}
+\Msg{*}
+\Msg{* Happy TeXing!}
+\Msg{*}
+\Msg{************************************************************************}
+
+\endbatchfile
+%</install>
+%<*ignore>
+\fi
+%</ignore>
+%<*driver>
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesFile{soulutf8.drv}%
+ [2007/09/09 v1.0 Adding support for UTF-8 to soul (HO)]%
+\documentclass{ltxdoc}
+\usepackage{holtxdoc}
+\begin{document}
+ \DocInput{soulutf8.dtx}%
+\end{document}
+%</driver>
+% \fi
+%
+% \CheckSum{1821}
+%
+% \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{soulutf8.drv}
+%
+% \title{The \xpackage{soulutf8} package}
+% \date{2007/09/09 v1.0}
+% \author{Heiko Oberdiek\\\xemail{oberdiek@uni-freiburg.de}}
+%
+% \maketitle
+%
+% \begin{abstract}
+% This package extends package \xpackage{soul} and adds some support
+% for UTF-8. Namely the input encodings \xfile{utf8.def}
+% from package \xpackage{inputenc} and
+% package \xpackage{ucs}'s \xfile{utf8x.def} are supported.
+% \end{abstract}
+%
+% \tableofcontents
+%
+% \section{Documentation}
+%
+% This package \xpackage{soulutf8} does not have own options and does not
+% define new user commands.
+% Any option is passed to package \xpackage{soul} \cite{soul}
+% that is loaded first.
+% Then some internal macros of \xpackage{soul} are redefined to add
+% support for UTF-8.
+% The following input encodings are supported:
+% \begin{quote}
+% \begin{tabular}{@{}lll@{}}
+% \texttt{utf8} & \LaTeX\ base &
+% \xfile{TDS:tex/latex/base/utf8.def} \cite{utf8}\\
+% \texttt{utf8x} & Package \xpackage{ucs} &
+% \xfile{TDS:tex/latex/ucs/utf8x.def} \cite{ucs}\\
+% \end{tabular}
+% \end{quote}
+% UTF-8 byte sequences are added as token group to a word, even
+% if these UTF-8 characters are some kind of hyphen or space.
+% As exception the following three Unicode characters are handled specially:
+% \begin{quote}
+% \begin{tabular}{lll}
+% Slot & Name & Action\\
+% \hline
+% \texttt{U+00A0} & NO-BREAK SPACE & like |~|\\
+% \texttt{U+2013} & EN DASH & |--|\\
+% \texttt{U+2014} & EM DASH & |---|
+% \end{tabular}
+%
+% \subsection{Patch}
+%
+% Also package \xpackage{soulutf8} tries to patch package \xpackage{soul}
+% to improve its behaviour:
+% \begin{itemize}
+% \item
+% A problem with additional levels of curly braces is fixed.
+% As advantage more implicite kernings are detected.
+% However, the result may be incompatible with the
+% original behaviour of package \xpackage{soul} because
+% of these respected implicite kernings.
+% \item
+% \eTeX\ , especially \cs{unexpanded} is supported.
+% This allows a better protection of token groups
+% (|\mbox{|\dots|}|, math, \dots).
+% \end{itemize}
+% \end{quote}
+%
+% \subsection{Future}
+%
+% Currently package \xpackage{soul} does not seem to be
+% maintained. Nevertheless if there will be a new version that
+% adds support for UTF-8, then this package may become
+% obsolete.
+%
+% \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
+ \catcode44 12 % ,
+ \catcode45 12 % -
+ \catcode46 12 % .
+ \catcode58 12 % :
+ \catcode64 11 % @
+ \expandafter\let\expandafter\x\csname ver@soulutf8.sty\endcsname
+ \ifcase 0%
+ \ifx\x\relax % plain
+ \else
+ \ifx\x\empty % LaTeX
+ \else
+ 1%
+ \fi
+ \fi
+ \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{soulutf8}{The package is already loaded}%
+ \endgroup
+ \expandafter\endinput
+ \fi
+\endgroup
+% \end{macrocode}
+% Package identification:
+% \begin{macrocode}
+\begingroup
+ \catcode40 12 % (
+ \catcode41 12 % )
+ \catcode44 12 % ,
+ \catcode45 12 % -
+ \catcode46 12 % .
+ \catcode47 12 % /
+ \catcode58 12 % :
+ \catcode64 11 % @
+ \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\relax
+ \xdef#1{#3}%
+ \fi
+ }%
+ \fi
+\expandafter\x\csname ver@soulutf8.sty\endcsname
+\ProvidesPackage{soulutf8}%
+ [2007/09/09 v1.0 Adding support for UTF-8 to soul (HO)]
+% \end{macrocode}
+%
+% \subsection{Catcodes}
+%
+% \begin{macrocode}
+\expandafter\edef\csname SOuL@AtEnd\endcsname{%
+ \catcode64 \the\catcode64\relax
+}
+\catcode64 11 % @
+\def\TMP@EnsureCode#1#2{%
+ \edef\SOuL@AtEnd{%
+ \SOuL@AtEnd
+ \catcode#1 \the\catcode#1\relax
+ }%
+ \catcode#1 #2\relax
+}
+\TMP@EnsureCode{10}{12}% ^^J
+\TMP@EnsureCode{33}{12}% !
+\TMP@EnsureCode{34}{12}% "
+\TMP@EnsureCode{36}{3}% $
+\TMP@EnsureCode{39}{12}% '
+\TMP@EnsureCode{40}{12}% (
+\TMP@EnsureCode{41}{12}% )
+\TMP@EnsureCode{42}{12}% *
+\TMP@EnsureCode{43}{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{61}{12}% =
+\TMP@EnsureCode{62}{12}% >
+\TMP@EnsureCode{94}{7}% ^
+\TMP@EnsureCode{96}{12}% `
+\TMP@EnsureCode{126}\active % ~
+\TMP@EnsureCode{128}{12}% ^^80
+\TMP@EnsureCode{147}{12}% ^^93
+\TMP@EnsureCode{148}{12}% ^^94
+\TMP@EnsureCode{160}{12}% ^^a0
+\TMP@EnsureCode{194}{12}% ^^c2
+\TMP@EnsureCode{226}{12}% ^^e2
+% \end{macrocode}
+%
+% \subsection{Loading packages}
+%
+% Package \xpackage{soul} uses \cs{documentclass} to detect \LaTeX.
+% \begin{macrocode}
+\ifx\documentclass\@undefined
+% \end{macrocode}
+%
+% \subsubsection{\plainTeX}
+%
+% First we check, whether package \xpackage{soul} is already loaded.
+% \begin{macrocode}
+ \expandafter\ifx\csname SOUL@\endcsname\relax
+% \end{macrocode}
+% In case of \plainTeX\ package \xpackage{soul} defines some
+% macros in a simple manner that will break the definitions of
+% \xfile{miniltx.tex}, for example. Therefore these macros
+% are first saved and restored afterwards.
+% \begin{macrocode}
+ \let\SOuL@orgDeclareRobustCommand\DeclareRobustCommand
+ \let\SOuL@orgnewcommand \newcommand
+ \let\SOuL@orgDeclareOption \DeclareOption
+ \let\SOuL@orgPackageError \PackageError
+ \def\SOuL@restorelatexcmds{%
+ \let\DeclareRobustCommand\SOuL@orgDeclareRobustCommand
+ \let\newcommand \SOuL@orgnewcommand
+ \let\DeclareOption \SOuL@orgDeclareOption
+ \let\PackageError \SOuL@orgPackageError
+ }%
+ \input soul.sty\relax
+ \SOuL@restorelatexcmds
+ \fi
+% \end{macrocode}
+% \begin{macro}{\SOUL@error}
+% Package \xpackage{soul}'s use of \cs{PackageError} is replaced
+% by \cs{@PackageError} of package \xpackage{infwarerr}.
+% \begin{macrocode}
+ \input infwarerr.sty\relax
+ \let\SOuL@orgSOUL@error\SOUL@error
+ \def\SOUL@error{%
+ \begingroup
+ \let\PackageError\@PackageError
+ \SOuL@orgSOUL@error
+ \endgroup
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+ \input etexcmds.sty\relax
+% \end{macrocode}
+% \begin{macro}{\@onelevel@sanitize}
+% Define \LaTeX's \cs{@onelevel@sanitize} if not already available.
+% \begin{macrocode}
+ \expandafter\ifx\csname @onelevel@sanitize\endcsname\relax
+ \def\@onelevel@sanitize#1{%
+ \edef#1{%
+ \expandafter\strip@prefix\meaning#1%
+ }%
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\strip@prefix}
+% \begin{macrocode}
+ \def\strip@prefix#1>{}%
+% \end{macrocode}
+% \end{macro}
+% \begin{macrocode}
+ \fi
+\else
+% \end{macrocode}
+%
+% \subsubsection{\LaTeX}
+% \begin{macrocode}
+ \DeclareOption*{\PassOptionsToPackage{\CurrentOption}{soul}}%
+ \ProcessOptions\relax
+ \RequirePackage{soul}[2003/11/17]%
+ \RequirePackage{infwarerr}[2007/09/09]%
+ \RequirePackage{etexcmds}[2007/09/09]%
+\fi
+% \end{macrocode}
+%
+% \subsubsection{\eTeX}
+%
+% In \plainTeX\ command \cs{+} is an \emph{outer} macro.
+% Therefore numbers are used to avoid problems.
+% \begin{macrocode}
+\ifetex@unexpanded
+ \catcode33=14 % '!': comment
+ \catcode43=9 % '+': ignore
+\else
+ \catcode33=9 % '!': ignore
+ \catcode43=14 % '+': comment
+\fi
+% \end{macrocode}
+%
+% \subsection{Macro for redefinitions}
+%
+% \begin{macro}{\SOuL@redefine}
+% \begin{macrocode}
+\def\SOuL@redefine#1{%
+ \begingroup
+ \def\SOuL@cmd{#1}%
+ \afterassignment\SOuL@cmdcheck
+ \def\SOuL@temp
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\SOuL@cmdcheck}
+% \begin{macrocode}
+\def\SOuL@cmdcheck{%
+ \expandafter\ifx\SOuL@cmd\SOuL@temp
+ \else
+ \edef\SOuL@temp*{\expandafter\string\SOuL@cmd}%
+ \@PackageWarningNoLine{soulutf8}{%
+ Command \SOuL@temp* has changed.\MessageBreak
+ Supported versions of package `soul': 2003/11/17.\MessageBreak
+ Depending on the unknown changes the redefinition\MessageBreak
+ of \SOuL@temp* may not behave correctly%
+ }%
+ \fi
+ \expandafter\endgroup
+ \expandafter\def\SOuL@cmd
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Redefinition of \cs{SOUL@eval}}
+%
+% \begin{macro}{\SOUL@eval}
+% Macro \cs{SOUL@eval} is redefined to add detection of
+% the first byte of a UTF-8 sequence. Because \cs{SOUL@eval}
+% is overwritten, a warning is issued, if the contents of
+% \cs{SOUL@eval} is not as expected.
+% \begin{macrocode}
+\SOuL@redefine\SOUL@eval{%
+% \end{macrocode}
+% First the expected definition.
+% \begin{macrocode}
+ \def\SOUL@n*##1{\SOUL@scan}%
+ \if\noexpand\SOUL@@\SOUL@spc
+ \else
+ \SOUL@ignorespacesfalse
+ \fi
+ \ifnum\SOUL@minus=\thr@@
+ \SOUL@flushminus
+ \else\ifnum\SOUL@comma=\tw@
+ \SOUL@flushcomma
+ \else\ifnum\SOUL@apo=\tw@
+ \SOUL@flushapo
+ \else\ifnum\SOUL@grave=\tw@
+ \SOUL@flushgrave
+ \fi\fi\fi\fi
+ \ifx\SOUL@@-\else\SOUL@flushminus\fi
+ \ifx\SOUL@@,\else\SOUL@flushcomma\fi
+ \ifx\SOUL@@'\else\SOUL@flushapo\fi
+ \ifx\SOUL@@`\else\SOUL@flushgrave\fi
+ \ifx\SOUL@@-%
+ \advance\SOUL@minus\@ne
+ \else\ifx\SOUL@@,%
+ \advance\SOUL@comma\@ne
+ \else\ifx\SOUL@@'%
+ \advance\SOUL@apo\@ne
+ \else\ifx\SOUL@@`%
+ \advance\SOUL@grave\@ne
+ \else
+ \SOUL@flushminus
+ \SOUL@flushcomma
+ \SOUL@flushapo
+ \SOUL@flushgrave
+ \ifx\SOUL@@\SOUL@stop
+ \def\SOUL@n*{%
+ \SOUL@doword
+ \SOUL@eventuallyexhyphen\null
+ }%
+ \else\ifx\SOUL@@\par
+ \def\SOUL@n*\par{\par\leavevmode\SOUL@scan}%
+ \else\if\noexpand\SOUL@@\SOUL@spc
+ \SOUL@doword
+ \SOUL@eventuallyexhyphen\null
+ \ifSOUL@ignorespaces
+ \else
+ \SOUL@everyspace{}%
+ \fi
+ \def\SOUL@n* {\SOUL@scan}%
+ \else\ifx\SOUL@@\\%
+ \SOUL@doword
+ \SOUL@eventuallyexhyphen\null
+ \SOUL@everyspace{\unskip\nobreak\hfil\break}%
+ \SOUL@ignorespacestrue
+ \else\ifx\SOUL@@~%
+ \SOUL@doword
+ \SOUL@eventuallyexhyphen\null
+ \SOUL@everyspace{\nobreak}%
+ \else\ifx\SOUL@@\slash
+ \SOUL@doword
+ \SOUL@eventuallyexhyphen{/}%
+ \SOUL@exhyphen{/}%
+ \else\ifx\SOUL@@\mbox
+ \def\SOUL@n*{\SOUL@addprotect}%
+ \else\ifx\SOUL@@\hbox
+ \def\SOUL@n*{\SOUL@addprotect}%
+ \else\ifx\SOUL@@\soulomit
+ \def\SOUL@n*\soulomit##1{%
+ \SOUL@doword
+ {\spaceskip\SOUL@spaceskip##1}%
+ \SOUL@scan
+ }%
+ \else\ifx\SOUL@@\break
+ \SOUL@doword
+ \break
+ \else\ifx\SOUL@@\linebreak
+ \SOUL@doword
+ \SOUL@everyspace{\linebreak}%
+ \else\ifcat\bgroup\noexpand\SOUL@@
+ \def\SOUL@n*{\SOUL@addgroup{}}%
+ \else\ifcat$\noexpand\SOUL@@
+ \def\SOUL@n*{\SOUL@addmath}%
+ \else
+ \def\SOUL@n*{\SOUL@dotoken}%
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \fi\fi\fi\fi
+ \SOUL@n*%
+}{%
+% \end{macrocode}
+% Now the redefined version follows.
+% \begin{macrocode}
+ \def\SOUL@n*##1{\SOUL@scan}%
+ \if\noexpand\SOUL@@\SOUL@spc
+ \else
+ \SOUL@ignorespacesfalse
+ \fi
+ \ifnum\SOUL@minus=\thr@@
+ \SOUL@flushminus
+ \else\ifnum\SOUL@comma=\tw@
+ \SOUL@flushcomma
+ \else\ifnum\SOUL@apo=\tw@
+ \SOUL@flushapo
+ \else\ifnum\SOUL@grave=\tw@
+ \SOUL@flushgrave
+ \fi\fi\fi\fi
+ \ifx\SOUL@@-\else\SOUL@flushminus\fi
+ \ifx\SOUL@@,\else\SOUL@flushcomma\fi
+ \ifx\SOUL@@'\else\SOUL@flushapo\fi
+ \ifx\SOUL@@`\else\SOUL@flushgrave\fi
+ \ifx\SOUL@@-%
+ \advance\SOUL@minus\@ne
+ \else\ifx\SOUL@@,%
+ \advance\SOUL@comma\@ne
+ \else\ifx\SOUL@@'%
+ \advance\SOUL@apo\@ne
+ \else\ifx\SOUL@@`%
+ \advance\SOUL@grave\@ne
+ \else
+ \SOUL@flushminus
+ \SOUL@flushcomma
+ \SOUL@flushapo
+ \SOUL@flushgrave
+ \ifx\SOUL@@\SOUL@stop
+ \def\SOUL@n*{%
+ \SOUL@doword
+ \SOUL@eventuallyexhyphen\null
+ }%
+ \else\ifx\SOUL@@\par
+ \def\SOUL@n*\par{\par\leavevmode\SOUL@scan}%
+ \else\if\noexpand\SOUL@@\SOUL@spc
+ \SOUL@doword
+ \SOUL@eventuallyexhyphen\null
+ \ifSOUL@ignorespaces
+ \else
+ \SOUL@everyspace{}%
+ \fi
+ \def\SOUL@n* {\SOUL@scan}%
+ \else\ifx\SOUL@@\\%
+ \SOUL@doword
+ \SOUL@eventuallyexhyphen\null
+ \SOUL@everyspace{\unskip\nobreak\hfil\break}%
+ \SOUL@ignorespacestrue
+ \else\ifx\SOUL@@~%
+ \SOUL@doword
+ \SOUL@eventuallyexhyphen\null
+ \SOUL@everyspace{\nobreak}%
+ \else\ifx\SOUL@@\slash
+ \SOUL@doword
+ \SOUL@eventuallyexhyphen{/}%
+ \SOUL@exhyphen{/}%
+ \else\ifx\SOUL@@\mbox
+ \def\SOUL@n*{\SOUL@addprotect}%
+ \else\ifx\SOUL@@\hbox
+ \def\SOUL@n*{\SOUL@addprotect}%
+ \else\ifx\SOUL@@\soulomit
+ \def\SOUL@n*\soulomit##1{%
+ \SOUL@doword
+ {\spaceskip\SOUL@spaceskip##1}%
+ \SOUL@scan
+ }%
+ \else\ifx\SOUL@@\break
+ \SOUL@doword
+ \break
+ \else\ifx\SOUL@@\linebreak
+ \SOUL@doword
+ \SOUL@everyspace{\linebreak}%
+ \else\ifcat\bgroup\noexpand\SOUL@@
+ \def\SOUL@n*{\SOUL@addgroup{}}%
+ \else\ifcat$\noexpand\SOUL@@
+ \def\SOUL@n*{\SOUL@addmath}%
+ \else
+% \end{macrocode}
+% The current token is examined to detect the start of
+% a UTF-8 sequence.
+% \begin{macrocode}
+ \SOuL@analyzeutfviii
+ \ifcase\SOuL@octets
+ \SOuL@analyzeutfviiix
+ \fi
+ \ifcase\SOuL@octets
+ \def\SOUL@n*{\SOUL@dotoken}%
+ \or % 1
+ \or % 2
+ \def\SOUL@n*{\SOuL@addtwooctets}%
+ \or % 3
+ \def\SOUL@n*{\SOuL@addthreeoctets}%
+ \or % 4
+ \def\SOUL@n*{\SOuL@addfouroctets}%
+ \fi
+ \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi
+ \fi\fi\fi\fi
+ \SOUL@n*%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{UTF-8 analysis}
+%
+% \subsubsection{Help strings}
+%
+% \begin{macrocode}
+\def\SOuL@defsanitizedstring#1#2{%
+ \expandafter\def\csname SOuL@string#1\endcsname{#2}%
+ \expandafter\@onelevel@sanitize\csname SOuL@string#1\endcsname
+}
+\SOuL@defsanitizedstring{UTFviii}{UTFviii@}
+\SOuL@defsanitizedstring{octets}{@octets}
+\SOuL@defsanitizedstring{two}{two}
+\SOuL@defsanitizedstring{three}{three}
+\SOuL@defsanitizedstring{four}{four}
+\SOuL@defsanitizedstring{macrocolon}{macro:}
+\SOuL@defsanitizedstring{csnameu}{csname u8-}
+\SOuL@defsanitizedstring{undeferr}{utf@viii@undeferr}
+\def\SOuL@stringendash{^^e2^^80^^93}
+\def\SOuL@stringemdash{^^e2^^80^^94}
+\def\SOuL@stringnobreakspace{^^c2^^a0}
+\edef\SOuL@charhash{\string #}
+\edef\SOuL@chartwo{\string 2}
+\edef\SOuL@charthree{\string 3}
+\def\SOuL@empty{}
+% \end{macrocode}
+%
+% \subsubsection{Support for \xfile{utf8.def}}
+%
+% \begin{macro}{\SOuL@analyzeutfviii}
+% \begin{macrocode}
+\begingroup
+ \edef\x{\endgroup
+ \def\noexpand\SOuL@analyzeutfviii{%
+ \noexpand\expandafter\noexpand\SOuL@checkutfviii
+ \noexpand\meaning\noexpand\SOUL@@
+ \SOuL@stringUTFviii\SOuL@stringoctets
+ \noexpand\@nil
+ }%
+ \def\noexpand\SOuL@checkutfviii
+ ##1\SOuL@stringUTFviii##2\SOuL@stringoctets##3\noexpand\@nil
+ }%
+\x{%
+ \def\SOuL@temp{#2}%
+ \chardef\SOuL@octets=%
+ \ifx\SOuL@temp\SOuL@stringtwo
+ \tw@
+ \else\ifx\SOuL@temp\SOuL@stringthree
+ \thr@@
+ \else\ifx\SOuL@temp\SOuL@stringfour
+ 4 %
+ \else
+ \z@
+ \fi\fi\fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Support for \xfile{utf8x.def}}
+%
+% \begin{macro}{\SOuL@analyzeutfviiix}
+% \begin{macrocode}
+\begingroup
+ \edef\x{\endgroup
+ \def\noexpand\SOuL@analyzeutfviiix{%
+ \noexpand\expandafter\noexpand\SOuL@checkutfviiix
+ \noexpand\meaning\noexpand\SOUL@@
+ \SOuL@stringmacrocolon\SOuL@charhash1{}{}{}{}%
+ \SOuL@stringcsnameu\SOuL@stringundeferr
+ \noexpand\@nil
+ }%
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\SOuL@checkutfviiix}
+% \begin{macrocode}
+ \def\noexpand\SOuL@checkutfviiix
+ ##1\SOuL@stringmacrocolon\SOuL@charhash1##2##3##4##5##6%
+ \SOuL@stringcsnameu##7\SOuL@stringundeferr##8\noexpand\@nil
+ }%
+\x{%
+ \def\SOuL@temp{#7}%
+ \ifx\SOuL@temp\SOuL@empty
+ \chardef\SOuL@octets=\z@
+ \else
+ \def\SOuL@temp{#5}%
+ \ifx\SOuL@temp\SOuL@charthree
+ \chardef\SOuL@octets=4 %
+ \else
+ \def\SOuL@temp{#3}%
+ \ifx\SOuL@temp\SOuL@chartwo
+ \chardef\SOuL@octets=\thr@@
+ \else
+ \chardef\SOuL@octets=\tw@
+ \fi
+ \fi
+ \fi
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Actions for UTF-8 sequences}
+%
+% \begin{macro}{\SOuL@addtwooctets}
+% \begin{macrocode}
+\def\SOuL@addtwooctets#1#2{%
+ \def\SOuL@temp{#1#2}%
+ \@onelevel@sanitize\SOuL@temp
+ \ifx\SOuL@temp\SOuL@stringnobreakspace
+ \SOUL@doword
+ \SOUL@eventuallyexhyphen\null
+ \SOUL@everyspace{\nobreak}%
+ \let\SOuL@next\SOUL@scan
+ \else
+ \def\SOuL@next{%
+! \SOUL@addtoken{{\noexpand#1\noexpand#2}}%
++ \SOUL@addtoken{{\etex@unexpanded{#1#2}}}%
+ }%
+ \fi
+ \SOuL@next
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\SOuL@addthreeoctets}
+% \begin{macrocode}
+\def\SOuL@addthreeoctets#1#2#3{%
+ \def\SOuL@temp{#1#2#3}%
+ \@onelevel@sanitize\SOuL@temp
+ \ifx\SOuL@temp\SOuL@stringendash
+ \SOUL@doword
+ \SOUL@eventuallyexhyphen{-}%
+ \SOUL@exhyphen{--}%
+ \let\SOuL@next\SOUL@scan
+ \else
+ \ifx\SOuL@temp\SOuL@stringemdash
+ \SOUL@doword
+ \SOUL@eventuallyexhyphen{-}%
+ \SOUL@exhyphen{---}%
+ \let\SOuL@next\SOUL@scan
+ \else
+ \def\SOuL@next{%
+! \SOUL@addtoken{{\noexpand#1\noexpand#2\noexpand#3}}%
++ \SOUL@addtoken{{\etex@unexpanded{#1#2#3}}}%
+ }%
+ \fi
+ \fi
+ \SOuL@next
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\SOuL@addfouroctets}
+% \begin{macrocode}
+\def\SOuL@addfouroctets#1#2#3#4{%
+! \SOUL@addtoken{{\noexpand#1\noexpand#2\noexpand#3\noexpand#4}}%
++ \SOUL@addtoken{{\etex@unexpanded{#1#2#3#4}}}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Redefinition of \cs{SOUL@splittoken}}
+%
+% \begin{macro}{\SOUL@splittoken}
+% Macro \cs{SOUL@splittoken} separates the first token
+% or token group from a word and redefines the word to contain
+% the remaining tokens. However if the remaining tokens are
+% a token group, then the curly braces will be removed and
+% the token group is splitted by the next call of \cs{SOUL@splittoken}.
+% The redefinition avoids the removal of curly braces around the
+% remaining tokens.
+% \begin{macrocode}
+\SOuL@redefine\SOUL@splittoken#1#2\SOUL@stop{%
+ \global\SOUL@token={#1}%
+ \global\SOUL@word={#2}%
+}#1{%
+ \global\SOUL@token={#1}%
+ \SOuL@remainingtoken\relax
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\SOuL@remainingtoken}
+% \begin{macrocode}
+\def\SOuL@remainingtoken#1\SOUL@stop{%
+ \global\SOUL@word=\expandafter{\@gobble#1}%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsection{Patches}
+%
+% The fixed \cs{SOUL@splittoken} allows to remove the double
+% sets of curly braces in other macros of package \xpackage{soul}.
+% The benefit is that implicite kernings are more often detected
+% and fixes a bug in package \xpackage{soul}. The disadvantage is
+% incompatibility. The width of the resulting strings may change.
+% \begin{macro}{\SOUL@flushcomma}
+% \begin{macrocode}
+\SOuL@redefine\SOUL@flushcomma{%
+ \ifcase\SOUL@comma
+ \or
+ \edef\x{\SOUL@word={\the\SOUL@word,}}\x
+ \or
+ \edef\x{\SOUL@word={\the\SOUL@word{{,,}}}}\x
+ \fi
+ \SOUL@comma\z@
+}{%
+ \ifcase\SOUL@comma
+ \or
+ \edef\x{\SOUL@word={\the\SOUL@word,}}\x
+ \or
+ \edef\x{\SOUL@word={\the\SOUL@word{,,}}}\x
+ \fi
+ \SOUL@comma\z@
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\SOUL@flushapo}
+% \begin{macrocode}
+\SOuL@redefine\SOUL@flushapo{%
+ \ifcase\SOUL@apo
+ \or
+ \edef\x{\SOUL@word={\the\SOUL@word'}}\x
+ \or
+ \edef\x{\SOUL@word={\the\SOUL@word{{''}}}}\x
+ \fi
+ \SOUL@apo\z@
+}{%
+ \ifcase\SOUL@apo
+ \or
+ \edef\x{\SOUL@word={\the\SOUL@word'}}\x
+ \or
+ \edef\x{\SOUL@word={\the\SOUL@word{''}}}\x
+ \fi
+ \SOUL@apo\z@
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\SOUL@flushgrave}
+% \begin{macrocode}
+\SOuL@redefine\SOUL@flushgrave{%
+ \ifcase\SOUL@grave
+ \or
+ \edef\x{\SOUL@word={\the\SOUL@word`}}\x
+ \or
+ \edef\x{\SOUL@word={\the\SOUL@word{{``}}}}\x
+ \fi
+ \SOUL@grave\z@
+}{%
+ \ifcase\SOUL@grave
+ \or
+ \edef\x{\SOUL@word={\the\SOUL@word`}}\x
+ \or
+ \edef\x{\SOUL@word={\the\SOUL@word{``}}}\x
+ \fi
+ \SOUL@grave\z@
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\SOUL@addgroup}
+% \begin{macrocode}
+\SOuL@redefine\SOUL@addgroup#1#2{%
+ {%
+ \let\protect\noexpand
+ \edef\x{%
+ \global\SOUL@word={%
+ \the\SOUL@word
+ {{\noexpand#1#2}}%
+ }%
+ }%
+ \x
+ }%
+ \SOUL@scan
+}#1#2{%
+ \begingroup
+ \let\protect\noexpand
+ \edef\x{\endgroup
+ \SOUL@word={%
+ \the\SOUL@word
+! {\noexpand#1{#2}}%
++ {\etex@unexpanded{#1{#2}}}%
+ }%
+ }%
+ \x
+ \SOUL@scan
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\SOUL@addmath}
+% \begin{macrocode}
+\SOuL@redefine\SOUL@addmath$#1${%
+ {%
+ \let\protect\noexpand
+ \edef\x{%
+ \global\SOUL@word={%
+ \the\SOUL@word
+ {{\hbox{$#1$}}}%
+ }%
+ }%
+ \x
+ }%
+ \SOUL@scan
+}$#1${%
+ \begingroup
+ \let\protect\noexpand
+ \edef\x{\endgroup
+ \SOUL@word={%
+ \the\SOUL@word
+! {\hbox{$#1$}}%
++ {\etex@unexpanded{\hbox{$#1$}}}%
+ }%
+ }%
+ \x
+ \SOUL@scan
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\SOUL@addprotect}
+% \begin{macrocode}
+\SOuL@redefine\SOUL@addprotect#1#2{%
+ {%
+ \let\protect\noexpand
+ \edef\x{%
+ \global\SOUL@word={%
+ \the\SOUL@word
+ {{\hbox{#2}}}%
+ }%
+ }%
+ \x
+ }%
+ \SOUL@scan
+}#1#2{%
+ \begingroup
+ \let\protect\noexpand
+ \edef\x{\endgroup
+ \SOUL@word={%
+ \the\SOUL@word
+! {\hbox{#2}}%
++ {\etex@unexpanded{\hbox{#2}}}%
+ }%
+ }%
+ \x
+ \SOUL@scan
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\SOUL@addtoken}
+% \begin{macrocode}
++ \SOuL@redefine\SOUL@addtoken#1{%
++ \edef\x{%
++ \SOUL@word={%
++ \the\SOUL@word
++ \noexpand#1%
++ }%
++ }%
++ \x
++ \SOUL@scan
++ }#1{%
++ \edef\x{%
++ \SOUL@word={%
++ \the\SOUL@word
++ \etex@unexpanded{#1}%
++ }%
++ }%
++ \x
++ \SOUL@scan
++ }%
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macrocode}
+\SOuL@AtEnd
+% \end{macrocode}
+%
+% \begin{macrocode}
+%</package>
+% \end{macrocode}
+%
+% \section{Test}
+%
+% \subsection{Catcode checks for loading}
+%
+% \begin{macrocode}
+%<*test1>
+% \end{macrocode}
+% \begin{macrocode}
+\catcode`\@=11 %
+\def\RestoreCatcodes{}
+\count@=0 %
+\loop
+ \edef\RestoreCatcodes{%
+ \RestoreCatcodes
+ \catcode\the\count@=\the\catcode\count@\relax
+ }%
+\ifnum\count@<255 %
+ \advance\count@\@ne
+\repeat
+
+\def\RangeCatcodeInvalid#1#2{%
+ \count@=#1\relax
+ \loop
+ \catcode\count@=15 %
+ \ifnum\count@<#2\relax
+ \advance\count@\@ne
+ \repeat
+}
+\def\Test{%
+ \RangeCatcodeInvalid{0}{47}%
+ \RangeCatcodeInvalid{58}{64}%
+ \RangeCatcodeInvalid{91}{96}%
+ \RangeCatcodeInvalid{123}{255}%
+ \catcode`\@=12 %
+ \catcode`\\=0 %
+ \catcode`\{=1 %
+ \catcode`\}=2 %
+ \catcode`\#=6 %
+ \catcode`\[=12 %
+ \catcode`\]=12 %
+ \catcode`\%=14 %
+ \catcode`\ =10 %
+ \catcode13=5 %
+ \input soulutf8.sty\relax
+ \RestoreCatcodes
+}
+\Test
+\csname @@end\endcsname
+\end
+% \end{macrocode}
+% \begin{macrocode}
+%</test1>
+% \end{macrocode}
+%
+% \subsection{\LaTeX\space tests}
+%
+% \begin{macrocode}
+%<*test2|test3|test4|test5>
+% \end{macrocode}
+% \begin{macrocode}
+%<noetex>\let\unexpanded\UNDEFINED
+\NeedsTeXFormat{LaTeX2e}
+\documentclass{article}
+\usepackage[T1]{fontenc}
+\usepackage{lmodern}
+\usepackage{textcomp}
+\usepackage[ngerman]{babel}
+\expandafter\def\csname ver@hypdestopt.sty\endcsname{}
+\usepackage[unicode]{hyperref}
+\usepackage{bookmark}
+\usepackage{color}
+\usepackage{soul}[2003/11/17]
+\makeatletter
+\newcommand*{\@ifDefined}[1]{%
+ \@ifundefined{#1}{%
+ \@latex@error{%
+ \expandafter\noexpand\csname#1\endcsname undefined%
+ }\@ehc
+ }%
+}
+\newcommand*{\SaveOrg}[1]{%
+ \@ifdefinable{ORG@SOUL@#1}{%
+ \@ifDefined{SOUL@#1}{%
+ \expandafter\let\csname ORG@SOUL@#1\expandafter\endcsname
+ \csname SOUL@#1\endcsname
+ }%
+ }%
+}
+\newcommand*{\RestoreOrg}[1]{%
+ \@ifDefined{ORG@SOUL@#1}{%
+ \@ifDefined{SOUL@#1}{%
+ \expandafter\let\csname SOUL@#1\expandafter\endcsname
+ \csname ORG@SOUL@#1\endcsname
+ }%
+ }%
+}
+\makeatother
+\SaveOrg{eval}
+\SaveOrg{splittoken}
+\SaveOrg{flushcomma}
+\SaveOrg{flushapo}
+\SaveOrg{grave}
+\SaveOrg{addgroup}
+\SaveOrg{addmath}
+\SaveOrg{addprotect}
+\SaveOrg{addtoken}
+\usepackage{soulutf8}[2007/09/09]
+% \end{macrocode}
+% Input encoding \xfile{utf8}.
+% \begin{macrocode}
+%<*utf8>
+\usepackage[utf8]{inputenc}
+\DeclareUnicodeCharacter{00A0}{\nobreakspace}
+%</utf8>
+% \end{macrocode}
+% Input encoding \xfile{utf8x}. Package \xpackage{ucs}
+% has a nasty bug, that it redefines \cs{show}.
+% \begin{macrocode}
+%<*utf8x>
+\let\origshow\show
+\usepackage[utf8x]{inputenc}
+\AtBeginDocument{%
+ \let\show\origshow
+}
+%</utf8x>
+% \end{macrocode}
+%
+% \subsubsection{Driver definitions}
+%
+% \begin{macrocode}
+\makeatletter
+% \end{macrocode}
+% \begin{macro}{\an}
+% The definition for \cs{an} is taken from the documentation of
+% package \xpackage{soul}.
+% \begin{macrocode}
+\DeclareRobustCommand*{\an}{%
+ \def\SOUL@preamble{$^{^P}$}%
+ \def\SOUL@everyspace##1{##1\texttt{\char`\ }\linebreak[2]}%
+ \def\SOUL@postamble{$^{^E}$}%
+ \def\SOUL@everyhyphen{$^{^-}$\linebreak[1]}%
+ \def\SOUL@everyexhyphen##1{##1$^{^=}$}%
+ \def\SOUL@everysyllable{$^{^S}$}%
+ \def\SOUL@everytoken{\the\SOUL@token$^{^T}$}%
+ \def\SOUL@everylowerthan{$^{^L}$}%
+ \SOUL@
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\sy}
+% The definition for \cs{sy} is taken from the documentation of
+% package \xpackage{soul}.
+% \begin{macrocode}
+\DeclareRobustCommand*{\sy}{%
+ \SOUL@setup
+ \def\SOUL@preamble{%
+ \lefthyphenmin=\z@
+ \righthyphenmin=\z@
+ }%
+ \def\SOUL@everyspace##1{##1\space}%
+ \def\SOUL@everysyllable{\the\SOUL@syllable}%
+ \def\SOUL@everyhyphen{%
+ \discretionary{%
+ \SOUL@setkern\SOUL@hyphkern
+ \SOUL@sethyphenchar
+ }{}{%
+ \hbox{\kern1pt$\cdot$}%
+ }%
+ }%
+ \def\SOUL@everyexhyphen##1{%
+ \SOUL@setkern\SOUL@hyphkern
+ \hbox{##1}%
+ \discretionary{}{}{%
+ \SOUL@setkern\SOUL@charkern
+ }%
+ }%
+ \SOUL@
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \begin{macro}{\soulH}
+% \begin{macrocode}
+\DeclareRobustCommand*{\soulH}{%
+ \def\SOUL@preamble{%
+ \gdef\SOULH{}%
+ \soulHadd{[}%
+ }%
+ \def\SOUL@everyspace##1{%
+ \soulHadd{Sp}%
+ }%
+ \def\SOUL@postamble{%
+ \soulHadd{]}%
+ }%
+ \def\SOUL@everyhyphen{%
+ \soulHadd{Hy}%
+ }%
+ \def\SOUL@everyexhyphen##1{%
+ \soulHadd{Exhy}%
+ }%
+ \def\SOUL@everysyllable{%
+ \soulHadd{Sy}%
+ }%
+ \def\SOUL@everytoken{%
+ \soulHadd{T}%
+ }%
+ \def\SOUL@everylowerthan{%
+ \soulHadd{<}%
+ }%
+ \SOUL@
+}
+\newcommand*{\soulHadd}[1]{%
+ #1%
+ \expandafter\gdef\expandafter\soulHstring\expandafter{%
+ \soulHstring
+ #1%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Test macros}
+%
+% \begin{macrocode}
+\usepackage{qstest}
+\IncludeTests{*}
+\LogTests{log}{*}{*}
+% \end{macrocode}
+% \begin{macrocode}
+\newsavebox\boxA
+\newsavebox\boxB
+\newsavebox\boxC
+% \end{macrocode}
+% \begin{macro}{\TestDriver}
+% \begin{macrocode}
+\newcommand*{\TestDriver}[4]{%
+ \subsection{Driver #1}%
+ \@PackageInfo{soulutf8-test}{* Driver #1}%
+ \expandafter\let\expandafter\testdriver\csname #1\endcsname
+ \def\teststringA{#3}%
+ \def\teststringB{#4}%
+ \begin{qstest}{string-#2-driver-#1}{string,#2,driver,#1}%
+ \@PackageInfo{soulutf8-test}{* Version: soulutf8}%
+ \global\let\soulHstring\@empty
+ \setbox0=\hbox{\expandafter\testdriver\expandafter{\teststringA}}%
+ \let\HstringA\soulHstring
+ \SetTestVBox{\boxA}{\teststringA}%
+ %
+ \@PackageInfo{soulutf8-test}{* Version: soul + patch}%
+ \global\let\soulHstring\@empty
+ \RestoreOrg{eval}%
+ \setbox2=\hbox{\expandafter\testdriver\expandafter{\teststringB}}%
+ \let\HstringB\soulHstring
+ \SetTestVBox{\boxB}{\teststringB}%
+ %
+ \@PackageInfo{soulutf8-test}{* Version: original soul}%
+ \global\let\soulHstring\@empty
+ \RestoreOrg{splittoken}%
+ \RestoreOrg{flushcomma}%
+ \RestoreOrg{flushapo}%
+ \RestoreOrg{grave}%
+ \RestoreOrg{addgroup}%
+ \RestoreOrg{addmath}%
+ \RestoreOrg{addprotect}%
+ \RestoreOrg{addtoken}%
+ \setbox4=\hbox{\expandafter\testdriver\expandafter{\teststringB}}%
+ \let\HstringC\soulHstring
+ \SetTestVBox{\boxC}{\teststringB}%
+ %
+ \TestInfo{0}{soulutf8}%
+ \TestInfo{2}{soul + patch}%
+ \TestInfo{4}{original soul}%
+ \TestInfoVBox
+ \showboxdepth=\maxdimen
+ \showboxbreadth=\maxdimen
+ \tracingonline=\@ne
+ \Expect*{\HstringA}*{\HstringB}%
+ \Expect*{\HstringA}*{\HstringC}%
+ \Expect*{\the\wd0}*{\the\wd2}%
+ \ifdim\wd0=\wd2 %
+ \else
+ \showbox0 %
+ \showbox2 %
+ \fi
+ \Expect*{\the\ht0}*{\the\ht2}%
+ \Expect*{\the\dp0}*{\the\dp2}%
+ \Expect*{\the\wd\boxB}*{\the\wd\boxA}%
+ \Expect*{\the\wd\boxC}*{\the\wd\boxA}%
+ \Expect*{\the\ht\boxB}*{\the\ht\boxA}%
+ \ifdim\ht\boxB=\ht\boxA
+ \else
+ \showbox\boxA
+ \showbox\boxB
+ \fi
+ \Expect*{\the\ht\boxC}*{\the\ht\boxA}%
+ \Expect*{\the\dp\boxB}*{\the\dp\boxA}%
+ \Expect*{\the\dp\boxC}*{\the\dp\boxA}%
+ \end{qstest}%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\SetTestVBox}
+% \begin{macrocode}
+\newcommand*{\SetTestVBox}[2]{%
+ \setbox#1=\vbox{%
+ \hsize=0pt\relax
+ \hfuzz=100mm\relax
+ \expandafter\testdriver\expandafter{#2}%
+ }%
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\TestInfo}
+% \begin{macrocode}
+\newcommand*{\TestInfo}[2]{%
+ \par
+ \noindent
+ \copy#1\relax
+ \hfill
+ \begingroup
+ \small
+ \ifdim\wd0=\wd2\relax
+ \ifdim\wd0=\wd4\relax
+ \else
+ \ifnum#1=2 %
+ \raisebox{.5\baselineskip}[0pt][0pt]{%
+ \llap{$\}$ }%
+ \rlap{width = \the\wd#1\relax\space$\{$}%
+ \phantom{width = 999.99999pt}%
+ \qquad
+ }%
+ \else
+ \ifnum#1=4 %
+ \rlap{width = \the\wd#1}%
+ \phantom{width = 999.99999pt}%
+ \qquad
+ \fi
+ \fi
+ \fi
+ \else
+ \begingroup
+ \bfseries
+ \rlap{width = \the\wd#1}%
+ \phantom{width = 999.99999pt}%
+ \endgroup
+ \qquad
+ \fi
+ \rlap{(#2)}%
+ \phantom{(original soul)}%
+ \endgroup
+ \par
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\TestInfoVBox}
+% \begin{macrocode}
+\newcommand*{\TestInfoVBox}{%
+ \par
+ \noindent
+ \mbox{\vrule\relax\space\copy\boxA}%
+ \ifdim\ht\boxA=\ht\boxB
+ \else
+ \hfill
+ \begingroup
+ \small
+ \rlap{(soulutf8)}%
+ \phantom{(soulutf8)}%
+ \endgroup
+ \par
+ \noindent
+ \mbox{\vrule\relax\space\copy\boxB}%
+ \hfill
+ \begingroup
+ \small
+ \rlap{(soul)}%
+ \phantom{(soulutf8)}%
+ \endgroup
+ \fi
+ \par
+}
+% \end{macrocode}
+% \end{macro}
+% \begin{macro}{\Test}
+% \begin{macrocode}
+\makeatletter
+\newcommand*{\Test}[3]{%
+ \clearpage
+ \begingroup
+ \def\linebreak{\textbackslash linebreak }%
+ \def\\{\textbackslash\textbackslash}%
+ \def\soulomit##1{%
+ \textbackslash soulomit\textbraceleft##1\textbraceright
+ }%
+ \def\mbox##1{%
+ \textbackslash mbox\textbraceleft##1\textbraceright
+ }%
+ \def\abc{\textbackslash abc }%
+ \def\texttt##1{%
+ \textbackslash texttt\textbraceleft##1\textbraceright
+ }%
+ \def\c##1{%
+ \textbackslash c\textbraceleft##1\textbraceright
+ }%
+%<*utf8x>
+ \count@=128 %
+ \loop
+ \ifnum\count@<256 %
+ \lccode`\~=\count@
+ \lowercase{%
+ \def~{\noexpand~}%
+ }%
+ \advance\count@\@ne
+ \repeat
+%</utf8x>
+ \csname protected@edef\endcsname\x{\endgroup
+ \noexpand\section{String #1: #2}%
+ }%
+ \x
+ \TestDriver{so}{#1}{#2}{#3}%
+ \TestDriver{caps}{#1}{#2}{#3}%
+ \TestDriver{ul}{#1}{#2}{#3}%
+ \TestDriver{st}{#1}{#2}{#3}%
+ \TestDriver{hl}{#1}{#2}{#3}%
+ \TestDriver{an}{#1}{#2}{#3}%
+ \TestDriver{sy}{#1}{#2}{#3}%
+ \TestDriver{soulH}{#1}{#2}{#3}%
+}
+\makeatother
+% \end{macrocode}
+% \end{macro}
+%
+% \subsubsection{Testing}
+%
+% \begin{macrocode}
+\begin{document}
+ \Test A{}{}%
+ \Test B{Hello World}{Hello World}%
+ \Test C{%
+ Umlauts: ^^c3^^84^^c3^^96^^c3^^9c^^c3^^a4^^c3^^b6^^c3^^bc^^c3^^9f%
+ }{%
+ Umlauts: \"A\"O\"U\"a\"o\"u\ss
+ }%
+ \Test D{Euro: ^^e2^^82^^ac}{Euro: \texteuro}%
+ \Test E{Stra^^c3^^9fe}{Stra\ss e}%
+ \Test F{R^^c3^^b6mer}{R\"omer}%
+ \Test G{A^^e2^^80^^93B^^e2^^80^^94C}{A--B---C}%
+ \Test H{X^^c2^^a0Y}{X~Y}%
+ \Test I{A^^c5^^a4}{A\v T}%
+ \Test J{A,B,,C,,,D,,,,E}{A,B,,C,,,D,,,,E}%
+ \Test K{A'B''C'''D''''E}{A'B''C'''D''''E}%
+ \Test L{A`B``C```D````E}{A`B``C```D````E}%
+ \Test M{A$x$B}{A$x$B}%
+ \Test N{A\mbox{abc}B}{A\mbox{abc}B}%
+ \Test O{,,TA''}{,,TA''}%
+ \Test P{{!`}Hola{?`}}{{!`}Hola{?`}}%
+ \Test Q{re-sent\slash x}{re-sent\slash x}%
+ \Test R{new\\line}{new\\line}%
+ \Test S{foo\linebreak bar}{foo\linebreak bar}%
+ \Test T{Virchow{sche}}{Virchow{sche}}%
+ \Test U{A\soulomit{foo}B}{A\soulomit{foo}B}%
+ \Test V{A\texttt{xyz}B}{A\texttt{xyz}B}%
+ \Test W{ffi}{ffi}%
+ \Test X{f{}f{}i}{f{}f{}i}%
+ \Test Y{f\mbox{}f\mbox{}i}{f\mbox{}f\mbox{}i}%
+ \Test Z{\c{\"a}}{{\c{\"a}}}%
+%<*test2|test3>
+ \let\abcx\UNDEFINED
+ \def\abc{%
+ \begingroup
+ \def\abcx{x}%
+ \abcx
+ \endgroup
+ }%
+ \Test{AA}{[{x\abc x}]}{[{xxx}]}%
+%</test2|test3>
+% \end{macrocode}
+%
+% \begin{macrocode}
+\end{document}
+% \end{macrocode}
+% \begin{macrocode}
+%</test2|test3|test4|test5>
+% \end{macrocode}
+%
+% \section{Installation}
+%
+% \subsection{Download}
+%
+% \paragraph{Package.} This package is available on
+% CTAN\footnote{\url{ftp://ftp.ctan.org/tex-archive/}}:
+% \begin{description}
+% \item[\CTAN{macros/latex/contrib/oberdiek/soulutf8.dtx}] The source file.
+% \item[\CTAN{macros/latex/contrib/oberdiek/soulutf8.pdf}] Documentation.
+% \end{description}
+%
+%
+% \paragraph{Bundle.} All the packages of the bundle `oberdiek'
+% 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[\CTAN{macros/latex/contrib/oberdiek/oberdiek-tds.zip}]
+% \end{description}
+% \emph{TDS} refers to the standard ``A Directory Structure
+% for \TeX\ Files'' (\CTAN{tds/tds.pdf}). Directories
+% with \xfile{texmf} in their name are usually organized this way.
+%
+% \subsection{Bundle installation}
+%
+% \paragraph{Unpacking.} Unpack the \xfile{oberdiek-tds.zip} in the
+% TDS tree (also known as \xfile{texmf} tree) of your choice.
+% Example (linux):
+% \begin{quote}
+% |unzip oberdiek-tds.zip -d ~/texmf|
+% \end{quote}
+%
+% \paragraph{Script installation.}
+% Check the directory \xfile{TDS:scripts/oberdiek/} for
+% scripts that need further installation steps.
+% Package \xpackage{attachfile2} comes with the Perl script
+% \xfile{pdfatfi.pl} that should be installed in such a way
+% that it can be called as \texttt{pdfatfi}.
+% Example (linux):
+% \begin{quote}
+% |chmod +x scripts/oberdiek/pdfatfi.pl|\\
+% |cp scripts/oberdiek/pdfatfi.pl /usr/local/bin/|
+% \end{quote}
+%
+% \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 soulutf8.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@{}}
+% soulutf8.sty & tex/generic/oberdiek/soulutf8.sty\\
+% soulutf8.pdf & doc/latex/oberdiek/soulutf8.pdf\\
+% soulutf8-test1.tex & doc/latex/oberdiek/soulutf8-test1.tex\\
+% soulutf8-test2.tex & doc/latex/oberdiek/soulutf8-test2.tex\\
+% soulutf8-test3.tex & doc/latex/oberdiek/soulutf8-test3.tex\\
+% soulutf8-test4.tex & doc/latex/oberdiek/soulutf8-test4.tex\\
+% soulutf8-test5.tex & doc/latex/oberdiek/soulutf8-test5.tex\\
+% soulutf8.dtx & source/latex/oberdiek/soulutf8.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
+% (\teTeX, \mikTeX, \dots) relies on file name databases, you must refresh
+% these. For example, \teTeX\ users run \verb|texhash| or
+% \verb|mktexlsr|.
+%
+% \subsection{Some details for the interested}
+%
+% \paragraph{Attached source.}
+%
+% The PDF documentation on CTAN also includes the
+% \xfile{.dtx} source file. It can be extracted by
+% AcrobatReader 6 or higher. Another option is \textsf{pdftk},
+% e.g. unpack the file into the current directory:
+% \begin{quote}
+% \verb|pdftk soulutf8.pdf unpack_files output .|
+% \end{quote}
+%
+% \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{soulutf8.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 soulutf8.dtx
+%makeindex -s gind.ist soulutf8.idx
+%pdflatex soulutf8.dtx
+%makeindex -s gind.ist soulutf8.idx
+%pdflatex soulutf8.dtx
+%\end{verbatim}
+% \end{quote}
+%
+% \begin{thebibliography}{9}
+%
+% \bibitem{soul}
+% Melchior Franz: \textit{The \xpackage{soul} package};
+% 2003/11/17;\\
+% \CTAN{macros/latex/contrib/soul/}.
+%
+% \bibitem{ucs}
+% Dominique P. G. Unruh: \textit{\xpackage{ucs.sty} -- Unicode Support};
+% 2004/10/17;\\
+% \CTAN{macros/latex/contrib/unicode/}.
+%
+% \bibitem{utf8}
+% Frank Mittelbach, Chris Rowley:
+% \textit{Providing some UTF-8 support via \xpackage{inputenc}};
+% 2006/03/30;\\
+% \CTAN{macros/latex/base/utf8inc.dtx}.
+%
+% \end{thebibliography}
+%
+% \begin{History}
+% \begin{Version}{2007/09/09 v1.0}
+% \item
+% First version.
+% \end{Version}
+% \end{History}
+%
+% \PrintIndex
+%
+% \Finale
+\endinput
diff --git a/Master/texmf-dist/source/latex/oberdiek/stackrel.dtx b/Master/texmf-dist/source/latex/oberdiek/stackrel.dtx
index 867ac53a57a..e260b98cebe 100644
--- a/Master/texmf-dist/source/latex/oberdiek/stackrel.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/stackrel.dtx
@@ -272,6 +272,7 @@ and the derived files
% \begin{macrocode}
%</package>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
diff --git a/Master/texmf-dist/source/latex/oberdiek/stringenc.dtx b/Master/texmf-dist/source/latex/oberdiek/stringenc.dtx
index 530078f87c9..d39c7fafd83 100644
--- a/Master/texmf-dist/source/latex/oberdiek/stringenc.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/stringenc.dtx
@@ -119,7 +119,7 @@
\input docstrip.tex
\Msg{************************************************************************}
\Msg{* Installation}
-\Msg{* Package: stringenc 2007/06/16 v1.1 Converts strings between encodings (HO)}
+\Msg{* Package: stringenc 2007/09/09 v1.2 Converts strings between encodings (HO)}
\Msg{************************************************************************}
\keepsilent
@@ -244,7 +244,7 @@ and the derived files
%<*driver>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{stringenc.drv}%
- [2007/06/16 v1.1 Converts strings between encodings (HO)]%
+ [2007/09/09 v1.2 Converts strings between encodings (HO)]%
\documentclass{ltxdoc}
\usepackage{holtxdoc}
\usepackage{longtable}
@@ -254,7 +254,7 @@ and the derived files
%</driver>
% \fi
%
-% \CheckSum{5880}
+% \CheckSum{5882}
%
% \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
@@ -275,7 +275,7 @@ and the derived files
% \GetFileInfo{stringenc.drv}
%
% \title{The \xpackage{stringenc} package}
-% \date{2007/06/16 v1.1}
+% \date{2007/09/09 v1.2}
% \author{Heiko Oberdiek\\\xemail{oberdiek@uni-freiburg.de}}
%
% \maketitle
@@ -461,7 +461,7 @@ and the derived files
\fi
\expandafter\x\csname ver@stringenc.sty\endcsname
\ProvidesPackage{stringenc}%
- [2007/06/16 v1.1 Converts strings between encodings (HO)]
+ [2007/09/09 v1.2 Converts strings between encodings (HO)]
% \end{macrocode}
%
% \subsection{Catcodes}
@@ -471,35 +471,36 @@ and the derived files
\catcode64 \the\catcode64\relax
}
\catcode64 11 % @
-\def\SE@EnsureCode#1#2#3{%
+\def\TMP@EnsureCode#1#2#3{%
\edef\SE@AtEnd{%
\SE@AtEnd
#1#2 \the#1#2\relax
}%
#1#2 #3\relax
}
-\SE@EnsureCode\catcode{34}{12}% "
-\SE@EnsureCode\catcode{36}{3}% $
-\SE@EnsureCode\catcode{38}{4}% &
-\SE@EnsureCode\catcode{39}{12}% '
-\SE@EnsureCode\catcode{40}{12}% (
-\SE@EnsureCode\catcode{41}{12}% )
-\SE@EnsureCode\catcode{42}{12}% *
-\SE@EnsureCode\catcode{43}{12}% +
-\SE@EnsureCode\catcode{44}{12}% ,
-\SE@EnsureCode\catcode{45}{12}% -
-\SE@EnsureCode\catcode{46}{12}% .
-\SE@EnsureCode\catcode{58}{12}% :
-\SE@EnsureCode\catcode{60}{12}% <
-\SE@EnsureCode\catcode{61}{12}% =
-\SE@EnsureCode\catcode{62}{12}% >
-\SE@EnsureCode\catcode{91}{12}% [
-\SE@EnsureCode\catcode{93}{12}% ]
-\SE@EnsureCode\catcode{94}{7}% ^
-\SE@EnsureCode\catcode{96}{12}% `
-\SE@EnsureCode\uccode{34}{0}% "
-\SE@EnsureCode\uccode{48}{0}% 0
-\SE@EnsureCode\uccode{61}{0}% =
+\TMP@EnsureCode\catcode{34}{12}% "
+\TMP@EnsureCode\catcode{36}{3}% $
+\TMP@EnsureCode\catcode{38}{4}% &
+\TMP@EnsureCode\catcode{39}{12}% '
+\TMP@EnsureCode\catcode{40}{12}% (
+\TMP@EnsureCode\catcode{41}{12}% )
+\TMP@EnsureCode\catcode{42}{12}% *
+\TMP@EnsureCode\catcode{43}{12}% +
+\TMP@EnsureCode\catcode{44}{12}% ,
+\TMP@EnsureCode\catcode{45}{12}% -
+\TMP@EnsureCode\catcode{46}{12}% .
+\TMP@EnsureCode\catcode{47}{12}% /
+\TMP@EnsureCode\catcode{58}{12}% :
+\TMP@EnsureCode\catcode{60}{12}% <
+\TMP@EnsureCode\catcode{61}{12}% =
+\TMP@EnsureCode\catcode{62}{12}% >
+\TMP@EnsureCode\catcode{91}{12}% [
+\TMP@EnsureCode\catcode{93}{12}% ]
+\TMP@EnsureCode\catcode{94}{7}% ^
+\TMP@EnsureCode\catcode{96}{12}% `
+\TMP@EnsureCode\uccode{34}{0}% "
+\TMP@EnsureCode\uccode{48}{0}% 0
+\TMP@EnsureCode\uccode{61}{0}% =
% \end{macrocode}
%
% \subsection{Tools}
@@ -510,8 +511,8 @@ and the derived files
\input infwarerr.sty\relax
\input pdfescape.sty\relax
\else
- \RequirePackage{infwarerr}%
- \RequirePackage{pdfescape}%
+ \RequirePackage{infwarerr}[2007/09/09]%
+ \RequirePackage{pdfescape}[2007/09/09]%
\fi
% \end{macrocode}
%
@@ -615,7 +616,7 @@ and the derived files
% \begin{macrocode}
\def\SE@ConvertTo#1#2#3{%
\let\SE@result\SE@Empty
- \PE@sanitize\SE@encoding{#3}%
+ \EdefSanitize\SE@encoding{#3}%
\expandafter\ifx\csname\SE@PrefixTo\SE@encoding\endcsname\relax
\StringEncodingLoad\SE@encoding
\fi
@@ -724,7 +725,7 @@ and the derived files
% \begin{macrocode}
\def\SE@ConvertFrom#1#2#3{%
\let\SE@result\SE@Empty
- \PE@sanitize\SE@encoding{#3}%
+ \EdefSanitize\SE@encoding{#3}%
\expandafter\ifx\csname\SE@PrefixFrom\SE@encoding\endcsname\relax
\StringEncodingLoad\SE@encoding
\fi
@@ -1062,15 +1063,15 @@ $ \fi
% \begin{macro}{\StringEncodingConvert}
% \begin{macrocode}
\def\StringEncodingConvert#1#2#3#4{%
- \PE@sanitize\SE@from{#3}%
- \PE@sanitize\SE@to{#4}%
+ \EdefSanitize\SE@from{#3}%
+ \EdefSanitize\SE@to{#4}%
\expandafter\ifx\csname SE@alias@\SE@from\endcsname\relax
\else
- \PE@sanitize\SE@from{\csname SE@alias@\SE@from\endcsname}%
+ \EdefSanitize\SE@from{\csname SE@alias@\SE@from\endcsname}%
\fi
\expandafter\ifx\csname SE@alias@\SE@to\endcsname\relax
\else
- \PE@sanitize\SE@to{\csname SE@alias@\SE@to\endcsname}%
+ \EdefSanitize\SE@to{\csname SE@alias@\SE@to\endcsname}%
\fi
\ifx\SE@to\SE@utfxvi
\let\SE@to\SE@utfxvibe
@@ -1145,32 +1146,32 @@ $ \fi
% \end{macro}
% \begin{macro}{\SE@utfxvi}
% \begin{macrocode}
-\PE@sanitize\SE@utfxvi{utf16}
+\EdefSanitize\SE@utfxvi{utf16}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\SE@utfxvibe}
% \begin{macrocode}
-\PE@sanitize\SE@utfxvibe{utf16be}
+\EdefSanitize\SE@utfxvibe{utf16be}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\SE@utfxvile}
% \begin{macrocode}
-\PE@sanitize\SE@utfxvile{utf16le}
+\EdefSanitize\SE@utfxvile{utf16le}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\SE@utfxxxii}
% \begin{macrocode}
-\PE@sanitize\SE@utfxxxii{utf32}
+\EdefSanitize\SE@utfxxxii{utf32}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\SE@utfxxxiibe}
% \begin{macrocode}
-\PE@sanitize\SE@utfxxxiibe{utf32be}
+\EdefSanitize\SE@utfxxxiibe{utf32be}
% \end{macrocode}
% \end{macro}
% \begin{macro}{\SE@utfxxxiile}
% \begin{macrocode}
-\PE@sanitize\SE@utfxxxiile{utf32le}
+\EdefSanitize\SE@utfxxxiile{utf32le}
% \end{macrocode}
% \end{macro}
%
@@ -1396,8 +1397,8 @@ $ \fi
%
% \begin{macrocode}
%<*utf32>
-%<utf32be>\ProvidesFile{se-utf32be.def}[2007/06/16 v1.1 stringenc: UTF-32BE]
-%<utf32le>\ProvidesFile{se-utf32le.def}[2007/06/16 v1.1 stringenc: UTF-32LE]
+%<utf32be>\ProvidesFile{se-utf32be.def}[2007/09/09 v1.2 stringenc: UTF-32BE]
+%<utf32le>\ProvidesFile{se-utf32le.def}[2007/09/09 v1.2 stringenc: UTF-32LE]
% \end{macrocode}
%
% \begin{macrocode}
@@ -1555,7 +1556,7 @@ $ \fi
%
% \begin{macrocode}
%<*utf8>
-\ProvidesFile{se-utf8.def}[2007/06/16 v1.1 stringenc: UTF-8]
+\ProvidesFile{se-utf8.def}[2007/09/09 v1.2 stringenc: UTF-8]
% \end{macrocode}
%
% \noindent
@@ -1895,7 +1896,7 @@ $ \fi
%
% \begin{macrocode}
%<*utf16le>
-\ProvidesFile{se-utf16le.def}[2007/06/16 v1.1 stringenc: UTF-16LE]
+\ProvidesFile{se-utf16le.def}[2007/09/09 v1.2 stringenc: UTF-16LE]
% \end{macrocode}
%
% \begin{macrocode}
@@ -1935,7 +1936,7 @@ $ \fi
%
% \begin{macrocode}
%<*pdfdoc>
-\ProvidesFile{se-pdfdoc.def}[2007/06/16 v1.1 stringenc: PDFDocEncoding]
+\ProvidesFile{se-pdfdoc.def}[2007/09/09 v1.2 stringenc: PDFDocEncoding]
% \end{macrocode}
%
% Pass ranges 32..126 and 160..255 through and use
@@ -2066,7 +2067,7 @@ $ \fi
%
% \begin{macrocode}
%<*iso-8859-1>
-\ProvidesFile{se-iso-8859-1.def}[2007/06/16 v1.1 stringenc: ISO-8859-1]
+\ProvidesFile{se-iso-8859-1.def}[2007/09/09 v1.2 stringenc: ISO-8859-1]
% \end{macrocode}
%
% Excluded area: 0x80..0x9F
@@ -2136,7 +2137,7 @@ $ \fi
%
% \begin{macrocode}
%<*cp1252>
-\ProvidesFile{se-cp1252.def}[2007/06/16 v1.1 stringenc: cp1252]
+\ProvidesFile{se-cp1252.def}[2007/09/09 v1.2 stringenc: cp1252]
% \end{macrocode}
%
% \begin{macrocode}
@@ -2237,7 +2238,7 @@ $ \fi
%
% \begin{macrocode}
%<*ascii>
-\ProvidesFile{se-ascii.def}[2007/06/16 v1.1 stringenc: US-ASCII]
+\ProvidesFile{se-ascii.def}[2007/09/09 v1.2 stringenc: US-ASCII]
% \end{macrocode}
%
% \begin{macrocode}
@@ -2286,123 +2287,123 @@ $ \fi
%
% \begin{macrocode}
%<*iso-8859-2>
-\ProvidesFile{se-iso-8859-2.def}[2007/06/16 v1.1 stringenc: ISO-8859-2]
+\ProvidesFile{se-iso-8859-2.def}[2007/09/09 v1.2 stringenc: ISO-8859-2]
\def\SE@this{iso-8859-2}
%</iso-8859-2>
%<*iso-8859-3>
-\ProvidesFile{se-iso-8859-3.def}[2007/06/16 v1.1 stringenc: ISO-8859-3]
+\ProvidesFile{se-iso-8859-3.def}[2007/09/09 v1.2 stringenc: ISO-8859-3]
\def\SE@this{iso-8859-3}
%</iso-8859-3>
%<*iso-8859-4>
-\ProvidesFile{se-iso-8859-4.def}[2007/06/16 v1.1 stringenc: ISO-8859-4]
+\ProvidesFile{se-iso-8859-4.def}[2007/09/09 v1.2 stringenc: ISO-8859-4]
\def\SE@this{iso-8859-4}
%</iso-8859-4>
%<*iso-8859-5>
-\ProvidesFile{se-iso-8859-5.def}[2007/06/16 v1.1 stringenc: ISO-8859-5]
+\ProvidesFile{se-iso-8859-5.def}[2007/09/09 v1.2 stringenc: ISO-8859-5]
\def\SE@this{iso-8859-5}
%</iso-8859-5>
%<*iso-8859-6>
-\ProvidesFile{se-iso-8859-6.def}[2007/06/16 v1.1 stringenc: ISO-8859-6]
+\ProvidesFile{se-iso-8859-6.def}[2007/09/09 v1.2 stringenc: ISO-8859-6]
\def\SE@this{iso-8859-6}
%</iso-8859-6>
%<*iso-8859-7>
-\ProvidesFile{se-iso-8859-7.def}[2007/06/16 v1.1 stringenc: ISO-8859-7]
+\ProvidesFile{se-iso-8859-7.def}[2007/09/09 v1.2 stringenc: ISO-8859-7]
\def\SE@this{iso-8859-7}
%</iso-8859-7>
%<*iso-8859-8>
-\ProvidesFile{se-iso-8859-8.def}[2007/06/16 v1.1 stringenc: ISO-8859-8]
+\ProvidesFile{se-iso-8859-8.def}[2007/09/09 v1.2 stringenc: ISO-8859-8]
\def\SE@this{iso-8859-8}
%</iso-8859-8>
%<*iso-8859-9>
-\ProvidesFile{se-iso-8859-9.def}[2007/06/16 v1.1 stringenc: ISO-8859-9]
+\ProvidesFile{se-iso-8859-9.def}[2007/09/09 v1.2 stringenc: ISO-8859-9]
\def\SE@this{iso-8859-9}
%</iso-8859-9>
%<*iso-8859-10>
-\ProvidesFile{se-iso-8859-10.def}[2007/06/16 v1.1 stringenc: ISO-8859-10]
+\ProvidesFile{se-iso-8859-10.def}[2007/09/09 v1.2 stringenc: ISO-8859-10]
\def\SE@this{iso-8859-10}
%</iso-8859-10>
%<*iso-8859-11>
-\ProvidesFile{se-iso-8859-11.def}[2007/06/16 v1.1 stringenc: ISO-8859-11]
+\ProvidesFile{se-iso-8859-11.def}[2007/09/09 v1.2 stringenc: ISO-8859-11]
\def\SE@this{iso-8859-11}
%</iso-8859-11>
%<*iso-8859-13>
-\ProvidesFile{se-iso-8859-13.def}[2007/06/16 v1.1 stringenc: ISO-8859-13]
+\ProvidesFile{se-iso-8859-13.def}[2007/09/09 v1.2 stringenc: ISO-8859-13]
\def\SE@this{iso-8859-13}
%</iso-8859-13>
%<*iso-8859-14>
-\ProvidesFile{se-iso-8859-14.def}[2007/06/16 v1.1 stringenc: ISO-8859-14]
+\ProvidesFile{se-iso-8859-14.def}[2007/09/09 v1.2 stringenc: ISO-8859-14]
\def\SE@this{iso-8859-14}
%</iso-8859-14>
%<*iso-8859-15>
-\ProvidesFile{se-iso-8859-15.def}[2007/06/16 v1.1 stringenc: ISO-8859-15]
+\ProvidesFile{se-iso-8859-15.def}[2007/09/09 v1.2 stringenc: ISO-8859-15]
\def\SE@this{iso-8859-15}
%</iso-8859-15>
%<*iso-8859-16>
-\ProvidesFile{se-iso-8859-16.def}[2007/06/16 v1.1 stringenc: ISO-8859-16]
+\ProvidesFile{se-iso-8859-16.def}[2007/09/09 v1.2 stringenc: ISO-8859-16]
\def\SE@this{iso-8859-16}
%</iso-8859-16>
%<*koi8-r>
-\ProvidesFile{se-koi8-r.def}[2007/06/16 v1.1 stringenc: KOI8-R]
+\ProvidesFile{se-koi8-r.def}[2007/09/09 v1.2 stringenc: KOI8-R]
\def\SE@this{koi8-r}
%</koi8-r>
%<*nextstep>
-\ProvidesFile{se-nextstep.def}[2007/06/16 v1.1 stringenc: NextStep]
+\ProvidesFile{se-nextstep.def}[2007/09/09 v1.2 stringenc: NextStep]
\def\SE@this{nextstep}
%</nextstep>
%<*mac-centeuro>
-\ProvidesFile{se-mac-centeuro.def}[2007/06/16 v1.1 stringenc: Mac OS Central European]
+\ProvidesFile{se-mac-centeuro.def}[2007/09/09 v1.2 stringenc: Mac OS Central European]
\def\SE@this{mac-centeuro}
%</mac-centeuro>
%<*mac-cyrillic>
-\ProvidesFile{se-mac-cyrillic.def}[2007/06/16 v1.1 stringenc: Mac OS Cyrillic]
+\ProvidesFile{se-mac-cyrillic.def}[2007/09/09 v1.2 stringenc: Mac OS Cyrillic]
\def\SE@this{mac-cyrillic}
%</mac-cyrillic>
%<*mac-roman>
-\ProvidesFile{se-mac-roman.def}[2007/06/16 v1.1 stringenc: Mac OS Roman]
+\ProvidesFile{se-mac-roman.def}[2007/09/09 v1.2 stringenc: Mac OS Roman]
\def\SE@this{mac-roman}
%</mac-roman>
%<*dec-mcs>
-\ProvidesFile{se-dec-mcs.def}[2007/06/16 v1.1 stringenc: DEC-MCS]
+\ProvidesFile{se-dec-mcs.def}[2007/09/09 v1.2 stringenc: DEC-MCS]
\def\SE@this{dec-mcs}
%</dec-mcs>
%<*cp437>
-\ProvidesFile{se-cp437.def}[2007/06/16 v1.1 stringenc: cp437]
+\ProvidesFile{se-cp437.def}[2007/09/09 v1.2 stringenc: cp437]
\def\SE@this{cp437}
%</cp437>
%<*cp850>
-\ProvidesFile{se-cp850.def}[2007/06/16 v1.1 stringenc: cp850]
+\ProvidesFile{se-cp850.def}[2007/09/09 v1.2 stringenc: cp850]
\def\SE@this{cp850}
%</cp850>
%<*cp852>
-\ProvidesFile{se-cp852.def}[2007/06/16 v1.1 stringenc: cp852]
+\ProvidesFile{se-cp852.def}[2007/09/09 v1.2 stringenc: cp852]
\def\SE@this{cp852}
%</cp852>
%<*cp855>
-\ProvidesFile{se-cp855.def}[2007/06/16 v1.1 stringenc: cp855]
+\ProvidesFile{se-cp855.def}[2007/09/09 v1.2 stringenc: cp855]
\def\SE@this{cp855}
%</cp855>
%<*cp858>
-\ProvidesFile{se-cp858.def}[2007/06/16 v1.1 stringenc: cp858]
+\ProvidesFile{se-cp858.def}[2007/09/09 v1.2 stringenc: cp858]
\def\SE@this{cp858}
%</cp858>
%<*cp865>
-\ProvidesFile{se-cp865.def}[2007/06/16 v1.1 stringenc: cp865]
+\ProvidesFile{se-cp865.def}[2007/09/09 v1.2 stringenc: cp865]
\def\SE@this{cp865}
%</cp865>
%<*cp866>
-\ProvidesFile{se-cp866.def}[2007/06/16 v1.1 stringenc: cp866]
+\ProvidesFile{se-cp866.def}[2007/09/09 v1.2 stringenc: cp866]
\def\SE@this{cp866}
%</cp866>
%<*cp1250>
-\ProvidesFile{se-cp1250.def}[2007/06/16 v1.1 stringenc: cp1250]
+\ProvidesFile{se-cp1250.def}[2007/09/09 v1.2 stringenc: cp1250]
\def\SE@this{cp1250}
%</cp1250>
%<*cp1251>
-\ProvidesFile{se-cp1251.def}[2007/06/16 v1.1 stringenc: cp1251]
+\ProvidesFile{se-cp1251.def}[2007/09/09 v1.2 stringenc: cp1251]
\def\SE@this{cp1251}
%</cp1251>
%<*cp1257>
-\ProvidesFile{se-cp1257.def}[2007/06/16 v1.1 stringenc: cp1257]
+\ProvidesFile{se-cp1257.def}[2007/09/09 v1.2 stringenc: cp1257]
\def\SE@this{cp1257}
%</cp1257>
% \end{macrocode}
@@ -5890,7 +5891,7 @@ $ \fi
\catcode`\%=14 %
\catcode`\ =10 %
\catcode13=5 %
- \usepackage{stringenc}[2007/06/16]%
+ \usepackage{stringenc}[2007/09/09]%
\RestoreCatcodes
}
\Test
@@ -5940,7 +5941,7 @@ $ \fi
\let\SavedNumexpr\numexpr
\let\numexpr\relax
\fi
-\usepackage{stringenc}[2007/06/16]
+\usepackage{stringenc}[2007/09/09]
\ifx\plainmode Y
\let\numexpr\SavedNumexpr
\fi
@@ -6302,6 +6303,7 @@ $ \fi
% \begin{macrocode}
%</test2>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
@@ -6534,6 +6536,11 @@ $ \fi
% \item
% Fixes for cp850, cp852, nextstep.
% \end{Version}
+% \begin{Version}{2007/08/27 v1.2}
+% \item
+% Uses \cs{EdefSanitize} instead of \cs{PE@sanitize}
+% from package \xpackage{pdfescape} (2007/08/27 v1.5).
+% \end{Version}
% \end{History}
%
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/oberdiek/tabularht.dtx b/Master/texmf-dist/source/latex/oberdiek/tabularht.dtx
index 34c0ea48377..cd59cea4ddb 100644
--- a/Master/texmf-dist/source/latex/oberdiek/tabularht.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/tabularht.dtx
@@ -962,6 +962,7 @@ and the derived files
% \begin{macrocode}
%</package>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
diff --git a/Master/texmf-dist/source/latex/oberdiek/tabularkv.dtx b/Master/texmf-dist/source/latex/oberdiek/tabularkv.dtx
index b378e31d53c..1a5549aa69d 100644
--- a/Master/texmf-dist/source/latex/oberdiek/tabularkv.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/tabularkv.dtx
@@ -278,6 +278,7 @@ and the derived files
% \begin{macrocode}
%</package>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
diff --git a/Master/texmf-dist/source/latex/oberdiek/telprint.dtx b/Master/texmf-dist/source/latex/oberdiek/telprint.dtx
index c336c8e5e25..12c7b3a636a 100644
--- a/Master/texmf-dist/source/latex/oberdiek/telprint.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/telprint.dtx
@@ -17,7 +17,8 @@
%
% This work consists of the main source file telprint.dtx
% and the derived files
-% telprint.sty, telprint.pdf, telprint.ins, telprint.drv.
+% telprint.sty, telprint.pdf, telprint.ins, telprint.drv,
+% telprint-test1.tex.
%
% Distribution:
% CTAN:macros/latex/contrib/oberdiek/telprint.dtx
@@ -51,8 +52,9 @@
%
% Installation:
% TDS:tex/generic/oberdiek/telprint.sty
-% TDS:doc/generic/oberdiek/telprint.pdf
-% TDS:source/generic/oberdiek/telprint.dtx
+% TDS:doc/latex/oberdiek/telprint.pdf
+% TDS:doc/latex/oberdiek/telprint-test1.tex
+% TDS:source/latex/oberdiek/telprint.dtx
%
%<*ignore>
\begingroup
@@ -67,7 +69,7 @@
\input docstrip.tex
\Msg{************************************************************************}
\Msg{* Installation}
-\Msg{* Package: telprint 2007/04/11 v1.8 Formatting of German phone numbers (HO)}
+\Msg{* Package: telprint 2007/09/09 v1.9 Formatting of German phone numbers (HO)}
\Msg{************************************************************************}
\keepsilent
@@ -94,7 +96,8 @@ This Current Maintainer of this work is Heiko Oberdiek.
This work consists of the main source file telprint.dtx
and the derived files
- telprint.sty, telprint.pdf, telprint.ins, telprint.drv.
+ telprint.sty, telprint.pdf, telprint.ins, telprint.drv,
+ telprint-test1.tex.
\endpreamble
@@ -103,6 +106,8 @@ and the derived files
\file{telprint.drv}{\from{telprint.dtx}{driver}}%
\usedir{tex/generic/oberdiek}%
\file{telprint.sty}{\from{telprint.dtx}{package}}%
+ \usedir{doc/latex/oberdiek}%
+ \file{telprint-test1.tex}{\from{telprint.dtx}{test1}}%
}
\obeyspaces
@@ -128,7 +133,7 @@ and the derived files
%<*driver>
\NeedsTeXFormat{LaTeX2e}
\ProvidesFile{telprint.drv}%
- [2007/04/11 v1.8 Formatting of German phone numbers (HO)]%
+ [2007/09/09 v1.9 Formatting of German phone numbers (HO)]%
\documentclass{ltxdoc}
\usepackage{holtxdoc}
\usepackage[ngerman,english]{babel}
@@ -138,7 +143,7 @@ and the derived files
%</driver>
% \fi
%
-% \CheckSum{328}
+% \CheckSum{422}
%
% \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
@@ -159,7 +164,7 @@ and the derived files
% \GetFileInfo{telprint.drv}
%
% \title{The \xpackage{telprint} package}
-% \date{2007/04/11 v1.8}
+% \date{2007/09/09 v1.9}
% \author{Heiko Oberdiek\\\xemail{oberdiek@uni-freiburg.de}}
%
% \maketitle
@@ -225,6 +230,7 @@ and the derived files
% \subsection{Documentation in German}
%
% \begin{otherlanguage*}{ngerman}
+% \hyphenation{To-ken-ma-kros}
% \begin{itemize}
% \item \DescribeMacro\telprint |telprint#1|\\
% Der eigentliche Anwenderbefehl zur formatierten Ausgabe von
@@ -363,20 +369,44 @@ and the derived files
\fi
\expandafter\x\csname ver@telprint.sty\endcsname
\ProvidesPackage{telprint}%
- [2007/04/11 v1.8 Formatting of German phone numbers (HO)]
+ [2007/09/09 v1.9 Formatting of German phone numbers (HO)]
% \end{macrocode}
%
+% \subsection{Catcodes}
+%
% \begin{macrocode}
-\ifx\telprint\UnDeFiNeD
-% \fi in derselben Zeile wie \endinput oder \expandafter verwenden!
-\else\endinput\fi
+\expandafter\edef\csname TELAtEnd\endcsname{%
+ \catcode64 \the\catcode64\relax
+}
+\catcode64 11 % @
+\def\TMP@EnsureCode#1#2{%
+ \edef\TELAtEnd{%
+ \TELAtEnd
+ \catcode#1 \the\catcode#1\relax
+ }%
+ \catcode#1 #2\relax
+}
+\TMP@EnsureCode{33}{12}% !
+\TMP@EnsureCode{36}{3}% $
+\TMP@EnsureCode{40}{12}% (
+\TMP@EnsureCode{41}{12}% )
+\TMP@EnsureCode{42}{12}% *
+\TMP@EnsureCode{43}{12}% +
+\TMP@EnsureCode{44}{12}% ,
+\TMP@EnsureCode{45}{12}% -
+\TMP@EnsureCode{46}{12}% .
+\TMP@EnsureCode{47}{12}% /
+\TMP@EnsureCode{61}{12}% =
+\TMP@EnsureCode{126}{13}% ~ (active)
% \end{macrocode}
+%
+% \subsection{Package macros}
% \begin{macrocode}
\ifx\DeclareRobustCommand\UnDeFiNeD
\def\DeclareRobustCommand*#1[1]{\def#1##1}%
\def\TELreset{\let\DeclareRobustCommand=\UnDeFiNeD}%
- \immediate\write-1{%
- Package `telprint' warning: %
+ \input infwarerr.sty\relax
+ \@PackageInfo{telprint}{%
Macros are not robust!%
}%
\else
@@ -522,6 +552,66 @@ and the derived files
% \begin{macrocode}
\TELreset\let\TELreset=\UnDeFiNeD
% \end{macrocode}
+%
+% \begin{macrocode}
+\TELAtEnd
+%</package>
+% \end{macrocode}
+%
+% \section{Test}
+%
+% \subsection{Catcode checks for loading}
+%
+% \begin{macrocode}
+%<*test1>
+% \end{macrocode}
+% \begin{macrocode}
+\catcode`\@=11 %
+\def\RestoreCatcodes{}
+\count@=0 %
+\loop
+ \edef\RestoreCatcodes{%
+ \RestoreCatcodes
+ \catcode\the\count@=\the\catcode\count@\relax
+ }%
+\ifnum\count@<255 %
+ \advance\count@\@ne
+\repeat
+
+\def\RangeCatcodeInvalid#1#2{%
+ \count@=#1\relax
+ \loop
+ \catcode\count@=15 %
+ \ifnum\count@<#2\relax
+ \advance\count@\@ne
+ \repeat
+}
+\def\Test{%
+ \RangeCatcodeInvalid{0}{47}%
+ \RangeCatcodeInvalid{58}{64}%
+ \RangeCatcodeInvalid{91}{96}%
+ \RangeCatcodeInvalid{123}{255}%
+ \catcode`\@=12 %
+ \catcode`\\=0 %
+ \catcode`\{=1 %
+ \catcode`\}=2 %
+ \catcode`\#=6 %
+ \catcode`\[=12 %
+ \catcode`\]=12 %
+ \catcode`\%=14 %
+ \catcode`\ =10 %
+ \catcode13=5 %
+ \input telprint.sty\relax
+ \RestoreCatcodes
+}
+\Test
+\csname @@end\endcsname
+\end
+% \end{macrocode}
+% \begin{macrocode}
+%</test1>
+% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
@@ -582,8 +672,9 @@ and the derived files
% \def\t{^^A
% \begin{tabular}{@{}>{\ttfamily}l@{ $\rightarrow$ }>{\ttfamily}l@{}}
% telprint.sty & tex/generic/oberdiek/telprint.sty\\
-% telprint.pdf & doc/generic/oberdiek/telprint.pdf\\
-% telprint.dtx & source/generic/oberdiek/telprint.dtx\\
+% telprint.pdf & doc/latex/oberdiek/telprint.pdf\\
+% telprint-test1.tex & doc/latex/oberdiek/telprint-test1.tex\\
+% telprint.dtx & source/latex/oberdiek/telprint.dtx\\
% \end{tabular}^^A
% }^^A
% \sbox0{\t}^^A
@@ -752,6 +843,12 @@ and the derived files
% \item
% Line ends sanitized.
% \end{Version}
+% \begin{Version}{2007/09/09 v1.9}
+% \item
+% Catcode section added.
+% \item
+% Missing docstrip tag added.
+% \end{Version}
% \end{History}
%
% \PrintIndex
diff --git a/Master/texmf-dist/source/latex/oberdiek/transparent.dtx b/Master/texmf-dist/source/latex/oberdiek/transparent.dtx
index 7719d4f532b..296430a90d4 100644
--- a/Master/texmf-dist/source/latex/oberdiek/transparent.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/transparent.dtx
@@ -368,6 +368,7 @@ Hello World
% \begin{macrocode}
%</package>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
diff --git a/Master/texmf-dist/source/latex/oberdiek/twoopt.dtx b/Master/texmf-dist/source/latex/oberdiek/twoopt.dtx
index 8706b91b74b..09ce98d6730 100644
--- a/Master/texmf-dist/source/latex/oberdiek/twoopt.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/twoopt.dtx
@@ -357,6 +357,7 @@ and the derived files
% \begin{macrocode}
%</package>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}
diff --git a/Master/texmf-dist/source/latex/oberdiek/zref.dtx b/Master/texmf-dist/source/latex/oberdiek/zref.dtx
index 7e16f7d5cd5..538670f6955 100644
--- a/Master/texmf-dist/source/latex/oberdiek/zref.dtx
+++ b/Master/texmf-dist/source/latex/oberdiek/zref.dtx
@@ -3226,6 +3226,7 @@ the height difference of the two baselines is
% \begin{macrocode}
%</dotfill>
% \end{macrocode}
+%
% \section{Installation}
%
% \subsection{Download}