我最近从 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 补丁中关于稳健性的变化有关,但我没有发现任何明显的问题。