答案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
,它可以像复制命令