csvsimple 放错了 \omit。当对整行使用多列时,\multispan

csvsimple 放错了 \omit。当对整行使用多列时,\multispan

...

大家好!

我曾尝试寻找甚至唯一类似的问题,但没有成功。

我收到以下错误:

! 放错 \omit。 \multispan ->\omit \@multispan l.1113 } 我希望只在制表符或对齐的 \cr 之后看到 \omit。

对于以下代码(在“工作示例”下面,彼得·埃贝尔斯伯格问):

\documentclass[a4paper]{article}

\usepackage[english]{babel}
\usepackage[utf8x]{inputenc}
\usepackage{color}
\usepackage{colortbl}
\usepackage{csvsimple}

\begin{filecontents*}{misreco_train.csv}
first;second;third
speaker1_cmd;;
\end{filecontents*}

\begin{document}

\definecolor{DarkBrown}{rgb}{0.4,0.2,0}
\definecolor{LightSalmon}{rgb}{1,0.8,0.6}
\definecolor{Salmon}{rgb}{1,0.6,0.4}

\csvstyle{Misrecognition}{
tabular={|ccc|},
separator=semicolon,
table head=\hline\multicolumn{3}{|c|}{\cellcolor{DarkBrown}{\color{white} header text}},
late after head=\\\hline\rowcolor{Salmon},
late after line=\csvifoddrow{\\\hline\rowcolor{Salmon}}{\\\hline\rowcolor{LightSalmon}},
respect underscore=true
}

\begin{table}[ht]
\centering
\caption{here is my caption}
\csvreader[Misrecognition]%
{misreco_train.csv}%
{1=\first,2=\second,3=\third}%
{
  \csviffirstrow%
  {
    \ifthenelse{\equal{\second}{}}%
    {\multicolumn{3}{c|}{\cellcolor{Salmon}\first}}% this is the line causing the error
    {%
      \ifthenelse{\equal{\third}{}}%
        {\first & \multicolumn{2}{c|}{\cellcolor{Salmon}\second}}%
        {\first & \second & \third}%
    }%
  }%
  {\first & \second & \third}%
}
\end{table}

\end{document}

如果我的 CSV 文件只有一行数据且只有一个项目,就会出现问题:

CSV 文件内容:

first;second;third % this is the header
one_item;; % this is the first 3-column row with only one item

我已经部分弄清楚了问题出在我尝试对整行使用多列时。在多列前面加上“\”有助于解决错误,但并不能解决问题,因为它只是在标题和第一行之间添加了一些额外的未格式化空间。

作为一个解决方法我使用了以下修改:

& \multicolumn{2}{c|}{\cellcolor{Salmon}\first}

我怀疑 csvsimple 把事情搞乱了,但就是找不到解决方案。

编辑:埃格尔指出,csvreader 正在添加一些不可扩展的标记。有没有解决方法,例如使用 csvloop 而不是 csvreader(实际上(据我所知)它是 csvloop 的某种包装器?)

编辑2:谢谢,托马斯·F·斯特姆感谢您的回答,但不幸的是,我暂时还不能将您的答案标记为解决方案,因为在按照您在代码示例中指出的那样将其调整到我的代码后,在 PDF 文档中呈现表格仍然存在问题。表格标题右侧有一小块空白。看起来,第一行从标题行开始……请参见下图:

生成的表

我的texmaker的PS版本是3.2

EDIT3:CSV 文件看起来像:

first;second;third
item1;;

或者

first;second;third
item1;item2;

或者

first;second;third
item1;item2;item3

或者

first;second;third
item1;item2;item3
item4;;

...等等。但是,千万不要像这样:

first;second;third
item1;;
item2;item3;item4;

因此,仅当所有前一行都已最大程度填充时,才会出现下一行。

答案1

首先,问题的原因不是添加了一些不可展开的 token,这可以通过删除代码并直接写表来csvreader发现。以下代码给出了相同的错误信息:csvreader

\documentclass[a4paper]{article}

\usepackage[english]{babel}
%\usepackage[utf8x]{inputenc}
\usepackage{color}
\usepackage{colortbl}
\usepackage{csvsimple}

\begin{document}

\definecolor{DarkBrown}{rgb}{0.4,0.2,0}
\definecolor{LightSalmon}{rgb}{1,0.8,0.6}
\definecolor{Salmon}{rgb}{1,0.6,0.4}

\def\first{START}
\def\second{}
\def\third{}

\begin{table}[ht]
\centering
\caption{normal table}
\begin{tabular}{|ccc|}
  \hline\multicolumn{3}{|c|}{\cellcolor{DarkBrown}{\color{white} header text}}\\\hline\rowcolor{Salmon}%
  \ifthenelse{\equal{\second}{}}%
  {\multicolumn{3}{c|}{\cellcolor{Salmon}\first}}% this is the line causing the error
  {%
    \ifthenelse{\equal{\third}{}}%
      {\first & \multicolumn{2}{c|}{\cellcolor{Salmon}\second}}%
      {\first & \second & \third}%
  }%
\end{tabular}
\end{table}

\end{document}

您不能将 放在\ifthenelsedoing a 之前\multicolumn

因此,代码必须稍作修改。以下内容有效:

\documentclass[a4paper]{article}

\usepackage[english]{babel}
%\usepackage[utf8x]{inputenc}
\usepackage{color}
\usepackage{colortbl}
\usepackage{csvsimple}

\begin{filecontents*}{misreco_train.csv}
first;second;third
speaker1_cmd;;
A;B;C
\end{filecontents*}

\begin{document}

\definecolor{DarkBrown}{rgb}{0.4,0.2,0}
\definecolor{LightSalmon}{rgb}{1,0.8,0.6}
\definecolor{Salmon}{rgb}{1,0.6,0.4}

\csvstyle{Recognition}{
  tabular={|ccc|},
  separator=semicolon,
  table head=\hline\multicolumn{3}{|c|}{\cellcolor{DarkBrown}{\color{white} header text}},
  late after head=,
  late after line=\csvifoddrow{\\\hline\rowcolor{Salmon}}{\\\hline\rowcolor{LightSalmon}},
  respect underscore=true
}


\begin{table}[ht]
\centering
\caption{here is my caption}
\ttfamily
\csvreader[Recognition]%
{misreco_train.csv}%
{1=\first,2=\second,3=\third}%
{%
  \csviffirstrow%
  {%
    \ifthenelse{\equal{\second}{}}%
    {\\\hline\multicolumn{3}{c|}{\cellcolor{Salmon}\first}}%
    {%
      \\\hline\rowcolor{Salmon}\first
      \ifthenelse{\equal{\third}{}}%
        {& \multicolumn{2}{c|}{\cellcolor{Salmon}\second}}%
        {& \second & \third}%
    }%
  }%
  {\first & \second & \third}%
}
\end{table}

\end{document}

请注意,我插入了\ttfamily以使下划线可见。

在此处输入图片描述

相关内容