我在尝试使用包对齐数字和计算结果时遇到了一些问题siunitx
。这是我的代码。
\documentclass{article}
\usepackage{siunitx}
\usepackage{fp}
\usepackage{booktabs}
% #1: decimal places (default=2), #2: value
\newcommand*{\KelvinToCelsius}[2][2]{%
\FPeval\tempKtoC{round((#2-273.15):#1)}%
\num{\tempKtoC}%
}
\begin{document}
\begin{tabular}{S S}
\toprule
\si{\kelvin} & \si{\celsius} \\
\midrule
10.3 & {\KelvinToCelsius{10.3}} \\
200.34 & {\KelvinToCelsius{200.34}} \\
500.26 & {\KelvinToCelsius{500.26}} \\
1200.5 & {\KelvinToCelsius[1]{1200.5}}\\
12345 & {\KelvinToCelsius[0]{12345}} \\
\bottomrule
\end{tabular}
\end{document}
其结果为:
请注意,第二列中的数字没有对齐。
如何解决这个问题?
答案1
充分利用expl3
;\KelvinToCelsius
命令必须是可扩展的,并且甚至可以使用可选参数。
使用\fpeval
可让您免于fp
。
\documentclass{article}
\usepackage{siunitx,xfp}
\usepackage{booktabs}
% #1: decimal places (default=2), #2: value
\NewExpandableDocumentCommand{\KelvinToCelsius}{O{2}m}{%
\fpeval{round(#2-273.15,#1)}%
}
\begin{document}
\begin{tabular}{
S[table-format=5.2]
S[table-format=5.2]
}
\toprule
{\si{\kelvin}} & {\si{\celsius}} \\
\midrule
10.3 & \KelvinToCelsius{10.3} \\
200.34 & \KelvinToCelsius{200.34} \\
500.26 & \KelvinToCelsius{500.26} \\
1200.5 & \KelvinToCelsius[1]{1200.5}\\
12345 & \KelvinToCelsius[0]{12345} \\
\bottomrule
\end{tabular}
\end{document}
答案2
命令必须可扩展,以便 siunitx 看到“纯数字”。最好使用 xfp 包进行计算并避免使用可选参数。
\documentclass{article}
\usepackage{siunitx}
\usepackage{xfp}
\usepackage{booktabs}
% #1: decimal places (default=2), #2: value
\newcommand*{\KelvinToCelsius}[1]{% no optional argument
\fpeval{round((#1-273.15)/2,2)}%
}
\begin{document}
\begin{tabular}{S S}
\toprule
\si{\kelvin} & \si{\celsius} \\
\midrule
10.3 & \KelvinToCelsius{10.3} \\
200.34 & \KelvinToCelsius{200.34} \\
500.26 & \KelvinToCelsius{500.26} \\
%1200.5 & {\KelvinToCelsius[1]{1200.5}}\\
%12345 & {\KelvinToCelsius[0]{12345}} \\
\bottomrule
\end{tabular}
\end{document}