array
我使用and包定义了几种列类型collcell
。示例
\newcolumntype{N}{>{\collectcell\num}c<{\endcollectcell}}
这大大减轻了制作表格的负担,并使它们在源文件中更具可读性。但是,当我制作带有一些标题行的表格时,我必须使用以下方式转义列命令(标题不必位于 内\num
)\multicolumn
:
\begin{tabular}{NN}
\hline
\multicolumn{1}{c}{Header 1} & \multicolumn{1}{c}{Header 2}\\
\hline
1.234 & 2.345\\
....
\end{tabular}
有没有更快的方法?也许通过重新定义中间表中的列类型,或者使用生成转义行的命令?
答案1
一种方法是使用在标题完成时启用的开关。检查此开关以查看是否要应用列宏。标题完成后,\EndTableHeader
需要调用。
在下面的测试中,N
列类型将红色应用于每个单元格,结果为:
\begin{tabular}{NN}
\hline
Header 1 & Header 1\EndTableHeader\\
\hline
1.234 & 2.345\\
\end{tabular}
标题列不是用红色排版的:
笔记:
- 这里的解决方案使用了包
\newtoggle
中的etoolbox
,因为我发现该语法更具可读性。这可以适用于评估条件的许多其他选项。 - 我在定义切换按钮时对其进行了初始化。这样做也许可以解决问题,但我更喜欢在定义时初始化变量。
- 表格的开始和结束都设置为重置切换。这是为了防止任何可能在表格外部应用的意外设置/重置,并且还允许在表格中间出现标题行的情况。
- 我确信
%
在序言的末尾有一些不必要的内容,但我发现将它们添加到我的序言中比弄清楚它们是否必要更安全
代码:
\documentclass{article}
\usepackage{collcell}
\usepackage{xcolor}% only needed for testing
\usepackage{etoolbox}
\newtoggle{inTableHeader}% Track if still in header of table
\toggletrue{inTableHeader}% Set initial value
\newcommand*{\StartTableHeader}{\global\toggletrue{inTableHeader}}%
\newcommand*{\EndTableHeader}{\global\togglefalse{inTableHeader}}%
% Redefine tabular to initialize \StartTableHeader at start and end
\let\OldTabular\tabular%
\let\OldEndTabular\endtabular%
\renewenvironment{tabular}{\StartTableHeader\OldTabular}{\OldEndTabular\StartTableHeader}%
% Define the column type:
\newcommand*{\myColorCell}[1]{\iftoggle{inTableHeader}{#1}{\textcolor{red}{#1}}}%
\newcolumntype{N}{>{\collectcell\myColorCell}c<{\endcollectcell}}%
\begin{document}
\noindent
\begin{tabular}{NN}
\hline
Header 1 & Header 1\EndTableHeader\\
\hline
1.234 & 2.345\\
\end{tabular}
\bigskip\noindent
Check again to make sure that settings are correct at start of table:
\noindent
\begin{tabular}{NN}
\hline
Header 1 & Header 1\EndTableHeader\\
\hline
1.234 & 2.345\\
\end{tabular}
\end{document}