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:
ou (usando o primitivo\newcommand\a[1]{+#1+#1+#1+}
\def
do TeX):
e usá-la como\def\a#1{+#1+#1+#1+}
\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:
então,\newcommand\a[1]{+#1+\newcommand\x[1]{xxx#1}}
\a
{b}
nos dará o estranho
+b+de forma que o novo\newcommand
{x}
[1]
{xxxb}
\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
ou, usando a definição do primitivo TeX:\newcommand\a[1]{+#1+\newcommand\x[1]{xxx##1}}
e\def\a#1{+#1+\def\x ##1{xxx##1}}
\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.
This question on the Web: http://latex.net.br/faq/FAQ-hash.html
Do you have any question? Ask on: latex.net.br - we love qood questions!