%20%D0%BF%D1%80%D0%B8%D0%B2%D0%BE%D0%B4%D0%B8%D1%82%20%D0%BA%20%D0%BE%D1%82%D0%BE%D0%B1%D1%80%D0%B0%D0%B6%D0%B5%D0%BD%D0%B8%D1%8E%20%D0%BD%D0%B5%D0%BA%D0%BE%D1%82%D0%BE%D1%80%D0%BE%D0%B3%D0%BE%20%D0%B2%D0%BD%D1%83%D1%82%D1%80%D0%B5%D0%BD%D0%BD%D0%B5%D0%B3%D0%BE%20%D1%81%D0%BE%D0%B4%D0%B5%D1%80%D0%B6%D0%B8%D0%BC%D0%BE%D0%B3%D0%BE%20%D0%B2%20%D0%BA%D0%BE%D0%BD%D1%86%D0%B5%20%D0%B4%D0%BE%D0%BA%D1%83%D0%BC%D0%B5%D0%BD%D1%82%D0%B0..png)
Мне нужно динамически применить окружение (или, возможно, ряд вложенных окружений) к некоторому тексту с помощью команд expl3 (latex3). Однако окружение ведет себя по-другому при объединении ряда маркеров, связанных с окружением, с помощью expl3, по сравнению с тем, когда я использую его обычно, встраивая текст. При использовании expl3 любой контент внутри окружения, который следует после переданного содержимого тела (то есть +b
), отображается в конце документа, а не рядом с переданным содержимым тела.
В чем проблема?
Приведенная ниже схема MWE демонстрирует проблему.
\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}