¿Cómo se pueden usar \sec y \secc desde dentro de otra definición de macro en Opmac?

¿Cómo se pueden usar \sec y \secc desde dentro de otra definición de macro en Opmac?

¿Alguien puede indicarme la dirección correcta? Necesito resumir básicamente todo el contenido de un artículo en una definición de macro (así es como el usuario lo pasa a mi plantilla), que contiene referencias \sec y \secc. Por alguna razón, cuando uso esas macros dentro de otro \def, falla con un mensaje críptico: "El párrafo terminó antes de que se completara \eoldefA".

\input opmac

\def\fails{
\sec Test 2

Some Text
}

\fails

\sec Test 1
This is Okay

\end

Producción:

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

Respuesta1

Simplemente no puede usarlo \secen el argumento de otro comando, porque se basa en delimitar el título con el carácter de fin de línea insertado por TeX, pero cuando incrusta el código en una macro, el final de línea se convierte a un espacio.

En mi opinión esta es una mala decisión, porque el código es bastante frágil; mucho mejor sería delimitar el título con \par(lo que requiere que el usuario deje una línea en blanco después del título de la sección.

Solución alterna:

\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

ingrese la descripción de la imagen aquí

Respuesta2

Lo que está sucediendo es que opmac está haciendo algunas cosas raras con códigos de caracteres para permitir que el \seccomando termine su argumento con una línea en blanco. Si quieres saber más necesitarás estudiar los capítulos dellibro de textoque hablan sobre cómo funciona el proceso "digestivo" de TeX (no estoy seguro de qué tan profundo estás o estás dispuesto a profundizar en la programación de TeX). ¿Cuánto control tienes sobre cómo ingresan las entradas a tu plantilla y cuáles son tus necesidades más globales?

Respuesta3

Este problema se describe en la página 16 del opmac-d.pdfdocumento, donde se sugiere la solución:

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

O, en su código:

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

Puedes ver otra solución muy similar usando \bracedparammacro desdeTruco OPmac 0036.

información relacionada