
Играясь с 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
.