我正在尝试定义一个宏,它是命令的通用参数的小包装。该宏已展开,但命令未考虑该参数。
这个宏,\sp
用在了一个极端表里面,下面是代码和结果,注意虽然\sp
展开了,但是参数没有用到。我如何定义该宏来扩展为可用的参数?
% define macro \sp
\define\sp{[bottomframe=off]}
% table setup
\setupxtable[frame=off, bottomframe=on]
\starttext
\startxtable
\startxtablehead
\startxrow
\startxcell Head 1 \stopxcell
\startxcell Head 2 \stopxcell
\stopxrow
\stopxtablehead
\startxtablebody
\startxrow
\startxcell A1 \stopxcell
\startxcell \sp A2 \stopxcell
\stopxrow
\startxrow
\startxcell B1 \stopxcell
\startxcell \stopxcell
\stopxrow
\stopxtablebody
\stopxtable
\stoptext
答案1
当命令采用可选参数时,ConTeXt 总是检查命令后的下一个字符是否是,而[
您的示例中并非如此。
\sp
要将隐藏在命令中的参数传递给,\startxcell
您必须使\sp
命令可扩展,可以使用 来完成\defineexpandable
。下一步是扩展\sp
可以使用 来完成的内容\expanded
。
\defineexpandable\sp{[bottomframe=off]}
\starttext
\startxtable
\startxrow
\startxcell Cell 1 \stopxcell
\expanded{\startxcell \sp Cell 2 \stopxcell}
\stopxrow
\stopxtable
\stoptext
将相同参数多次传递的更好解决方案xtable
是创建一个命名设置并将名称作为参数传递给\startxcell
命令。
\setupxtable [sp] [bottomframe=off]
\starttext
\startxtable
\startxrow
\startxcell Cell 1 \stopxcell
\startxcell [sp] Cell 2 \stopxcell
\stopxrow
\stopxtable
\stoptext
答案2
我认为没有 \sp 的定义可以做到这一点。您需要 \startxcell 的一个变体来扩展以下命令一次:
\define\sp{[bottomframe=off]}
\define\startxcello{\expandafter \startxcell }
% table setup
\setupxtable[frame=off, bottomframe=on]
\starttext
\startxtable
\startxtablehead
\startxrow
\startxcell Head 1 \stopxcell
\startxcell Head 2 \stopxcell
\stopxrow
\stopxtablehead
\startxtablebody
\startxrow
\startxcell A1 \stopxcell
\startxcello \sp A2 \stopxcell
\stopxrow
\startxrow
\startxcell B1 \stopxcell
\startxcell [bottomframe=off] B2 \stopxcell
\stopxrow
\stopxtablebody
\stopxtable
\stoptext