我有一个包含表格的文档,其中我根据某些单元格的内容自动创建交叉引用。为此,我使用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}
输出:
使用tabular
或tabularx
,\collectcell
捕获单元格的内容。但使用tabu
,它还会捕获在单元格内容之前插入的标记,包括\tabu@cellleft
由 自动插入的标记tabu
。
我可以用什么\collectcell
来替换我的列定义以便只捕获单元格内容?
我想保留在禁忌和非禁忌环境中都能工作的列定义,因为我会同时使用这两种环境。我不能只根据环境名称做出决定,因为我定义了一些包装器,tabularx
并且使用了tabu
包中的其他环境(longtabu
这是我转向的原因之一tabu
)。
理想情况下,我希望继续能够嵌套列类型定义(就像我现在T
使用一样t
,并且\ttfamily
不会最终出现在收集的单元格内容中),但如果真的需要,我可以安排始终将其放在内置collectcell
列类型的最内层(l
,,,...)。X
p
答案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}