在 {tabu} 中使用 \collectcell

在 {tabu} 中使用 \collectcell

我有一个包含表格的文档,其中我根据某些单元格的内容自动创建交叉引用。为此,我使用collcell包将单元格内容传递给宏。

我目前正在使用tabular(带有array)和tabularx,但我想将其中一些表移动到tabu。不幸的是,tabu\collectcell不能很好地协同工作。MNWE(我通过简单地使用来替换链接自动化\meaning以显示正在发生的事情):

\documentclass{standalone}
\usepackage{collcell}
\usepackage{tabu}
\usepackage{tabularx}

\def\showmeaning#1->#2.{#2}
\newcommand{\linkify}[1]{\def\linkifycontent{#1}\expandafter\showmeaning\meaning\linkifycontent.}
\newcolumntype{t}{>{\ttfamily}l}
\newcolumntype{T}{>{\collectcell{\linkify}}t<{\endcollectcell}}
\newcolumntype{U}{>{\ttfamily\collectcell{\linkify}}l<{\endcollectcell}}

\begin{document}

\begin{tabularx}{6em}{TU}
  foo & bar \\
\end{tabularx}
\qquad
\begin{tabu}{TU}
  foo & bar \\
\end{tabu}

\end{document}

输出:

禁忌-collcell.pdf

使用tabulartabularx\collectcell捕获单元格的内容。但使用tabu,它还会捕获在单元格内容之前插入的标记,包括\tabu@cellleft由 自动插入的标记tabu

我可以用什么\collectcell来替换我的列定义以便只捕获单元格内容?

我想保留在禁忌和非禁忌环境中都能工作的列定义,因为我会同时使用这两种环境。我不能只根据环境名称做出决定,因为我定义了一些包装器,tabularx并且使用了tabu包中的其他环境(longtabu这是我转向的原因之一tabu)。

理想情况下,我希望继续能够嵌套列类型定义(就像我现在T使用一样t,并且\ttfamily不会最终出现在收集的单元格内容中),但如果真的需要,我可以安排始终将其放在内置collectcell列类型的最内层(l,,,...)。Xp

答案1

新的 LaTeX3 软件包tabularray是过时软件包的替代品tabu。您可以将cmd选项用于带有环境的单元格、行或列tblr

\documentclass{article}

\usepackage{tabularray}

\def\showmeaning#1->#2.{#2}
\newcommand{\linkify}[1]{\def\linkifycontent{#1}\expandafter\showmeaning\meaning\linkifycontent.}

\NewColumnType{T}{X[font=\sffamily,t,cmd=\linkify]}
\NewColumnType{U}{X[font=\ttfamily,l,cmd=\linkify]}

\begin{document}

\begin{tblr}{TU}
 \hline
  foo & bar \\
 \hline
\end{tblr}

\end{document}

在此处输入图片描述

答案2

事实证明,这不需要太多代码。重写\collectcell以读取到 的所有内容\tabu@cellleft,然后调用原始\collectcell。用于\tabu@ifenvir检查当前环境是tabu还是longtabu

\let\collectcell@notabu\collectcell
\def\collectcell@intabu#1#2\tabu@cellleft{#2\tabu@cellleft\collectcell@notabu{#1}}
\def\collectcell{\tabu@ifenvir\collectcell@intabu\collectcell@notabu}

相关内容