我想测试表格中是否调用了某个宏。
MWE 说明了这一点。但结果总是“否”。
如何在不改变宏的情况下实现我想要的\Cl
(这只是一个简化的例子)?
\documentclass{article}
\usepackage{collcell}
\newcolumntype{P}{>{\collectcell\foo}c<{\endcollectcell}}
\def\foo#1{\ifx#1\Cl Yes\else No\fi}
\def\Cl{\textbf{Cl}}
\begin{document}
\begin{tabular}{cPc}
a & b & c\\
d & \Cl & d\\
\end{tabular}
\end{document}
答案1
宏\foo
永远看不到\Cl
。原因是当对齐单元开始时,TeX 会扩展标记以查找所基于的\omit
(原始元素) 。\multicolumn
\foo
传递给第二行的实际参数是\protect\textbf•{Cl}
(项目符号表示宏名称中的空格):\Cl
扩展一次为\textbf{Cl}
并\textbf{Cl}
扩展为\protect\textbf•{Cl}
;由于这里\protect
等同于\relax
,搜索停止,但对于\foo
看到真实的东西来说已经太晚了。
只需保护你的\Cl
宏。
\documentclass{article}
\usepackage{collcell}
\usepackage{etoolbox}
\newcolumntype{P}{>{\collectcell\foo}c<{\endcollectcell}}
\newcommand\foo[1]{\ifx#1\Cl Yes\else No\fi}
% we don't want \Cl gets expanded when looking for \omit
\newrobustcmd\Cl{\textbf{Cl}}
\begin{document}
\begin{tabular}{cPc}
a & b & c\\
d & \Cl & d\\
\end{tabular}
\end{document}