如何在数学模式中用 \\& 替换 \\?

如何在数学模式中用 \\& 替换 \\?

我遇到了以下问题:我必须撰写一篇数学论文/书籍,其中制定许多不同的优化问题。

为了保持一致性,我想创建一个环境来排版这些 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]说明符。

这种设置的结果是,与最小化问题相关的条件将被分配一个方程编号,而不是每个条件一个编号。这可能符合您的喜好,也可能不符合您的喜好。

相关内容