我一直在为此绞尽脑汁,显然一定是遗漏了什么。我试图从 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
)。