![如何使用 regex_replace_once (l3regex) 在嵌套环境/宏中进行替换?](https://linux22.com/image/448770/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20regex_replace_once%20(l3regex)%20%E5%9C%A8%E5%B5%8C%E5%A5%97%E7%8E%AF%E5%A2%83%2F%E5%AE%8F%E4%B8%AD%E8%BF%9B%E8%A1%8C%E6%9B%BF%E6%8D%A2%EF%BC%9F.png)
我正在尝试使用嵌套环境,其中外部环境对内部环境的输出应用一些更改。当外部环境需要使用正则表达式命令(在我的情况下为 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}