我有一个大型文档需要排版成两种不同的页面格式。一些方程式在小格式中太长,所以我想根据宏是否\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}