如何对齐具有不同字符宽度的表格中的数字?

如何对齐具有不同字符宽度的表格中的数字?

我尝试在表中对齐一些十六进制数字,格式为 0x1FFFF 和 0x00001。它们必须向右对齐,但我还希望它们每个字符具有相同的宽度,尽管 F 比 0 或任何其他数字宽很多。否则,当开头的 0x 不一致时,看起来真的很可笑……

此处的代码

\begin{table}
\begin{center}
\begin{tabular}{@{}lr@{}} 
\toprule
\textbf{DEC} \hspace{10mm}      & \textbf{HEX} \\ 
\midrule
1           & 0x00001  \\
2           & 0x00002  \\
100         & 0x00064  \\   
131.071     & 0x1FFFF  \\
262143      & 0x3FFFF  \\
\bottomrule
\end{tabular}
\end{center}
\end{table}

创建此表

在此处输入图片描述

有没有什么方法可以正确对齐右边的数字,以便看起来不像不同数量的数字?

答案1

每个字符的宽度相同意味着您需要一种符合此要求的字体。通常,这是一种可以使用 访问的等宽字体\texttt

十六进制

\documentclass{article}
\usepackage{booktabs}
\usepackage{array}
\begin{document}
\begin{table}
\centering
\begin{tabular}{@{}l>{\ttfamily}r@{}} 
\toprule
\textbf{DEC} \hspace{10mm}      & \textbf{HEX} \\ 
\midrule
1           & 0x00001  \\
2           & 0x00002  \\
100         & 0x00064  \\   
131.071     & 0x1FFFF  \\
262143      & 0x3FFFF  \\
\bottomrule
\end{tabular}
\end{table}
\end{document}

答案2

除了真正的等宽字体外,您还可以伪造它:

\documentclass{article}
\usepackage{booktabs}

\newcommand*{\fakemonochar}[1]{\makebox[.6em][c]{#1}}
\makeatletter
\newcommand*{\fakemonotext}[1]{%
  \@fakemonotext#1\\%
}
\newcommand*{\@fakemonotext}[1]{%
  \ifx #1\\\else\fakemonochar{#1}\expandafter\@fakemonotext\fi
}
\makeatother 

\begin{document}

\begin{tabular}{@{}lrr@{}} 
\toprule
\textbf{DEC} & \textbf{HEX} (faked) & \textbf{HEX} (mono)\\ 
\midrule
1           & \fakemonotext{0x00001} & \texttt{0x00001} \\
2           & \fakemonotext{0x00002} & \texttt{0x00002} \\
100         & \fakemonotext{0x00064} & \texttt{0x00064} \\   
131.071     & \fakemonotext{0x1FFFF} & \texttt{0x1FFFF} \\
262143      & \fakemonotext{0x3FFFF} & \texttt{0x3FFFF} \\
\bottomrule
\end{tabular}
\end{document}

比较伪造的等宽字体和真正的等宽字体

答案3

您可以让 TeX 进行计算!

\documentclass{article}

\usepackage{xparse,booktabs,siunitx}

\ExplSyntaxOn
\NewDocumentCommand{\hexnum}{ O{ \l_hexnum_pad_int } m }
 {
  \hexnum_print:nn { #1 } { #2 }
 }
\NewDocumentCommand{\hexrow}{ O{ \l_hexnum_pad_int } m }
 {
  \num{#2} & \hexnum_print:nn { #1 } { #2 }
 }
\NewDocumentCommand{\sethexnumpad}{m}
 {
  \int_set:Nn \l_hexnum_pad_int { #1 }
 }

\int_new:N \l_hexnum_pad_int

\cs_new_protected:Nn \hexnum_print:nn
 {
  \texttt{ 0x \hexnum_pad:nf { #1 } { \int_to_Hex:n { #2 } } }
 }

\cs_new:Nn \hexnum_pad:nn
 {
  \int_compare:nF { #1 == 0 }
  {
   \prg_replicate:nn { #1 - \tl_count:n { #2 } } { 0 }
  }
  #2
 }
\cs_generate_variant:Nn \hexnum_pad:nn { nf }

\ExplSyntaxOff

\sethexnumpad{5} % initialize

\begin{document}

Stand alone: \hexnum[0]{35671} or \hexnum{35671}

\bigskip

\begin{tabular}{ l r }
\toprule
{DEC} & \multicolumn{1}{c}{HEX} \\
\midrule
\hexrow{1} \\
\hexrow{2} \\
\hexrow{100} \\
\hexrow{131071} \\
\hexrow{262143} \\
\bottomrule
\end{tabular}
%
\sethexnumpad{8}
%
\begin{tabular}{ l r }
\toprule
{DEC} & \multicolumn{1}{c}{HEX} \\
\midrule
\hexrow[1]{1} \\
\hexrow{2} \\
\hexrow{100} \\
\hexrow{131071} \\
\hexrow{262143} \\
\bottomrule
\end{tabular}

\end{document}

填充是针对\l_hexnum_pad_int数字进行的,您可以使用\sethexnumpad或使用可选参数\hexnum(或\hexrow对它的包装)进行设置。如果将值设置为 0,则不进行填充。

在此处输入图片描述

相关内容