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

\secTeX에 의해 삽입된 줄 끝 문자로 제목을 구분해야 하기 때문에 다른 명령의 인수에 사용할 수 없습니다 . 그러나 매크로에 코드를 포함하면 줄 끝이 변환됩니다. 공간으로.

제 생각에는 코드가 매우 취약하기 때문에 이것은 잘못된 결정입니다. 훨씬 더 나은 방법은 \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명령이 빈 줄로 인수를 종료할 수 있도록 문자 코드를 사용하여 펑키한 작업을 수행하고 있다는 것입니다. 더 자세히 알고 싶다면 해당 장을 공부해야 합니다.TeXbookTeX의 "소화" 프로세스가 어떻게 작동하는지에 대해 이야기합니다(당신이 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.

관련 정보