
TeX をいじっているときに、奇妙なエラーに遭遇しました。これが私の入力ファイルです:
\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
これを でコンパイルするとpdftex
、次のエラーが発生します:
(./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!
行を削除すると\twice{Hello World.\par}
、コンパイルは成功し、期待どおりの出力が得られます。
\twice{\hello}
は機能するのに、なぜ\twice{Hello World.\par}
機能しないのでしょうか?
\someMacro{someText\par}
に変更するという一般的な手法は\def\defText{someText\par} \def\someMacro{\defText}
常に機能しますか? マクロのパラメーターとして使用したい段落ごとにマクロを定義しなくても済む代替手段はありますか?
答え1
}
引数の末尾を検索する際にドキュメント全体が読み込まれてしまうことを避けるため、デフォルトで\par
は (または空白行)はマクロ引数では許可されません。引数に複数の段落を許可するコマンドを定義する場合は、\long\def
ではなく を使用します\def
。