考虑具有以下序言的文件:
\documentclass[12pt]{article}
\usepackage{amsmath}
问题#1。
为什么使用下面的代码会导致对齐不佳?
\noindent
$-3x$\\[-\baselineskip]%
$\begin{aligned}\!
\phantom{-3x} (x+1) & = 4 \\ & = 2^2
\end{aligned}$
我无法确定要使用多少负空间才能实现内联数学与aligned
环境之间的对齐,使用\baselineskip
和的任何合理组合\jot
都是如此。(由于某些对我来说不透明的原因,该维度\dimexpr-\baselineskip+0.5\jot
几乎可以工作,但仍然无法完成工作。)
问题2。
在这种情况下,与字体大小无关,实现正确对齐的正确间距是多少ETC。?
背景
我正在思考如何提出一个强有力的解决方案关于方程式对齐的这个问题,并得出结论,我不明白 LaTeX 在处理 时对垂直间距做了什么aligned
。我想描述如何撤消一行垂直空间,但当下一行的内容是多行方程时,这似乎并不简单。
正常运行的测试用例
以下是我进行的小测试,试图评估间距问题。后两种情况只会使上述示例中的失败更加令人困惑。
取消文本模式下两行的垂直间距:简单。下面的代码大致说明了我想要实现的效果:
\noindent Testing \phantom{testing} 1 \phantom{2} 3 \\[-\baselineskip]% \phantom{Testing} testing \phantom{1} 2 \phantom{3}
它显示为一行文本,内容为“测试测试 1 2 3”,并具有适当的对齐和间距,正如它应该的那样。
取消涉及数学和
aligned
环境的垂直间距:没有什么固有地间距的变化。\noindent $-3x$ \\[-\baselineskip]% $\begin{aligned}\! \phantom{-3x} (x+1) \end{aligned}$
输出结果类似为 -3X(X+1)具有适当的对齐和间距。
没有额外垂直间距的多行方程:如果我们做出
aligned
环境变成一个多行方程——但删除方程两行之间的垂直间距——那么垂直对齐仍然功能正常。\noindent $-3x$ \\[-\baselineskip]% $\begin{aligned}\! \phantom{-3x} (x+1) & + 4 \\[-\baselineskip] & + 4 \end{aligned}$
我必须承认,我不明白为什么我不必让单位参与进来
\jot
进来就能正常工作,但我们再次获得了正确的垂直对齐,看起来像 −3X(X+1)+4。
我希望找到一种显而易见且可移植的方法来实现这一点,而不管其他事情如何。当然,如果我使用align
而不是aligned
,我可能还必须涉及\abovedisplayskip
,我对此很满意;但如果在那之外的空间中存在“陷阱”,我会再次感到有点恼火。但无论如何,我认为第一步是了解它应该如何与存在于数学模式中的环境一起工作,例如aligned
。
答案1
如果你添加\showoutput
,你会看到
...\hbox(10.14995+4.35004)x390.0, glue set 368.11467fil []
...\glue -13.5
...\penalty 300
...\glue(\lineskip) 1.0
...\hbox(19.0+12.99998)x390.0, glue set 305.5215fil []
这告诉您额外的垂直空间是\lineskip
粘连。正如 Andrew Swan 的回答所建议的那样,您可以隐藏高度,这将阻止使用行间粘连,但这有过度打印的危险。另一种方法是使用\strut
-s 来确保基线间距,然后补偿行间粘连以及基线跳过:
\documentclass[12pt]{article}
\usepackage{amsmath}
\begin{document}
Question \#1.
\showoutput
\showboxdepth3
Why do we get bad alignment with the following code?
\noindent
$-3x$\strut\\[\dimexpr-\baselineskip-\lineskip\relax]%
\strut$\begin{aligned}\!
\phantom{-3x} (x+1) & = 4 \\ & = 2^2
\end{aligned}$
\end{document}
答案2
重写答案
aligned
不带可选参数的基本定义是将其材料放在一个\vcenter
框中。\vcenter
将其内容相对于公式的轴垂直居中放置,这高于基线。如果您不开始新行,那么您将看到材料以这种方式垂直居中。
当您开始新行时,LaTeX 会首先为基线添加垂直跳跃,然后查看下一行是否与上一行不重叠。如果下一行的顶部在上一行\lineskiplimit
的底部之内,\baselineskip
则会被忽略并\lineskip
添加到行之间,即第一行的底部和第二行的顶部之间。
在您的案例中,aligned
下一行上的环境(有 2 行或更多行)足够高,因此这会产生影响,因此间距在\lineskip
环境顶部之前,在环境中,材料是这样的,第一行的基线低于\baselineskip
顶部。因此备份\baselineskip
是不够的,正如 David Carlisle 解释的那样。在您的测试案例 2 和 3 中,对齐的材料不超过一行高,因此\lineskip
不会启动。
需要注意的一点是aligned
插入支柱以使线条高度均匀。这样做的结果是,具有正常高度/深度的单条线aligned
最终会与基线对齐。
如果您给出aligned
选项[t]
,则它会切换到\vtop
而不是\vcenter
。这会将对齐的基线设置为对齐中第一行的基线,更适合您的目的。
下面的示例演示了这一点,并将\vtop
和\vcenter
进行了比较aligned
:
\documentclass{article}
\usepackage{amsmath}
\setlength{\parindent}{0pt}
\setlength{\parskip}{10pt}
\begin{document}
\verb+aligned+: no newlines
$3x$%
$\vcenter{\hbox{$a$}}$%
$3x$%
$\vcenter{\hbox{$\strut a$}}$%
$3x$%
$\begin{aligned}a\end{aligned}$%
$3x$%
$\begin{aligned}u\\v\\w\end{aligned}$
\verb+aligned+: with newlines
$3x$\\[-\baselineskip]%
\hspace*{1.1em}$\vcenter{\hbox{$a$}}$\\[-\baselineskip]%
\hspace*{1.7em}$3x$\\[-\baselineskip]%
\hspace*{2.8em}$\vcenter{\hbox{$\strut a$}}$\\[-\baselineskip]%
\hspace*{3.4em}$3x$\\[-\baselineskip]%
\hspace*{4.5em}$\begin{aligned}a\end{aligned}$\\[-\baselineskip]%
\hspace*{5.5em}$3x$\\[-\baselineskip]\\[-\baselineskip]%
\hspace*{6.6em}$\begin{aligned}u\\v\\w\end{aligned}$
\verb+aligned[t]+: no newlines
$3x$%
$\vtop{\hbox{$a$}}$%
$3x$%
$\begin{aligned}[t]u\\v\\w\end{aligned}$
\verb+aligned[t]+: with newlines
$3x$\\[-\baselineskip]%
\hspace*{1.1em}$\vtop{\hbox{$a$}}$\\[-\baselineskip]%
\hspace*{1.7em}$3x$\\[-\baselineskip]%
\hspace*{2.8em}$\begin{aligned}[t]u\\v\\w\end{aligned}$
\end{document}
[t]
但是,如果对齐的第一行上有高材料,则即使使用选项:基线现在向下移动该行的高度加上\lineskip
(加上前一行的深度),换行也会更难控制。在某些情况下,您可以\smash
在第一行的任何高垂直材料上使用aligned
。以下示例具有由引入的夸张的高材料\vrule
。
\documentclass[12pt]{article}
\usepackage{amsmath}
\begin{document}
\noindent
$-3x$\\[-\baselineskip]
$\begin{aligned}[t]
\phantom{-3x} \smash{\vrule height 30pt (x+1)} & = 4 \\ & = 2^2
\end{aligned}$
\noindent
in contrast to:
\noindent
$-3x$\\[-\baselineskip]
$\begin{aligned}
\phantom{-3x} \vrule height 30pt (x+1) & = 4 \\ & = 2^2
\end{aligned}$
\noindent
$-3x$\\[-\baselineskip]
$\begin{aligned}[t]
\phantom{-3x} \vrule height 30pt (x+1) & = 4 \\ & = 2^2
\end{aligned}$
\end{document}
一般来说,您需要\vphantom
在前进的材料中引入一个,以便为高材料提供垂直空间。
但是,你为什么要开辟一条新路线对我来说是一个谜:
\documentclass[12pt]{article}
\usepackage{amsmath}
\begin{document}
\noindent
$-3x$%
$\begin{aligned}[t]\!
\vrule height 30pt (x+1) & = 4 \\ & = 2^2
\end{aligned}$
\end{document}