누구든지 올바른 방향으로 나를 가리킬 수 있습니까? 기본적으로 기사의 전체 내용을 매크로 정의(사용자가 내 템플릿에 전달하는 방법)로 마무리해야 합니다. 여기에는 \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
\sec
TeX에 의해 삽입된 줄 끝 문자로 제목을 구분해야 하기 때문에 다른 명령의 인수에 사용할 수 없습니다 . 그러나 매크로에 코드를 포함하면 줄 끝이 변환됩니다. 공간으로.
제 생각에는 코드가 매우 취약하기 때문에 이것은 잘못된 결정입니다. 훨씬 더 나은 방법은 \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.