LaTeX-Befehl, der zwei neue Befehle definiert, einen als großgeschriebene Version des anderen

LaTeX-Befehl, der zwei neue Befehle definiert, einen als großgeschriebene Version des anderen

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 \logund 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}

Bildbeschreibung hier eingeben

Aber ich würde es vermeiden. Definieren Sie einfach die Operatoren, die Sie benötigen.

verwandte Informationen