使用 \catcode`_=12 下划线 hack 和 hyperref 时重复出现“标签可能已更改”

使用 \catcode`_=12 下划线 hack 和 hyperref 时重复出现“标签可能已更改”

尽管输出文件没有改变,但此 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

请注意,我也遇到过带有上标的方程式的问题(不太可重复)。因此 ^ 的情况也是如此。我不知道为什么这似乎需要重置数学代码,而 _ 的情况则不需要。可能应该在两者中都包含它。

相关内容