TeX 基元\halign
允许重复前导,每个表格等都是基于此构建的。查看以下代码的输出可以最轻松地解释它是什么。
\documentclass{article}
\usepackage{array}
\newcolumntype{\repeat}{<{\span\doublenextamp}}
\def\doublenextamp#1&{#1&&}
\begin{document}
First test.
\begin{tabular}{c\repeat lr}
a & b & d &e & f & apsdoi \\
cde & def & erasd &arp & sefoi & wp
\end{tabular}
\end{document}
这节省了大量的打字工作,并且,对于自动生成的表,还节省了大量自己计算列数的工作。
但是,我只能在 LaTeX 中让它在从第二列或更多列开始重复时工作,而不是重复整个序言。这是因为 LaTeX(或者说软件包array
?)在用户可以输入的任何内容之前插入了很多内容,但 TeX 希望将额外的内容&
(标记重复的内容)放在首位。
两个问题:
有没有打包的解决方案?
是否存在具有简洁用户界面的自定义解决方案?
答案1
这是一个通过修改包内部结构来实现的解决方案array
。
\documentclass{article}
\usepackage{array}
\makeatletter
\newcommand*\repeatall{%
\def\@arstrut{&\unhbox\@arstrutbox}%
}
\newcommand*\repeatnone{%
\def\@arstrut{\unhbox\@arstrutbox}%
}
\makeatother
\begin{document}
\repeatall
\begin{tabular}{l}
a&b&c\\
d&e&f\\
\end{tabular}
\end{document}
或许将其变成环境而不是开关会更好。
\newenvironment{repeattabular}{%
\repeatall
\tabular
}{%
\endtabular
}
答案2
这并不能完全回答你的问题,但可能对那些需求较少的人有帮助,所以我把它包括在这里。你可以*n{c}
使用n类型的列c
。您可以使用*n{lr}
来获取n lr
列。使用该array
包,您可以对任何定义的列类型执行此操作:
\documentclass{article}
\usepackage{array}
\newcolumntype{L}{lr}
\begin{document}
\begin{tabular}{*3{L}}
a & b & d &e & f & apsdoi \\
cde & def & erasd &arp & sefoi & wp
\end{tabular}
\end{document}
当然,这不会动态分配列,但根据自动生成的表的创建方式,您可能提前知道需要重复的列数。