Novos usuários do LaTeX ficam surpresos ao perceberem que definições de macro contendo caracteres não alfabéticos, como, por exemplo,
são incapazes de compilar. A razão é que a linguagem de macro do TeX, diferentemente da maioria das linguagens de programação, aceita exclusivamente letras em nomes de macros.\newcommand{\cul8r}{Goodbye!}
Existem várias técnicas para definir uma macro com um nome como
\cul8r
. Infelizmente, nenhuma das técnicas é particularmente boa:
\csname
…\endcsname
para definir e invocar a macro:
\expandafter\newcommand\csname cul8r\endcsname{Goodbye!} Eu disse: ``\csname cul8r\endcsname''.
\newcommand{\DefineRemark}[2]{% \expandafter\newcommand\csname rmk-#1\endcsname{#2}% } \newcommand{\Remark}[1]{\csname rmk-#1\endcsname} ... \DefineRemark{cul8r}{Goodbye!} ... \Remark{cul8r}
\catcode`8 = 11 \newcommand{\cul8r}{Goodbye!} Eu disse: ``\cul8r''.
\cul8r
pode ser usado diretamente
\setlength
{\paperwidth
}
{8in}
nos dirá:
! Número ausente, tratado como zero.8
\cul
que deve ser sempre seguida de
“8r”:
\def\cul8r{Goodbye!} Eu disse: ``\cul8r''.
\cul8r
pode ser usado diretamente
\cul
for seguido de qualquer outra coisa além de “8r”, com um diagnóstico confuso —
\cul99
produzirá:
(o que confundiria alguém que sequer tenha percebido que havia uma definição de! Uso de \cul não corresponde à definição dele. <*> \cul9 9
\cul
no documento).
\cul
existente, quando houver; consequentemente, a técnica não pode ser usada para definir duas macros, uma
\cul8r
e, digamos, uma \cul123
, no mesmo documento.
\@
e @ em nomes de macros para mais informações.
Note que o uso análogo da técnica 3 neste exemplo nos daria
que funciona, mas derruba o objeto do exercício. (\begingroup \catcode`8 = 11 \gdef\cul8r{Goodbye!} \gdef\later{\cul8r} \endgroup Eu disse: ``\later''.
\later
tem o código de catálogo “congelado” para ‘8’, embora o valor volte ao normal no momento em que ele é usado; observe, ainda, o uso do comando primitivo \gdef
, já que o \newcommand
não pode criar uma macro que fique disponível fora do grupo.)
Recomendação: Escolha outro mecanismo (tal como
\DefineRemark
, acima) ou escolha outro nome para sua macro, um que contenha apenas letras comuns. Uma abordagem usual é utilizar algarismos romanos no lugar dos arábicos:
o que estraga a intenção da piada implícita no exemplo\newcommand{\culVIIIr}{Goodbye!}
\cul8r
!
This answer last edited: 2009-06-03
This question on the Web: http://latex.net.br/faq/FAQ-linmacnames.html
Do you have any question? Ask on: latex.net.br - we love qood questions!