有人能给我指出正确的方向吗?我需要将文章的全部内容包装在宏定义中(这是用户将其传递到我的模板中的方式),其中包含引用 \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
答案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
}
您可以看到另一个非常相似的解决方案,使用\bracedparam
宏OPmac 技巧 0036。