为什么 ConTeXt 使用 \NC..\NR 而不是 &..\cr?

为什么 ConTeXt 使用 \NC..\NR 而不是 &..\cr?

当 Knuth 提出 catcode 表时,他将字符专用&于 catcode 4,即对齐制表符。人们很少会更改这些默认 catcode,我想大多数用户已经习惯于通过使用 来表示对齐点来排版制表材料&纯 TeX用户类型

\halign{\hfil#\hfil&\hfil#\hfil\cr
  A & B \cr
  C & D \cr
}
\bye

乳胶用户享受简化的表格界面

\documentclass{article}
\begin{document}
\begin{tabular}{cc}
  A & B \\
  C & D \\
\end{tabular}
\end{document}

但在语境MkIV 有一个

\starttext
\starttabulate[|c|c|]
  \NC A \NC B \NR
  \NC C \NC D \NR
\stoptabulate
\stoptext

我不知道为什么,因为\NC..\NR要输入的标记比 还多,尤其是在行首&..\cr有多余的,在我看来,这会使源代码的可读性降低。我还注意到ConTeXt 文档中的 catcode 为 12(其他)。\NC&

但是,所有事物的存在都是有原因的,所以问题是:为什么 ConTeXt 选择使用\NC..\NR而不是 ,&..\cr以及为什么 catcode 是&12?

答案1

\NC我不知道 Hans Hagen 最初使用的原因是什么&。在原文中table宏,还有\VL用于“钩”列的垂直规则\HC等。所以,也许它被引入是为了具有一致的语法。

但我发现它非常有用,因为它可以将内容和样式清晰地分开。而且,我不介意多敲几个键,因为过一段时间它就会变成肌肉记忆:Shift \ n c <release Shift>。让我通过几个例子来说明我所说的内容和样式分离的含义:

  1. 跨越行和列. 如何创建下表?

    在此处输入图片描述

    在 LaTeX 中,您可以创建多列,然后在其中创建多行。与 ConTeXt 代码进行对比:

    \starttext
      \startTABLE
        \NC[nx=2,ny=2] A big cell \NC A \NC B \NC \NR
                                  \NC C \NC D \NC \NR
        \NC E     \NC   F         \NC G \NC H \NC \NR
      \stopTABLE
    \stoptext
    

    因为\NC它是一个宏(而不是一个原始的),所以它可以直接采用可选参数。

  2. 内容与呈现分离假设我想要一个表格,第一行前后有规则,最后一行后面有规则,并且第一行的内容以粗体显示(这是一种常见的表格格式)。

    在此处输入图片描述

    在 LaTeX 中,您需要手动在第一行的每个元素周围添加\toprule\midrule和添加\textbf。在 ConTeXt 中,您可以执行以下操作:

    \startsetups standard
      \setupTABLE[frame=off]
      \setupTABLE[row][first][style=bold]
      \setupTABLE[row][first][topframe=on, rulethickness=2pt]
      \setupTABLE[row][2][topframe=on, rulethickness=1pt]
      \setupTABLE[row][last][bottomframe=on, rulethickness=1.5pt]
    \stopsetups
    
    \starttext
      \startTABLE[setups={standard}]
        \NC 1st header \NC 2nd header \NC 3rd header \NC \NR
        \NC value      \NC value      \NC value      \NC \NR
        \NC value      \NC value      \NC value      \NC \NR
        \NC value      \NC value      \NC value      \NC \NR
        \NC value      \NC value      \NC value      \NC \NR
      \stopTABLE
    \stoptext
    

    现在假设,你的老板说他想要像 Word 那样的精美表格。

    在此处输入图片描述

    好吧,你只需要一个新的设置,然后你就可以了:

    \definecolor[blue][b=0.8]
    \startsetups uglytable
      \setupTABLE[frame=off, framecolor=blue]
      \setupTABLE[row][first][style=bold, color=white, background=color, backgroundcolor=blue]
      \setupTABLE[column][first][leftframe=on]
      \setupTABLE[column][last][rightframe=on]
      \setupTABLE[row][last][bottomframe=on]
    \stopsetups
    

    再次强调,在幕后,这种机制依赖于\NC宏而不是原语的事实。

当然,无需引入任何新宏即可实现这一点:tikztables 执行类似操作,并将其保留&为列分隔符。但是,如果我没记错的话,tikz矩阵内部&是一个活动字符,然后会映射到宏;这会带来活动字符的所有常见麻烦。在 ConTeXt 中,人们倾向于尽可能避免使用活动字符。

相关内容