From e0c6872cf40896c7be36b11dcc744620f10adf1d Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 2 Sep 2019 13:46:59 +0900 Subject: Initial commit --- macros/latex/contrib/textcase/textcase.dtx | 406 +++++++++++++++++++++++++++++ 1 file changed, 406 insertions(+) create mode 100644 macros/latex/contrib/textcase/textcase.dtx (limited to 'macros/latex/contrib/textcase/textcase.dtx') diff --git a/macros/latex/contrib/textcase/textcase.dtx b/macros/latex/contrib/textcase/textcase.dtx new file mode 100644 index 0000000000..2903c69f1e --- /dev/null +++ b/macros/latex/contrib/textcase/textcase.dtx @@ -0,0 +1,406 @@ +% \iffalse +%% Source File: textcase.dtx +%% Copyright 1997 1998 David Carlisle +%% +%% This file may be distributed under the terms of the LPPL. +%% See 00readme.txt for details. +% +%<*dtx> + \ProvidesFile{textcase.dtx} +% +%\NeedsTeXFormat{LaTeX2e} +%\ProvidesPackage{textcase} +% \ProvidesFile{textcase.drv} +% \fi +% \ProvidesFile{textcase.dtx} + [2004/10/07 v0.07 Text only upper/lower case changing (DPC)] +% +% \iffalse +%<*driver> +\documentclass{ltxdoc} +\usepackage{textcase} +\begin{document} +\DocInput{textcase.dtx} +\end{document} +% +% \fi +% +% \GetFileInfo{textcase.dtx} +% \CheckSum{110} +% +% \changes{v0.01}{1997/09/28} +% {Posted to c.t.t} +% \changes{v0.02}{1997/09/28} +% {Support \cs{ensuremath}} +% \changes{v0.03}{1997/12/12} +% {Donald Arseneau: support \cs{ref} \cs{cite} \cs{label}} +% \changes{v0.04}{1997/12/14} +% {Convert to dtx form, add \cs{NoCaseChange}} +% \changes{v0.04}{1997/12/14} +% {Support (most uses of) optional argument of \cs{cite}} +% \changes{v0.05}{1997/12/16} +% {More comments from Donald, +% perhaps I should just give him this package for Christmas} +% \changes{v0.06}{1998/11/12} +% {overload option} +% \changes{v0.07}{2004/10/07} +% {missing percent added} +% +% +% \title{The \textsf{textcase} package\thanks{This file +% has version number \fileversion, last +% revised \filedate.}} +% \author{David Carlisle\thanks{%^^A +% Reorganisation to suppport skipping a wider class of +% things than just math done by Donald Arseneau}} +% +% \date{\filedate} +% +% \maketitle +% +% \section{Introduction}\label{intro} +% |\MakeTextUppercase| and |\MakeTextLowercase| are versions of the +% standard |\MakeUppercase| and |\MakeLowercase| that do not change +% the case of any math sections in their arguments. +%\begin{verbatim} +% \MakeTextUppercase{abc\ae\ \( a = b \) and $\alpha \neq a$ +% or even \ensuremath{x=y} and $\ensuremath{x=y}$} +%\end{verbatim} +% Should produce: +% \begin{quotation} +% ABC\AE\ \( a = b \) AND $\alpha \neq a$ +% OR EVEN \ensuremath{x=y} AND $\ensuremath{x=y}$ +% \end{quotation} +% +% Version 0.03 of this package incorporates some changes suggested by +% Donald Arseneau so that as well as math mode, the arguments of +% |\cite|, |\label| and |\ref| are also prevented from being uppercased. +% So you can now go +%\begin{verbatim} +% \MakeTextUppercase{% +% Text in section~\ref{intro}, about \cite[pp 2--4]{bbb}} +%\end{verbatim} +% which produces +% \begin{quotation} +% \MakeTextUppercase{% +% Text in section~\ref{intro}, about \cite[pp 2--4]{bbb}} +% \end{quotation} +% If, instead, the standard |\MakeUppercase| were used here, the keys +% `into' and `bbb' would be uppercased and generate errors about +% undefined references to INTRO and BBB. +% +% Sometimes there may be a special section of text that should not be +% uppercased. This can be marked with |\NoCaseChange|, as follows. +%\begin{verbatim} +% \MakeTextUppercase{% +% Text \NoCaseChange{More Text} yet more text} +%\end{verbatim} +% which produces +% \begin{quotation} +% \MakeTextUppercase{% +% Text \NoCaseChange{More Text} yet more text} +% \end{quotation} +% +% |\NoCaseChange| has other uses. If for some reason you need a +% tabular environment within an uppercased section, then you need +% to ensure that the name `tabular' and the preamble (eg `ll') +% does not get uppercased: +%\begin{verbatim} +% \MakeTextUppercase{% +% Text \NoCaseChange{\begin{tabular}{ll}}% +% table&stuff\\goes&here +% \NoCaseChange{\end{tabular}} +% More text} +%\end{verbatim} +% which produces +% \begin{quotation} +% \MakeTextUppercase{% +% Text \NoCaseChange{\begin{tabular}{ll}}%^^A +% table&stuff\\goes&here +% \NoCaseChange{\end{tabular}} +% More text} +% \end{quotation} +% +% \section{Features and Foibles} +% +% \subsection{Nested text} +% The commands defined here only skip math sections and |\ref| arguments +% if they are not `hidden' inside a |{ }| brace group. All text inside +% such a group will be made uppercase just as with the standard +% |\MakeUppercase|. +%\begin{verbatim} +% \MakeTextUppercase{a b {c $d$} $e$} +%\end{verbatim} +% produces +% \begin{quotation} +% \MakeTextUppercase{a b {c $d$} $e$} +% \end{quotation} +% Of course, this restriction does not apply to the arguments of the +% supported commands |\ensuremath|, |\label|, |\ref|, and |\cite|. +% +% If you cannot arrange for your +% mathematics to be at the outer level of brace grouping, you should +% use the following basic technique (which works even with the standard +% |\MakeUppercase| command). Define a new command that expands to your +% math expression, and then use that command, with |\protect|, in the +% text to be uppercased. Note that if the text being uppercased is in a +% section title or other moving argument you may need to make the +% definition in the document preamble, rather than just before the +% section command, so that the command is defined when the table of +% contents file is read. +%\begin{verbatim} +% \MakeTextUppercase{% +% Text \fbox{$a=b$ and $x=y$}}% +% +% \newcommand{\mathexprone}{$a=b$} +% \newcommand{\mathexprtwo}{$x=y$} +% \MakeTextUppercase{% +% Text \fbox{\protect\mathexprone\ and \protect\mathexprtwo}}% +%\end{verbatim} +% which produces +% \begin{quotation} +% \MakeTextUppercase{% +% Text \fbox{$a=b$ and $x=y$}}% +% +% \newcommand{\mathexprone}{$a=b$} +% \newcommand{\mathexprtwo}{$x=y$} +% \MakeTextUppercase{% +% Text \fbox{\protect\mathexprone\ and \protect\mathexprtwo}}% +% \end{quotation} +% +% \subsection{Citations} +% As documented above, |\cite| and |\ref| commands are not uppercased by +% |\MakeTextUppercase|. If you are using a non-numeric citation scheme +% you may want the replacement text for |\cite| to be uppercased. +% +% It is difficult to arrange that |\MakeTextUppercase| uppercases such +% text, not least because this would lead to interaction with the many +% bibliography packages which redefine |\cite| one way or another. One +% possibility to achieve this is to use Donald Arseneau's cite package +% and to locally redefine |\citeform| to add |\MakeUppercase| around +% the final text string produced by |\cite|. +%\begin{verbatim} +% \MakeTextUppercase{% +% Text \cite{bbb} and \cite{ccc}} +% +% {\renewcommand\citeform{\MakeUppercase}\MakeTextUppercase{% +% Text \cite{bbb} and \cite{ccc}}} +%\end{verbatim} +% which produces\footnote{This is faked, so this document does not +% rely on \texttt{cite.sty} being installed} +% \begin{quotation} +% TEXT [1] AND [David Carlisle 1997] +% +% TEXT [1] AND [DAVID CARLISLE 1997] +% \end{quotation} +% +% \subsection{overload Option} +% By default the package only defines new commands, |\MakeTextUppercase| +% and |\MakeTextlowercase| as described above. You may wish to redefine +% the standard |\MakeUppercase| and |\MakeLowercase| commands to be +% the same as these new commands. So that for example headings in the +% book class have this new feature without any further redefinition. +% You may use the package option |[overload]| in which case these +% new definitions will be overloaded on to the existing command names. +% +% \begin{thebibliography}{9} +% +% \bibitem{bbb} Something numeric +% \bibitem[David Carlisle 1997]{ccc} Something textual +% \end{thebibliography} +% +% \StopEventually{} +% +% \section{Implementation} +% +% \begin{macrocode} +%<*package> +% \end{macrocode} +% +% \begin{macro}{\@uclcnotmath} +% This is the main macro of this package. It is basically +% a copy of |\MakeTextUppercase| and |\MakeTextLowercase| +% from the \LaTeX\ kernel, modified slightly so that they +% can share code (that modification could be done to the +% standard versions as well) and then further changed to +% skip certain features like math mode and |\label| arguments. +% +% The arguments are:\\ +% |#1|: Extra commands to apply for case changing. +% Used to locally redefine |\i| and |\j| for uppercasing.\\ +% |#2|: Either |##1##2| or |##2##1| to control the order +% in which |\let| is applied to the pairs of control +% sequences in |\@uclclist|.\\ +% |#3|: |\uppercase| or |\lowercase|.\\ +% |#4|: The text to be upper (or lower) cased. +% \begin{macrocode} +\def\@uclcnotmath#1#2#3#4{\begingroup +% \end{macrocode} +% Run extra commands (currently just to redefine |\i| and |\j|). +% \begin{macrocode} + #1% +% \end{macrocode} +% +% Locally set |\( \)| to be just |$ $|, so that the math skipping +% code can be simplified, just to look for |$|. +% \begin{macrocode} + \def\({$}\let\)\(% +% \end{macrocode} +% +% Set up the `non-math' things that also have to be skipped. +% \begin{macrocode} + \def\NoCaseChange##1{\noexpand\NoCaseChange{\noexpand##1}}% + \@nonchangecase\label + \@nonchangecase\ref + \@nonchangecase\ensuremath +% \end{macrocode} +% +% |\cite| a bit trickier, as we want to uppercase any optional argument. +% This will fail if the optional argument contains a brace group, but +% should catch most cases. +% +% |text \cite[page 1]{foo} more text| ends up as +%\begin{verbatim} +% \uppercase{text \toks@{\cite[page1]}% +% \the\toks@{foo}% +% \uppercase{ more text} +%\end{verbatim} +% \begin{macrocode} + \def\cite##1##{\toks@{\noexpand\cite##1}\@citex}% + \def\@citex##1{\NoCaseChange{\the\toks@{##1}}}% +% \end{macrocode} +% (|\@citex| is a scratch macro here, not a redefinition of the existing +% |\@citex|.) +% +% The following is essentially taken from |\MakeUppercase|. +% Recursively execute |\reserved@a| to |\let| the pairs in |\@uclclist|. +% The strange construction with |\@gobble| at the end just gobbles the +% final recursive call. +% +% Incidentally, packages should not use the |\reserved@|\ldots\ scratch +% macros, which are `reserved' for use within the \LaTeX\ kernel, but +% (a) this code is essentially a copy from the kernel, and +% (b) I'm allowed to break the rules, so there. +% \begin{macrocode} + \def\reserved@a##1##2{\let#2\reserved@a}% + \expandafter\reserved@a\@uclclist\reserved@b{\reserved@b\@gobble}% +% \end{macrocode} +% +% Expand everything first so that the `skipping' code can see what to +% skip and so that tokens are revealed to |\uppercase|. +% This makes the argument `moving'. +% The |$\valign$| is just a fake math expression used to terminate +% the parsing done by |\@skipmath|. +% \begin{macrocode} + \protected@edef\reserved@a{\endgroup + \noexpand\@skipmath#3#4$\valign$}% +% \end{macrocode} +% +% \begin{macrocode} + \reserved@a} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\@nonchangecase} +% \begin{macrocode} +\def\@nonchangecase#1{\def#1##1{\NoCaseChange{#1{##1}}}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\NoCaseChange} +% For hiding arbitrary text from |\uppercase|. This innocuous +% definition is used for any occurrence of |\NoCaseChange| +% in text that is not passed to |\MakeTextUppercase|. For example a +% section heading may be uppercased, but the toc entry may not. +% It is also used for nested definitions of |\cite| etc, where the +% |\NoCaseChange| is inserted by expansion, but not removed as it is +% hidden by the brace group. +% \begin{macrocode} +\let\NoCaseChange\@firstofone +% \end{macrocode} +% \end{macro} +% +%\begin{macro}{\@skipmath} +% |#1|: operation |\uppercase| / |\lowercase|\\ +% |#2|: text up to first (next) |$|\\ +% |#3|: first math mode material (or |\valign| sentinel) +% \begin{macrocode} +\def\@skipmath#1#2$#3${% + \@skip@nonchangecase#1#2\NoCaseChange\valign + \ifx\valign#3% + \else + $#3$% + \expandafter\@skipmath\expandafter#1% + \fi} +% \end{macrocode} +% \end{macro} +% +%\begin{macro}{\@skip@nonchangecase} +% |#1|: |\uppercase| or |\lowercase|\\ +% |#2|: Text up to the first command (such as |\cite|) made `safe'. +% or the first use of |\NoCaseChange|. +% \begin{macrocode} +\def\@skip@nonchangecase#1#2\NoCaseChange#3{% + #1{#2}% + \ifx\valign#3% + \else + #3% + \expandafter\@skip@nonchangecase\expandafter#1% + \fi} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\MakeTextUppercase} +% \changes{v0.06}{1998/11/12} +% {Add edef to make behaviour more like \cs{MakeUppercase}} +% Put it all together. Arrange for \i\ and \j\ to uppercase, and +% to read the pairs in the ucase list `forwards'. +% \begin{macrocode} +\DeclareRobustCommand\MakeTextUppercase{% + \@uclcnotmath{\def\i{I}\def\j{J}}{##1##2}\uppercase} +% \end{macrocode} +% +% \begin{macrocode} +\protected@edef\MakeTextUppercase#1{\MakeTextUppercase{#1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\MakeTextLowercase} +% \changes{v0.06}{1998/11/12} +% {Add edef to make behaviour more like \cs{MakeLowercase}} +% probably will never be used, but it is easy to implement. +% Use |\lowercase| and read the pairs in the uppercase list `backwards'. +% \begin{macrocode} +\DeclareRobustCommand\MakeTextLowercase{% + \@uclcnotmath{}{##2##1}\lowercase} +% \end{macrocode} +% +% \begin{macrocode} +\protected@edef\MakeTextLowercase#1{\MakeTextLowercase{#1}} +% \end{macrocode} +% \end{macro} +% +% \begin{macro}{\MakeUppercase} +% \begin{macro}{\MakeLowercase} +% \changes{v0.06}{1998/11/12} +% {Option to overload added. latex/2906} +% \begin{macrocode} +\DeclareOption{overload}{% + \expandafter\let\csname MakeUppercase \expandafter\endcsname + \csname MakeTextUppercase \endcsname + \expandafter\let\csname MakeLowercase \expandafter\endcsname + \csname MakeTextLowercase \endcsname} +% \end{macrocode} +% +% \begin{macrocode} +\ProcessOptions +% \end{macrocode} +% \end{macro} +% \end{macro} +% +% \begin{macrocode} +% +% \end{macrocode} +% +% \Finale +% -- cgit v1.2.3