我想自动生成列标题列表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
不可扩展)。好消息是有一个解决方案。:-) 您只需要确保以可扩展的方式生成材料,这样当\multicolumn
TeX 递归扩展行首的标记(查找\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
。