Может ли кто-нибудь указать мне правильное направление? Мне нужно обернуть практически все содержимое статьи в определение макроса (именно так пользователь передает его в мой шаблон), которое содержит ссылки \sec и \secc. По какой-то причине, когда я использую эти макросы внутри другого \def, он выдает ошибку с загадочным сообщением: "Параграф закончился до завершения \eoldefA".
\input opmac
\def\fails{
\sec Test 2
Some Text
}
\fails
\sec Test 1
This is Okay
\end
Выход:
This is pdfTeX, Version 3.14159265-2.6-1.40.19 (TeX Live 2018/W32TeX) (preloaded format=pdftex)
restricted \write18 enabled.
entering extended mode
(./test.tex (./opmac.tex
This is OPmac (Olsak's Plain macros), version <Mar. 2018a>
(c:/texlive/2018/texmf-dist/tex/csplain/fonts/ams-math.tex
FONT: AMS math fonts - \mathchardef's prepared, 12 math families preloaded.)
OPmac: etex.src macros detected)
Runaway argument?
Test 2
! **Paragraph ended before \eoldefA was complete.**
<to be read again>
\par
\fails -> \sec Test 2 \par
Some Text
l.9 \fails
решение1
Вы просто не можете использовать его \sec
в аргументе другой команды, поскольку он полагается на разделение заголовка символом конца строки, вставленным TeX, но когда вы встраиваете код в макрос, конец строки преобразуется в пробел.
По моему мнению, это плохое решение, поскольку код довольно хрупкий; гораздо лучше было бы разделить заголовок с помощью \par
(что потребует от пользователя оставить пустую строку после заголовка раздела).
Обходной путь:
\input opmac
\expandafter\let\expandafter\isec\csname\string\sec:M\endcsname
\def\fails{
\isec{Test 2}
Some Text
}
\fails
\sec Test 1
This is Okay
\end
решение2
Происходит то, что opmac делает что-то странное с кодами символов, чтобы позволить \sec
команде завершить свой аргумент пустой строкой. Если вы хотите узнать больше, вам нужно будет изучить главыTeXbookкоторые говорят о том, как работает «пищеварительный» процесс TeX (не уверен, насколько глубоко вы разбираетесь в программировании TeX или готовы ли вы в это вникать). Насколько вы контролируете то, как вводимые данные поступают в ваш шаблон, и каковы ваши более глобальные потребности?
решение3
Эта проблема описана на странице 16 opmac-d.pdf
документа, где предлагается решение:
\def\mymacro#1{... \csname\string\sec:M\endcsname{#1} ...}
Или в вашем коде:
\def\fails
\csname\string\sec:M\endcsname{Test 2}
Some Text
}
Вы можете увидеть еще одно очень похожее решение с использованием \bracedparam
макроса изOPmac трюк 0036.