Ich möchte einen Befehl erstellen, der zwei neue mathematische Operatoren definiert, von denen einer eine großgeschriebene Version des anderen ist. Beispielsweise \makeoperator{log}
würde der Befehl \log
und erstellen \Log
, um Protokolle in Klein- und Großbuchstaben zu setzen. Bisher habe ich Folgendes (der erste Teil geht an egreg):
\makeatletter
\newcommand{\Capitalize}[1]{%
\edef\@tempa{\expandafter\@gobble\string#1}%
\edef\@tempb{\expandafter\@car\@tempa\@nil}%
\edef\@tempa{\expandafter\@cdr\@tempa\@nil}%
\uppercase\expandafter{\expandafter\def\expandafter\@tempb\expandafter{\@tempb}}%
\@namedef{\@tempb\@tempa}{\expandafter\MakeUppercase\expandafter{#1}}}
\makeatother
\def\makeoperator#1{%
\expandafter\def\csname #1\endcsname{\operatorname{#1}}%
\Capitalize{\csname #1\endcsname}%
}
Dies führt jedoch zu einem undefinierten Steuersequenzfehler. Was ist falsch?
Antwort1
Wenn Sie (ähnlich wie ich) primitive TeX-Befehle anstelle von Expl3-Befehlen bevorzugen, können Sie Folgendes tun:
\def\DeclareDoubleMathOperator#1{\ddmoA#1\end}
\def\ddmoA#1#2\end{\uppercase{\ddmoB#1}#1{#2}}
\def\ddmoB#1#2#3{%
\expandafter\def\csname #1#3\endcsname{\mathop{\rm#1#3}\nolimits}%
\expandafter\def\csname #2#3\endcsname{\mathop{\rm#2#3}\nolimits}%
}
\DeclareDoubleMathOperator{log}
\DeclareDoubleMathOperator{blob}
$\log x+\Log x$
$\blob x+\Blob x$
\bye
Antwort2
Heutzutage gibt es bessere Methoden.
\documentclass{article}
\usepackage{amsmath}
\ExplSyntaxOn
\NewDocumentCommand{\DeclareDoubleMathOperator}{m}
{
% lowercase version
\cs_if_exist:cF { #1 }
{
\exp_args:Nc \DeclareMathOperator{#1}{#1}
}
% capitalized version
\cs_if_exist:cF { \text_titlecase:n { #1 } }
{
\exp_args:Ncx \DeclareMathOperator{ \text_titlecase:n { #1 } } { \text_titlecase:n { #1 } }
}
}
\ExplSyntaxOff
\DeclareDoubleMathOperator{log}
\DeclareDoubleMathOperator{blob}
\begin{document}
$\log x+\Log x$
$\blob x+\Blob x$
\end{document}
Aber ich würde es vermeiden. Definieren Sie einfach die Operatoren, die Sie benötigen.