据我了解,使用S
中的列的各种选项siunitx
,我可以生成包含数字和非数字条目的列。我可以让数字条目按小数点对齐。我可以让文本条目相对于列宽左对齐、右对齐或居中对齐。
是否可以让数字条目按其小数点对齐,同时控制文本条目相对于小数点标记的对齐?
更复杂的是,是否可以逐行应用不同的对齐方式?特别是,我是否可以将列居中对齐方式保留为列的头部条目,同时将我的特殊基于小数点的对齐方式应用于后面的条目?
以下 MWE 以夸张的数字产生了我想要的结果,但我手动在最后两个条目中强制留出了一些空间来实现这一点。我不想这样做。
\documentclass{article}
\usepackage{siunitx}
\newcommand*\heading[1]{\multicolumn{1}{c}{#1}}
\begin{document}
\begin{tabular}{S[table-format=9.3,table-text-alignment=center]}
\hline
\heading{Title}\\
\hline
1\\
2.000\\
6\\
24.0\\
123456789\\
{\phantom{123\,456\,78}\vdots\phantom{\,000}}\\
{\phantom{123\,456\,7}$f(n)$\phantom{\,00}}
\end{tabular}
\end{document}
请注意,我确实想要一个居中的标题,理想情况下,我实际上希望其余文本条目以0.5\ex
小数点左侧的点为中心。另外,请注意,由于整数部分和小数部分之间存在这种不对称,因此我认为这没什么table-number-alignment=center-decimal-marker
用。
答案1
在此之前我先说两点:
- 这不是唯一的
siunitx
解决方案。遗憾的是,table-text-alignment
没有用decimal-marker
:( - 我提供两个宏:
\widestparts{<digits before …>}{<… and after decimal marker>}
†\tcenter{<text to center at the decimal marker>}
†现在可以使用了,感谢Peter Grill 的问题,Martin Scharrer 的回答和Peter 在聊天中给出的提示。
手动对齐
您可以添加另一个\textcenter
带有三个参数的宏:
- 在你的实际文本之前添加内容,
- 实际文本后面的内容(在下面的例子中,我还删除了小数点标记
.
),以及 - 实际排版的内容。
例如:
\newcommand*{\textcenter}[3]{{%
\hphantom{\num{#1}}%
\makebox[\widthof{.}][c]{#3}\hspace{-\decimalmarkerwidth}%
\hphantom{\num[add-decimal-zero = false,add-integer-zero = false,scientific-notation = fixed]{#2}}%
}}
代码
\documentclass{article}
\usepackage{xcolor} % only for this example (redefinition of hphantom}
\usepackage{mathtools,calc,siunitx,ifthen}
\usepackage[T1]{fontenc}
% getting the width of the decimal marker: . or ,
\newlength{\decimalmarkerwidth}\settowidth{\decimalmarkerwidth}{.} % or ,
% remove the % in the next line to get gray phantoms
%\renewcommand\hphantom[1]{{\color[gray]{.7}#1}}
\newcommand*\heading[1]{\multicolumn{1}{c}{#1}} % not used anymore ... (but can used (without the multicolumn) for other formatting (bf, color, ...)
\makeatletter
\newcounter{alex@auxctr} % (Internal)
% \widestparts takes two arguments: #1 = number of digits before the decimal marker
% #2 = number of digits after the decimal marker
\newcommand*{\widestparts}[2]{%
\alex@widestpartauxloop{\alex@widestpartleft}{#1}{9}%
\alex@widestpartauxloop{\alex@widestpartright}{#2}{0}%
}
% (Internal) \alex@widestpartauxloop loops over #2 and adds #2 times #3 to #1.
\newcommand*{\alex@widestpartauxloop}[3]{%
\def\alex@WidestPartTemp{}\setcounter{alex@auxctr}{0}%
\whiledo{\value{alex@auxctr}<#2}{\g@addto@macro\alex@WidestPartTemp{#3}\stepcounter{alex@auxctr}}%
\xdef#1{\alex@WidestPartTemp}%
}
% \tcenter takes one argument: #1 = actual text that should be typeset
\newcommand*{\tcenter}[1]{{%
\hphantom{\num{\alex@widestpartleft}}%
\makebox[\widthof{.}][c]{#1}\hspace{-\decimalmarkerwidth}%
\hphantom{\num[add-decimal-zero = false,add-integer-zero = false,scientific-notation = fixed]{.\alex@widestpartright}}%
}}
\makeatother
\usepackage{booktabs} % for \top-, \mid- and \bottomrule
\begin{document}
\widestparts{9}{3}
\begin{tabular}{S[table-format=9.3,table-text-alignment=center]}
\toprule
\tcenter{Title} \\ \midrule
1 \\
2.000 \\
6 \\
24.0 \\
123456789 \\
\tcenter{$\smash{\vdotswithin{.}}$} \\ % \smash is used to hide the oversized vertical height of \vdots
\tcenter{$f(n)$} \\ \bottomrule
\end{tabular}
\end{document}
输出