Wie kann ich \sec und \secc innerhalb einer anderen Makrodefinition in Opmac verwenden?

Wie kann ich \sec und \secc innerhalb einer anderen Makrodefinition in Opmac verwenden?

Kann mir jemand den richtigen Weg weisen? Ich muss im Grunde den gesamten Inhalt eines Artikels in einer Makrodefinition zusammenfassen (so übergibt der Benutzer ihn an meine Vorlage), die die Referenzen \sec und \secc enthält. Aus irgendeinem Grund schlägt die Verwendung dieser Makros innerhalb eines anderen \def mit einem kryptischen Fehler fehl: „Absatz endete, bevor \eoldefA abgeschlossen war.“

\input opmac

\def\fails{
\sec Test 2

Some Text
}

\fails

\sec Test 1
This is Okay

\end

Ausgabe:

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

Antwort1

Sie können es nicht einfach \secim Argument eines anderen Befehls verwenden, da es darauf beruht, den Titel mit dem von TeX eingefügten Zeilenende-Zeichen abzugrenzen. Wenn Sie den Code jedoch in ein Makro einbetten, wird das Zeilenende-Zeichen in ein Leerzeichen umgewandelt.

Meiner Meinung nach ist das eine schlechte Entscheidung, da der Code recht fragil ist. Viel besser wäre es, den Titel durch abzugrenzen \par(was den Benutzer dazu zwingt, nach dem Abschnittstitel eine Leerzeile zu lassen).

Problemumgehung:

\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

Bildbeschreibung hier eingeben

Antwort2

Was passiert, ist, dass opmac einige abgefahrene Sachen mit Zeichencodes macht, um dem \secBefehl zu ermöglichen, sein Argument mit einer leeren Zeile zu beenden. Wenn Sie mehr wissen möchten, müssen Sie die Kapitel desTeXbookdie darüber sprechen, wie der „Verdauungsprozess“ von TeX funktioniert (ich bin mir nicht sicher, wie tief Sie in die TeX-Programmierung einsteigen können oder bereit sind, einzusteigen). Wie viel Kontrolle haben Sie darüber, wie die Eingabe in Ihre Vorlage gelangt, und was sind Ihre allgemeineren Anforderungen?

Antwort3

Dieses Problem wird auf Seite 16 des opmac-d.pdfDokuments beschrieben, wo auch eine Lösung vorgeschlagen wird:

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

Oder in Ihrem Code:

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

\bracedparamEine weitere sehr ähnliche Lösung mit Makro finden Sie unterOPmac-Trick 0036.

verwandte Informationen