% % \iffalse meta-comment % % Copyright (C) 1995, 1999 American Mathematical Society. % Copyright (C) 2016-2023 LaTeX Project and American Mathematical Society. % % This work may be distributed and/or modified under the % conditions of the LaTeX Project Public License, either version 1.3c % of this license or (at your option) any later version. % The latest version of this license is in % https://www.latex-project.org/lppl.txt % and version 1.3c or later is part of all distributions of LaTeX % version 2005/12/01 or later. % % This work has the LPPL maintenance status `maintained'. % % The Current Maintainer of this work is the LaTeX Project. % % \fi % %\iffalse %<*driver> \documentclass{amsdtx} \def\MaintainedByLaTeXTeam#1{% \begin{center}% \fbox{\fbox{\begin{tabular}{@{}l@{}}% This file is maintained by the \LaTeX{} Project team.\\% Bug reports can be opened (category \texttt{#1}) at\\% \url{https://latex-project.org/bugs/}.\end{tabular}}}\end{center}} \let\savedarg\arg \usepackage{amsopn} \let\arg\savedarg \GetFileInfo{amsopn.sty} \begin{document} \title{The \pkg{amsopn} package} \author{Michael Downes} \date{Version \fileversion, \filedate} \DocInput{amsopn.dtx} \end{document} % %\fi % % \maketitle % \MaintainedByLaTeXTeam{amslatex} % % \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. % % \MaybeStop{} % % Standard file identification. % \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{amsopn}[2022/04/08 v2.04 operator names] % \end{macrocode} % % 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@{\@ifnextchar\limits{\nolimits\@gobble}{\nolimits}} % \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). % Use |\Umathcodedefnum| with xetex and LuaTeX to avoid problems % using |\mathcode| if |-| has already been defined using |\Umathcode|. % \changes{v2.02}{2016/03/08}{Unicode TeX version of \cs{newmcodes@}} % \begin{macrocode} \begingroup \catcode`\"=12 \ifx\Umathcode\@undefined \gdef\newmcodes@{\mathcode`\'39\mathcode`\*42\mathcode`\."613A% % \end{macrocode} % Define \cs{std@minus} for \cs{relbar} use; otherwise there are % problems with arrows constructed with relbar. % \begin{macrocode} \ifnum\mathcode`\-=45 \else \mathchardef\std@minus\mathcode`\-\relax \fi \mathcode`\-45\mathcode`\/47\mathcode`\:"603A\relax} % \end{macrocode} % \begin{macrocode} \else % \end{macrocode} % \begin{macrocode} \gdef\newmcodes@{\mathcode`\'39\mathcode`\*42\mathcode`\."613A% \ifnum\Umathcodenum`\-=45 \else \Umathcharnumdef\std@minus\Umathcodenum`\-\relax \fi \mathcode`\-45\mathcode`\/47\mathcode`\:"603A\relax} % \end{macrocode} % \begin{macrocode} \fi \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 m}{\@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} % % \changes{v2.04}{2022/04/08}{Make operators \cs{protected} (gh/123)} % \begin{macrocode} \protected\def\arccos{\qopname\relax o{arccos}} \protected\def\arcsin{\qopname\relax o{arcsin}} \protected\def\arctan{\qopname\relax o{arctan}} \protected\def\arg{\qopname\relax o{arg}} \protected\def\cos{\qopname\relax o{cos}} \protected\def\cosh{\qopname\relax o{cosh}} \protected\def\cot{\qopname\relax o{cot}} \protected\def\coth{\qopname\relax o{coth}} \protected\def\csc{\qopname\relax o{csc}} \protected\def\deg{\qopname\relax o{deg}} \protected\def\det{\qopname\relax m{det}} \protected\def\dim{\qopname\relax o{dim}} \protected\def\exp{\qopname\relax o{exp}} \protected\def\gcd{\qopname\relax m{gcd}} \protected\def\hom{\qopname\relax o{hom}} \protected\def\inf{\qopname\relax m{inf}} \protected\def\injlim{\qopname\relax m{inj\,lim}} \protected\def\ker{\qopname\relax o{ker}} \protected\def\lg{\qopname\relax o{lg}} \protected\def\lim{\qopname\relax m{lim}} \protected\def\liminf{\qopname\relax m{lim\,inf}} \protected\def\limsup{\qopname\relax m{lim\,sup}} \protected\def\ln{\qopname\relax o{ln}} \protected\def\log{\qopname\relax o{log}} \protected\def\max{\qopname\relax m{max}} \protected\def\min{\qopname\relax m{min}} \protected\def\Pr{\qopname\relax m{Pr}} \protected\def\projlim{\qopname\relax m{proj\,lim}} \protected\def\sec{\qopname\relax o{sec}} \protected\def\sin{\qopname\relax o{sin}} \protected\def\sinh{\qopname\relax o{sinh}} \protected\def\sup{\qopname\relax m{sup}} \protected\def\tan{\qopname\relax o{tan}} \protected\def\tanh{\qopname\relax o{tanh}} % \end{macrocode} % % \begin{macro}{\operator@font} % \begin{macro}{\operatorfont} % 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. The original name was \cs{operator@font}, retained % for compatibility; the second name was added to make it % more accessible so that users can call this font for use in special % constructs that are not ordinary operator names but conceptually % related. % % \cs{operator@font} is also declared by the \LaTeX{} kernel (for % at least 14 years), thus defining it here effectively means % ``resetting it'' to the kernel value, which is counterproductive % in situations where the user (or a class) has altered its % definition and at a later point \pkg{amsopn} got added. % \changes{v2.03}{2022/01/20}{Do not reset \cs{operator@font} it is % already defined in the LaTeX kernel (gh/734)} % \begin{macrocode} %\def\operator@font{\mathgroup\symoperators} % commented out in 2.03 \def\operatorfont{\operator@font} % \end{macrocode} % \end{macro} % \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. % \changes{v2.04}{2022/04/08}{Make operators \cs{protected} (gh/123)} % \begin{macrocode} \protected\def\varlim@#1#2{% \vtop{\m@th\ialign{##\cr \hfil$#1\operator@font lim$\hfil\cr \noalign{\nointerlineskip\kern1.5\ex@}#2\cr \noalign{\nointerlineskip\kern-\ex@}\cr}}% } \protected\def\varinjlim{% \mathop{\mathpalette\varlim@{\rightarrowfill@\textstyle}}\nmlimits@ } \protected\def\varprojlim{% \mathop{\mathpalette\varlim@{\leftarrowfill@\textstyle}}\nmlimits@ } \protected\def\varliminf{\mathop{\mathpalette\varliminf@{}}\nmlimits@} \def\varliminf@#1{\@@underline{\vrule\@depth.2\ex@\@width\z@ \hbox{$#1\m@th\operator@font lim$}}} \protected\def\varlimsup{\mathop{\mathpalette\varlimsup@{}}\nmlimits@} \def\varlimsup@#1{\@@overline{\hbox{$#1\m@th\operator@font lim$}}} % \end{macrocode} % % \begin{macrocode} \let\nmlimits@\displaylimits \DeclareOption{namelimits}{\let\nmlimits@\displaylimits} \DeclareOption{nonamelimits}{\let\nmlimits@\nolimits} \ProcessOptions\relax % \end{macrocode} % % If we don't load the \pkg{amsgen} package then the use of \cs{ex@} % in \cs{varlim@} will lead to trouble. % \begin{macrocode} \RequirePackage{amsgen}\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*)} % % \Finale