如何将 \shortstack 与 \arraystretch 一起使用以实现相同的行分离?

如何将 \shortstack 与 \arraystretch 一起使用以实现相同的行分离?

当我使用\shortstack在表格单元格中创建新行时,行分隔与 的值定义的不同\arraystretch。以下 MWE 显示了该问题:

\documentclass[a4paper]{article}
\usepackage{siunitx}
\usepackage{booktabs}

\begin{document}

\renewcommand{\arraystretch}{3}
\begin{tabular}{cc} \toprule
Metal & \shortstack{Temperature \\ m.p.(\si{\celsius}) \\ b.p(\si{\celsius}) } \\ \midrule
Mg & \shortstack[c]{650 \\ 1090} \\
Al & \shortstack[c]{660 \\ 2467} \\
\bottomrule
\end{tabular}

\par\bigskip

\renewcommand{\arraystretch}{1}
\begin{tabular}{cc} \toprule
Metal & \shortstack{Temperature \\ m.p.(\si{\celsius}) \\ b.p(\si{\celsius}) } \\ \midrule
Mg & \shortstack[c]{650 \\ 1090} \\
Al & \shortstack[c]{660 \\ 2467} \\
\bottomrule
\end{tabular}

\end{document}

我如何才能使 的行分隔\shortstack与 定义的表相同\arraystretch?或者我如何控制 的行分隔\shortstack

答案1

stackengine包中有一个\Shortstack宏,其中有一个可设置的间隙设置。由于\shortstack间隙为 3pt,因此我在这里将其设置为 9pt \Shortstack

\documentclass[a4paper]{article}
\usepackage{siunitx}
\usepackage{booktabs}
\usepackage[usestackEOL]{stackengine}
\begin{document}
\setstackgap{S}{9pt}
\renewcommand{\arraystretch}{3}
\begin{tabular}{cc} \toprule
Metal & \Shortstack{Temperature \\ m.p.(\si{\celsius}) \\ b.p(\si{\celsius}) } \\ \midrule
Mg & \Shortstack[c]{650 \\ 1090} \\
Al & \Shortstack[c]{660 \\ 2467} \\
\bottomrule
\end{tabular}

\par\bigskip

\renewcommand{\arraystretch}{1}
\begin{tabular}{cc} \toprule
Metal & \shortstack{Temperature \\ m.p.(\si{\celsius}) \\ b.p(\si{\celsius}) } \\ \midrule
Mg & \shortstack[c]{650 \\ 1090} \\
Al & \shortstack[c]{660 \\ 2467} \\
\bottomrule
\end{tabular}

\end{document}

在此处输入图片描述

如果这不是您想要的间距,那么还有一个\addstackgap宏可以在参数上方和下方添加堆叠间隙(在本例中为\Shortstack)。

\documentclass[a4paper]{article}
\usepackage{siunitx}
\usepackage{booktabs}
\usepackage[usestackEOL]{stackengine}
\begin{document}
\setstackgap{S}{9pt}
\renewcommand{\arraystretch}{3}
\begin{tabular}{cc} \toprule
Metal & \addstackgap{\Shortstack{Temperature \\ m.p.(\si{\celsius}) \\ b.p(\si{\celsius}) }} \\ \midrule
Mg & \addstackgap{\Shortstack[c]{650 \\ 1090}} \\
Al & \Shortstack[c]{660 \\ 2467} \\
\bottomrule
\end{tabular}

\par\bigskip

\renewcommand{\arraystretch}{1}
\begin{tabular}{cc} \toprule
Metal & \shortstack{Temperature \\ m.p.(\si{\celsius}) \\ b.p(\si{\celsius}) } \\ \midrule
Mg & \shortstack[c]{650 \\ 1090} \\
Al & \shortstack[c]{660 \\ 2467} \\
\bottomrule
\end{tabular}

\end{document}

在此处输入图片描述

答案2

