
Beim Herumspielen mit TeX ist mir ein seltsamer Fehler begegnet. Dies ist meine Eingabedatei:
\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
Wenn ich dies mit kompiliere pdftex
, erhalte ich diesen Fehler:
(./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!
Wenn ich die Zeile entferne \twice{Hello World.\par}
, ist die Kompilierung erfolgreich und ich erhalte die erwartete Ausgabe.
Warum funktioniert es, funktioniert \twice{\hello}
aber \twice{Hello World.\par}
nicht?
Funktioniert die allgemeine Technik zum Ändern \someMacro{someText\par}
auf \def\defText{someText\par} \def\someMacro{\defText}
immer? Gibt es eine Alternative, die mir dabei hilft, nicht für jeden Absatz, den ich als Parameter für ein Makro verwenden möchte, ein Makro zu definieren?
Antwort1
Um zu vermeiden, dass ein fehlendes }
Argument Ihr gesamtes Dokument verschluckt, während nach dem Ende eines Arguments gesucht wird, \par
ist in einem Makroargument standardmäßig (oder eine leere Zeile) nicht zulässig. Wenn Sie einen Befehl definieren möchten, der mehrere Absätze im Argument zulässt, verwenden Sie \long\def
anstelle von \def
.