当方程式包含案例/rcase 时,如何将方程式编号对齐到底部?

当方程式包含案例/rcase 时,如何将方程式编号对齐到底部?

当方程式包含 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⁴的框,它代表正常排版基线上方和下方的间距。我们可以使用它的深度来猜测最后一行的深度,并将字距调整为等于该深度的负量。⁵

最终结果是: 环境输出


  1. 一如既往,\NewDocumentEnvironment更喜欢\newenvironment
  2. 再次\bgroup{
  3. 我们不能只看的深度\hbox。记住它的基线将是 CTok 的基线,因此深度将比我们猜测的要大得多。
  4. 从理论上讲,这取决于字体。例如,如果字体的下行部分很长而上行部分很短,则需要不同配置的\strutbox。幸运的是,我不知道有哪种文本字体在采用标准行距的情况下,无法舒适地适应 LaTeX 支柱的边界。
  5. 这并不是万无一失的,尤其是在数学方面。\sum_{i=0}最后一行可能会出现类似情况,这将使深度超出您的预期,并搞乱对齐。处理这种情况留给读者作为练习(提示:为环境提供一个可选参数,让用户覆盖最终的字距量)。

相关内容