删除列的最简单方法?

删除列的最简单方法?

我有一组 10 个表,每个表都有一个我不想要的额外列。具体来说,这些表是 phpMyAdmin 导出的数据库表的描述,它们都有一个我想删除的“MIME”列。除了使用字符串操作/查找和替换之外,还有其他方法可以做到这一点吗?

我已尝试将列设置为p{0in},但列标题仍然保留。

答案1

\documentclass[a4paper]{article}
\usepackage{array}
\newcolumntype{H}{>{\setbox0=\hbox\bgroup}c<{\egroup}@{}}

\begin{document}
\begin{tabular}{ccHc}
one & two & hide & three\\
1 & 2 & H & 3
\end{tabular}

\begin{tabular}{ccc}
one & two & three\\
1 & 2 &  3
\end{tabular}

\end{document}

第二个表格显示了相同的结果。基本上,我们设置了一个没有列间空间的列,其内容被\setbox0=\hbox{<entry>}

对于最后一列,您需要修复最后的填充,例如使用

\begin{tabular}{ccH@{\hspace*{-\tabcolsep}}}

示例代码

\documentclass[a4paper]{article}
\usepackage{array}
\newcolumntype{H}{>{\setbox0=\hbox\bgroup}c<{\egroup}@{}}
\newcolumntype{Z}{>{\setbox0=\hbox\bgroup}c<{\egroup}@{\hspace*{-\tabcolsep}}}

\begin{document}

\fbox{\begin{tabular}{ccHc}
one & two & hide & three\\
1 & 2 & H & 3
\end{tabular}}

\fbox{\begin{tabular}{ccc}
one & two & three\\
1 & 2 &  3
\end{tabular}}

\fbox{\begin{tabular}{ccH@{\hspace*{-\tabcolsep}}}
one & two & hide \\
1 & 2 & H
\end{tabular}}

\fbox{\begin{tabular}{ccZ}
one & two & hide \\
1 & 2 & H
\end{tabular}}

\fbox{\begin{tabular}{cc}
one & two \\
1 & 2
\end{tabular}}

\end{document}

在此处输入图片描述

答案2

egreg 的解决方案很好。它将单元格内容排版在一个框中,然后将其丢弃。单元格中的所有代码都会被执行和排版。还有两种替代方案,为了完整起见,我在这里列出。

首先,您可以使用collcell包来收集单元格内容,然后将其提供给宏,宏会简单地丢弃它。\@gobble宏会执行此操作。此方法不会执行或排版单元格内容,但需要扫描每个标记。它可能比使用依赖于内容的框更快或更慢。

另一种方法是插入一个宏,该宏读取\unskip每个单元格后面插入的下一个单元格(行的最后一列除外)之前的所有内容。单元格内容在\unskip里面\\,宏看不到。这种方法速度最快,除了 TeX 解析器的参数扫描外,不会执行、排版或检查单元格内容。

对于小型蜂窝来说,速度差异并不重要。

\documentclass[a4paper]{article}

\usepackage{collcell}
\makeatletter
\newcolumntype{G}{>{\collectcell\@gobble}c<{\endcollectcell}@{}}
\makeatother
% Fastest. Does not work in the last column.
\def\eatcell#1\unskip{}
\newcolumntype{E}{>{\eatcell}c@{}}

\begin{document}
\begin{tabular}{ccGc}
one & two & hide & three\\
1 & 2 & H & 3
\end{tabular}

\begin{tabular}{ccEc}
one & two & hide & three\\
1 & 2 & H & 3
\end{tabular}

\begin{tabular}{ccc}
one & two & three\\
1 & 2 &  3
\end{tabular}

\end{document}

答案3

简而言之:

\usepackage{array}
\newcolumntype{H}{>{\iffalse}c<{\fi}@{}}

可以通过更改列类型或更改\iffalse\iftrue

答案4

举个tabularray例子,如果tabularray要求等价(实际上已经要求过一次了lvjr/tabularray#451)。

请注意,类似定义的H列类型不适用于vlines内部键。

理论上tabularray可以做得更好。由于表格主体(又称环境内容)在排版之前被拆分,然后以每个单元格为基础进行存储,因此确实存在内部状态,此时可以真正从结构上操纵表格。但随后对行号和列号的所有引用都会受到映射的影响。

\documentclass{article}
\usepackage{tabularray}

\NewColumnType{H}{Q[cmd={\setbox0=\vbox}, colsep=0pt]}

\begin{document}
\setlength{\rulewidth}{3pt} % enlarge \rulewidth to emphasis the difference

\begin{tblr}{
  hlines, vline{1,Z},
    colspec={lHl}
}
  One & Hide & Two \\
  One & XXXX & Two \\
\end{tblr}

\begin{tblr}{
  hlines, vline{1,Z},
    colspec={ll}
}
  One & Two \\
  One & Two \\
\end{tblr}
\end{document}

在此处输入图片描述

相关内容