\newcolumntype 不会对重新定义原始类型的列发出任何警告

\newcolumntype 不会对重新定义原始类型的列发出任何警告

使用代码

\documentclass{article}
\usepackage{array}
\begin{document}
\newcolumntype{c}{l}
$\begin{array}{cc}
a+b+c & a \\
d & e 
\end{array}$
\end{document}

我期望对列的原始类型的重新定义产生警告c

事实上,在array.sty(版本 2.4k 2018-12-30)中我们在第 241 行有一些处理此类警告的代码。

\def\newcolumntype#1{%
  \edef\NC@char{\string#1}%
  \@ifundefined{NC@find@\NC@char}%
    {\@tfor\next:=<>clrmbp@!|\do{\if\noexpand\next\NC@char
        \PackageWarning{array}%
                       {Redefining primitive column \NC@char}\fi}%
     \NC@list\expandafter{\the\NC@list\NC@do#1}}%
    {\PackageWarning{array}{Column \NC@char\space is already defined}}%

第四行\noexpand对我来说似乎很奇怪。

答案1

它原本

\if\next\NC@char

但它被改为

\if\noexpand\next\NC@char

我认为预期的改变是

\if\expandafter\noexpand\next\NC@char

以防止在某些语言设置中激活array包之后再加载该包。!

这个改变是错误的,但早在 1994 年 3 月就已做出,而且之前没有人报告过……

相关内容