Я набираю доказательство по индукции, используя split
для выравнивания знаков равенства точно друг под другом. Один из знаков должен иметь «IH» сверху, чтобы указать, что гипотеза индукции была использована на этом этапе. Я использую stackrel
для этого. Однако, поскольку \stackrel{IH}{=}
шире, чем =
, он не выравнивается должным образом. Я попробовал два варианта с split
( &
до или после =
знака) и также с alignedat
(но это сработает только в том случае, если центральный столбец будет выровнен по центру, чего не происходит, он выровнен по левому краю. Смотрите пример кода и его вывод:
\documentclass{minimal}
\usepackage{amsmath}
\begin{document}
\begin{equation*}
\begin{split}
S_n &= 2^iS_{n-i}+2^i-1\\
&\stackrel{IH}{=} 2^i(2^1S_{n-i-1}+2^1-1)+2^i-1\\
&= 2^{i+1}S_{n-i-1}+2^{i+1}-1
\end{split}
\end{equation*}
\begin{equation*}
\begin{split}
S_n =& 2^iS_{n-i}+2^i-1\\
\stackrel{IH}{=}& 2^i(2^1S_{n-i-1}+2^1-1)+2^i-1\\
=& 2^{i+1}S_{n-i-1}+2^{i+1}-1
\end{split}
\end{equation*}
\begin{equation*}
\begin{alignedat}{2}
S_n &=&& 2^iS_{n-i}+2^i-1\\
&\stackrel{IH}{=}&& 2^i(2^1S_{n-i-1}+2^1-1)+2^i-1\\
&=&& 2^{i+1}S_{n-i-1}+2^{i+1}-1
\end{alignedat}
\end{equation*}
\end{document}
Как вы можете видеть, знаки равенства и знаки равенства с «IH» над ними нигде не находятся точно друг под другом.
Я ненуждатьсяиспользовать split
, поэтому решения без него split
тоже были бы идеальными. Как мне заставить это работать?
решение1
Вы можете использовать \mathmakebox
или \mathclap
(спасибо Эндрю) изmathtools
\documentclass{article}
\usepackage{mathtools}
\begin{document}
\begin{equation*}
\begin{split}
S_n &= 2^iS_{n-i}+2^i-1\\
&\stackrel{\mathmakebox[\widthof{=}]{\mathrm{IH}}}{=} 2^i(2^1S_{n-i-1}+2^1-1)+2^i-1\\
&= 2^{i+1}S_{n-i-1}+2^{i+1}-1
\end{split}
\end{equation*}
\end{document}
Вы align*
также можете использовать вместо equation*
иsplit
\documentclass{article}
\usepackage{mathtools}
\begin{document}
\begin{align*}
S_n &= 2^iS_{n-i}+2^i-1\\
&\stackrel{\mathclap{\mathrm{IH}}}{=} 2^i(2^1S_{n-i-1}+2^1-1)+2^i-1\\
&= 2^{i+1}S_{n-i-1}+2^{i+1}-1
\end{align*}
\end{document}
Обратите внимание, что я изменил IH
на \mathrm{IH}
. (Спасибо egreg).
решение2
На самом деле, решения выше не являются оптимальными, поскольку приведенный пример является очень частным случаем: IH
имеет почти такую же ширину, как =
, поэтому с правой стороны нет проблем. Но подумайте, что произойдет, когда нам понадобится что-то значительно большее, чем IH
, как в
\begin{align*}
S_n &= 2^iS_{n-1}+2^i-1\\
&\stackrel{\mathrm{IH,IG,IK,IL}}{=}2^i(2^1S_{n-i-1}+2^1-1)+2^i-1\\
&= 2^{i+1}S_{n-i-1}+2^{i+1}-1
\end{align*}
Тогда правая часть IH,IG,IK,IL
будет накладываться на формулу!
Мое решение — определить \leftstackrel
, который идеально выравнивает по левому краю, но добавляет необходимое пустое пространство справа, чтобы не было перекрытия. Вот код:
\newlength{\leftstackrelawd}
\newlength{\leftstackrelbwd}
\def\leftstackrel#1#2{\settowidth{\leftstackrelawd}%
{${{}^{#1}}$}\settowidth{\leftstackrelbwd}{$#2$}%
\addtolength{\leftstackrelawd}{-\leftstackrelbwd}%
\leavevmode\ifthenelse{\lengthtest{\leftstackrelawd>0pt}}%
{\kern-.5\leftstackrelawd}{}\mathrel{\mathop{#2}\limits^{#1}}}
и его можно использовать просто как:
\begin{align*}
S_n &= 2^iS_{n-1}+2^i-1\\
&\leftstackrel{\mathrm{IH,IG,IK,IL}}{=}2^i(2^1S_{n-i-1}+2^1-1)+2^i-1\\
&= 2^{i+1}S_{n-i-1}+2^{i+1}-1
\end{align*}
Сравните (1.1) (устаревшее \stackrel
), (1.2) ( \stackrel
предложенное выше) и (1.3) ( \leftstackrel
) на рисунке ниже.
(источник:fluxus-virus.com)
решение3
Я предлагаю три стратегии. Первая — определить команду \iheq
, которая печатает знак равенства с некоторым отступом, чтобы он стал такой же ширины, как \overset{\mathrm{IH}}{=}
, что можно просто получить с помощью \iheq*
.
Вторая стратегия — добавить сбоку «(IH)».
\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}
\NewDocumentCommand{\iheq}{s}{%
\overset{\IfBooleanTF{#1}{\mathrm{IH}}{\hphantom{\mathrm{IH}}}}{=}%
}
\begin{document}
\begin{equation*}
\begin{split}
S_n &\iheq 2^iS_{n-i}+2^i-1\\
&\iheq* 2^i(2^1S_{n-i-1}+2^1-1)+2^i-1\\
&\iheq 2^{i+1}S_{n-i-1}+2^{i+1}-1
\end{split}
\end{equation*}
\begin{equation*}
\begin{aligned}
S_n &= 2^iS_{n-i}+2^i-1\\
&= 2^i(2^1S_{n-i-1}+2^1-1)+2^i-1 && \makebox[0pt][l]{(IH)}\\
&= 2^{i+1}S_{n-i-1}+2^{i+1}-1
\end{aligned}
\end{equation*}
\end{document}
Третья стратегия: уменьшите IH и обеспечьте его нулевую ширину.
\documentclass{article}
\usepackage{amsmath}
\usepackage{xparse}
\NewDocumentCommand{\iheq}{s}{%
\IfBooleanTF{#1}{\overset{\IH}{=}}{=}%
}
\NewDocumentCommand{\IH}{}{%
\hidewidth\scriptscriptstyle\mathrm{IH}\hidewidth
}
\begin{document}
\begin{equation*}
\begin{split}
S_n &\iheq 2^iS_{n-i}+2^i-1\\
&\iheq* 2^i(2^1S_{n-i-1}+2^1-1)+2^i-1\\
&\iheq 2^{i+1}S_{n-i-1}+2^{i+1}-1
\end{split}
\end{equation*}
\end{document}
решение4
Поскольку эта проблема каждый раз меня раздражает, позвольте мне вставить свои пять копеек.
Решение, которое, возможно, не такое уж элегантное, но которое мне нравится по результату, состоит в том, чтобы использовать команду, \phantom
которая сделает все остальные =
знаки такими же большими и высокими, как указанный, как показано ниже.
\begin{align*}
S_n & \stackrel{\phantom{\mathrm{IH}}}{=} 2^iS_{n-i}+2^i-1 \\
& \stackrel{\mathrm{IH}}{=} 2^i(2^1S_{n-i-1}+2^1-1)+2^i-1\\
& \stackrel{\phantom{\mathrm{IH}}}{=} 2^{i+1}S_{n-i-1}+2^{i+1}-1
\end{align*}
Это результат
и это также подходит для длинных этикеток, при условии, что вы цените большое пространство вокруг =
знака.
Обратите внимание, что, кроме того, ее можно объединить с \mathmakebox
командой from mathtools
для работы с несколькими метками разной длины, как в следующем патологическом примере:
\begin{align*}
S_n & \stackrel{\phantom{\mathrm{IH,(3.14)}}}{=}
2^iS_{n-i}+2^i-1 \\
& \stackrel{\mathrm{IH}}{\mathmakebox[\widthof{$\stackrel{\mathrm{IH,(3.14)}}{=}$}]{=}}
2^i(2^1S_{n-i-1}+2^1-1)+2^i-1\\
& \stackrel{\mathrm{IH,(3.14)}}{=}
2^{i+1}S_{n-i-1}+2^{i+1}-1
\end{align*}