我问过类似的问题前,但我想我必须用另一种方式来描述它。
需要
使用嵌套环境/宏来级联样式的正确方法是什么(很像 CSS 在 HTML 中的工作方式),而每个环境可能会有选择地和部分地(而不是完全地)风格化其嵌入的内容?
问题
假设innerenv
嵌套在中outerenv
。如果innerenv
将文本更改为斜体并outerenv
使其变为红色,因为它们在上应用了不重叠的样式所有的文本,那么它们自然地一起工作(红色斜体)。
但是,如果 theouterenv
想要修改其嵌入文本的一部分(而不是全部)(例如将首字母加粗,或将前三个单词改为小写,……),那么就会出现问题。问题是我无法找到从控制序列中识别扩展文本的方法。例如,myenv
和mytext
之间的区别\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}