我使用 csvsimpl-l3 和 tabularray 包从 CSV 文件创建表格。在 CSV 文件中,一些数据标有“significant”。符号“|”用于将数据与单词“significant”分开。以这种方式修改的数据在输出表中的格式应与其他数据不同。即,表格的单元格应具有灰色背景,数据应加粗并涂成红色。当然,输出表不应显示“significant|”。
我的示例给出了部分良好的结果,因为 \SetCell 命令根本不起作用并且没有正确格式化表格单元格。
我注意到,继续使用包 csvsimple=l3 和 tabulararray 以及命令 \SetCell 非常重要。
如果有人知道如何解决这个问题并且可以提供帮助,那对我来说将会有很大的帮助。
\documentclass{article}
\begin{filecontents*}{test.csv}
significant|a,b,c
1,significant|2,3
4,5,significant|6
\end{filecontents*}
\usepackage{csvsimple-l3}
\usepackage{tabularray}
\usepackage{xcolor}
\usepackage{xstring}
\NewDocumentCommand{\applystyle}{m}{%
\IfSubStr{#1}{|}{%
\expandafter\SetCell{fg=black!10,bg=red}\bfseries\applystylehelper#1\relax
}{%
\strut#1%
}%
}
\def\applystylehelper#1|#2\relax{%
\helperstyle{#1}{#2}%
}
\NewDocumentCommand{\helperstyle}{mm}{%
\IfStrEq{#1}{significant}{%
{\strut}#2%
}{%
\strut#2%
}%
}
\begin{document}
\csvreader[
no head,
generic collected table = longtblr,
generic table options = {[label = none]{
rowhead = 1,
colspec = {|X[1,c]|X[1,c]|X[1,c]|},
width=0.5\textwidth
}},
table head = \hline,
late after line = \\\hline
]{test.csv}{}{%
\applystyle{\csvcoli} & \applystyle{\csvcolii} & \applystyle{\csvcoliii}%
}%
\end{document}
答案1
问题似乎是该tabularray
包需要特定的扩展机制\SetCell
(即必须在特定的时间点进行扩展),这是由于该tabularray
包处理表格材料的方式所致。结合通过 进行处理csvreader
,如果您不确切知道应该在哪个时间点扩展什么,则很难遵循正确的扩展顺序。
但是,您可以使用包\ifcsvstrcmp
提供的命令csvsimple-l3
。但在操作字符串时,您还需要注意正确扩展。使用来自的解决方案这个很好的答案并添加一些用于字符串操作的自定义命令,您可以执行以下操作:
\documentclass{article}
\begin{filecontents*}{test.csv}
significant|a,b,c
1,significant|2,3
4,5,significant|6
\end{filecontents*}
\usepackage{csvsimple-l3}
\usepackage{tabularray}
\usepackage{xcolor}
\ExplSyntaxOn
\cs_generate_variant:Nn \str_range:nnn { e }
\NewExpandableDocumentCommand{\clipbehind}{ m }{
\str_range:enn { #1 } { 1 } { 11 }
}
\NewExpandableDocumentCommand{\clipbefore}{ m }{
\str_if_in:nnTF { #1 } { | } {
\str_range:enn { #1 } { 13 } { -1 }
} { #1 }
}
\ExplSyntaxOff
\begin{document}
\csvreader[
no head,
generic collected table = longtblr,
generic table options = {[
label = none
]{
rowhead = 1,
colspec = {|X[1,c]|X[1,c]|X[1,c]|},
width=0.5\textwidth
}},
table head = \hline,
late after line = \\\hline
]{test.csv}{}{
\ifcsvstrcmp{\clipbehind{\csvcoli}}{significant}{
\SetCell{fg=black!10, bg=red, font=\noexpand\bfseries}
}{}
\clipbefore{\csvcoli} &
\ifcsvstrcmp{\clipbehind{\csvcolii}}{significant}{
\SetCell{fg=black!10, bg=red, font=\noexpand\bfseries}
}{}
\clipbefore{\csvcolii} &
\ifcsvstrcmp{\clipbehind{\csvcoliii}}{significant}{
\SetCell{fg=black!10, bg=red, font=\noexpand\bfseries}
}{}
\clipbefore{\csvcoliii}
}
\end{document}
此变体允许在单元格中使用数学模式:
\documentclass{article}
\begin{filecontents*}{test.csv}
significant|a,$+$,c
1,significant|2,significant|$\sim$
4,$\frac{1}{2}$,significant|6
\end{filecontents*}
\usepackage{csvsimple-l3}
\usepackage{tabularray}
\usepackage{xcolor}
\ExplSyntaxOn
\cs_generate_variant:Nn \tl_range:nnn { e }
\NewExpandableDocumentCommand{\clipbehind}{ m }{
\tl_range:enn { #1 } { 1 } { 11 }
}
\NewExpandableDocumentCommand{\clipbefore}{ m }{
\str_if_in:nnTF { #1 } { | } {
\tl_range:enn { #1 } { 13 } { -1 }
} { #1 }
}
\ExplSyntaxOff
\begin{document}
\csvreader[
no head,
generic collected table = longtblr,
generic table options = {[
label = none
]{
rowhead = 1,
colspec = {|X[1,c]|X[1,c]|X[1,c]|},
width=0.5\textwidth
}},
table head = \hline,
late after line = \\\hline
]{test.csv}{}{
\ifcsvstrcmp{\clipbehind{\csvcoli}}{significant}{
\SetCell{fg=black!10, bg=red, font=\noexpand\bfseries}
}{}
\clipbefore{\csvcoli} &
\ifcsvstrcmp{\clipbehind{\csvcolii}}{significant}{
\SetCell{fg=black!10, bg=red, font=\noexpand\bfseries}
}{}
\clipbefore{\csvcolii} &
\ifcsvstrcmp{\clipbehind{\csvcoliii}}{significant}{
\SetCell{fg=black!10, bg=red, font=\noexpand\bfseries}
}{}
\clipbefore{\csvcoliii}
}
\end{document}