如何在 Opmac 中的另一个宏定义中使用 \sec 和 \secc

如何在 Opmac 中的另一个宏定义中使用 \sec 和 \secc

有人能给我指出正确的方向吗?我需要将文章的全部内容包装在宏定义中(这是用户将其传递到我的模板中的方式),其中包含引用 \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用空行终止其参数。如果你想了解更多,你需要研究电子书讨论 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
}

您可以看到另一个非常相似的解决方案,使用\bracedparamOPmac 技巧 0036

相关内容