我遇到了以下问题:我必须撰写一篇数学论文/书籍,其中制定许多不同的优化问题。
为了保持一致性,我想创建一个环境来排版这些 opt 问题。我将为您提供一个最小的运行示例:
\documentclass[a4paper,10pt]{scrartcl}
\usepackage{amsmath,amsfonts,amssymb}
\usepackage{environ}
\begin{document}
\NewEnviron{OptEnv}[1]{%
\begin{align}
\text{min. } & #1 \\
\text{s.t. } & \BODY
\end{align}
}
\begin{OptEnv}{a}
a \leq 1 \\
& b \leq a \\
& 3 \leq b
\end{OptEnv}
\end{document}
我现在的问题是:有没有一种简单的方法可以省略&
环境中的并在每个环境的定义中附加\\
?
谢谢
答案1
使用 expl3 的更好方法
如果你确定每一个 \\
在需要替换的环境中,可以使用正则表达式替换来完成:
\documentclass[a4paper,10pt]{scrartcl}
\usepackage{amsmath,amssymb}
\ExplSyntaxOn
\NewDocumentEnvironment{OptEnv}{mb}
{
\tl_set:Nn \l_tmpa_tl { #2 }
\regex_replace_all:nnN { \c{\\} } { \c{\\} \cT& } \l_tmpa_tl
\begin{align}
\text{min.~} & #1 \\
\text{s.t.~} & \tl_use:N \l_tmpa_tl
\end{align}
}
\ExplSyntaxOff
\begin{document}
\begin{OptEnv}{a}
a \leq 1 \\
b \leq a \\
3 \leq b
\end{OptEnv}
\end{document}
旧答案
如果你确定每一个 \\
在需要更换环境中,您可以这样做xstring
:
\documentclass[a4paper,10pt]{scrartcl}
\usepackage{amsmath,amssymb}
\usepackage{environ,xstring}
\NewEnviron{OptEnv}[1]{%
\noexpandarg % don't expand arguments
% with \expandafter get the expansion of \BODY
\expandafter\StrSubstitute\expandafter{\BODY}{\\}{\\&}[\BODY]
\begin{align}
\text{min. } & #1 \\
\text{s.t. } & \BODY
\end{align}
}
\begin{document}
\begin{OptEnv}{a}
a \leq 1 \\
b \leq a \\
3 \leq b
\end{OptEnv}
\end{document}
答案2
稍微修改一下amsmath
就可以避免加载其他软件包:
\documentclass[a4paper,10pt]{scrartcl}
\usepackage{amsmath,amsfonts,amssymb}
\usepackage{environ}
\makeatletter
\NewEnviron{OptEnv}[1]{%
\def\Let@{\def\\{\math@cr &}}%
\begin{align}
\text{min. } & #1 \math@cr
\text{s.t. } & \BODY
\end{align}
}
\makeatother
\begin{document}\thispagestyle{empty}
\begin{OptEnv}{a}
a \leq 1 \\
b \leq a \\
3 \leq b
\end{OptEnv}
\end{document}
答案3
如果您将其置于\BODY
顶部对齐、左对齐的array
环境中,则无需再提供&
对齐指示符:
\documentclass[a4paper]{scrartcl}
\usepackage{amsmath,amsfonts,amssymb,environ}
\setlength\textwidth{3in} % just for this example
\NewEnviron{OptEnv}[1]{%
\begin{align}
\min\ & #1 \\
\text{s.t.\ } & \begin{array}[t]{@{}l} \BODY \end{array}
\end{align}
}
\begin{document}
\begin{OptEnv}{a}
a \leq 1 \\
b \leq a \\
3 \leq b
\end{OptEnv}
\end{document}
如果您希望条件垂直居中,则只需省略[t]
说明符。
这种设置的结果是,与最小化问题相关的条件将被分配一个方程编号,而不是每个条件一个编号。这可能符合您的喜好,也可能不符合您的喜好。