\usepackage{siunitx} 与 tabularx 中的数学代码一起使用时会出现错误

\usepackage{siunitx} 与 tabularx 中的数学代码一起使用时会出现错误

我想使用siunitx包来在文档中写入单位。但是,只需添加以下行:

\usepackage{siunitx}

到文档(甚至没有使用命令siunitx)给出了 84 个类型的错误:Missing '}'... Missing '$' ... Extra '}' ...等等。

如果没有此行,文档仍可编译并生成。

我已设法找到导致问题的根源,即 tabularx 内部数学代码的使用。

以下是需要编译的最少代码:

\documentclass[12pt,twoside]{report}
\usepackage{siunitx}
\usepackage{comment}
\usepackage{tabularx}
\newcolumntype{Y}{>{\centering\arraybackslash}X}
\newcolumntype{s}{>{\hsize=.25\hsize\centering\arraybackslash}X}

\begin{document}
\begin{center} 
\begin {table}[h]
\caption{Comparison between bla bla bla}
\centering
{
    \renewcommand{\arraystretch}{1.5} % \renewcommand{\arraystretch}{1.5}
    \begin{tabularx}{0.95\linewidth} {Y|s}   
    \hline\hline
    column 1 title & column 2 title \tabularnewline % [0.5cm]  
    \hline%\hline
    cell(1,1) & $\textrm{w}_0$ \tabularnewline
%\begin{comment}
    cell(2,1) & $\frac{\textrm{w}_0}{\sqrt{2}}\approx 0.7\textrm{w}_0$ \tabularnewline
    cell(3,1) & $\frac{\textrm{w}_0}{\sqrt{3}}\approx 0.58\textrm{w}_0$ \tabularnewline
    cell(4,1) & $0.5\textrm{w}_0$ \tabularnewline
    cell(5,1) & $0.46\textrm{w}_0$ \tabularnewline

    \hline
%\end{comment}
    \end{tabularx}
}
\label{tab:comparing_table}
\end{table} 
%
\end{center} 
\end{document}

现在,没有了:\usepackage{siunitx}上面的表格可以正常编译。问题出在表格内的数学代码上。只有文本的同一张表格也可以正常编译。

我怎样才能保留包含数学运算的表格并siunitx???

答案1

在我看来,问题出在你的习惯上,columntype因为对我来说,使用j而不是可以完美运行。由包保留。sssiunitx

表格型

\documentclass[12pt,twoside]{report}
\usepackage{siunitx}
\usepackage{comment}
\usepackage{tabularx}
\newcolumntype{Y}{>{\centering\arraybackslash}X}
\newcolumntype{j}{>{\hsize=.25\hsize\centering\arraybackslash}X}

\begin{document}
\begin{center} 
\begin{table}[h]
\caption{Comparison between bla bla bla}
\centering
{
    \renewcommand{\arraystretch}{1.5} % 
    \begin{tabularx}{0.95\linewidth}{Y|j}   
    \hline\hline
    column 1 title & column 2 title \tabularnewline % [0.5cm]  
    \hline%\hline
    cell(1,1) & {$\textrm{w}_0$}  \tabularnewline
    cell(2,1) & $\frac{\textrm{w}_0}{\sqrt{2}}\approx 0.7\textrm{w}_0$ \tabularnewline
    cell(3,1) & $\frac{\textrm{w}_0}{\sqrt{3}}\approx 0.58\textrm{w}_0$ \tabularnewline
    cell(4,1) & $0.5\textrm{w}_0$ \tabularnewline
    cell(5,1) & $0.46\textrm{w}_0$ \tabularnewline
    \hline
\end{tabularx}
}
\label{tab:comparing_table}
\end{table} 
\end{center} 
\end{document}

答案2

控制台输出(和日志文件)显示

Package array Warning: Column s is already defined on input line 8.

当列类型已经定义时,array通常会发出警告并覆盖定义。但是 Catch 22 正在等着我们!s列类型由 定义siunitx,因此会显示警告,但siunitx实际上在文档开始时对列类型进行了必要的定义!因此,您最终还是会得到s由 定义的列类型siunitx,这会导致错误,因为该列中的输入无效。

如果您不确定覆盖列类型是否安全,请不要这样做。

还有几点需要注意。

  1. 永远不要放置table在里面center:这只会在文档中产生不必要的垂直空间,并且表格可能位于或不位于该垂直空间的中间。

  2. 避免\begin{table}[h]希望浮动确实被放置这里。通常不会。LaTeX 会转换[h][ht],但大浮点数可能无法在指定位置找到它们的位置,最终会将其和所有后续浮点数延迟到当前章节结束。

  3. 使用组来局部化的效果\renewcommand{\arraystretch}{1.5}是没用的,因为之后无论如何都会恢复原来的值\end{table}

  4. 将您的放在它所属的\label旁边。\caption

  5. 使用“可变X列”的正确方法是使用\hsize=<frac>\hsize所有分数的总和作为X列数。在您的例子中,如果第一列的细分为 3/4,第二列的细分为 1/4,则应该是

    >{\hsize=1.5\hsize}X >{\hsize=0.5\hsize}X
    

完整的代码,具有booktabs功能而不是\hline\hline垂直规则。

\documentclass[12pt,twoside]{report}
\usepackage{siunitx}
\usepackage{comment}
\usepackage{tabularx}
\usepackage{booktabs}

\begin{document}

\begin{table}[htp]
\caption{Comparison between bla bla bla}
\label{tab:comparing_table}

\centering
\renewcommand{\arraystretch}{1.5}

\begin{tabularx}{0.95\linewidth}
 {
  >{\centering\hsize=1.5\hsize}X
  >{\centering\hsize=0.5\hsize}X
 }
\toprule
column 1 title & column 2 title \tabularnewline % [0.5cm]  
\midrule
    cell(1,1) & $\textrm{w}_0$ \tabularnewline
%\begin{comment}
    cell(2,1) & $\frac{\textrm{w}_0}{\sqrt{2}}\approx 0.7\textrm{w}_0$ \tabularnewline
    cell(3,1) & $\frac{\textrm{w}_0}{\sqrt{3}}\approx 0.58\textrm{w}_0$ \tabularnewline
    cell(4,1) & $0.5\textrm{w}_0$ \tabularnewline
    cell(5,1) & $0.46\textrm{w}_0$ \tabularnewline

\bottomrule
%\end{comment}
\end{tabularx}

\end{table} 

\end{document}

在此处输入图片描述

以下是输出

>{\centering}X c

对于色谱柱规格:

在此处输入图片描述

相关内容