tabularx 多次处理其主体;我怎么知道我处于哪个周期?

tabularx 多次处理其主体;我怎么知道我处于哪个周期?

假设我喜欢使用经过\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

相关内容