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+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
\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.
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!