Как использовать \sec и \secc из другого макроопределения в Opmac

Как использовать \sec и \secc из другого макроопределения в Opmac

Может ли кто-нибудь указать мне правильное направление? Мне нужно обернуть практически все содержимое статьи в определение макроса (именно так пользователь передает его в мой шаблон), которое содержит ссылки \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.

Связанный контент