不要重新定义内核/核心宏,因为您不知道它们在其他地方使用(在内核或其他软件包中)。

重新定义为更相关的内容以满足您的需求似乎相当简单\shortstack,并且未在任何基类中使用(articlebook或者report):

在此处输入图片描述

\documentclass{article}
\usepackage{siunitx,booktabs}% http://ctan.org/pkg/{siunitx,booktabs}

\renewcommand{\shortstack}[2][c]{%
  \begin{tabular}[b]{@{}#1@{}}% [c]enter; [t]op; [b]ottom
    #2
  \end{tabular}%
}
\begin{document}

\renewcommand{\arraystretch}{1.5}
\begin{tabular}{cc}
  \toprule
  Metal & \shortstack{Temperature \\ m.p.(\si{\celsius}) \\ b.p(\si{\celsius}) } \\
  \midrule
  Mg & \shortstack[c]{650 \\ 1090} \\
  Al & \shortstack[c]{660 \\ 2467} \\
  \bottomrule
\end{tabular}

\par\bigskip

\renewcommand{\arraystretch}{1}
\begin{tabular}{cc}
  \toprule
  Metal & \shortstack{Temperature \\ m.p.(\si{\celsius}) \\ b.p(\si{\celsius}) } \\
  \midrule
  Mg & \shortstack[c]{650 \\ 1090} \\
  Al & \shortstack[c]{660 \\ 2467} \\
  \bottomrule
\end{tabular}

\end{document}

答案3

这是我其他答案中不同的方法。如果你想要更改的实际定义\shortstack,可以按照以下方法进行。我有两个新的宏,\shortstackgap{}\restoreshortstack。第一个宏采用数字参数,该参数(作为点值)用于重新定义\shortstack间隙。第二个宏重新定义\shortstack为其默认定义,具有 3pt 堆叠间隙。

\documentclass[a4paper]{article}
\usepackage{siunitx}
\usepackage{booktabs}

\makeatletter
\newcommand\shortstackgap[1]{%
\gdef\@shortstack[##1]{%
  \leavevmode
  \vbox\bgroup
    \baselineskip-\p@\lineskip #1\p@
    \let\mb@l\hss\let\mb@r\hss
    \expandafter\let\csname mb@##1\endcsname\relax
    \let\\\@stackcr
    \@ishortstack}
\gdef\@ishortstack##1{\ialign{\mb@l {####}\unskip\mb@r\cr ##1\crcr}\egroup}
}
\newcommand\restoreshortstack{%
\gdef\@shortstack[##1]{%
  \leavevmode
  \vbox\bgroup
    \baselineskip-\p@\lineskip 3\p@
    \let\mb@l\hss\let\mb@r\hss
    \expandafter\let\csname mb@##1\endcsname\relax
    \let\\\@stackcr
    \@ishortstack}
\gdef\@ishortstack##1{\ialign{\mb@l {####}\unskip\mb@r\cr ##1\crcr}\egroup}
}
\makeatother

\begin{document}

\renewcommand{\arraystretch}{3}
\shortstackgap{9}
\begin{tabular}{cc} \toprule
Metal & \shortstack{Temperature \\ m.p.(\si{\celsius}) \\ b.p(\si{\celsius}) } \\ \midrule
Mg & \shortstack[c]{650 \\ 1090} \\
Al & \shortstack[c]{660 \\ 2467} \\
\bottomrule
\end{tabular}

\par\bigskip

\restoreshortstack
\renewcommand{\arraystretch}{1}
\begin{tabular}{cc} \toprule
Metal & \shortstack{Temperature \\ m.p.(\si{\celsius}) \\ b.p(\si{\celsius}) } \\ \midrule
Mg & \shortstack[c]{650 \\ 1090} \\
Al & \shortstack[c]{660 \\ 2467} \\
\bottomrule
\end{tabular}

\end{document}

在此处输入图片描述

相关内容