在表格中途更改 tabularx 列对齐方式

在表格中途更改 tabularx 列对齐方式

我有一些非常大和非常小的数字以十进制表示法显示(针对非科学观众)。通常情况下,对于小幅度范围,我会用 对齐小数点{r@{.}l},但在这种情况下,我必须在同一个表中处理大约 20 个数量级,因此这变得不切实际。我的真实表格有二十多行。

目前所有数字都可以右对齐或集体左对齐。我希望将正幂(整数)右对齐,但将负幂(小数)左对齐。

\begin{tabularx}{\textwidth}{>{\bfseries}clrX}
Name & Sci       & Decimal           & Notes \\
\hline
foo  & $10^{12}$ & 1 000 000 000 000 & Big number \\
bar  & $10^{5}$  &           100 000 & Fair size \\
\hline
baz  & $10^{-6}$ & 0.000 001         & Left-align these \\
qux  & $10^{-8}$ & 0.000 000 01      & numbers, please! \\
\end{tabularx}

我可以\multicolumn{1}{l}{0.000 0001}对每个小数都这样做(对于整数,反之亦然)——我甚至可以自动化这个过程——但是因为我使用 LaTeX 的时间还不是很长[1],所以我想在开始黑客攻击之前学习最佳实践。

问题重述

1 000 000 Whole numbers align right
   10 000
      100
0.01
0.000 1
0.000 001 Fractional (decimal) numbers align left

我承认这可能是一个 XY 问题,因此我会接受任何能够产生所需输出的优雅答案。我还会接受对问题的修改,以澄清任何令人困惑的地方。


  1. 只有大约 20 年。有趣的是,这件事从未发生过。

答案1

您可以利用siunitx更简单的输入并定义左对齐和右对齐的命令:

\documentclass{article}
\usepackage{tabularx,siunitx}

\NewDocumentCommand\rnum{O{}m}{%
  \mbox{}\hspace{0pt plus 1filll}\num[#1]{#2}%
}
\NewDocumentCommand\lnum{O{}m}{%
  \num[#1]{#2}\hspace{0pt plus 1filll}\mbox{}%
}

\begin{document}

\noindent
\begin{tabularx}{\textwidth}{>{\bfseries}clcX}
Name & Sci       & Decimal           & Notes \\
\hline
foo  & $10^{12}$ & \rnum{1000000000000} & Big number \\
bar  & $10^{5}$  &        \rnum{100000} & Fair size \\
\hline
baz  & $10^{-6}$ & \lnum{0.000001}      & Left-align these \\
qux  & $10^{-8}$ & \lnum{0.00000001}    & numbers, please! \\
\end{tabularx}

\end{document}

enter image description here

答案2

您可以使用 collcell 来收集内容并测试值。(“Decimal” 用括号括起来,以避免也对其进行测试)。

\documentclass{article}
\usepackage{tabularx}
\usepackage{siunitx}
\usepackage{collcell}


\ExplSyntaxOn
\newcolumntype{E}{>{\collectcell \my_is_braced_input:n }c<{\endcollectcell}}

\cs_new:Npn \my_align_numbers:n #1\scan_stop: 
 {
   \fp_compare:nTF { #1 < 1 }
    {\num{#1}\hfill\mbox{}}
    {\mbox{}\hfill\num{#1}}
 } 

\cs_new:Nn \my_is_braced_input:n 
 {
  \peek_catcode:NF \c_group_begin_token
  {\my_align_numbers:n}
  #1\scan_stop:
 }   
\ExplSyntaxOff

\sisetup{group-digits}
\begin{document}

\noindent
\begin{tabularx}{\textwidth}{>{\bfseries}clEX}
Name & Sci       & {Decimal} & Notes \\
\hline
foo  & $10^{12}$ & 1000000000000 & Big number \\
bar  & $10^{5}$  &        100000 & Fair size \\
\hline
baz  & $10^{-6}$ & 0.000001      & Left-align these \\
qux  & $10^{-8}$ & 0.00000001    & numbers, please! \\
\end{tabularx}

\end{document}

enter image description here

相关内容