与 siunitx 中的 S 列中的特定字符对齐

与 siunitx 中的 S 列中的特定字符对齐

为了避免再次开始新的问题,我将使用此线索,因为问题与第一个问题相同。

\documentclass{article}

\usepackage{booktabs,dcolumn}
\usepackage{calc}
\usepackage[locale=DE]{siunitx}

\newcommand*\mc[1]{\multicolumn{2}{c}{#1}}
\newcommand*\Alignment[1]{% Alignment at `--'.
  \multicolumn{1}{r@{}}{\llap{\makebox[\widthof{--}][c]{#1}}}
}

\begin{document}

\begin{table}
 \centering
 \caption{Something.}
 \label{tbl:4}
  \begin{tabular}{
             S[table-format=2.0]
    @{--}    S[table-format=2.0]
    @{\quad}
             S[table-format=5.0]
    @{\quad}
             S[table-format=5.0]
  }
   \toprule
    \mc{St{\o}jniveau}       & {1994} & {2005-planen} \\
    \mc{\si{\decibel}}       & {---}  & {---}         \\
   \midrule
    55                  & 59 & 19491  & 12430         \\
    60                  & 64 &  7111  &  2644         \\
    65                  & 69 &  1191  &   320         \\
    70                  & 74 &   280  &    43         \\
    \Alignment{$> 75$}  &    &    52  &     1         \\
   \bottomrule
  \end{tabular}
\end{table}

\end{document}

输出2

如何在第一列获得正确的对齐?

答案1

也许需要一点手工工作:

不幸的是,\tablenum宏似乎不适合在单元格外工作(或者至少不仅限于单元格内),因为第一个数字\tablenum出现在第二个数字中(通过将两个出现项放在它们自己的组中来解决)。 两者都添加了水平空间(可能是因为它们通常是一个自己的列),可以使用框来解决此问题。

语法\numtablerange是这样构成的:一个可选参数被转发给两个\tablenums;但是,如果给出了两个可选参数,那么第一个参数转发给第一个\tablenum,第二个参数转发给第二个。

我以为可以用

\numtablerange[][parse-numbers=false]{75}{\hphantom{00}}

模拟一个开放式范围,但\tablenum会因未定义\__siunitx_table_print_S_direct:和而中断\__siunitx_table_print:,因此我采用了更加手动的方法。

顺便说一句,如果数字这么简单,您可以55--59直接在表中使用等等……

代码

\documentclass{standalone}
\usepackage{booktabs,calc}
\usepackage[locale=DE]{siunitx}
\makeatletter
\newcommand*{\numtablerange}[1][]{%
  \kernel@ifnextchar[{\numtable@range{#1}}{\numtable@range{#1}[#1]}}
\def\numtable@range#1[#2]#3#4{%
  \numtablerange@boxme{\expandafter\tablenum\expandafter[\numtablerange@lopt, #1]{#3}}--%
  \numtablerange@boxme{\expandafter\tablenum\expandafter[\numtablerange@ropt, #2]{#4}}%
}
\newcolumntype{T}[3]{>{\def\numtablerange@lopt{#1}\def\numtablerange@ropt{#2}}#3}
\newcommand*{\numtablerange@boxme}[1]{{\sbox0{#1}\usebox0}}
\makeatletter
\begin{document}
  \begin{tabular}{T{table-format=2.0}{table-format=2.0}{c} @{\quad} S[table-format=5.0] @{\quad} S[table-format=5.0]}
    \toprule
    St{\o}jniveau                        & {1994} & {2005-planen} \\
    \si{\decibel}                        & {---}  & {---}         \\ \midrule
    \numtablerange{55}{59}               & 19491  & 12430         \\
    \numtablerange{60}{64}               & 7111   & 2644          \\
    \numtablerange{65}{69}               & 1191   & 320           \\
    \numtablerange{70}{74}               & 280    & 43            \\
    \makebox[\widthof{00--00}][r]{$>75$} & 52     & 1             \\ \bottomrule
  \end{tabular}
\end{document}

输出

在此处输入图片描述

相关内容