Como posso usar \sec e \secc de dentro de outra definição de macro no Opmac

Como posso usar \sec e \secc de dentro de outra definição de macro no Opmac

Alguém pode me apontar na direção certa? Preciso encerrar basicamente todo o conteúdo de um artigo em uma definição de macro (é assim que o usuário passa para o meu modelo), que contém as referências \sec e \secc. Por alguma razão, quando uso essas macros dentro de outro \def, ele falha com um enigmático: "O parágrafo terminou antes de \eoldefA ser concluído."

\input opmac

\def\fails{
\sec Test 2

Some Text
}

\fails

\sec Test 1
This is Okay

\end

Saída:

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

Responder1

Você simplesmente não pode usar \seco argumento para outro comando, porque ele depende da delimitação do título com o caractere de fim de linha inserido pelo TeX, mas quando você incorpora o código em uma macro, o fim de linha é convertido para um espaço.

Na minha opinião esta é uma má decisão, porque o código é bastante frágil; muito melhor seria delimitar o título com \par(o que exige que o usuário deixe uma linha em branco após o título da seção.

Gambiarra:

\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

insira a descrição da imagem aqui

Responder2

O que está acontecendo é que o opmac está fazendo algumas coisas estranhas com códigos de caracteres para permitir que o \seccomando termine seu argumento com uma linha em branco. Se você quiser saber mais, precisará estudar os capítulos doTeXbookque falam sobre como funciona o processo “digestivo” do TeX (não tenho certeza de quão profundo você está ou deseja se aprofundar na programação do TeX). Quanto controle você tem sobre como as informações chegam ao seu modelo e quais são suas necessidades mais globais?

Responder3

Este problema está descrito na página 16 do opmac-d.pdfdocumento, onde é sugerida a solução:

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

Ou, no seu código:

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

Você pode ver outra solução muito semelhante usando \bracedparammacro deTruque OPmac 0036.

informação relacionada