当方程式包含 case/rcase 时,如何将方程式编号对齐到底部?
\documentclass{article}
\usepackage[french,USenglish]{babel}
\usepackage[mmddyyyy]{datetime}
\usepackage{amsmath,amssymb}
\usepackage{amsmath,mathtools,amsfonts,stackengine}
\begin{document}
\begin{equation}
\mathrm{CTtok_{I_{iv}}} = \begin{cases}
\quad \mathcal{T}_{I_{iv}}\\
\quad \mathrm{C1_I} = \mathrm{e(g, g)}^{\alpha \mathrm{r_i}}\\
\quad \mathrm{C2_I} = \mathrm{g}^{\beta \mathrm{r_i}}\\
\begin{rcases}
\quad \mathrm{C3_{I_y} = g^{q_y(0)}}\\
\quad \mathrm{C4_{I_y} = H(\mathrm{attr(y)})^{q_y(0)}}\\
\end{rcases} {\!\normalsize\mathrm{\forall\ y \in Y_I}}\\
\end{cases}
\end{equation}
\end{document}
答案1
您可以numcases
使用包裹cases
对类似环境中的所有方程进行编号cases
。\nonumber
根据需要抑制编号。我还使用\eqmathbox
=
使案例中的符号保持一致,并手动}
为下面两个方程设置右括号。
\documentclass{article}
\usepackage{mathtools,cases,eqparbox}
% https://tex.stackexchange.com/a/34412/5764
\makeatletter
\NewDocumentCommand{\eqmathbox}{o O{c} m}{%
\IfValueTF{#1}
{\def\eqmathbox@##1##2{\eqmakebox[#1][#2]{$##1##2$}}}
{\def\eqmathbox@##1##2{\eqmakebox{$##1##2$}}}
\mathpalette\eqmathbox@{#3}
}
\makeatother
\begin{document}
\begin{numcases}{\mathrm{CTtok_{I_{iv}}} =}
\eqmathbox[LHS][r]{\mathcal{T}_{I_{iv}}} \nonumber \\
\eqmathbox[LHS][r]{\mathrm{C1_I}} = \mathrm{e(g, g)}^{\alpha \mathrm{r_i}} \nonumber \\
\eqmathbox[LHS][r]{\mathrm{C2_I}} = \mathrm{g}^{\beta \mathrm{r_i}} \nonumber \\
\eqmathbox[LHS][r]{\mathrm{C3_{I_y}}} = g^{q_y(0)} \nonumber \\
\mathrm{C4_{I_y} = H(\mathrm{attr(y)})^{q_y(0)}}
\raisebox{.5\height}[0pt][0pt]{%
$\left.\renewcommand{\arraystretch}{1.2}\begin{array}{c} \mathstrut \\ \mathstrut \end{array}\right\} \forall\ y \in Y_I$%
}
\end{numcases}
\end{document}
答案2
您遇到的情况是,方程编号通常设置在显示数学行的基线处,以使其与 CTok 对齐。
我们需要做的是欺骗 LaTeX,让它认为基线位于等式的底部。为此,我们将数学放在一个框内。问题是,我们需要制作一个框,使其基线与多行表达式最后一行内容的基线对齐。
以下是我想出的办法。
\NewDocumentEnvironment{bnequation}{}
{
\begin{equation}
\vbox\bgroup % ❶
\hbox\bgroup % ❷
$\displaystyle % ❸
}
{
$\egroup % ❹
\kern-\dp\strutbox % ❺
\egroup
\end{equation}
}
我们创建一个新的文档环境¹,命名为 ,以表明它是一个底部编号的方程式。然后在环境中equation
,我们首先打开一个\vbox
。请注意,我们在这里使用\bgroup
❶ 而不是 ,{
以便我们将参数分散到和命令\vbox
之间。我们将在 内堆叠一个框和一个 kern ,以便我们选择框的基线位置。\begin
\end
\vbox
然后我们在 ❷ 里面放一个\hbox
² \vbox
。如果我们只有一个空的\hbox
,它仍然会具有我们试图避免的数学基线。然后我们进入数学模式并确保我们处于\displaystyle
。❸
在\end
定义中,我们关闭了数学和\hbox
❹,然后我们需要放置一个垂直的字距❺,这样我们就可以使的基线成为\vbox
整个事物的底部,而不是的基线\hbox
。我最初在这里使用过\kern0pt
,但是方程式编号的对齐方式不正确,因为它与数学的整体底部对齐,而不是最后一行的底部。幸运的是,我们有一个很好的方法来猜测最后一行的深度³。LaTeX 维护一个名为\strutbox
⁴的框,它代表正常排版基线上方和下方的间距。我们可以使用它的深度来猜测最后一行的深度,并将字距调整为等于该深度的负量。⁵
- 一如既往,
\NewDocumentEnvironment
更喜欢\newenvironment
。 - 再次
\bgroup
为{
。 - 我们不能只看的深度
\hbox
。记住它的基线将是 CTok 的基线,因此深度将比我们猜测的要大得多。 - 从理论上讲,这取决于字体。例如,如果字体的下行部分很长而上行部分很短,则需要不同配置的
\strutbox
。幸运的是,我不知道有哪种文本字体在采用标准行距的情况下,无法舒适地适应 LaTeX 支柱的边界。 - 这并不是万无一失的,尤其是在数学方面。
\sum_{i=0}
最后一行可能会出现类似情况,这将使深度超出您的预期,并搞乱对齐。处理这种情况留给读者作为练习(提示:为环境提供一个可选参数,让用户覆盖最终的字距量)。