我想用纯乳胶生成表格内容。
我的草稿如下:
\documentclass{article}
\usepackage{expl3}
\usepackage{colortbl}
\definecolor{lightgray}{gray}{0.9}
\ExplSyntaxOn
\seq_new:N \l_my_projects_seq
\NewDocumentCommand \addproject { m } {
\seq_put_right:Nn \l_my_projects_seq { #1 }
}
\NewDocumentCommand \printprojects {} {
\begin{tabular}{lc}
Project & Content \\
\seq_map_indexed_inline:Nn \l_my_projects_seq {
\ifodd ##1
\else
\rowcolor{lightgray}
\fi
\textsf{##2} & ...\\
}
\end{tabular}
}
\ExplSyntaxOff
\begin{document}
\addproject{A}
\addproject{B}
\printprojects
\end{document}
错误是
! Misplaced \noalign.
\rowcolor ->\noalign
{\ifnum 0=`}\fi \global \let \CT@do@color \CT@@do@color...
如果我禁用\rowcolor...
,则会生成 PDF。如果我\rowcolor...
在 之前添加\seq_map...
,也会生成 PDF。
万一我需要从 expl3 切换到 lualatex,对我来说也是可以的。这是一个练习,让我学到一些东西解释3。
答案1
您可以使用\seq_map_indexed_function:NN
可扩展的。
\documentclass{article}
\usepackage{colortbl}
\definecolor{lightgray}{gray}{0.9}
\ExplSyntaxOn
\seq_new:N \l_my_projects_seq
\NewDocumentCommand \addproject { m }
{
\seq_put_right:Nn \l_my_projects_seq { #1 }
}
\NewDocumentCommand \printprojects {}
{
\rowcolors{2}{lightgray}{white}
\begin{tabular}{lc}
Project & Content \\
\seq_map_inline:Nn \l_my_projects_seq { \textsf{##1} & ... \\ }
\end{tabular}
}
\ExplSyntaxOff
\begin{document}
\addproject{A}
\addproject{B}
\printprojects
\end{document}
另一方面,xcolor
已经规定了这一点。
\documentclass{article}
\usepackage[table]{xcolor}
\definecolor{lightgray}{gray}{0.9}
\ExplSyntaxOn
\seq_new:N \l_my_projects_seq
\NewDocumentCommand \addproject { m }
{
\seq_put_right:Nn \l_my_projects_seq { #1 }
}
\NewDocumentCommand \printprojects {}
{
\rowcolors{2}{lightgray}{white}
\begin{tabular}{lc}
Project & Content \\
\seq_map_indexed_function:NN \l_my_projects_seq \__my_choosecolor:nn
\end{tabular}
}
\cs_new:Nn \__my_choosecolor:nn
{
\textsf{#2} & ...\\
}
\ExplSyntaxOff
\begin{document}
\addproject{A}
\addproject{B}
\printprojects
\end{document}
答案2
TeX 在单元格开始时处于非常微妙的状态,寻找跨越条目或(此处)\noalign
。几乎任何东西(例如\relax
或\protected
宏)都会停止扫描并开始单元格内容。
\documentclass{article}
\usepackage{colortbl}
\begin{document}
\begin{tabular}{ll}
11&22\\
\rowcolor{blue}
33&44
\end{tabular}
\def\foo{\rowcolor{blue}}
\begin{tabular}{ll}
11&22\\
\foo
33&44
\end{tabular}
\ExplSyntaxOn
\show\seq_map_indexed_inline:Nn
\ExplSyntaxOff
\protected\def\blub{\rowcolor{blue}}
\begin{tabular}{ll}
11&22\\
\blub
33&44
\end{tabular}
\end{document}
注意\seq_map_indexed_inline:Nn
是\protected
并且\foo
有效但\blub
不起作用。
答案3
如果你想要的只是训练一些expl3
编码:
David 的回答中描述了这个问题,在这里复制/重现它没有多大用处。相反,这个答案显示了两种方法来做你想做的事情而不会触发那个错误:
在您的映射函数中使用
\\
before\rowcolor
(并将其从第一行的末尾删除),以便\rowcolor
每行(您的\int_if_odd:nF
)之前只有完全可扩展的材料:\NewDocumentCommand \printprojects {} { \begin{tabular}{lc} Project & Content \seq_map_indexed_inline:Nn \l_my_projects_seq { \\ \int_if_odd:nF {##1} { \rowcolor{lightgray} } \textsf{##2} & ... } \end{tabular} }
不要依赖于
\rowcolor
循环内部,而是让它\rowcolors
完成工作:\NewDocumentCommand \printprojectsB {} { \group_begin: \rowcolors{3}{lightgray}{} \begin{tabular}{lc} Project & Content \\ \seq_map_inline:Nn \l_my_projects_seq { \textsf{##1} & ... \\ } \end{tabular} \group_end: }
两者的结果是:
答案4
如果您使用{NiceTabular}
(nicematrix
及其键color-inside
)而不是{tabular}
,则直接获得预期的输出。这是因为nicematrix
,其内置命令\rowcolor
不使用colortbl
PGF/TikZ。您需要进行多次编译。
\documentclass{article}
\usepackage{nicematrix}
\definecolor{lightgray}{gray}{0.9}
\ExplSyntaxOn
\seq_new:N \l_my_projects_seq
\NewDocumentCommand \addproject { m } {
\seq_put_right:Nn \l_my_projects_seq { #1 }
}
\NewDocumentCommand \printprojects {} {
\begin{NiceTabular}{lc}[color-inside]
Project & Content \\
\seq_map_indexed_inline:Nn \l_my_projects_seq {
\ifodd ##1
\else
\rowcolor{lightgray}
\fi
\textsf{##2} & ...\\
}
\end{NiceTabular}
}
\ExplSyntaxOff
\begin{document}
\addproject{A}
\addproject{B}
\printprojects
\end{document}