foreach 中的 \tableheadline

foreach 中的 \tableheadline

我想自动生成列标题列表tabularx。以下是 MWE:

\documentclass{memoir}
\usepackage{tabularx}
\usepackage{pgffor}

%Adopted from classicthesis-config.tex
\newcommand{\tableheadline}[1]{\multicolumn{1}{l}{\textbf{#1}}}

\begin{document}

\def\coauthors{{John}, {Sue}, {Terry}}

%Adopted from https://texwelt.de/fragen/22216/pgffor-tabelleninhalt-mit-foreach-erzeugen
\makeatletter
\xdef\coauthorheadline{}%
\foreach \coauthor in \coauthors%
{%
  \protected@xdef\coauthorheadline{\coauthorheadline%
    \coauthor \protect&}%
}
\makeatother

  \begin{tabularx}{\textwidth}{c|c|c|c} %TODO: Remove extraneous column at the end due to superfluous & above
    \coauthorheadline \\
    %TODO: Rest
  \end{tabularx}

\end{document}

如果我没有在 中使用任何格式,则此方法可以正常工作foreach。但是,如果我添加\tableheadline,特别是,LaTeX 会报错。而不是

\coauthor \protect&}%

上面我试过了

\tableheadline{\coauthor} \protect&}%

\protect{\tableheadline{\coauthor}} \protect&}%

不幸的是,这两种方法都行不通。我怎样才能延迟\tableheadline命令的扩展,以便tabularx执行它?

答案1

\protect\multicolumn@gernot 的评论大致正确,只是我认为输入流中永远不会有。\protect作用于下一个标记;它应该不是后面跟着一个带括号的参数。因此,\protect{\tableheadline{\coauthor}}问题中的代码片段是 的错误用法\protect\protect\tableheadline是正确的用法,但这会阻止\multicolumn其工作。事实上,为了工作,诸如\multicolumn或 之类的命令\rowcolor不能位于给定单元格( 的情况下为 的行)中不可扩展的非空格标记之后\rowcolor。据我所知,这将阻止这种情况,因为在正常排版过程中,由于此定义\protect,它\let等于:\relax

\let\@typeset@protect\relax

(并且\relax不可扩展)。好消息是有一个解决方案。:-) 您只需要确保以可扩展的方式生成材料,这样当\multicolumnTeX 递归扩展行首的标记(查找\noalign或)时,就不会出现任何问题\omit

请注意,我给出了最后一列的类型X,因为tabularx没有X列就没有多大意义。

\documentclass{article} % no problem with memoir either
\usepackage{tabularx}
\usepackage{xparse}
\usepackage{lipsum}

\newcommand{\tableheadline}[1]{\multicolumn{1}{l}{\textbf{#1}}}

\ExplSyntaxOn
\seq_new:N \g__andreas_coauthors_seq

\NewDocumentCommand \coauthors { m }
  {
    % Comment out the following line if you want to append to the list of
    % coauthors instead of replacing it.
    \seq_gclear:N \g__andreas_coauthors_seq
    \clist_map_inline:nn {#1}
      { \seq_gput_right:Nn \g__andreas_coauthors_seq { \tableheadline {##1} } }
  }

\NewExpandableDocumentCommand \coauthorheadline { }
  {
    \seq_use:Nn \g__andreas_coauthors_seq { & }
  }
\ExplSyntaxOff

\begin{document}

% You can do this in the preamble if you prefer, but babel catcodes may not be
% set up yet, in this case.
\coauthors{{John}, {Sue}, {Terry}}

\noindent
\begin{tabularx}{\linewidth}{c|c|c|X}
  \coauthorheadline \\
  Foo foo foo & bar bar bar & baz baz baz & \lipsum[1][1-2] \\
  a           & b           & c           & d.
\end{tabularx}

\end{document}

截屏

注意:它适用于\multicolumn完全\seq_use:Nn可扩展的(在页边空白处用一颗星号来记录)界面3.pdf\coauthorheadline)。当 TeX从 的第一行开始递归扩展时tabularx,它在到达 之前不会遇到任何不可扩展的非空格标记\multicolumn

相关内容