![\newcolumntype 不会对重新定义原始类型的列发出任何警告](https://linux22.com/image/398349/%5Cnewcolumntype%20%E4%B8%8D%E4%BC%9A%E5%AF%B9%E9%87%8D%E6%96%B0%E5%AE%9A%E4%B9%89%E5%8E%9F%E5%A7%8B%E7%B1%BB%E5%9E%8B%E7%9A%84%E5%88%97%E5%8F%91%E5%87%BA%E4%BB%BB%E4%BD%95%E8%AD%A6%E5%91%8A.png)
使用代码
\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 月就已做出,而且之前没有人报告过……