![与 siunitx 中的 S 列中的特定字符对齐](https://linux22.com/image/275880/%E4%B8%8E%20siunitx%20%E4%B8%AD%E7%9A%84%20S%20%E5%88%97%E4%B8%AD%E7%9A%84%E7%89%B9%E5%AE%9A%E5%AD%97%E7%AC%A6%E5%AF%B9%E9%BD%90.png)
为了避免再次开始新的问题,我将使用此线索,因为问题与第一个问题相同。
\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}
如何在第一列获得正确的对齐?
答案1
也许需要一点手工工作:
不幸的是,\tablenum
宏似乎不适合在单元格外工作(或者至少不仅限于单元格内),因为第一个数字\tablenum
出现在第二个数字中(通过将两个出现项放在它们自己的组中来解决)。 两者都添加了水平空间(可能是因为它们通常是一个自己的列),可以使用框来解决此问题。
语法\numtablerange
是这样构成的:一个可选参数被转发给两个\tablenum
s;但是,如果给出了两个可选参数,那么第一个参数转发给第一个\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}