防止索引中 \! 的错误扩展

防止索引中 \! 的错误扩展

我最近从 texlive-2019 升级到 texlive-2020,我的索引命令坏了。

相关代码为:

\newcommand{\BasisChange}[2]{[#2\!\leftarrow\!#1]}

A change of basis matrix\index{$\BasisChange{\mathcal A}{\mathcal B}$}.

在 texlive-2019 中,这将在我的.ind文件中生成一个条目

  \item {$[\mathcal  B\tmspace  -\thinmuskip {.1667em}\leftarrow \tmspace  -\thinmuskip {.1667em}\mathcal  A]$}, 
        161

而在 texlive-2020 中,它生成

  \item $[\mathcal  B\
    \subitem \leftarrow \
      \subsubitem \mathcal  A]$, 161

似乎\!被解释为子项的开始。

有什么办法可以让我恢复旧的行为或“保护”我的数学命令以免\!被误解?

答案1

这里发生的事情是,当宏的内容写入文件时,宏会被扩展,然后.idx你会得到一个条目

\indexentry{$\mathcal B\!\leftarrow\!\mathcal A$}

(您对事物的定义还存在其他问题。请尝试举例说明\BasisChange{A}{\mathcal B}。)

感叹号被解释为子项。我认为只需将索引命令更改为

\index{B-A@\BasisChange{A}{B}}

将解决问题,因为@如果我没记错的话,makeindex 不应该解析过去的子条目。

编辑:再深入一点,这行不通。你可以试试

\index{B-A@{A}{B}|BasisChange}

但我还未检查过。结束编辑

放在\protect前面\BasisChange也应该有效,如果你的文档中有很多这样的内容,你可以使用\DeclareRobustCommand(实际上,可能\DeclareRobustCommand*会更好)来代替,\newcommand这样你就可以\protect自动获得离子。

至于为什么更新会导致这个问题,我粗略地搜索了 git 历史记录,看起来它可能与 2019 年 LaTeX 补丁中关于稳健性的变化有关,但我没有发现任何明显的问题。

相关内容