我正在尝试定义一个表格列,它自动应用\ce{}
mhchem 包中的命令将单元格内容格式化为化学式。
Google 搜索结果的答案是将array
和collcell
包与显而易见的一起使用\newcolumntype
。
然而,不知何故,我无法实现我的愿望。
以下是我目前得到的信息:
\documentclass{article}
\pagestyle{empty}
\usepackage{tabularx}
\usepackage{siunitx}
\usepackage{csvsimple}
\usepackage{array}
\usepackage{collcell}
\usepackage[version=4]{mhchem}
\def\cewrapmacro#1{% Simple test macro
\ce{{#1}}%
}
\newcommand{\MyChemTableCell}[1]{\ce{#1}}
\newcolumntype{M}{>{\collectmacro\cewrapmacro}l<{\endcollectmacro}}
\newcolumntype{L}{>{\collectcell\MyChemTableCell}l<{\endcollectcell}}
\begin{filecontents*}[]{test-file.csv}
mz, Intensity, annotation \\
1.20, 56.01, CH3OH \\
12.13, 1901.0, CH2OO- + H+
\end{filecontents*}
\begin{document}
\csvstyle{MyStyle}{
no head,
before reading=\centering\sisetup{table-number-alignment=center,table-format=3.3,table-auto-round},
tabular={c@{}S[table-format=1.4]S[table-format=1.2]M},
table head=\\ \empty & m/z & {Relative Intensity} & Annotation \\,
table foot=\\,
late after line=\\,
}
% the first empty is for using S as first column
\csvreader[MyStyle, filter expr={test{\ifnumgreater{\thecsvinputline}{1}}}]{test-file.csv}{}{\empty & \csvcoli & \csvcolii & \csvcoliii }
\end{document}
如您所见,根据我所遵循的示例,我找到了两条不同的路径,并定义了两种列类型L
和M
。M
编译时出现一些未定义的控制序列警告,而不进行任何格式化,而导致L
或多或少无限的Missing \cr inserted
。我觉得,除了调用之外\ce{}
,我还直接复制粘贴了从搜索中找到的结果;我做错了什么,我必须做什么才能定义一个自动将单元格内容格式化为化学方程式/公式的列类型?
答案1
事实证明,问题似乎在于这两个包collcell
不能csvsimple
一起工作,如以下答案所示:https://tex.stackexchange.com/a/83410/164869
一种解决方法是使用tabularray
包,例如像这样:
\documentclass{article}
\pagestyle{empty}
\usepackage{tabularray}
\usepackage{siunitx}
\usepackage{csvsimple-l3}
\usepackage{array}
\usepackage{collcell}
\usepackage[version=4]{mhchem}
\UseTblrLibrary{siunitx}
\begin{filecontents*}[]{test-file.csv}
mz, Intensity, annotation
1.20, 56.01, CH3OH
12.13, 1901.0, CH2OO- + H+
1.20, 56.01, CH3OH
\end{filecontents*}
% required by tabularray
\NewTableCommand\toprule{\hline[0.08em]}
\NewTableCommand\midrule{\hline[0.05em]\vspace{1pt}}
\NewTableCommand\bottomrule{\hline[0.08em]}
\begin{document}
\csvstyle{MyStyle}{
no head,
before reading=\centering\sisetup{table-number-alignment=center,table-format=3.3,table-auto-round},
tabularray={
colspec={c@{}S[table-format=1.4]S[table-format=1.2]l},
row{1} = {guard},
stretch = 0,
column{4} = {cmd=\ce}
},
table head=\toprule\empty & m/z & {Relative Intensity} & Annotation \\\midrule,
table foot=\bottomrule,
late after line=\\,
}
% the first empty is for using S as first column
\csvreader[MyStyle, filter expr={test{\ifnumgreater{\thecsvinputline}{1}}}]{test-file.csv}{}{\empty & \csvcoli & \csvcolii & \csvcoliii }
\end{document}
答案2
这可能不是你想要的,但你可以将宏\ce
直接放入表体中,这样就可以避免定义新列类型导致的问题。你只需要注意正确的扩展顺序。
其他一些评论:
\\
CSV 文件中的行尾不应有任何线条。删除它们可解决表格中出现虚假线条的问题。- 不要
S
在选项中使用列类型tabular
。如csvsimple
手册中所述,在表格主体内使用\tablenum
宏更为可靠。这解决了您试图通过使用添加新列来规避的代码问题c @{}
。 no head
如果 CSV 确实有标题行,则不要使用。您可以安全地删除此选项(一旦您的 CSV 格式正确,请参阅 1.),也filter expr
可以从代码中删除此选项。- 您可能应该删除“\empty”宏,因为它们在这里不执行任何操作。
完整 MWE:
\documentclass{article}
\pagestyle{empty}
\usepackage{siunitx}
\usepackage{csvsimple}
\usepackage[version=4]{mhchem}
\begin{filecontents*}{test-file.csv}
mz, Intensity, annotation
1.20, 56.01, CH3OH
12.13, 1901.0, CH2OO- + H+
12.13, 1901.0, CH2OO- + H+
\end{filecontents*}
\begin{document}
\csvstyle{MyStyle}{
before reading={\centering\sisetup{table-number-alignment=center, table-auto-round}},
tabular={c c c},
table head={\hline m/z & Relative Intensity & Annotation \\ \hline},
table foot={\hline},
late after line={\\}
}
% the first empty is for using S as first column
\csvreader[MyStyle] {test-file.csv} {} {
\tablenum[table-format=1.4]{\csvcoli} &
\tablenum[table-format=1.2]{\csvcolii} &
\edef\csvcoliiitemp{\noexpand\ce{\csvcoliii}}\csvcoliiitemp
}
\end{document}