source: Backup NB/Talks/MEMPHYSetal/LAGUNA/EU I3/PhysicsLatex/revtex4/revtex4/src/textcase.dtx @ 416

Last change on this file since 416 was 416, checked in by campagne, 16 years ago
File size: 13.2 KB
Line 
1% \iffalse
2%% Source File: textcase.dtx
3%% Copyright 1997 1998 David Carlisle
4%%
5%% This file may be distributed under the terms of the LPPL.
6%% See 00readme.txt for details.
7%
8%<*dtx>
9          \ProvidesFile{textcase.dtx}
10%</dtx>
11%<package>\NeedsTeXFormat{LaTeX2e}
12%<package>\ProvidesPackage{textcase}
13%<driver> \ProvidesFile{textcase.drv}
14% \fi
15%         \ProvidesFile{textcase.dtx}
16       [1998/11/12 v0.06 Text only upper/lower case changing (DPC)]
17%
18% \iffalse
19%<*driver>
20\documentclass{ltxdoc}
21\usepackage{textcase}
22\begin{document}
23\DocInput{textcase.dtx}
24\end{document}
25%</driver>
26% \fi
27%
28% \GetFileInfo{textcase.dtx}
29% \CheckSum{110}
30%
31% \changes{v0.01}{1997/09/28}
32%    {Posted to c.t.t}
33% \changes{v0.02}{1997/09/28}
34%    {Support \cs{ensuremath}}
35% \changes{v0.03}{1997/12/12}
36%    {Donald Arseneau: support \cs{ref} \cs{cite} \cs{label}}
37% \changes{v0.04}{1997/12/14}
38%    {Convert to dtx form, add \cs{NoCaseChange}}
39% \changes{v0.04}{1997/12/14}
40%    {Support (most uses of) optional argument of \cs{cite}}
41% \changes{v0.05}{1997/12/16}
42%    {More comments from Donald,
43%     perhaps I should just give him this package for Christmas}
44% \changes{v0.06}{1998/11/12}
45%    {overload option}
46%
47%
48% \title{The \textsf{textcase} package\thanks{This file
49%        has version number \fileversion, last
50%        revised \filedate.}}
51% \author{David Carlisle\thanks{%^^A
52%   Reorganisation to suppport skipping a wider class of
53%   things than just math done by Donald Arseneau}}
54%
55% \date{\filedate}
56%
57% \maketitle
58%
59% \section{Introduction}\label{intro}
60% |\MakeTextUppercase| and |\MakeTextLowercase| are versions of the
61% standard |\MakeUppercase| and |\MakeLowercase| that do not change
62% the case of any math sections in their arguments.
63%\begin{verbatim}
64% \MakeTextUppercase{abc\ae\ \( a = b \)  and $\alpha \neq a$
65%   or even \ensuremath{x=y} and $\ensuremath{x=y}$}
66%\end{verbatim}
67% Should produce:
68% \begin{quotation}
69%  ABC\AE\ \( a = b \)  AND $\alpha \neq a$
70%   OR EVEN \ensuremath{x=y} AND $\ensuremath{x=y}$
71% \end{quotation}
72%
73% Version 0.03 of this package incorporates some changes suggested by
74% Donald Arseneau so that as well as math mode, the arguments of
75% |\cite|, |\label| and |\ref| are also prevented from being uppercased.
76% So you can now go
77%\begin{verbatim}
78% \MakeTextUppercase{%
79%    Text in section~\ref{intro}, about \cite[pp 2--4]{bbb}}
80%\end{verbatim}
81% which produces
82% \begin{quotation}
83% \MakeTextUppercase{%
84%    Text in section~\ref{intro}, about \cite[pp 2--4]{bbb}}
85% \end{quotation}
86% If, instead, the standard |\MakeUppercase| were used here, the keys
87% `into' and `bbb' would be uppercased and generate errors about
88% undefined references to INTRO and BBB.
89%
90% Sometimes there may be a special section of text that should not be
91% uppercased. This can be marked with |\NoCaseChange|, as follows.
92%\begin{verbatim}
93% \MakeTextUppercase{%
94%    Text \NoCaseChange{More Text} yet more text}
95%\end{verbatim}
96% which produces
97% \begin{quotation}
98% \MakeTextUppercase{%
99%    Text \NoCaseChange{More Text} yet more text}
100% \end{quotation}
101%
102% |\NoCaseChange| has other uses. If for some reason you need a
103% tabular environment within an uppercased section, then you need
104% to ensure that the name `tabular' and the preamble (eg `ll')
105% does not get uppercased:
106%\begin{verbatim}
107% \MakeTextUppercase{%
108%    Text \NoCaseChange{\begin{tabular}{ll}}%
109%                        table&stuff\\goes&here
110%         \NoCaseChange{\end{tabular}}
111%    More text}
112%\end{verbatim}
113% which produces
114% \begin{quotation}
115% \MakeTextUppercase{%
116%    Text \NoCaseChange{\begin{tabular}{ll}}%^^A
117%                        table&stuff\\goes&here
118%         \NoCaseChange{\end{tabular}}
119%    More text}
120% \end{quotation}
121%
122% \section{Features and Foibles}
123%
124% \subsection{Nested text}
125% The commands defined here only skip math sections and |\ref| arguments
126% if they are not `hidden' inside a |{ }| brace group. All text inside
127% such a group will be made uppercase just as with the standard
128% |\MakeUppercase|.
129%\begin{verbatim}
130% \MakeTextUppercase{a b {c $d$} $e$}
131%\end{verbatim}
132% produces
133% \begin{quotation}
134%  \MakeTextUppercase{a b {c $d$} $e$}
135% \end{quotation}
136% Of course, this restriction does not apply to the arguments of the
137% supported commands |\ensuremath|, |\label|, |\ref|, and |\cite|.
138%
139% If you cannot arrange for your
140% mathematics to be at the outer level of brace grouping, you should
141% use the following basic technique (which works even with the standard
142% |\MakeUppercase| command). Define a new command that expands to your
143% math expression, and then use that command, with |\protect|, in the
144% text to be uppercased. Note that if the text being uppercased is in a
145% section title or other moving argument you may need to make the
146% definition in the document preamble, rather than just before the
147% section command, so that the command is defined when the table of
148% contents file is read.
149%\begin{verbatim}
150% \MakeTextUppercase{%
151%        Text \fbox{$a=b$ and $x=y$}}%
152%
153% \newcommand{\mathexprone}{$a=b$}
154% \newcommand{\mathexprtwo}{$x=y$}
155% \MakeTextUppercase{%
156%        Text \fbox{\protect\mathexprone\ and \protect\mathexprtwo}}%
157%\end{verbatim}
158% which produces
159% \begin{quotation}
160% \MakeTextUppercase{%
161%        Text \fbox{$a=b$ and $x=y$}}%
162%
163% \newcommand{\mathexprone}{$a=b$}
164% \newcommand{\mathexprtwo}{$x=y$}
165% \MakeTextUppercase{%
166%        Text \fbox{\protect\mathexprone\ and \protect\mathexprtwo}}%
167% \end{quotation}
168%
169% \subsection{Citations}
170% As documented above, |\cite| and |\ref| commands are not uppercased by
171% |\MakeTextUppercase|. If you are using a non-numeric citation scheme
172% you may want the replacement text for |\cite| to be uppercased.
173%
174% It is difficult to arrange that |\MakeTextUppercase| uppercases such
175% text, not least because this would lead to interaction with the many
176% bibliography packages which redefine |\cite| one way or another. One
177% possibility to achieve this is to use Donald Arseneau's cite package
178% and to locally redefine |\citeform| to add |\MakeUppercase| around
179% the final text string produced by |\cite|.
180%\begin{verbatim}
181% \MakeTextUppercase{%
182%        Text \cite{bbb} and \cite{ccc}}
183%
184% {\renewcommand\citeform{\MakeUppercase}\MakeTextUppercase{%
185%        Text \cite{bbb} and \cite{ccc}}}
186%\end{verbatim}
187% which produces\footnote{This is faked, so this document does not
188%  rely on \texttt{cite.sty} being installed}
189% \begin{quotation}
190%  TEXT [1] AND [David Carlisle 1997]
191%
192%  TEXT [1] AND [DAVID CARLISLE 1997]
193% \end{quotation}
194%
195% \subsection{overload Option}
196% By default the package only defines new commands, |\MakeTextUppercase|
197% and |\MakeTextlowercase| as described above. You may wish to redefine
198% the standard |\MakeUppercase| and |\MakeLowercase| commands to be
199% the same as these new commands. So that for example headings in the
200% book class have this new feature without any further redefinition.
201% You may use the package option |[overload]| in which case these
202% new definitions will be overloaded on to the existing command names.
203%
204% \begin{thebibliography}{9}
205%
206% \bibitem{bbb} Something numeric
207% \bibitem[David Carlisle 1997]{ccc} Something textual
208% \end{thebibliography}
209%
210% \StopEventually{}
211%
212% \section{Implementation}
213%
214%    \begin{macrocode}
215%<*package>
216%    \end{macrocode}
217%
218% \begin{macro}{\@uclcnotmath}
219% This is the main macro of this package. It is basically
220% a copy of |\MakeTextUppercase| and |\MakeTextLowercase|
221% from the \LaTeX\ kernel, modified slightly so that they
222% can share code (that modification could be done to the
223% standard versions as well) and then further changed to
224% skip certain features like math mode and |\label| arguments.
225%
226% The arguments are:\\
227% |#1|: Extra commands to apply for case changing.
228%       Used to locally redefine |\i| and |\j| for uppercasing.\\
229% |#2|: Either |##1##2| or |##2##1| to control the order
230%       in which |\let| is applied to the pairs of control
231%       sequences in |\@uclclist|.\\
232% |#3|:  |\uppercase| or |\lowercase|.\\
233% |#4|: The text to be upper (or lower) cased.
234%    \begin{macrocode}
235\def\@uclcnotmath#1#2#3#4{\begingroup
236%    \end{macrocode}
237% Run extra commands (currently just to redefine |\i| and |\j|).
238%    \begin{macrocode}
239      #1%
240%    \end{macrocode}
241%
242% Locally set |\( \)| to be just |$ $|, so that the math skipping
243% code can be simplified, just to look for |$|.
244%    \begin{macrocode}
245      \def\({$}\let\)\(%
246%    \end{macrocode}
247%
248% Set up the `non-math' things that also have to be skipped.
249%    \begin{macrocode}
250      \def\NoCaseChange##1{\noexpand\NoCaseChange{\noexpand##1}}%
251      \@nonchangecase\label
252      \@nonchangecase\ref
253      \@nonchangecase\ensuremath
254%    \end{macrocode}
255%
256% |\cite| a bit trickier, as we want to uppercase any optional argument.
257% This will fail if the optional argument contains a brace group, but
258% should catch most cases.
259%
260% |text \cite[page 1]{foo} more text| ends up as
261%\begin{verbatim}
262% \uppercase{text \toks@{\cite[page1]}%
263% \the\toks@{foo}%
264% \uppercase{ more text}
265%\end{verbatim}
266%    \begin{macrocode}
267      \def\cite##1##{\toks@{\noexpand\cite##1}\@citex}%
268      \def\@citex##1{\NoCaseChange{\the\toks@{##1}}}%
269%    \end{macrocode}
270% (|\@citex| is a scratch macro here, not a redefinition of the existing
271% |\@citex|.)
272%
273% The following is essentially taken from |\MakeUppercase|.
274% Recursively execute |\reserved@a| to |\let| the pairs in |\@uclclist|.
275% The strange construction with |\@gobble| at the end just gobbles the
276% final recursive call.
277%
278% Incidentally, packages should not use the |\reserved@|\ldots\ scratch
279% macros, which are `reserved' for use within the \LaTeX\ kernel, but
280% (a) this code is essentially a copy from the kernel, and
281% (b) I'm allowed to break the rules, so there.
282%    \begin{macrocode}
283      \def\reserved@a##1##2{\let#2\reserved@a}%
284      \expandafter\reserved@a\@uclclist\reserved@b{\reserved@b\@gobble}%
285%    \end{macrocode}
286%
287% Expand everything first so that the `skipping' code can see what to
288% skip and so that tokens are revealed to |\uppercase|.
289% This makes the argument `moving'.
290% The |$\valign$| is just a fake math expression used to terminate
291% the parsing done by |\@skipmath|.
292%    \begin{macrocode}
293      \protected@edef\reserved@a{\endgroup
294          \noexpand\@skipmath#3#4$\valign$}%
295%    \end{macrocode}
296%
297%    \begin{macrocode}
298      \reserved@a}
299%    \end{macrocode}
300% \end{macro}
301%
302% \begin{macro}{\@nonchangecase}
303%    \begin{macrocode}
304\def\@nonchangecase#1{\def#1##1{\NoCaseChange{#1{##1}}}}
305%    \end{macrocode}
306% \end{macro}
307%
308% \begin{macro}{\NoCaseChange}
309% For hiding arbitrary text from |\uppercase|. This innocuous
310% definition is used for any occurrence of |\NoCaseChange|
311% in text that is not passed to |\MakeTextUppercase|. For example a
312% section heading may be uppercased, but the toc entry may not.
313% It is also used for nested definitions of |\cite| etc, where the
314% |\NoCaseChange| is inserted by expansion, but not removed as it is
315% hidden by the brace group.
316%    \begin{macrocode}
317\let\NoCaseChange\@firstofone
318%    \end{macrocode}
319% \end{macro}
320%
321%\begin{macro}{\@skipmath}
322% |#1|: operation |\uppercase| / |\lowercase|\\
323% |#2|: text up to first (next) |$|\\
324% |#3|: first math mode material (or |\valign| sentinel)
325%    \begin{macrocode}
326\def\@skipmath#1#2$#3${%
327  \@skip@nonchangecase#1#2\NoCaseChange\valign
328  \ifx\valign#3%
329  \else
330    $#3$%
331    \expandafter\@skipmath\expandafter#1%
332  \fi}
333%    \end{macrocode}
334% \end{macro}
335%
336%\begin{macro}{\@skip@nonchangecase}
337% |#1|: |\uppercase| or |\lowercase|\\
338% |#2|: Text up to the first command (such as |\cite|) made `safe'.
339%       or the first use of |\NoCaseChange|.
340%    \begin{macrocode}
341\def\@skip@nonchangecase#1#2\NoCaseChange#3{%
342  #1{#2}%
343  \ifx\valign#3%
344  \else
345    #3%
346    \expandafter\@skip@nonchangecase\expandafter#1%
347  \fi}
348%    \end{macrocode}
349% \end{macro}
350%
351% \begin{macro}{\MakeTextUppercase}
352% \changes{v0.06}{1998/11/12}
353%    {Add edef to make behaviour more like \cs{MakeUppercase}}
354% Put it all together. Arrange for \i\ and \j\ to uppercase, and
355% to read the pairs in the ucase list `forwards'.
356%    \begin{macrocode}
357\DeclareRobustCommand\MakeTextUppercase{%
358  \@uclcnotmath{\def\i{I}\def\j{J}}{##1##2}\uppercase}
359%    \end{macrocode}
360%
361%    \begin{macrocode}
362\protected@edef\MakeTextUppercase#1{\MakeTextUppercase{#1}}
363%    \end{macrocode}
364% \end{macro}
365%
366% \begin{macro}{\MakeTextLowercase}
367% \changes{v0.06}{1998/11/12}
368%    {Add edef to make behaviour more like \cs{MakeLowercase}}
369% probably will never be used, but it is easy to implement.
370% Use |\lowercase| and read the pairs in the uppercase list `backwards'.
371%    \begin{macrocode}
372\DeclareRobustCommand\MakeTextLowercase{%
373  \@uclcnotmath{}{##2##1}\lowercase}
374%    \end{macrocode}
375%
376%    \begin{macrocode}
377\protected@edef\MakeTextLowercase#1{\MakeTextLowercase{#1}}
378%    \end{macrocode}
379% \end{macro}
380%
381% \begin{macro}{\MakeUppercase}
382% \begin{macro}{\MakeLowercase}
383% \changes{v0.06}{1998/11/12}
384%    {Option to overload added.  latex/2906}
385%    \begin{macrocode}
386\DeclareOption{overload}{%
387  \expandafter\let\csname MakeUppercase \expandafter\endcsname
388                  \csname MakeTextUppercase \endcsname
389  \expandafter\let\csname MakeLowercase \expandafter\endcsname
390                  \csname MakeTextLowercase \endcsname}
391%    \end{macrocode}
392%
393%    \begin{macrocode}
394\ProcessOptions
395%    \end{macrocode}
396% \end{macro}
397% \end{macro}
398%
399%    \begin{macrocode}
400%</package>
401%    \end{macrocode}
402%
403% \Finale
404%
Note: See TracBrowser for help on using the repository browser.