将宏定义为命令参数的包装器

将宏定义为命令参数的包装器

我正在尝试定义一个宏,它是命令的通用参数的小包装。该宏已展开,但命令未考虑该参数。

这个宏,\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

结果,<code>\sp</code> 已展开但未用作参数

答案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

在此处输入图片描述

相关内容