Definir macros dentro de macros

A maneira de pensar nisso é que ## é substituído por # , da mesma maneira que #1 é substituído por ‘qualquer que seja o primeiro argumento’. Então, se

você definir uma macro:

\newcommand\a[1]{+#1+#1+#1+}
ou (usando o primitivo \def do TeX):
\def\a#1{+#1+#1+#1+}
e usá-la como \a{b}, a expansão da macro vai produzir ‘+b+b+b+’, como a maioria das pessoas esperaria.

No entanto, se substituirmos agora parte da macro:

\newcommand\a[1]{+#1+\newcommand\x[1]{xxx#1}}
então, \a{b} nos dará o estranho
+b+\newcommand{x}[1]{xxxb}
de forma que o novo \x ignore seu argumento. Se usarmos o primitivo TeX:
\def\a#1{+#1+\def\x #1{xxx#1}}
\a{b} se expandirá para ‘+b+\def\x bb;xxxb}’. Isso fará com que \x seja uma macro delimitada por be sem argumentos, o que, certamente, não é o que pretendíamos! Na verdade, para definir que \x receba um argumento, precisamos de
\newcommand\a[1]{+#1+\newcommand\x[1]{xxx##1}}
ou, usando a definição do primitivo TeX:
\def\a#1{+#1+\def\x ##1{xxx##1}}
e \a{b} se expandirá para
+b+\def\x #1{xxx#1}
porque #1 é substituído por ‘b’ e ## é substituído por #.

Para encaixar uma definição dentro de uma definição dentro de uma definição, você vai precisar de ####1, duplicando o número de sinais #; e, no próximo nível, você precisará de 8 #s a cada vez, e assim por diante.


Do you have any question? Ask on: latex.net.br - we love qood questions!