我的证明通常是这样的:
\documentclass{article}
\usepackage{mathtools}
\begin{document}
\begin{align}
&\text{First Statement}\\
&\implies \text{Second Statement}\\
&\stackrel{\text{Explanation}}{\implies}\text{Third Statement}\\
&\stackrel{\mathclap{\text{Explanation}}}{\implies} \text{Fourth Statement}
\end{align}
\end{document}
问题是对齐考虑了整个 stackrel,而我希望它与蕴涵箭头对齐。我试过了,\stackrel{Explanation}{&\implies}
但会抛出一个错误。如果解释不太长并且不触及蕴涵箭头后的语句,则 \mathclap 有效。
您对如何解决这个问题有什么建议吗?
答案1
该\stackrel
命令定义为
#1#2 → \mathrel{\mathop{#2}\limits^{#1}}
因此你可以\smashoperator
使用mathtools
包以消除上标左半部分引入的空格。我\smashstackrel
在下面定义了一个\stackrel
包含的版本\smashoperator
。我认为\smashstackrel[l]
它正是您想要的。我还定义了\feliximplies{<text>}
让生活更简单。
\documentclass{article}
\usepackage{mathtools}
\newcommand*\smashstackrel[3][lr]{%
\mathrel{\smashoperator[#1]{\mathop{#3}^{#2}}}
}
\newcommand*\feliximplies[1]{\smashstackrel[l]{\textnormal{#1}}{\implies}}
\begin{document}
\begin{align}
&\text{First Statement}\\
&\implies \text{Second Statement}\\
&\smashstackrel[l]{\text{Explanation}}{\implies}\text{Third Statement}\\
&\feliximplies{Explanation} \text{Fourth Statement}
\end{align}
\end{document}
笔记:
的可选参数
\smashstackrel
可以是[l]
,[r]
或者,[lr]
取决于您是否要为了间距目的而忽略上标的左侧、右侧或两侧。\implies
定义为\DOTSB\;\Longrightarrow\;
并产生一个可以拉伸的空间(默认情况下不会收缩)。如果使用(或)\;
,则此空间将不再可拉伸,因此这样做感觉有点可疑。我认为\stackrel
\smashstackrel
\;\mkern-\thickmuskip\stackrel{<text>}{\implies}\;\mkern-\thickmuskip
可能比 更合适
\stackrel{<text>}{implies}
。这正好重新插入了丢失的可拉伸量。(同样的注释适用于\smashstackrel
和\noLstackrel
,它们定义如下。)但在这种情况下这并不重要,因为这里的空间无论如何都不会被拉伸。如果此命令在内联而不是在显示环境中使用,则会出现问题。
简要说明:
\;
定义为\mskip\thickmuskip
并插入长度为的水平空间\thickmuskip
,默认情况下为,但必要时5mu
可以拉伸至。类似于,但不允许拉伸。因此,在这种情况下删除水平空间,以便我们最终得到一个可以拉伸至的水平空间。参见10mu
\mkern
\mskip
\mkern-\thickmuskip
5mu
0mu
5mu
这个答案有关间距命令的更多信息。\smashstackrel
相比之下的一个可能的缺点\stackrel
是它总是以 排版\displaystyle
。我在下面提供了一个\smashstackrel[l]
不这样做的版本,因为在我突然想起 的存在之前我已经写过了\smashoperator
。\makeatletter %% <- make @ usable in command names \newcommand*\noLstackrel[2]{\mathpalette\noLstackrel@{{#1}{#2}}} \newcommand*\noLstackrel@[2]{\noLstackrel@@{#1}#2} \newcommand*\noLstackrel@@[3]{% #1 = \displaystyle etc., #2 = top, #3 = bottom \begingroup %% <- limit scope of boxes \sbox0{$\m@th#1\stackrel{#2}{#3}$}% %% <- put stackrel construction in box 0 \sbox2{$\m@th#1#3$}% %% <- put base symbol in box 2 \hskip.5\wd2 \hskip-.5\wd0 %% <- remove excess width on the left \mathrel{\usebox0}% %% <- print box 0 \endgroup } \makeatother %% <- revert @
用法:
\noLstackrel{<stuff on top>}{\implies}
。
答案2
在了解了 Circumscribes 的答案后,阅读了 mathtools 上的文档\smashoperators
,我发现了另一种可能的解决方案:\xRightarrow
\documentclass{article}
\usepackage{mathtools}
\begin{document}
\begin{align}
&\text{Statement}\\
&\implies \text{implies arrow}\\
&\xRightarrow{\text{Explanation}}\text{xRightarrow}\\
&\xRightarrow{(*)} \text{xRightarrow}\\
&\;\xRightarrow{(*)}\; \text{xRightarrow with ;}\\
&\implies \text{implies arrow}\\
&\;\xRightarrow{}\; \text{xRightarrow with ;}\\
&\;\Rightarrow\; \text{Rightarrow with ;}
\end{align}
\end{document}
导致:
此解决方案的优点是,它利用了来自已知包的命令,这可能比自制解决方案的错误更少。而且它还允许使用下标。缺点从图中可以看出。\implies
在箭头前插入一个空格,但这样xRightarrow
做不行。(编辑:这可以在\;
侧面修复,正如 Circumscribes 指出的那样,但仍然值得注意的是 xRightarrow 基于 Rightarrow,您可以从没有输入时的默认长度中看到)
因此,\implies
您可能不得不使用\Rightarrow
而不是 。其次,我不确定我是否在视觉上更喜欢不同长度的箭头,而不是超出通常\implies
箭头宽度的解释。