如何在 ConTeXt 中的宏调用中指定

如何在 ConTeXt 中的宏调用中指定

如果有以下 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 表以使其\不再是特殊字符。

一种方法是使用\tbacatcodescatcode 表(在 中定义),该表仅设置和catc-ctx.mkiv的正常 catcode ;其他所有内容,包括has catcode 。请注意,这意味着您不能在 的参数中使用 unmatched和。{}\other{}\tableItem

在此过程中,我还对您的代码做了一些风格上的更改:

  1. 使用设置来设置表格样式
  2. 使用\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

相关内容