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

TeX によって挿入された行末文字でタイトルを区切ることに依存しているため、別のコマンドの引数で使用することはできません\secが、マクロにコードを埋め込むと、行末がスペースに変換されます。

私の意見では、これは悪い決定です。なぜなら、コードは非常に脆弱だからです。タイトルを\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

この問題はopmac-d.pdfドキュメントの 16 ページに記載されており、解決策が提案されています。

\def\mymacro#1{... \csname\string\sec:M\endcsname{#1} ...}

または、コード内では次のようにします。

\def\fails
   \csname\string\sec:M\endcsname{Test 2}
   Some Text
}

\bracedparamマクロを使用した非常に類似した別のソリューションを見ることができます。OPmacトリック0036

関連情報