%EC%9D%84%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%ED%99%98%EA%B2%BD%EC%9D%84%20%ED%98%B8%EC%B6%9C%ED%95%98%EB%A9%B4%20%EB%AC%B8%EC%84%9C%20%EB%81%9D%EC%97%90%20%EC%9D%BC%EB%B6%80%20%EB%82%B4%EB%B6%80%20%EB%82%B4%EC%9A%A9%EC%9D%B4%20%ED%91%9C%EC%8B%9C%EB%90%A9%EB%8B%88%EB%8B%A4..png)
expl3(latex3) 명령을 사용하여 일부 텍스트에 환경(또는 일련의 중첩 환경)을 동적으로 적용해야 합니다. 하지만 expl3을 사용하여 일련의 환경 관련 토큰을 연결하면 환경이 정상적으로 텍스트를 삽입하여 사용할 때와 다르게 동작합니다. expl3을 사용하면 전달된 본문 콘텐츠(즉, ) 뒤에 오는 환경 내부의 모든 콘텐츠가 +b
전달된 본문 콘텐츠 옆에 표시되는 대신 문서 끝에 나타납니다.
문제는 무엇입니까?
\documentclass{minimal}
\RequirePackage{expl3}
\ExplSyntaxOn
\NewDocumentEnvironment{myenv}{ +b}{
\tl_set:Nn \l_myenv_body_tl {#1}
<myenv~begins>~\use:n \l_myenv_body_tl
<This~should~appear~before~myenv~ending.>
}{ <myenv~ends~here.>}
\ExplSyntaxOff
\begin{document}
First line.
\vspace \medskipamount
% An environment by normal approach
\begin{myenv}
Some text for the regular body.
\end{myenv}
\vspace \medskipamount
Second line.
\vspace \medskipamount
% An environment created using Expl3
\ExplSyntaxOn
\tl_set:Nn \l_body_tl {Some~text~for~the~body.}
\tl_set:Nn \l_beginings_tl {\begin{myenv} }
\tl_set:Nn \l_endings_tl {\end{myenv}}
\tl_set:Nn \l_total_tl {}
\tl_put_right:Nn \l_total_tl {\l_beginings_tl}
\tl_put_right:Nn \l_total_tl {\l_body_tl}
\tl_put_right:Nn \l_total_tl {\l_endings_tl}
\use:n {\l_total_tl}
\ExplSyntaxOff
\vspace \medskipamount
Third line.
\end{document}
답변1
b
리터럴을 확인해야 하는 인수를 사용하고 있으므로 \end{myenv}
매크로 뒤에 숨길 수 없습니다. 실제로 문제와 관련이 없는 \def\foo{\end{myenv}}
사실을 사용한 경우에도 동일한 내용이 표시됩니다.expl3
더 간단한 비 expl3
예
\documentclass{article}
\usepackage[T1]{fontenc}
\NewDocumentEnvironment{myenv}{ +b}{
<myenv~begins>
#1
<This~should~appear~before~myenv~ending.>
}{ <myenv~ends~here.>}
\def\fooA{\begin{myenv}}
\def\fooB{\end{myenv}}
\begin{document}
First line.
\begin{myenv}
abc
\end{myenv}
Second line.
\fooA
xyz
\fooB
Third line.
\end{document}