TeXLive 2019 中与 \ne 相关有哪些变化?

TeXLive 2019 中与 \ne 相关有哪些变化?

是否发生了与\ne

TeXLive 2018 中的以下 MWE 产生预期的输出

在此处输入图片描述

但使用 TeXLive 2019(所有软件包都是截至今天最新的),我得到了

Argument of \ne  has an extra }.

代码

\documentclass{article}
\usepackage{mathtools}
\usepackage{xparse}

\let\OldNe\ne

\RenewDocumentCommand{\ne}{o}{%
    \mathrel{\OldNe}
}

\begin{document}
$a \ne b$
\end{document}

答案1

随着最新的 LaTeX 版本(2019 年 10 月)的发布,许多通常不应该扩展的命令都变得更加强大,因此\ne,通常是\not=,现在扩展为\protect\ne␣\ne␣\csname ne \endcsname)。

使用 时\let\OldNe\ne,当您的命令执行 时\mathrel{\OldNe}\OldNe会扩展为\protect\ne␣,并且现在\ne␣是一个由 分隔的宏],但}在此之前发现了 ,因此 TeX 会引发Argument of \ne has an extra }(请注意错误消息中的额外空格)。


通常情况下,这会起作用,因为\ne␣会扩展为\not=。但是,xparse使用命令\ne␣作为临时宏来获取的参数,\ne这样万一您在}某处忘记了,错误消息将显示一些有意义的内容:

Runaway argument?
[oops 
! Paragraph ended before \ne  was complete.
<to be read again> 
                   \par

(看到在抓取的参数时发生了错误\ne␣)而不是暴露一些xparse无法提供有关错误来源的线索的内部信息:

Runaway argument?
[oops 
! Paragraph ended before \__xparse_grab_delimited_argument_of_some_macro:w was complete.
<to be read again> 
                   \par

为了解决这个问题,暂时加载letltxmacro并使用\LetLtxMacro\OldNe\ne而不是\let\OldNe\ne\LetLtxMacro解决了\ne现在受保护的事实。 2020-10-01 版本中,LaTeX 内核将采用全新的\NewCommandCopy,其使用方式与\LetLtxMacro,它可以像复制命令

相关内容