对齐环境中的条件换行

对齐环境中的条件换行

我有一个大型文档需要排版成两种不同的页面格式。一些方程式在小格式中太长,所以我想根据宏是否\usesmallformat定义来断开一些方程式:

\documentclass{article}

\usepackage{amsmath}

% Uncomment for small format - doesn't work, however
% \newcommand{\usesmallformat}{1}
% \setlength{\textwidth}{5cm}

\begin{document}

\begin{align}
A
&\leq
\sum_{i = 0}^L \|(I-K^i)(I-F^i)u\|_{V(\Omega)} \nonumber \\
%
&\leq
\sum_{i = 0}^L \left(\|(B - C^i)(I - D^i)u\|_{V(\Omega)}
{\ifdefined\usesmallformat \right. \nonumber\\ \fi}
%
\label{eq:One}
{\ifdefined\usesmallformat &\quad\ \fi}
+
{\ifdefined\usesmallformat \left. \fi}
\|(I - D^i)(I - S^i) u \|_{V(\Omega)} \right).
\end{align}

\end{document}

我希望在小格式中对齐环境的第二行在 - 符号处断开+。只有最后一行应该编号。另外,我想避免重复公式代码。设置align两个版本的环境并用 包围它们\ifdefined会起作用,但会导致代码膨胀,并且将来更难维护。

但是,如果我取消注释文档开头的两行,就会出现Missing } inserted \end{align}一些后续错误。

您知道如何达到预期的效果吗?

附言:我已经阅读了有关 breqn 包的信息,但是我无法使用它,因为它与我必须包含的其他包冲突。

答案1

更好更简单的方法是使用 提供的机制etoolbox,您可以在其中设置一个toggle(或者一个bool)。以下内容使您的示例可以工作,但我不喜欢编码,下面将提供另一种方法:

\documentclass{article}

\usepackage{amsmath,etoolbox}

\newtoggle{smallformat}
\settoggle{smallformat}{false} %set to true or false as required
\iftoggle{smallformat}{\setlength{\textwidth}{5cm}}{}

\begin{document}

\begin{align}
A
&\leq
\sum_{i = 0}^L \|(I-K^i)(I-F^i)u\|_{V(\Omega)} \nonumber \\
%
&\leq
\sum_{i = 0}^L \left(\|(B - C^i)(I - D^i)u\|_{V(\Omega)}
\iftoggle{smallformat}{\right. \nonumber\\}{}
%
\label{eq:One}
\iftoggle{smallformat}{&\quad\ }{}
+
\iftoggle{smallformat}{\left. }{}
\|(I - D^i)(I - S^i) u \|_{V(\Omega)} \right).
\end{align}

\end{document}

代码中的附加内容声明了一个新的切换smallformat,在本例中,它最初被设置为false。然后,你就可以\iftoggle{smallformat}{truecase}{falsecase}在代码中使用 了。

现在我更愿意这样编码:

\documentclass{article}

\usepackage{mathtools,amssymb,etoolbox}

\newtoggle{smallformat}
\settoggle{smallformat}{true}
\iftoggle{smallformat}{\setlength{\textwidth}{5cm}}{}

\newcommand{\eqbreak}[1][2]{\\&\hskip#1em}
\DeclarePairedDelimiter{\norm}{\lVert}{\rVert}

\begin{document}

\begin{equation}
  \label{eq:One}
  \begin{split}
    A &\leqslant
    \sum_{i = 0}^L \norm{(I-K^i)(I-F^i)u}_{V(\Omega)} \\
    &\leqslant
    \sum_{i = 0}^L \bigl(\norm{B - C^i)(I - D^i)u}_{V(\Omega)}
    \iftoggle{smallformat}{\eqbreak}{}
    + \|(I - D^i)(I - S^i) u \|_{V(\Omega)} \bigr).
  \end{split}
\end{equation}

\end{document}

您的显示是一个分布在多行上的单一方程式,因此equation使用内部split更合适,因为您只需要一个方程式编号。

\left...\right应尽可能限制使用。使用\bigl...\bigr及其同类词可以使示例中的编码更加容易。它还可以避免所有高大内容都位于一行的情况,在窄版本中,这会导致括号大小不同。

可选换行符是通过一个新命令实现的\eqbreak,我发现这个命令在显示中非常有用。它需要一个可选参数来说明下一行应缩进多少。默认情况下,它设置为\qquad= 2em,但 eg\eqbreak[4]会给出两倍的缩进量。

我曾经用来mathtools设置一个\norm命令形式\|...\|,这应该能在这些术语周围提供更好的间距,而没有像 LaTeX 这样的\|左分隔符。

最后,我更\leqslant喜欢\leq

缩小输出:

示例窄输出

答案2

您不需要{}在小写字母中插入对齐标记,也不需要在另一个字母中将其放在&中间,所以......\if

\documentclass{article}

\usepackage{amsmath}

 \newcommand{\usesmallformat}{1}
 \setlength{\textwidth}{5cm}
\makeatletter
\newcommand\sformat{%
\relax\ifdefined\usesmallformat\expandafter\@firstofone\else\expandafter\@gobble\fi}
\makeatother
\begin{document}

\begin{align}
A
&\leq
\sum_{i = 0}^L \|(I-K^i)(I-F^i)u\|_{V(\Omega)} \nonumber \\
%
&\leq
\sum_{i = 0}^L \left(\|(B - C^i)(I - D^i)u\|_{V(\Omega)}
\sformat{\right. \nonumber\\}
%
\label{eq:One}
\sformat{&\quad\ }
+
\sformat{\left.}
\|(I - D^i)(I - S^i) u \|_{V(\Omega)} \right).
\end{align}

\end{document}

相关内容