![siunitx 错误:数字输入无效](https://linux22.com/image/396696/siunitx%20%E9%94%99%E8%AF%AF%EF%BC%9A%E6%95%B0%E5%AD%97%E8%BE%93%E5%85%A5%E6%97%A0%E6%95%88.png)
我使用 siunitx 包以表格形式显示间隔,根据这个答案。但我用圆括号代替方括号。这是 MWE:
%!TeX program = xelatex
%!TeX encoding = UTF-8
\documentclass{article}
\usepackage{siunitx}
\usepackage{pdflscape}
\usepackage{booktabs}
\begin{document}
\begin{landscape}
\begin{table}
\begin{tabular}{
l*{3}{
S[table-format=1.3]@{\hspace{0.5em}}
>{{(}}
S[table-format=1.3,table-space-text-pre={(}]
@{,\,}
S[table-format=1.3,table-space-text-post={)}]
<{{)}}@{\hspace{2em}}
}
S[table-format=1.3]@{\hspace{0.5em}}
>{{(}}
S[table-format=1.3,table-space-text-pre={(}]
@{,\,}
S[table-format=1.3,table-space-text-post={)}]
<{{)}}
}
\toprule
{} & \multicolumn{3}{c@{\hspace{2em}}}{$\mathit{Exp}(\lambda)$} & \multicolumn{3}{c@{\hspace{2.5em}}}{$G(2,\lambda)$} & \multicolumn{3}{c@{\hspace{2.5em}}}{$G(3,\lambda)$} & \multicolumn{3}{@{}c@{\hspace{0.5em}}}{$N^+(\mu,\omega^2)$} \\
\midrule
$\alpha_0$ & 4.239 & 4.150 & 4.330 & 4.315 & 4.225 & 4.404 & 4.371 & 4.281 & 4.459 & 4.273 & 4.183 & 4.365\cr
$\alpha_1$ & 0.024 & 0.024 & 0.025 & 0.024 & 0.024 & 0.025 & 0.024 & 0.024 & 0.025 & 0.024 & 0.024 & 0.025\cr
$\beta_1$ & 0.054 & 0.049 & 0.060 & 0.051 & 0.045 & 0.056 & 0.049 & 0.043 & 0.054 & 0.051 & 0.046 & 0.057\cr
$\beta_2$ & 0.755 & 0.749 & 0.761 & 0.761 & 0.755 & 0.767 & 0.765 & 0.758 & 0.771 & 0.761 & 0.755 & 0.767\cr
$\beta_3$ & 0.109 & 0.102 & 0.116 & 0.106 & 0.099 & 0.113 & 0.105 & 0.098 & 0.112 & 0.106 & 0.099 & 0.113\cr
$\sigma^2$ & 0.032 & 0.031 & 0.033 & 0.031 & 0.030 & 0.032 & 0.030 & 0.030 & 0.031 & 0.031 & 0.030 & 0.032\cr
$\lambda$ & 1.426 & 1.352 & 1.502 & 2.468 & 2.356 & 2.588 & 3.383 & 3.240 & 3.531 & \multicolumn{3}{@{}c@{\hspace{0.5em}}}{--}\cr
$\mu$ & \multicolumn{3}{c@{\hspace{2em}}}{--} & \multicolumn{3}{c@{\hspace{2.5em}}}{--} & \multicolumn{3}{c@{\hspace{2.5em}}}{--} & 0.286 & 0.243 & 0.324\cr
$\omega^2$ & \multicolumn{3}{c@{\hspace{2em}}}{--} & \multicolumn{3}{c@{\hspace{2.5em}}}{--} & \multicolumn{3}{c@{\hspace{2.5em}}}{--} & 0.440 & 0.397 & 0.485\cr
DIC & \multicolumn{3}{c@{\hspace{2em}}}{$-$9687.5} & \multicolumn{3}{c@{\hspace{2.5em}}}{$-$10274.1} & \multicolumn{3}{c@{\hspace{2.5em}}}{$-$10592.1} & \multicolumn{3}{@{}c@{\hspace{0.5em}}}{$-$10173.7}\cr
\bottomrule
\end{tabular}
\end{table}
\end{landscape}
\end{document}
其实在 TeX Live 2017(siunitx 版本为 v2.7g)上运行良好,但是在 TeX Live 2019(siunitx 版本为 v2.7s)上编译时出现错误,提示invalid numerical input '(4.150'
。我很困惑。但是如果我使用方括号,错误就消失了。所以我认为问题在于括号始终被视为用于不确定性输入的开始和结束符号,当仅使用左括号时,siunitx 包认为这是一个无效的数字输入。因此,我将input-open-uncertainty
改为[
并将input-close-uncertainty
改为]
:
\sisetup{input-open-uncertainty=[,input-close-uncertainty=]}
table-space-text-pre
而且它确实有效!所以我想知道为什么即使指定了单括号也不能与数字一起使用。为什么这个问题会出现在较新版本的 siunitx 包中?
答案1
您正确地推测,左括号始终被视为标记不确定性的开始。这对于siunitx
能够可靠地解析数字是必要的。该选项table-space-text-pre
不会改变这一点;它只会将其值的宽度((
在本例中)添加到列中,实际标记((
)不会因此而受到任何不同的处理。
您仍然可以实现目标,而无需通过向解析器隐藏括号来重新定义不确定性输入。这可以通过将它们放在一个组内(和之间{
)来实现}
。看起来您已经在中尝试过这个,但是错误消息告诉您,当解析器读取括号>{{(}}
时,这个组不再存在。怎么会这样?siunitx
当 TeX 使用宏的参数时,它会剥去一层括号(如果存在)。这意味着有时,根据您使用的宏的实现,您输入的某些括号在到达它们应该使用的机器部分之前就会消失。
有两种方法可以解决这个问题。
- 您可以添加更多括号。对于您来说,添加一层就足够了:
>{{{(}}}
- 您可以将括号放在宏中,使其不被 TeX 识别。定义一个宏
\newcommand*\foo{{(}}
并像 一样使用它>{\foo}
。现在,当这个参数通过实现表的不同宏传递时,\foo
仍然未展开。只有当siunitx
解析器尝试理解其输入并找到 时{(}
,它才会展开。通常,这种方法比第一种方法更安全、更简单,因为您不必先找出需要多少层括号,并且当这个数字发生变化时,您的代码不会中断。
至于为什么这不会发生在旧版本中,siunitx
我只能猜测。对我来说,这看起来像是旧版本的错误,或者是新版本的新功能。(能够添加部分数字解析之前我想说,使用绝对>
是一个特点。)<
答案2
您忘记添加选项input-symbols = {( )}
。通过添加它并清理一些代码,我获得:
梅威瑟:
\documentclass{article}
\usepackage{siunitx}
\usepackage{pdflscape}
\usepackage{booktabs}
\newcommand\dsh{\multicolumn{3}{c@{\hspace{2em}}}{--}}
\newcommand\mcc[1]{\multicolumn{3}{@{} c @{\hspace{1em}}}{$#1$}}
\begin{document}
\begin{landscape}
\begin{table}
% \centering
\sisetup{table-format=1.3, % <---
input-symbols = {( )}} % <===
\begin{tabular}{
>{$}l<{$}
*{3}{S @{\hspace{0.5em}}
>{(}S[table-space-text-pre={(}]
@{,\,}
S[table-space-text-post={)}]<{)}@{\hspace{2em}}
}
S @{\hspace{0.5em}}
>{{(}}
S[table-space-text-pre={(}]
@{,\,}
S[table-space-text-post={)}]<{)}
}
\toprule
& \mcc{\mathit{Exp}(\lambda)} & \mcc{G(2,\lambda)}
& \mcc{G(3,\lambda)} & \mcc{N^+(\mu,\omega^2)} \\
\midrule
\alpha_0 & 4.239 & 4.150 & 4.330 & 4.315 & 4.225 & 4.404
& 4.371 & 4.281 & 4.459 & 4.273 & 4.183 & 4.365 \cr
\alpha_1 & 0.024 & 0.024 & 0.025 & 0.024 & 0.024 & 0.025
& 0.024 & 0.024 & 0.025 & 0.024 & 0.024 & 0.025\cr
\beta_1 & 0.054 & 0.049 & 0.060 & 0.051 & 0.045 & 0.056
& 0.049 & 0.043 & 0.054 & 0.051 & 0.046 & 0.057\cr
\beta_2 & 0.755 & 0.749 & 0.761 & 0.761 & 0.755 & 0.767
& 0.765 & 0.758 & 0.771 & 0.761 & 0.755 & 0.767\cr
\beta_3 & 0.109 & 0.102 & 0.116 & 0.106 & 0.099 & 0.113
& 0.105 & 0.098 & 0.112 & 0.106 & 0.099 & 0.113\cr
\sigma^2 & 0.032 & 0.031 & 0.033 & 0.031 & 0.030 & 0.032
& 0.030 & 0.030 & 0.031 & 0.031 & 0.030 & 0.032\cr
\lambda & 1.426 & 1.352 & 1.502 & 2.468 & 2.356 & 2.588
& 3.383 & 3.240 & 3.531 & \dsh\cr
\mu & \dsh & \dsh & \dsh & 0.286 & 0.243 & 0.324\cr
\omega^2 & \dsh & \dsh & \dsh & 0.440 & 0.397 & 0.485\cr
\omega^2 & \multicolumn{3}{c@{\hspace{2em}}}{--}
& \multicolumn{3}{c@{\hspace{2.5em}}}{--}
& \multicolumn{3}{c@{\hspace{2.5em}}}{--}
& 0.440 & 0.397 & 0.485\cr
\mathrm{DIC}& \mcc{-9687.5} & \mcc{-10274.1} & \mcc{-10592.1}
& \mcc{-10173.7}\cr
\bottomrule
\end{tabular}
\end{table}
\end{landscape}
\end{document}
编辑:修正了列规范。
答案3
您的代码似乎不需要siunitx
包及其S
列类型。基本c
列类型似乎表现同样出色。
另一个建议:使用array
环境而不是tabular
环境;这种改变将使您免于输入大量$
符号。
除了在下面的例子中替换之外S
,c
我还清理并简化了您的代码。
\documentclass{article}
\usepackage{array,amsmath,pdflscape,booktabs}
\begin{document}
\begin{landscape}
\begin{table}
\centering
\setlength\arraycolsep{1em}
$\begin{array}{@{}
l
*{4}{ c
@{\hspace{1em}}
>{(}c
@{,\,}
c<{)} }
@{}}
\toprule
& \multicolumn{3}{c}{\exp(\lambda)}
& \multicolumn{3}{c}{G(2,\lambda)}
& \multicolumn{3}{c}{G(3,\lambda)}
& \multicolumn{3}{c@{}}{N^+(\mu,\omega^2)} \\
\midrule
\alpha_0 & 4.239 & 4.150 & 4.330 & 4.315 & 4.225 & 4.404
& 4.371 & 4.281 & 4.459 & 4.273 & 4.183 & 4.365\\
\alpha_1 & 0.024 & 0.024 & 0.025 & 0.024 & 0.024 & 0.025
& 0.024 & 0.024 & 0.025 & 0.024 & 0.024 & 0.025\\
\beta_1 & 0.054 & 0.049 & 0.060 & 0.051 & 0.045 & 0.056
& 0.049 & 0.043 & 0.054 & 0.051 & 0.046 & 0.057\\
\beta_2 & 0.755 & 0.749 & 0.761 & 0.761 & 0.755 & 0.767
& 0.765 & 0.758 & 0.771 & 0.761 & 0.755 & 0.767\\
\beta_3 & 0.109 & 0.102 & 0.116 & 0.106 & 0.099 & 0.113
& 0.105 & 0.098 & 0.112 & 0.106 & 0.099 & 0.113\\
\sigma^2 & 0.032 & 0.031 & 0.033 & 0.031 & 0.030 & 0.032
& 0.030 & 0.030 & 0.031 & 0.031 & 0.030 & 0.032\\
\lambda & 1.426 & 1.352 & 1.502 & 2.468 & 2.356 & 2.588
& 3.383 & 3.240 & 3.531 & \multicolumn{3}{c@{}}{\text{--}}\\
\mu
& \multicolumn{3}{c}{\text{--}}
& \multicolumn{3}{c}{\text{--}}
& \multicolumn{3}{c}{\text{--}}
& 0.286 & 0.243 & 0.324\\
\omega^2
& \multicolumn{3}{c}{\text{--}}
& \multicolumn{3}{c}{\text{--}}
& \multicolumn{3}{c}{\text{--}}
& 0.440 & 0.397 & 0.485\\
\mathrm{DIC}
& \multicolumn{3}{c}{-9687.5}
& \multicolumn{3}{c}{-10274.1}
& \multicolumn{3}{c}{-10592.1}
& \multicolumn{3}{c@{}}{-10173.7}\\
\bottomrule
\end{array}$
\end{table}
\end{landscape}
\end{document}
附录: 如果你做需要使用S
列类型,你需要在上面的代码中更改的是(a)加载siunitx
包和(b)替换
$\begin{array}{@{}
l
*{4}{ c
@{\hspace{1em}}
>{(}c
@{,\,}
c<{)} }
@{}}
和
\sisetup{input-symbols = {()}, % inform siunitx that "(" and ")" have no special meaning
table-format=1.3}
$\begin{array}{@{}
l
*{4}{ S
@{\hspace{1em}}
>{(}S
@{,\,}
S<{)} }
@{}}