尽管输出文件没有改变,但此 MWE 会重复发出Label(s) may have changed
警告。同样的问题已在如何诊断永久的“标签可能已更改”警告?,但缺少 MWE 只能从症状上解决(通过从 中删除下划线\caption
)。现在,我不想从标题中删除下划线。
\documentclass{article}
\usepackage{hyperref}
\AtBeginDocument{
\catcode`_=12
\begingroup\lccode`~=`_
\lowercase{\endgroup\let~}\sb
\mathcode`_="8000
}
\begin{document}
\begin{figure}
\caption{$x_y$}
\label{z}
\end{figure}
\end{document}
更简单的 MWE:
\documentclass{article}
\usepackage{hyperref}
\begin{document}
\catcode`_=12
\begin{figure}
\caption{$x_y$}
\label{z}
\end{figure}
\end{document}
一些背景知识:我使用
\catcode`_=12
在讨论(和 egreg 的回答)之后进行 hack文本模式与数学模式下的下划线,其中包括允许在 DOI 和bibtex
键中使用下划线。但它似乎会干扰超链接和标题。
我能做些什么?
答案1
这应该可以解决问题。在文档开头读取文件_
时,将具有正确的类别代码.aux
。我认为问题在于hyperref
加载时“过早”地获取参数。
\documentclass{article}
\usepackage{hyperref}
\makeatletter
\AtBeginDocument{
\catcode`_=12
\begingroup\lccode`~=`_
\lowercase{\endgroup\let~}\sb
\mathcode`_="8000
\immediate\write\@auxout{\catcode`_=12 }
}
\makeatother
\begin{document}
\begin{figure}
\caption{$x_y$}
\label{z}
\end{figure}
\end{document}
答案2
实际上唯一需要的似乎就是序言
\makeatletter
\AtBeginDocument{
\catcode`_=12
\begingroup\lccode`~=`_
\lowercase{\endgroup\let~}\sb
\immediate\write\@auxout{\catcode`_=12 }
\catcode`^=12
\begingroup\lccode`~=`^
\lowercase{\endgroup\let~}\sp
\mathcode`^="8000
\immediate\write\@auxout{\catcode`^=12 }
}
\makeatother
请注意,我也遇到过带有上标的方程式的问题(不太可重复)。因此 ^ 的情况也是如此。我不知道为什么这似乎需要重置数学代码,而 _ 的情况则不需要。可能应该在两者中都包含它。