Вызов среды с использованием токена contcats (expl3) приводит к отображению некоторого внутреннего содержимого в конце документа.

Вызов среды с использованием токена contcats (expl3) приводит к отображению некоторого внутреннего содержимого в конце документа.

Мне нужно динамически применить окружение (или, возможно, ряд вложенных окружений) к некоторому тексту с помощью команд 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}

введите описание изображения здесь

Связанный контент