如何使用 regex_replace_once (l3regex) 在嵌套环境/宏中进行替换?

如何使用 regex_replace_once (l3regex) 在嵌套环境/宏中进行替换?

我正在尝试使用嵌套环境,其中外部环境对内部环境的输出应用一些更改。当外部环境需要使用正则表达式命令(在我的情况下为 regex_replace_once)部分修改内部环境的输出时,就会出现问题。例如,如果内部环境将其内容更改为斜体,而外部环境将首字母更改为粗体,则组合的嵌套版本应使整个内容变为斜体,并将首字母变为粗体(粗体斜体)。

问题是,普通正则表达式会在匹配实际文本之前先匹配环境名称(例如envname中的匹配)。我尝试在 expl3 中使用不同的类别匹配,使用 \cX、\c[....] 来避免这种匹配,但没有成功。使用显示 中的环境名称的类别是字符,因此无法从文本的其余部分识别出来。\begin{envname}tl_analysis_show\begin{inner}

如何使用正则表达式命令来改变嵌套环境的输出而不干扰控制序列(不仅在我的情况下在开始时,而且在传递的主体参数中的任何地方)?

PS:这个问题更通用的形式可能是“如何在 HTML 中拥有类似于 CSS 的级联样式”

平均能量损失

\documentclass{minimal}

\RequirePackage{expl3}


\ExplSyntaxOn
\NewDocumentEnvironment{outerenv}{+b}{%
    
    \tl_set:Nn \l_outerenv_body_tl {#1}
    % \regex_set:Nn \l_outerenv_pattern_regex {(\w)(.*)}
    % \regex_set:Nn \l_outerenv_pattern_regex {(\c[LO]\w)(.*)}
    \regex_set:Nn \l_outerenv_pattern_regex {(\c[^CBEMTPUDSOA]\w)(.*)}

    \tl_analysis_show:n {#1}

    \tl_analysis_show:N \l_outerenv_body_tl

    \regex_replace_once:NnN \l_outerenv_pattern_regex { \c{textbf}\cB\{ \1 \cE\} \2 } \l_outerenv_body_tl

    \tl_analysis_show:N \l_outerenv_body_tl

    \tl_use:N \l_outerenv_body_tl
}{}
\ExplSyntaxOff


\ExplSyntaxOn
\NewDocumentEnvironment{innerenv}{+b}{%

    \tl_set:Nn \l_innerenv_body_tl {\textit{#1}}
    \tl_analysis_show:N \l_innerenv_body_tl
        \tl_use:N \l_innerenv_body_tl
}{}
\ExplSyntaxOff

\begin{document}


    \begin{innerenv}
        Inner is italic.
    \end{innerenv}

    \begin{outerenv}
        Outer's first letter is bold.
    \end{outerenv}


    \begin{outerenv}
        \begin{innerenv}
            Inner nested in the outer.
        \end{innerenv}
    \end{outerenv}


\end{document}

在此处输入图片描述

相关内容