我有一组 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}