如果有以下 ConTeXt 宏:
\def\tableHeader#1 {%
\start
\setupTABLE[frame=on,offset=1mm]
\setupTABLE[c][1][width=0.25\textwidth]
\setupTABLE[c][2][width=0.75\textwidth]
\bTABLE
\bTR
\bTH[nc=2] #1 \eTH
\eTR
}
\def\tableFooter {%
\eTABLE
\stop
}
\def\tableItem#1#2 {%
\bTR
\bTD #1 \eTD
\bTD #2 \eTD
\eTR
}
如何使用 '[\w ]+' 作为第二个参数来调用此宏?即:
\tableHeader{Example}
\tableItem{Regex}{[\w ]+}
\tableFooter
答案1
在这里,您要确保[
不会被视为参数的开头\bTD
。为此,最简单的方法是插入\relax
。当您制作宏的这一部分时,我会在定义中执行此操作,而不是每次传递参数时都执行此操作
\def\tableItem#1#2 {%
\bTR
\bTD\relax #1 \eTD
\bTD\relax #2 \eTD
\eTR
}
\starttext
\bTABLE
\tableItem{Regex}{[\string\w\space]+}
\eTABLE
\stoptext
我怀疑你想要类似的东西
\tableItem{Regex}{\type{[\w ]+}}
\relax
这样可以避免在这种情况下需要,因为\type
也会停止对的扫描[
,但无论如何最好还是保留\relax
。
使用编辑问题的工作示例:注意\w
必须以某种方式将其制成字符串
\def\tableHeader#1 {%
\start
\setupTABLE[frame=on,offset=1mm]
\setupTABLE[c][1][width=0.25\textwidth]
\setupTABLE[c][2][width=0.75\textwidth]
\bTABLE
\bTR
\bTH[nc=2] #1 \eTH
\eTR
}
\def\tableFooter {%
\eTABLE
\stop
}
\def\tableItem#1#2 {%
\bTR
\bTD\relax #1 \eTD
\bTD\relax #2 \eTD
\eTR
}
\starttext
\tableHeader{Example}
\tableItem{Regex}{[\string\w\space]+}
\tableFooter
\stoptext
答案2
如果您确实只想输入[\w ]+
,您可以更改 catcode 表以使其\
不再是特殊字符。
一种方法是使用\tbacatcodes
catcode 表(在 中定义),该表仅设置和catc-ctx.mkiv
的正常 catcode ;其他所有内容,包括has catcode 。请注意,这意味着您不能在 的参数中使用 unmatched和。{
}
\
other
{
}
\tableItem
在此过程中,我还对您的代码做了一些风格上的更改:
- 使用设置来设置表格样式
- 使用
\define
而不是\def
。请记住,空格在 TeX 中很重要,因此\def\tableItem#1#2 {
与 不同\def\tableItem#1#2{
。
完整代码如下
\startsetups regex-table
\setupTABLE[frame=on,offset=1mm]
\setupTABLE[c][1][width=0.25\textwidth]
\setupTABLE[c][2][width=0.75\textwidth]
\stopsetups
\define[1]\tableHeader
{\bTABLE[setups=regex-table]
\bTR
\bTH[nc=2] #1 \eTH
\eTR}
\define\tableFooter{\eTABLE}
\define\tableItem
{\pushcatcodetable
\setcatcodetable\tpacatcodes
\doTableItem}
\define[2]\doTableItem
{\bTR
\bTD\relax #1 \eTD
\bTD\relax #2 \eTD
\eTR
\popcatcodetable}
\starttext
\tableHeader{Example}
\tableItem{Regex}{[\w ]+}
\tableFooter
\stoptext