表格标题行:如何忽略列类型?

表格标题行:如何忽略列类型?

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}

相关内容