
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}