假设我喜欢使用经过\item
授权的或类似列表的编码结构来设置表格:
\begin{mytabular}[.5\textwidth]
\item head1 & head2% <-- header row
\item abc & def
\item ghi & jkl
\end{mytabular}
我的想法是,始终将第一行作为标题行,后续行代表项目,因此上述输入应转换为以下输出:
\begin{tabularx}{.5\textwidth}{XX}
\toprule
head1 & head 2 \\% <-- header row
\midrule
abc & def \\
ghi & jkl \\
\bottomrule
\end{tabularx}
由于每行都由 标识\item
,因此可以使用 的适当重新定义\item
来判断我是否设置了标题。下面我使用了一些 的延迟重新定义\item
:
\documentclass{article}
\usepackage{tabularx,booktabs,environ}
\NewEnviron{mytabular}[1][\linewidth]{%
\let\olditem\item
\gdef\item{%
\gdef\item{%
\\\midrule\gdef\item{%
\\}}}
\begin{tabularx}{#1}{XX}
\toprule
\BODY \\
\bottomrule
\end{tabularx}
\let\item\olditem
}
\begin{document}
\noindent
\begin{mytabular}[.5\textwidth]
\item head1 & head2
\item abc & def
\item ghi & jkl
\end{mytabular}
\end{document}
目的是让第一个\item
什么都不做;第二个\item
应该变成\\ \midline
,并且每个后续都\item
应该变成\\
。然而,这永远不会发生:
事实证明,它tabularx
会多次处理自己的身体。有没有办法确定我处于哪个处理周期,以便确保采取适当的行动?上述问题类似于amsmath
\ifmeasuring@
在 型显示中的使用align
。
答案1
在试验过程中,tabularx 会做出各种局部定义来阻止事情多次发生,或者阻止您收到有关不良试验的坏框的多次警告。
尤其是
\hfuzz=\maxdimen
\let\hfuzz\@tempdima
(实际上没有=
),因此您在试验期间不会收到过满的水平盒警告。
在最后一次运行中,它会将所有这些恢复正常,以便您可以使用
\ifx\@tempdima\hfuzz
trial run
\else
final run
\fi
注意这需要是@
字母,或者你可以使用
\expandafter\ifx\csname @tempdima\endcsname\hfuzz