数学子数组环境中的参数“r”不起作用

数学子数组环境中的参数“r”不起作用

在学习 LaTeX 时,我发现以下代码的结果

\[
\sum_{\begin{subarray}{c}
    i<n\\ i+j=k
    \end{subarray}} = 
\sum_{\begin{subarray}{l}
    i<n\\ i+j=k
    \end{subarray}} =
\sum_{\begin{subarray}{r}
    i<n\\ i+j=k
    \end{subarray}}
\]

在此处输入图片描述

似乎这个论点‘r’不起作用。原因是什么?

答案1

subarray仅支持c并采取左对齐的其他措施。

% amsmath.sty, line 1031:
\newenvironment{subarray}[1]{%
  \vcenter\bgroup
  \Let@ \restore@math@cr \default@tag
  \baselineskip\fontdimen10 \scriptfont\tw@
  \advance\baselineskip\fontdimen12 \scriptfont\tw@
  \lineskip\thr@@\fontdimen8 \scriptfont\thr@@
  \lineskiplimit\lineskip
  \ialign\bgroup\ifx c#1\hfil\fi
    $\m@th\scriptstyle##$\hfil\crcr
}{%
  \crcr\egroup\egroup
}

这个想法是,\hfil只有当参数为 时,才会在左侧添加c。任何其他值都将被忽略。

我们可以添加使用更好的测试:\hfil在参数上有条件地添加。

\documentclass{article}
\usepackage{amsmath}

\ExplSyntaxOn
\NewDocumentCommand{\subarrayfill}{mm}
 {
  \str_if_in:nnT { #1 } { #2 } { \hfil }
 }
\ExplSyntaxOff

\makeatletter
\renewenvironment{subarray}[1]{%
  \vcenter\bgroup
  \Let@ \restore@math@cr \default@tag
  \baselineskip\fontdimen10 \scriptfont\tw@
  \advance\baselineskip\fontdimen12 \scriptfont\tw@
  \lineskip\thr@@\fontdimen8 \scriptfont\thr@@
  \lineskiplimit\lineskip
  \ialign\bgroup
    \subarrayfill{cr}{#1}% add \hfil if center or right alignment
    $\m@th\scriptstyle##$%
    \subarrayfill{cl}{#1}% add \hfil if center or left alignment
    \crcr
}{%
  \crcr\egroup\egroup
}
\makeatother

\begin{document}

\[
\sum_{\begin{subarray}{c}
    i<n\\ i+j=k
    \end{subarray}} = 
\sum_{\begin{subarray}{l}
    i<n\\ i+j=k
    \end{subarray}} =
\sum_{\begin{subarray}{r}
    i<n\\ i+j=k
    \end{subarray}}
\]

\end{document}

在此处输入图片描述

还可以添加检查,以确认参数是其中之一rcl

扩展我们的想法,我们可以\substack用一个可选参数(默认c)来丰富

\RenewDocumentCommand{\substack}{O{c}m}{%
  \begin{subarray}{#1}#2\end{subarray}%
}

我们可以将上面的显示输入为

\[
\sum_{\substack{i<n\\ i+j=k}}
=
\sum_{\substack[l]{i<n\\ i+j=k}}
=
\sum_{\substack[r]{i<n\\ i+j=k}}
\]

然而,由于这会改变语法,因此\substack可能不是一个好的选择。

相关内容