在集合上迭代并使用 \rowcolor

在集合上迭代并使用 \rowcolor

我想用纯乳胶生成表格内容。

我的草稿如下:

\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 的回答中描述了这个问题,在这里复制/重现它没有多大用处。相反,这个答案显示了两种方法来做你想做的事情而不会触发那个错误:

  1. 在您的映射函数中使用\\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}
    }
    
  2. 不要依赖于\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不使用colortblPGF/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}

上述代码的输出

相关内容