当每个环境/宏可能对其嵌入的内容进行部分样式化时,使用嵌套环境/宏来级联样式的正确方法是什么?

当每个环境/宏可能对其嵌入的内容进行部分样式化时,使用嵌套环境/宏来级联样式的正确方法是什么?

我问过类似的问题,但我想我必须用另一种方式来描述它。

需要

使用嵌套环境/宏来级联样式的正确方法是什么(很像 CSS 在 HTML 中的工作方式),而每个环境可能会有选择地和部分地(而不是完全地)风格化其嵌入的内容?

问题

假设innerenv嵌套在中outerenv。如果innerenv将文本更改为斜体并outerenv使其变为红色,因为它们在上应用了不重叠的样式所有的文本,那么它们自然地一起工作(红色斜体)。

但是,如果 theouterenv想要修改其嵌入文本的一部分(而不是全部)(例如将首字母加粗,或将前三个单词改为小写,……),那么就会出现问题。问题是我无法找到从控制序列中识别扩展文本的方法。例如,myenvmytext之间的区别\begin{myenv}mytext\end{myenv}似乎无法识别。

尝试过的解决方案

我尝试使用\regex_replace_once其扩展功能来识别 cat-codes,但是如下面 MWE 中的那样,它innerenv只是\begin{innerenv}一个字符,无法识别。

动机

我正在尝试翻译asciidoc转换成 latex。Asciidoc 翻译(使用酸医生) 转换为 HTML (和 ePub、Docbook、直接 PDF 等),其中 (多个)角色块元素或内联元素被转换成 CSS并相互级联。LaTeX 翻译需要处理分配多个角色(我考虑了 latex 中的环境)不会产生错误,也不应该取消内部环境的影响。但正如下面的 MWE 所示,它并不是那样工作的。

MWE 输出

在此处输入图片描述

平均能量损失

\documentclass{minimal}

\RequirePackage{expl3}
\RequirePackage{xcolor}



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

    \tl_analysis_show:N \l_outerenv_body_tl

    % \tl_set:Nn \l_outerenv_body_tl {\color{red}#1} % kind of change that works naturally on embeded things
    \regex_replace_once:NnN \l_outerenv_pattern_regex { \c{textbf}\cB\{ \1 \cE\} \2 } \l_outerenv_body_tl % but this does not work

    \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}
        This is innerenv (italic).
    \end{innerenv}

    \begin{outerenv}
        This is outerenv (red text or first letter is bold).
    \end{outerenv}


    \begin{outerenv}
        \begin{innerenv}
            The innerenv nested in the outerenv.
        \end{innerenv}
    \end{outerenv}


\end{document}

相关内容