Tabu/Longtabu:条件列定义

Tabu/Longtabu:条件列定义

我想创建一个具有条件列数的 longtabu 表:在开发模式下,应显示 5 列。在最终版本中,仅应显示第一列和最后一列。

为了实现这一点,我定义了一个新的列类型“H”,它在输出中被抑制(在删除列的最简单方法?)。隐藏具有此列类型的列可以正常工作。

问题是:我无法有条件地在“H”列和“X”列之间切换。我想在我的 longtabu 表中使用不同的列定义,但它不起作用(错误:“对齐制表符放错位置”)。

如何让它工作?

\documentclass[]{scrreprt}

\usepackage{tabu, longtable}

% Create hidden column, see: https://tex.stackexchange.com/q/16604/
\usepackage{collcell}
\makeatletter
\newcolumntype{H}{>{\collectcell\@gobble}c<{\endcollectcell}@{}}
\makeatother
\tabucolumn H


% If defined, only show first and last column
%\def\MyOnlyShowFinalTable{\relax}


\begin{document}

\ifdefined\MyOnlyShowFinalTable
\begin{longtabu} to \textwidth { X[2.0,m,m] | H | H | H | X[7.0,m,m] }
\else
\begin{longtabu} to \textwidth { X[1.3,m,m] | X[0.8,m,m] | X[0.8,m,m] | X[0.8,m,m] | X[5.0,m,m] }
\fi
A & B & C & D & E\\
A & B & C & D & E\\
A & B & C & D & E\\
A & B & C & D & E\\
\end{longtabu}

\end{document}          

一些额外的信息:我发现,当使用“c”列而不是“X”列时有一些解决方法:

\documentclass[]{scrreprt}

\usepackage{tabu, longtable}


% If defined, only show first and last column
%\def\MyOnlyShowFinalTable{\relax}


\ifdefined\MyOnlyShowFinalTable
  % Create hidden column, see: https://tex.stackexchange.com/q/16604/
  \usepackage{collcell}
  \makeatletter
  \newcolumntype{H}{>{\collectcell\@gobble}c<{\endcollectcell}@{}}
  \makeatother
\else
  \newcolumntype H{c |}
\fi

\tabucolumn H


%\newcolumntype Y{c |}
%
%\tabucolumn Y

\begin{document}

\begin{longtabu} to \textwidth { X[1.3,m,m] | H H H X[5.0,m,m] }
A & B & C & D & E\\
A & B & C & D & E\\
A & B & C & D & E\\
A & B & C & D & E\\
\end{longtabu}

\end{document}          

但是,这仍然不是我想要的,因为它不允许我指定不同的列比率,并且强迫我使用“c”列。

不过,我想知道为什么这对“X”列不起作用?

答案1

问题在于,\fi在已经读取并构建了表序言的情况下才进行评估。

这是一个工作版本;该\condtabupreamble命令有四个参数:

  • 0 或 1 分别表示选择第三或第四个参数
  • 规范tabu
  • 带有“隐藏”列的列规范
  • “非隐藏”情况的完整列规范
\documentclass[paper=a4]{scrreprt}

\usepackage{tabu, longtable}

% Create hidden column, see: http://tex.stackexchange.com/q/16604/
\usepackage{collcell}
\makeatletter
\newcolumntype{H}{>{\collectcell\@gobble}c<{\endcollectcell}@{}}
\makeatother
\tabucolumn H

\makeatletter
\newcommand{\condtabupreamble}[4]{%
  \ifcase#1\relax
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi
  {#2 {#3}}
  {#2 {#4}}%
}
\makeatother

\begin{document}

\condtabupreamble{0}% 1 for the non hidden version
  {\begin{longtabu} to \textwidth}
  { | X[2.0,m] | H | H | H | X[7.0,m] | }
  { | X[1.3,m] | X[0.8,m] | X[0.8,m] | X[0.8,m] | X[5.0,m] | }
A & B & C & D & E\\
A & B & C & D & E\\
A & B & C & D & E\\
A & B & C & D & E\\
\end{longtabu}

\condtabupreamble{1}% 1 for the non hidden version
  {\begin{longtabu} to \textwidth}
  { | X[2.0,m] | H | H | H | X[7.0,m] | }
  { | X[1.3,m] | X[0.8,m] | X[0.8,m] | X[0.8,m] | X[5.0,m] | }
A & B & C & D & E\\
A & B & C & D & E\\
A & B & C & D & E\\
A & B & C & D & E\\
\end{longtabu}

\end{document}

在此处输入图片描述

相关内容