使用 `filecontentsdef` 和 `expl3` 时,避免在输出中使用文字 `\geq`、`\\` 和 `\empty`

使用 `filecontentsdef` 和 `expl3` 时,避免在输出中使用文字 `\geq`、`\\` 和 `\empty`

基于这个答案,我试图定义一个newcases环境,它会自动将“ if”扩展为“ ”,并将“ ”, \quad & \text{if }扩展为“ ”。我的代码和输出如下所示。正如您在输出中看到的那样,结果是不正确的,其中、 和被逐字呈现并插入到代码中的每个换行符中。otherwise, \quad & \text{otherwise}\geq\\\emptyfl

\documentclass{article}
\usepackage{filecontentsdef}
\usepackage{amsmath}

\ExplSyntaxOn
\cs_generate_variant:Nn \tl_replace_all:Nnn {Nx}
\NewDocumentEnvironment {newcases} {} {
    % Use filecontentsdef to store everything until "\endfilecontentsdefmacro" 
    % into a macro named "\l__envcontents_tmp_tl".
    \filecontentsdefmacro \l__envcontents_tmp_tl
} {
    \endfilecontentsdefmacro
    \str_set:NV \l__envcontents_tmp_tl \l__envcontents_tmp_tl

    \tl_replace_all:Nxn \l__envcontents_tmp_tl
      { \c_space_tl\tl_to_str:n{if} \c_space_tl} % Search
      {, \quad & \text{if~}}                     % Replace
    \tl_replace_all:Nxn \l__envcontents_tmp_tl 
      {\tl_to_str:n{otherwise}}       % Search
      {, \quad \text{otherwise}}      % Replace

    % Output the result.
    \left\{\begin{array}{ll}
    \l__envcontents_tmp_tl
  \end{array}\right.
}
\ExplSyntaxOff

\begin{document}

Desired output:
\begin{equation}
  \begin{cases}
    a, \quad & \text{if } a \geq 0, \\ 
    -a, \quad & \text{otherwise}.
  \end{cases}
\end{equation}

Actual output, using newcases environment:
\begin{equation}
  \begin{newcases}
    a if a \geq 0 \\ 
    -a otherwise.
  \end{newcases}
\end{equation}

\end{document}

在此处输入图片描述

答案1

无需额外软件包的解决方案

使用正则表达式搜索和替换。

我不会使用它newcases作为环境的名称,因为它mathtools有一个\newcases命令。

\documentclass{article}
\usepackage{amsmath}

\ExplSyntaxOn

\tl_new:N \l__wintz_cases_tl

\NewDocumentEnvironment {autocases} {b}
  {
    \tl_set:Nn \l__wintz_cases_tl { #1 }
    % Search any control sequences immediately followed by "if".
    % If there is, insert a space between so the subsequent regex works. 
    \regex_replace_all:nnN { (\c{.*}) if } { \1\ if } \l__wintz_cases_tl
    % Search and replace "<space>if<space>" with ", \quad & \text{if }"
    \regex_replace_all:nnN { \s+if\s+ } { , \c{quad} \& \c{text}\{if\ \} } \l__wintz_cases_tl
    % Search and replace "otherwise" with ", \quad & \text{otherwise}"
    \regex_replace_all:nnN { otherwise } { , \c{quad} \& \c{text}\{otherwise\} } \l__wintz_cases_tl
    % Output the result.
    \begin{cases}
    \tl_use:N \l__wintz_cases_tl
    \end{cases}
  }{}
\ExplSyntaxOff

\begin{document}

Desired output:
\begin{equation}
  \begin{cases}
    a, \quad & \text{if } a \geq 0, \\ 
    -a, \quad & \text{otherwise}.
  \end{cases}
\end{equation}

Actual output, using autocases environment:
\begin{equation}
  \begin{autocases}
    a if a \geq 0 \\ 
    -a otherwise.
  \end{autocases}
\end{equation}

Actual output, using autocases environment:
\begin{equation}
  \begin{autocases}
    \infty if a \geq 0 \\ 
    \oplus if a < -1 \\
    0 otherwise.
  \end{autocases}
\end{equation}

\end{document}

在此处输入图片描述

(与filecontentsdef原始问题一样)

警告。你还应该知道autocases(或你喜欢的任何名称)不能可用于amsmath对齐显示。对于可用于amsmath对齐显示的环境,请使用上面描述的方法。

您想重新扫描获得的字符串。

不要将字符串与标记列表混用:它们是不同的数据类型。您还忘记了 并且&想要使用cases,而不是array

\documentclass{article}
\usepackage{filecontentsdef}
\usepackage{amsmath}

\ExplSyntaxOn

\str_new:N \l__envcontents_tmp_str
\cs_generate_variant:Nn \str_replace_all:Nnn {Nx}

\NewDocumentEnvironment {autocases} {} {
    % Use filecontentsdef to store everything until "\endfilecontentsdefmacro" 
    % into a string named "\l__envcontents_tmp_str".
    \filecontentsdefmacro \l__envcontents_tmp_str
} {
    \endfilecontentsdefmacro

    \str_replace_all:Nxn \l__envcontents_tmp_str
      { \c_space_tl\tl_to_str:n{if} \c_space_tl} % search
      {, \quad & \text{if~}} % replace
    \str_replace_all:Nxn \l__envcontents_tmp_str
      {\tl_to_str:n{otherwise}} % search
      {, \quad & \text{otherwise}} % replace

    % Output the result.
    \begin{cases}
    \tl_rescan:nV {} \l__envcontents_tmp_str
    \end{cases}
}
\ExplSyntaxOff

\begin{document}

Desired output:
\begin{equation}
  \begin{cases}
    a, \quad & \textup{if } a \geq 0, \\ 
    -a, \quad & \textup{otherwise}.
  \end{cases}
\end{equation}

Actual output, using autocases environment:
\begin{equation}
  \begin{autocases}
    a if a \geq 0 \\ 
    -a otherwise.
  \end{autocases}
\end{equation}

\end{document}

相关内容