Comando LaTeX que define dois novos comandos, um como uma versão maiúscula do outro

Comando LaTeX que define dois novos comandos, um como uma versão maiúscula do outro

Desejo criar um comando que defina dois novos operadores matemáticos, sendo um uma versão maiúscula do outro. Por exemplo, o comando \makeoperator{log}criaria \loge \Logcomporia logs em letras minúsculas e maiúsculas. Até agora, tenho o seguinte (crédito da primeira parte ao 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}%
}

mas isso produz um erro de sequência de controle indefinido. O que está errado?

Responder1

Se você preferir comandos primitivos TeX em vez de comandos Expl3 (semelhantes a mim), então você pode fazer:

\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

Responder2

Existem métodos melhores hoje em dia.

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

insira a descrição da imagem aqui

Mas eu evitaria. Basta definir os operadores que você precisa.

informação relacionada