表格中的小数以粗体显示时与列不对齐

表格中的小数以粗体显示时与列不对齐

我正在使用booktabs和制作一个表格dcolumn。它运行完美,直到我尝试将其中一个数字加粗,然后小数就无法正确读取。

这里有什么解决方法吗?

\documentclass{article}
\usepackage{booktabs,dcolumn}
\begin{document}
\newcolumntype{.}{D{.}{.}{-1}}
\begin{tabular}{l .}
\toprule
M & \multicolumn{1}{c}{N} \\
\midrule
5 & 12.0 \\
10 & \textbf{24.0}\\
\bottomrule
\end{tabular}
\end{document}

加粗数字

答案1

\textbf退出数学模式并为您提供文本模式设置,原则上根本不使用数学字体(尽管在计算机现代设置中数字.实际上来自文本罗马字体)

无论如何,您都会失去对齐,因为 dcolumn 需要查看.顶层而不是组内的内容。

D是通过定义的,\newcolumntype所以你需要定义一个类似的列,B比如也插入\boldmath

(请注意,您的示例在运行时会产生几个不相关的错误,请在发布前进行测试!)

在此处输入图片描述

\documentclass{article}

\usepackage{booktabs,dcolumn}
\begin{document}

\newcolumntype{.}{D{.}{.}{-1}}
\makeatletter
\newcolumntype{B}[3]{>{\boldmath\DC@{#1}{#2}{#3}}c<{\DC@end}}
\makeatother
\begin{tabular}{l .}
\toprule
M & \multicolumn{1}{c}{N} \\
\midrule
5 & 12.0 \\
10 & \multicolumn{1}{B{.}{.}{-1}}{24.0}\\
\bottomrule
\end{tabular}
\end{document}

将使用上面的方法.精确对齐,但默认粗体数字比标准数字更宽,因此对齐将失败。如果您只有一位或两位数字,这可能并不重要,但要使用非扩展粗体,最简单的方法是定义一个使用\boldmathb不是的版本bx

在此处输入图片描述

\documentclass{article}

\usepackage{booktabs,dcolumn}
\DeclareMathVersion{nxbold}
\SetSymbolFont{operators}{nxbold}{OT1}{cmr} {b}{n}
\SetSymbolFont{letters}  {nxbold}{OML}{cmm} {b}{it}
\SetSymbolFont{symbols}  {nxbold}{OMS}{cmsy}{b}{n}

\begin{document}


\newcolumntype{.}{D{.}{.}{-1}}
\makeatletter
\newcolumntype{B}[3]{>{\boldmath\DC@{#1}{#2}{#3}}c<{\DC@end}}
\newcolumntype{Z}[3]{>{\mathversion{nxbold}\DC@{#1}{#2}{#3}}c<{\DC@end}}
\makeatother
\begin{tabular}{l .}
\toprule
M & \multicolumn{1}{c}{N} \\
\midrule
5 & 11112.0 \\
10 & \multicolumn{1}{B{.}{.}{-1}}{11124.0}\\
19 & \multicolumn{1}{Z{.}{.}{-1}}{11124.0}\\
\bottomrule
\end{tabular}

\end{document}

答案2

我知道这是一个老话题,但我想提供一个替代解决方案来解决前面答案中反复出现的问题。前面的答案都需要\multicolumn{1}{B{.}{.}{-1}}{...}在每个粗体单元格中重新声明列格式参数(例如)。这在大型数据表中变得非常麻烦,因为更改列的最大小数位数需要找到该列中的每个粗体单元格并相应地更改它们。

以下替代解决方案创建了一个更简单、无参数的\boldcell宏,可以将单元格中的字体更改为粗体,而无需重申任何列格式参数。

\documentclass{article}
\usepackage{booktabs,dcolumn}

\newcommand\theDC{}
\newcommand\boldcell{\relax\ifmmode$\egroup\fi\bfseries\boldmath\theDC}
\makeatletter
\newcolumntype{E}[3]{>{\def\theDC{\DC@{#1}{#2}{#3}}\theDC}c<{\DC@end}}
\makeatother
\newcolumntype{.}{E{.}{.}{-1}}

\begin{document}
\begin{tabular}{l .}
\toprule
M & \multicolumn{1}{c}{N} \\
\midrule
5 & 12.0 \\
10 & \boldcell 24.0 \\
\bottomrule
\end{tabular}
\end{document}

它的工作原理是创建一个新的列类型E,它就像D保存列格式参数一样,然后可以通过调用它\boldcell

获得一个\boldcell有效的实现比看起来要困难得多,因为我们不能使用\multicolumn,因为它会在保存原始格式参数之前替换列格式。为了避免这种情况,\boldcell请在创建任何输出之前中止正在进行的操作\DC@,然后使用粗体字体重新启动它。这样,原始参数就会被保存,并且可以在重新启动期间自动重用。

如果需要的话,可以\boldmath在上面替换使用不同的粗体数学字体(参见其他答案)。

答案3

我到了这里,但我只想让文本加粗,但不增加宽度。我实际上并没有使用dcolumn。在这种情况下,通过, 你可以做:

\usepackage{graphicx}
\newsavebox\CBox
\def\textBF#1{\sbox\CBox{#1}\resizebox{\wd\CBox}{\ht\CBox}{\textbf{#1}}}

然后使用\textBF{24.0}而不是\textbf{24.0}

或者专门用于数学模式的替代方案(适用于siunitx):

\newsavebox\CBox
\def\mathBF#1{\sbox\CBox{#1}\resizebox{\wd\CBox}{\ht\CBox}{\ensuremath{\mathbf{#1}}}}
\newcommand{\best}[1]{\mathBF{#1}}  % for table

然后使用\mathBF{24.0}\best{24.0}

相关内容