第一行上的 Tabularx、csvsimple 和 multicol 导致 \omit 错误

第一行上的 Tabularx、csvsimple 和 multicol 导致 \omit 错误

我一直在为此绞尽脑汁,显然一定是遗漏了什么。我试图从 csv 构建一个表格,其中第一列作为标题,只要它保持不变,就像这个答案中一样:https://tex.stackexchange.com/a/225358/45330 但是,我(确实)想使用 tabularx。

问题是,当我像这样设置它时,除非我在第一个多列之前添加一个新行,否则我会收到一个Misplaced \omit \multispan -> \omit错误,

因此,下面的代码可以编译,但是会给出不需要的第一行(我尽可能简化了代码,这里看起来不需要 tabularx,但是完整版本需要):

\documentclass[10pt, a4paper]{article}

\usepackage{graphicx}
\usepackage{tabularx}
\usepackage[table]{xcolor}
\usepackage[T1]{fontenc}
\usepackage{helvet}
\usepackage[explicit]{titlesec}
\usepackage[english]{babel}
\usepackage{ltablex}
\usepackage{csvsimple}
\usepackage{siunitx}
\usepackage{filecontents}

\begin{filecontents*}[overwrite]{documents.csv}
document;detail;description
First;Purpose;Example
First;Reason;None in particular
First;Author;That one guy
Second;Purpose;Another example
Second;Reason;None of you business
Second;Author;That other dude
Second;Second Author;A racoon
\end{filecontents*}

\begin{document}

\rowcolors{2}{blue}{white}
\begin{tabularx}{\textwidth}{c|c}
\csvreader[
  separator=semicolon,
  head to column names,
  before line = {
    \ifthenelse{\equal{\document}{\currentdocument}}{%
      \\\hline %
    }{%
      \xdef\currentdocument{\document}%
      \\\hline\multicolumn{2}{c}{\cellcolor{teal}\currentdocument}\\\hline %
    }
  },
  before first line = {
    \xdef\currentdocument{\document}
    \\        % <--------------------------------------------------------- THE HEADACHE LINE
    \multicolumn{2}{c}{\cellcolor{teal}\currentdocument}\\\hline
  },
]{documents.csv}{}{\detail & \description}
\end{tabularx}

\end{document}

输出如下所示(注意第一个空行):

在此处输入图片描述

现在,我要思考应该有效的方法是删除\\第一行之前的部分。但是,当我这样做时,这给了我错位 \omit 错误

我显然遗失了一些东西,但我无论如何也找不到它。

答案1

问题是\multicolumn只允许单元格已启动,即直接在\\或之后&。在这两者之间,允许的命令都是扩展的命令,并且作为扩展的一部分,这些命令会消失,而不会产生副作用,因此\xdef会启动您的单元格,从而使以下内容\multicolumn无效。这可能可以通过以下方法修复

  \noalign{\xdef ....}%

但在您的特定情况下,这无济于事,因为\csvreader已经按照其实现方式启动了单元格。因此,我唯一能看到的没有完全不同实现的方法是这样的:


\newcommand\hiddenamp{&}

...
  before first line = {
  \xdef\currentdocument{\document}
     \hiddenamp\multicolumn{1}{c}{}\\[-12pt] 
  \multicolumn{2}{c}{\cellcolor{teal}\currentdocument}\\\hline
  },

基本上接受您得到一个额外的行,通过隐藏 | 并在之后备份来确保它不会显示。需要从 csvreader 代码中\hiddenamp隐藏。&

还有一条评论:\document像你这样使用是相当危险的。你对它进行了 \xdef 处理,尽管这在你的示例中似乎有效,但根据 csv 中的列所包含的内容,它可能不起作用(例如,将“First”替换为 First \copyright")。由于它只是一种表明你状态的手段,所以它不是一个好的选择,绝对不是用\xdef。考虑到 \document 可能包含任意脆弱的东西,也许\protected@xdef更好(但你需要将整个定义包装在其中\makeatletter ... \makeatother或使用一些狡猾的东西,例如\csname protected@xdef\encsname)。

相关内容