%%% ==================================================================== %%% @LaTeX-file{ %%% filename = "amstext.dtx", %%% version = "1.2b", %%% date = "1996/10/28", %%% time = "14:52:16 EST", %%% checksum = "54302 312 1563 12274", %%% author = "American Mathematical Society", %%% copyright = "Copyright (C) 1996 American Mathematical Society, %%% all rights reserved. Copying of this file is %%% authorized only if either: %%% (1) you make absolutely no changes to your copy, %%% including name; OR %%% (2) if you do make changes, you first rename it %%% to some other name.", %%% address = "American Mathematical Society, %%% Technical Support, %%% Electronic Products and Services, %%% P. O. Box 6248, %%% Providence, RI 02940, %%% USA", %%% telephone = "401-455-4080 or (in the USA and Canada) %%% 800-321-4AMS (321-4267)", %%% FAX = "401-331-3842", %%% email = "tech-support@ams.org (Internet)", %%% supported = "yes", %%% keywords = "latex, amslatex, ams-latex", %%% abstract = "This is part of the AMS-\LaTeX{} distribution. %%% It is a \LaTeX{} package that defines a %%% \cn{\text} macro, which makes it easy to %%% incorporate fragments of text inside a displayed %%% equation or a sub or superscript. Font sizes %%% are automatically scaled in sub/superscripts.", %%% docstring = "The checksum field above contains a CRC-16 %%% checksum as the first value, followed by the %%% equivalent of the standard UNIX wc (word %%% count) utility output of lines, words, and %%% characters. This is produced by Robert %%% Solovay's checksum utility.", %%% } %%% ==================================================================== % \iffalse %<*driver> \documentclass{amsdtx} \usepackage{amstext} \begin{document} \title{The \pkg{amstext} package} \author{Frank Mittelbach \and Rainer Sch\"opf} \date{28 October 1996 \\ Version 1.02} \hDocInput{amstext.dtx} \end{document} % % \fi % % \maketitle % % \MakeShortVerb\| % % \section{Introduction} % % This style file implements the \AmSTeX{} macro \cn{text} for use % with the new font selection scheme. The \cn{text} macro is a % sophisticated command which allows the user to insert ``normal text'' % into math formulas without worrying about correct sizes in sub- or % superscripts. It can also be used in ordinary text; there it % produces an unbreakable unit similar to \cn{mbox}. % % Here is an example demonstrating some of its features: % \[ %^^A mathbin spacing is nonscript glue, disappears in superscript % x^{2\,\times\,\text{size of $y$}} % \leq % z_{i_{\text{upper bound of the array}}} % \] % This was produced by % \begin{verbatim} % \[ % x^{2\,\times\,\text{size of $y$}} % \leq % z_{i_{\text{upper bound of the array}}} % \] % \end{verbatim} % % Additionally this style file redefines an internal \fn{plain.tex} % macro called \cs{mathhexbox} so that commands like \cn{dag} % or \cn{P} will change sizes if used in math subscripts. % % \StopEventually{} % Package information. % \begin{macrocode} \NeedsTeXFormat{LaTeX2e}% LaTeX 2.09 can't be used (nor non-LaTeX) [1994/12/01]% LaTeX date must December 1994 or later \ProvidesPackage{amstext}[1996/10/28 v1.2b] % \end{macrocode} % % \section{The implementation} % We need a few tools from \fn{amsgen.sty}. % \begin{macrocode} \RequirePackage{amsgen} % \end{macrocode} % % \begin{macro}{\text} % Now we come to the \cn{text} macro which is used to place % ordinary text inside of math formulas. If it is used outside % math it will produce an unbreakable unit of text. % \begin{macrocode} \DeclareRobustCommand{\text}{% \ifmmode\expandafter\text@\else\expandafter\mbox\fi} % \end{macrocode} % At the present time (late 1994) the \latex/ internal function % |\nfss@text| is used in |\ref|, in font commands like |\textbf|, % and in a few text symbol definitions like |\$| and |\pounds|. By % equating |\nfss@text| to |\text| we give it the ability of % |\text| to change sizes properly if used in a subscript. % \begin{macrocode} \let\nfss@text\text % \end{macrocode} % \end{macro} % % \begin{macro}{\text@} % If \cn{text} is encountered inside math mode the macro % \cs{text@} is called. It has one mandatory argument, the text % which should be produced. Since we do not know in which math % style we are currently in we call \cs{mathchoice} to tyeset % our text in all four possible styles. % \begin{macrocode} \def\text@#1{\mathchoice % \end{macrocode} % To save token space we call a macro \cs{textdef@} which takes % three arguments: the current math style, the corresponding size % macro and the text to typeset possibly with some additional % information for typesetting. % \begin{macrocode} {\textdef@\displaystyle\f@size{#1}}% % \end{macrocode} % The other three cases are similar except for the % \cs{iffirstchoice} switch which we set to false. This is % done to prevent \LaTeX{} macros like \cn{ref} or \cn{index} % from writing their arguments more than once. % \begin{macrocode} {\textdef@\textstyle\tf@size{\firstchoice@false #1}}% {\textdef@\textstyle\sf@size{\firstchoice@false #1}}% {\textdef@\textstyle \ssf@size{\firstchoice@false #1}}% % \end{macrocode} % Here we need to check whether a math size-change occurred inside % the argument of \cn{text}. If so, restore % \begin{macrocode} \check@mathfonts } % \end{macrocode} % The macros \cs{tf@size}, \cs{sf@size} and \cs{ssf@size} % hold the sizes which should be used when we are loading a new % font for use in \cs{textfont}, \cs{scriptfont} and % \cs{scriptscriptfont}. % \end{macro} % % \begin{macro}{\textdef@} % To typeset the argument of \cn{text} correctly we have to make % several actions. We start by placing everything inside an % \cs{hbox}. But this is not enough: we need one extra level of % grouping. These extra braces are necessary because of the new % font selection scheme which might produce an \cs{aftergroup} % to globally restore some font values after the current group. To % prevent any damage by this mechanism we add the braces thereby % bringing the token inserted by \cs{aftergroup} inside the % \cs{hbox}.\footnote{The mechanism will not produce a second % \cs{aftergroup}. For more details see the technical documentation % for NFSS2.} % \begin{macrocode} \def\textdef@#1#2#3{\hbox{{% % \end{macrocode} % Since text typeset inside an \cs{hbox} always stays in the size % of the text surrounding the formula we have to adjust this for % script and scriptscript sizes. For any math formula inside this % argument this will be achieved by setting \cs{everymath} to % the first argument of \cs{textdef@} since this argument % contains the math size in the current typeset case of % \cs{mathchoice}. % Since \latex/ also knows about \cn{parbox}es and the % \env{minipage} environment it might be neccessary to adjust % \cs{everydisplay} too but this has to be tested further. % \begin{macrocode} \everymath{#1}% % \end{macrocode} % The next line of code changes locally (i.e.\ inside the current % \cs{hbox}) the value of \cs{f@size}. This macro holds the % size for typesetting ordinary text (e.g.\ loading or selecting a % new font via \cs{selectfont}). By changing it to a smaller % value a following \cs{selectfont} will switch to the wanted % size. % \begin{macrocode} \let\f@size#2\selectfont % \end{macrocode} % Now we simply call the third argument and close all open groups. % \begin{macrocode} #3}}} % \end{macrocode} % \end{macro} % % \begin{macro}{\iffirstchoice@} % Here is the switch that we use to decide if \cn{ref} etc.\ % should print its warnings. The default is true since % normally these warnings shouldn't be suppressed. % \begin{macrocode} \newif\iffirstchoice@ \firstchoice@true % \end{macrocode} % \end{macro} % % \subsection{Re-definition of \latex/ macros to work with \cn{text}} % % If a counter-changing command occurs inside the argument of % \cn{text}, we don't want the counter to be changed four times % because \cn{stepcounter} and \cn{addtocounter} have global effect. % So we add the \cs{iffirstchoice@} test to make the counter % operations execute only once. % % \begin{macro}{\stepcounter} % Use \cs{def} rather than \cn{renewcommand*} because the star-form % (for non-\cs{long} definitions) doesn't work with the June 1994 % release of \latex/. % \begin{macrocode} \def\stepcounter#1{% \iffirstchoice@ \addtocounter{#1}\@ne \begingroup \let\@elt\@stpelt \csname cl@#1\endcsname \endgroup \fi } % \end{macrocode} % \end{macro} % % \begin{macro}{\addtocounter} % \begin{macrocode} \def\addtocounter#1#2{% \iffirstchoice@ \@ifundefined {c@#1}{\@nocounterr {#1}}% {\global \advance \csname c@#1\endcsname #2\relax}% \fi} % \end{macrocode} % \end{macro} % % Ensure \cs{ifmeasuring@} is defined even when \pkg{amstext} is used % separately from \pkg{amsmath}. % \begin{macrocode} \newif\ifmeasuring@ % \end{macrocode} % % For \cn{ref}, \cn{pageref}, and indeed anything else that issues a % warning or error, \cn{text} will produce four copies of the % warning/error message. To suppress the last three copies, we change % \cs{GenericInfo}, \cs{GenericWarning}, \cs{GenericError}. % \begin{macrocode} \let\m@gobble\@empty \@xp\let\csname m@gobble4\endcsname\@gobblefour \long\@xp\def\csname m@gobble6\endcsname#1#2#3#4#5#6{} % \end{macrocode} % % \begin{macrocode} \toks@{% \csname m@gobble\iffirstchoice@\ifmeasuring@ 4\fi\else 4\fi\endcsname \protect} \edef\GenericInfo{\the\toks@ \@xp\@nx\csname GenericInfo \endcsname} % \edef\GenericWarning{\the\toks@ \@xp\@nx\csname GenericWarning \endcsname} % \toks@{% \csname m@gobble\iffirstchoice@\ifmeasuring@ 6\fi\else 6\fi\endcsname \protect} \edef\GenericError{\the\toks@ \@xp\@nx\csname GenericError \endcsname} % \end{macrocode} % % At one time \cn{label}, \cs{@wrindex} and \cs{@wrglossary} were % changed here too to use the \cs{iffirstchoice@} test but it seems % that was a mistake because those are non-immediate writes. % Something like % \begin{verbatim} % \text{something \index{foo}} % \end{verbatim} % within a math formula would therefore \emph{lose the index term} if % the surrounding context was not displaystyle. (Unlikely in % practice, but not impossible.) [mjd,1994/12/09] % %\subsection{Applications of \cn{text}} % % \begin{macro}{\mathhexbox} % We start with an re-definition of the \fn{plain.tex} macro % \cs{mathhexbox}. (Although M. Spivak in \amstex/ uses the name % \cs{mathhexbox@} for this purpose, I [FMi] don't see any reason % to use a new name since the new definition is superior, has the % same syntax and is used for the same purpose.) % \begin{macrocode} \begingroup \catcode`\"=12 \gdef\mathhexbox#1#2#3{\text{$\m@th\mathchar"#1#2#3$}} \endgroup % \end{macrocode} % This redefinition means that now symbols like \S, \P, \dag, \ldots, % which are defined via \cs{mathhexbox} in \fn{plain.tex} or % elsewhere now correctly change sizes if they are used in math mode. % \end{macro} % % The usual \cs{endinput} to ensure that random garbage at the end of % the file doesn't get copied by \fn{docstrip}. % \begin{macrocode} \endinput % \end{macrocode} % % \CheckSum{135} % \Finale