我尝试在表中对齐一些十六进制数字,格式为 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,则不进行填充。