![使用 \mathclap 时正确对齐公式](https://linux22.com/image/351544/%E4%BD%BF%E7%94%A8%20%5Cmathclap%20%E6%97%B6%E6%AD%A3%E7%A1%AE%E5%AF%B9%E9%BD%90%E5%85%AC%E5%BC%8F.png)
我有一些公式,其中有大符号,例如\sum
带有\bigvee
索引的符号。由于索引太长,参数会向右移动太远:
\item[]\AL
\begin{flalign*}
%
&\bigvee\limits_{\substack{1\leqslant k\leqslant n\\
1\leqslant i_1<i_1<\ldots<i_{k}\leqslant n}}
\enspace x_{i_1}x_{i_2}\cdots x_{i_{k}}.&\\
\end{flalign*}
我使用以下方法修复它\mathclap
:
\item[]\AL
\begin{flalign*}
%
&\bigvee\limits_{\mathclap{\substack{1\leqslant k\leqslant n\\
1\leqslant i_1<i_1<\ldots<i_{k}\leqslant n}}}
\enspace x_{i_1}x_{i_2}\cdots x_{i_{k}}.&\\
\end{flalign*}
但它向左移动太多了。所以我尝试使用胶带:
\item[]\AL
\newlength{\mylll}%
\settowidth{\mylll}{${}_{1\leqslant i_1<i_1<\ldots<i_{k}\leqslant n}$}%
\begin{flalign*}
%
&\hspace{.5\mylll}\bigvee\limits_{\mathclap{\substack{1\leqslant k\leqslant n\\
1\leqslant i_1<i_1<\ldots<i_{k}\leqslant n}}}
\enspace x_{i_1}x_{i_2}\cdots x_{i_{k}}.&\\
\end{flalign*}
一切看起来都很好,但事实并非如此。您可以看到公式向右移动了一点,比我预期的要多(多余的空格标记为蓝色):
我的问题是,如何在不使用标尺正确调整的情况下正确处理这种对齐\hspace{???}
我的 MWE (LuaLaTex):
\documentclass[10pt,twoside,a4paper]{book}
%\usepackage{showframe}
%\usepackage{layout}
\usepackage{geometry}
\geometry{margin=1in}
%
\usepackage{amsmath}
\usepackage{mathtools}
%
\usepackage{amsthm}
\usepackage{thmtools}
%
\usepackage{newtxmath}
%
\usepackage{lipsum}
%
\usepackage{enumitem}
%%%%%
%Definition of a new list type
\newcounter{qcounter}
\newenvironment{questions}{
\begin{list}{
\bfseries\upshape\arabic{qcounter}.
}{
\renewcommand{\makelabel}[1]{%
\textbf{\refstepcounter{qcounter}\arabic{qcounter}##1.}}%
\usecounter{qcounter}
\setlength{\labelwidth}{0.5em}
\setlength{\labelsep}{0.5em}
\setlength{\leftmargin}{\labelwidth+\labelsep+0.5em}
\setlength{\itemsep}{2pt}
\setlength{\listparindent}{1em}
\setlength{\parsep}{1pt}
\setlength{\topsep}{6pt}
}
}{
\end{list}
}
%Command to correctly align environments in the list
\newcommand{\AL}{%
\setlength{\abovedisplayskip}{0pt}%
\setlength{\belowdisplayskip}{0pt}%
\setlength{\abovedisplayshortskip}{0pt}%
\setlength{\belowdisplayshortskip}{0pt}%
\setlength{\multlinegap}{0pt}%
~\vspace*{-\baselineskip}%
}
\begin{document}
\begin{questions}
%too big space
\item[]\AL
\begin{flalign*}
%
&\bigvee\limits_{\substack{1\leqslant k\leqslant n\\
1\leqslant i_1<i_1<\ldots<i_{k}\leqslant n}}
\enspace x_{i_1}x_{i_2}\cdots x_{i_{k}}.&\\
\end{flalign*}
%too left
\item[]\AL
\begin{flalign*}
%
&\bigvee\limits_{\mathclap{\substack{1\leqslant k\leqslant n\\
1\leqslant i_1<i_1<\ldots<i_{k}\leqslant n}}}
\enspace x_{i_1}x_{i_2}\cdots x_{i_{k}}.&\\
\end{flalign*}
%not very nice looking one
\item[]\AL
\newlength{\mylll}%
\settowidth{\mylll}{${}_{1\leqslant i_1<i_1<\ldots<i_{k}\leqslant n}$}%
\begin{flalign*}
%
&\hspace{.5\mylll}\bigvee\limits_{\mathclap{\substack{1\leqslant k\leqslant n\\
1\leqslant i_1<i_1<\ldots<i_{k}\leqslant n}}}
\enspace x_{i_1}x_{i_2}\cdots x_{i_{k}}.&\\
\end{flalign*}
\item[]\lipsum[2]
\end{questions}
\end{document}
答案1
你不需要同时加载amsmath
和 mathtools
,因为后者会加载前者。此外,还mathtools
提供了不错的命令\smashoperator
,它可以准确地完成您需要的操作:
\item[]\AL
\begin{flalign*}
%
&\smashoperator[r]{\bigvee_{\substack{1\leqslant k\leqslant n\\
1\leqslant i_1<i_1<\ldots<i_{k}\leqslant n}}}
\enspace x_{i_1}x_{i_2}\cdots x_{i_{k}}.&\\
\end{flalign*}
您可以省略显式调用,\limits
因为会\smashoperator
自动使用它。
来自mathtools
文档
[...]
mathtools
提供了一个\smashoperator
命令,它只是忽略了下标和上标的宽度。它还带有一个可选参数,l
,r
或lr
(默认),表示应忽略(粉碎)运算符的哪一侧。
请注意,只要您不需要对齐,flalign
这里就没有必要了。只需使用$\displaymath ... $
。