以尊重数字条目的小数点标记的方式对齐 S 列中的文本

以尊重数字条目的小数点标记的方式对齐 S 列中的文本

据我了解,使用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

在此之前我先说两点:

  1. 这不是唯一的siunitx解决方案。遗憾的是,table-text-alignment没有用decimal-marker:(
  2. 我提供两个宏:
    1. \widestparts{<digits before …>}{<… and after decimal marker>}
    2. \tcenter{<text to center at the decimal marker>}

现在可以使用了,感谢Peter Grill 的问题Martin Scharrer 的回答Peter 在聊天中给出的提示

手动对齐

您可以添加另一个\textcenter带有三个参数的宏:

  1. 在你的实际文本之前添加内容,
  2. 实际文本后面的内容(在下面的例子中,我还删除了小数点标记.),以及
  3. 实际排版的内容。

例如:

\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}

输出

输出带有幻影隐藏内容  输出带有灰色隐藏内容

相关内容