如何在 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
}

\bracedparam您可以使用巨集看到另一個非常相似的解決方案OPmac技巧0036

相關內容