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