두 개의 새로운 명령을 정의하는 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

Expl3 명령(나와 유사) 대신 TeX 기본 명령을 선호한다면 다음을 수행할 수 있습니다.

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

여기에 이미지 설명을 입력하세요

하지만 나는 그것을 피할 것입니다. 필요한 연산자를 정의하기만 하면 됩니다.

관련 정보