
Enquanto brincava com o TeX, me deparei com um erro estranho. Este é o meu arquivo de entrada:
\def\twice#1{#1#1}
\def\hello{Hello World.\par}
\twice{\hello} % works
\twice{Hello World. } % works
\twice{Hello World.\par} % doesn't work
\end
Quando compilo isso com pdftex
, recebo este erro:
(./hello.tex
Runaway argument?
{Hello World.
! Paragraph ended before \twice was complete.
<to be read again>
\par
l.6 \twice{Hello World.\par
} % doesn't work
! ==> Fatal error occurred, no output PDF file produced!
Se eu remover a linha \twice{Hello World.\par}
, a compilação será bem-sucedida e obterei a saída esperada.
Por que \twice{\hello}
funciona, mas \twice{Hello World.\par}
não funciona?
A técnica geral de mudar \someMacro{someText\par}
para \def\defText{someText\par} \def\someMacro{\defText}
sempre funcionará? Existe alguma alternativa que possa me ajudar a não definir uma macro para cada parágrafo que desejo usar como parâmetro para alguma macro?
Responder1
Para evitar }
que todo o seu documento seja engolido procurando pelo final de um argumento, por padrão \par
(ou uma linha em branco) não é permitido em um argumento de macro. Se você quiser definir um comando que permita vários parágrafos no argumento, use \long\def
em vez de \def
.