%%% ==================================================================== %%% @LaTeX-file{ %%% filename = "amsopn.dtx", %%% version = "1.2a", %%% date = "1995/02/20", %%% time = "12:11:47 EST", %%% author = "American Mathematical Society", %%% copyright = "Copyright (C) 1995 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", %%% checksum = "48778 244 1038 9330", %%% email = "tech-support@math.ams.org (Internet)", %%% codetable = "ISO/ASCII", %%% keywords = "amslatex, ams-latex, operator name, amsopn", %%% supported = "yes", %%% abstract = "This is part of the AMS-\LaTeX{} distribution. It %%% provides a variety of extra mathematical features, %%% largely derived from AMS-\TeX{}.", %%% 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} \begin{document} \title{The \pkg{amsopn} package} \author{Michael Downes} \date{Version \fileversion, \filedate} \hDocInput{amsopn.dtx} \end{document} % %\fi % % \maketitle % % \MakeShortVerb\| % % \section{Introduction} % % The \pkg{amsopn} package provides a command % \cn{DeclareMathOperator} for defining new `math operator names' % similar to the standard function names \cn{sin}, \cn{lim}, % \cn{max}, etc. % % \StopEventually{} % % Standard file identification. % \begin{macrocode} \ProvidesPackage{amsopn}[1995/02/20 v1.2a operator names] % \end{macrocode} % % The definition of \cs{nolimits@} shows a standard \amstex/ % construction. We want to find out what the next token is going % to be, so we use % \begin{verbatim} % \futurelet\@let@token\next@ % \end{verbatim} % The \cs{@let@token} is assigned the value of the next token and % then we must define \cs{next@} to look at \cs{@let@token} and % decide what to do. We could name \cs{next@} to be \cs{nolimits@@} % or something, but by always using \cs{next@} in similar % constructions we cut down on the number of control sequence names % that we use. But this means that \cs{nolimits@} must incorporate % the appropriate definition of \cs{next@}. Notice that \cs{next@} % turns around and redefines itself again; once more this is to save % a control sequence name. % % What \cs{nolimits@} does is keep a \cn{limits} typed by the % user from having any effect. This is used for operatornames whose % standard usage is never to have limits. % \begin{macrocode} \def\nolimits@{% \DN@{\nolimits\ifx\@let@token\limits\expandafter\@gobble\fi}% \FN@\next@} % \end{macrocode} % % In operator names, it is sometimes desired to have text-mode % punctuation characters such as |*-/:'|. % Because the body of an % operator name is set in math mode, these few punctuation % characters will not come out right (wrong symbol/and or wrong % spacing). The purpose of \cs{newmcodes@} is to make them act like % their normal text versions. % % Where practical, we use decimal numbers to cut down main mem % usage (\qc{\"} not needed). % \begin{macrocode} \begingroup \catcode`\"=12 \gdef\newmcodes@{\mathcode`\'39\mathcode`\*42\mathcode`\."613A% \mathcode`\-45\mathcode`\/47\mathcode`\:"603A\relax} \endgroup % \end{macrocode} % % The command \cs{operatorname} prints its argument as a `math % operator' like \cs{sin} or \cs{det}, with proper font and spacing. % \begin{macrocode} \DeclareRobustCommand{\operatorname}{% \@ifstar{\qopname\newmcodes@ m}% {\qopname\newmcodes@ o}}% % \end{macrocode} % In the interior of the \cs{mathop} we need a null object (we choose % a zero kern for minimum waste of main mem) in order to guard % against the case where \arg{3} is a single letter; \tex/ will seize % it and center it on the math axis if there is nothing else inside % the \cs{mathop} atom. % \begin{macrocode} \DeclareRobustCommand{\qopname}[3]{% \mathop{#1\kern\z@\operator@font#3}% \csname n#2limits@\endcsname} % \end{macrocode} % % \begin{macro}{\DeclareMathOperator} % The command \cn{DeclareMathOperator} defines the first argument to % be an operator name whose text is the second argument. The star % form means that the operator name should take limits (like \cn{max} % or \cn{lim}). % \begin{macrocode} \newcommand{\DeclareMathOperator}{% \@ifstar{\@declmathop\@empty}{\@declmathop o}} % \end{macrocode} % \end{macro} % % In the basic set of operator names (below) we did not use % \cn{DeclareRobustCommand} because of the hash table cost. But we % use it here to minimize the chances of trouble, since we are % producing a user-defined command. % \begin{macrocode} \long\def\@declmathop#1#2#3{% \@ifdefinable{#2}{% \DeclareRobustCommand{#2}{\qopname\newmcodes@#1{#3}}}} % \@onlypreamble\DeclareMathOperator \@onlypreamble\@declmathop % \end{macrocode} % % \begin{macrocode} \def\arccos{\qopname\relax o{arccos}} \def\arcsin{\qopname\relax o{arcsin}} \def\arctan{\qopname\relax o{arctan}} \def\arg{\qopname\relax o{arg}} \def\cos{\qopname\relax o{cos}} \def\cosh{\qopname\relax o{cosh}} \def\cot{\qopname\relax o{cot}} \def\coth{\qopname\relax o{coth}} \def\csc{\qopname\relax o{csc}} \def\deg{\qopname\relax o{deg}} \def\det{\qopname\relax\@empty{det}} \def\dim{\qopname\relax o{dim}} \def\exp{\qopname\relax o{exp}} \def\gcd{\qopname\relax\@empty{gcd}} \def\hom{\qopname\relax o{hom}} \def\inf{\qopname\relax\@empty{inf}} \def\injlim{\qopname\relax\@empty{inj\,lim}} \def\ker{\qopname\relax o{ker}} \def\lg{\qopname\relax o{lg}} \def\lim{\qopname\relax\@empty{lim}} \def\liminf{\qopname\relax\@empty{lim\,inf}} \def\limsup{\qopname\relax\@empty{lim\,sup}} \def\ln{\qopname\relax o{ln}} \def\log{\qopname\relax o{log}} \def\max{\qopname\relax\@empty{max}} \def\min{\qopname\relax\@empty{min}} \def\Pr{\qopname\relax\@empty{Pr}} \def\projlim{\qopname\relax\@empty{proj\,lim}} \def\sec{\qopname\relax o{sec}} \def\sin{\qopname\relax o{sin}} \def\sinh{\qopname\relax o{sinh}} \def\sup{\qopname\relax\@empty{sup}} \def\tan{\qopname\relax o{tan}} \def\tanh{\qopname\relax o{tanh}} % \end{macrocode} % % \begin{macro}{\operator@font} % This command is provided to allow the document styles to decide in % which way math operators like `max' or `log' are typeset. The % default is to set them in \meta{math group} zero of the current % math version. % \begin{macrocode} \def\operator@font{\mathgroup\symoperators} % \end{macrocode} % \end{macro} % % For backwards compatibility we keep this old command name for the % time being: % \begin{macrocode} \def\operatornamewithlimits{\operatorname*} % \end{macrocode} % % These macros use \cs{mathpalette}s so that they will change size % in script and scriptscript styles, though it's hard to imagine they % will ever be used there (the arrows, particularly, look bad in % subscript sizes). Notice that the use of \cs{ex@} means that the % vertical spacing may not be optimal in script and scriptscript % sizes. Unfortunately \tex/ provides no easy way to do math mode % vertical spacing that varies with current math style like mu units. % \begin{macrocode} \def\varlim@#1#2{\mathop{\vtop{\ialign{##\crcr \hfil$#1\m@th\operator@font lim$\hfil\crcr \noalign{\nointerlineskip\kern\ex@}#2#1\crcr \noalign{\nointerlineskip\kern-\ex@}\crcr}}}} \def\varinjlim{\mathpalette\varlim@\rightarrowfill@} \def\varprojlim{\mathpalette\varlim@\leftarrowfill@} \def\varliminf{\mathpalette\varliminf@{}} \def\varliminf@#1{\mathop{\@@underline{\vrule\@depth.2\ex@\@width\z@ \hbox{$#1\m@th\operator@font lim$}}}} \def\varlimsup{\mathpalette\varlimsup@{}} \def\varlimsup@#1{\mathop{\@@overline {\hbox{$#1\m@th\operator@font lim$}}}} % \end{macrocode} % % \begin{macrocode} \DeclareOption{namelimits}{\let\nmlimits@\displaylimits} \DeclareOption{nonamelimits}{\let\nmlimits@\nolimits} \ProcessOptions\relax % \end{macrocode} % % 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} % % \changes{v1.2a}{1995/02/20}{Fixed operatorname % (shouldn't have same limits behavior as operatorname*)} % \CheckSum{292} % \Finale