LaTeX 指令定義了兩個新指令,一個是另一個的大寫版本

LaTeX 指令定義了兩個新指令,一個是另一個的大寫版本

我希望創建一個命令來定義兩個新的數學運算符,一個是另一個的大寫版本。例如,該指令\makeoperator{log}將建立\log\Log排版小寫和大寫日誌。到目前為止,我有以下內容(第一部分歸功於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}%
}

但這會產生未定義的控制序列錯誤。怎麼了?

答案1

如果您喜歡 TeX 原始命令而不是 Expl3 命令(與我類似),那麼您可以這樣做:

\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

答案2

如今有更好的方法。

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

在此輸入影像描述

但我會避免它。只需定義您需要的運算子即可。

相關內容