自定义表格列:化学式

自定义表格列:化学式

我正在尝试定义一个表格列,它自动应用\ce{}mhchem 包中的命令将单元格内容格式化为化学式。

Google 搜索结果的答案是将arraycollcell包与显而易见的一起使用\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}

如您所见,根据我所遵循的示例,我找到了两条不同的路径,并定义了两种列类型LMM编译时出现一些未定义的控制序列警告,而不进行任何格式化,而导致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直接放入表体中,这样就可以避免定义新列类型导致的问题。你只需要注意正确的扩展顺序。

其他一些评论:

  1. \\CSV 文件中的行尾不应有任何线条。删除它们可解决表格中出现虚假线条的问题。
  2. 不要S在选项中使用列类型tabular。如csvsimple手册中所述,在表格主体内使用\tablenum宏更为可靠。这解决了您试图通过使用添加新列来规避的代码问题c @{}
  3. no head如果 CSV 确实有标题行,则不要使用。您可以安全地删除此选项(一旦您的 CSV 格式正确,请参阅 1.),也filter expr可以从代码中删除此选项。
  4. 您可能应该删除“\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}

在此处输入图片描述

相关内容