minted 的列表环境与 hyperref 和 caption 包一起

minted 的列表环境与 hyperref 和 caption 包一起

我用铸造包用于代码高亮。我使用它的列表环境。

我还使用 hyperref 包来提供整个文档的链接:图表、列表等。

如果我导入标题包,列表链接将无法正常工作。它们会将您带到文档的开头。除列表链接外,所有其他链接均正常工作。

如果我不导入字幕包,所有链接都可以正常工作。

项目主页上有一个问题:与字幕包不兼容但它似乎指向一个编译问题。

有什么方法可以使这三个包协同工作?

编辑:

我整理了 Marco 的答案,它非常有效,所以我一直在思考它。我做了一些测试,得出的结论是它符合导入的顺序。以下是我的结果:

\documentclass{report}

% it's all in the order of the imports

% this works
\usepackage{caption}
\usepackage{minted}
\usepackage{hyperref}

% this works
%\usepackage{minted}
%\usepackage{hyperref}
%\usepackage{caption}

% this works
%\usepackage{minted}
%\usepackage{caption}
%\usepackage{hyperref}    

%this does not work
%\usepackage{hyperref}
%\usepackage{caption}
%\usepackage{minted}

%this does not work
%\usepackage{caption}
%\usepackage{hyperref}
%\usepackage{minted}

%this does not work
%\usepackage{hyperref}
%\usepackage{minted}
%\usepackage{caption}

% I'm thinking that if hyperref is imported before minted it doesn't work

%however this does work (not importing caption at all, yet hyperref is imported before minted)
%\usepackage{hyperref}
%\usepackage{minted}

\begin{document}

\chapter{test}

\clearpage

\begin{listing}[H] \mint{cl}/(car (cons 1 2))/
\caption{Example of a listing.}
\label{lst:example}
\end{listing}
\clearpage

Listing \ref{lst:example} contains an example of a listing.

\end{document}

所以,我的问题是......为什么会发生这种情况?

编辑2:

理论上,使用 \usepackage 加载包的顺序原则上并不重要。然而现实生活……

Hyperref 有一个令人讨厌的特性,就是它有时会与其他广泛使用的包放在一起时发生冲突,有时会放在一起时发生冲突

那么,将此归咎于 Hyperref 是否公平?

答案1

正如您已经发现的那样,每次在 minted 包之前加载 hyperref 包时都会发生问题。以下情况就是这种情况:

  1. hyperref 包将被加载。它不会检测 float 包(因为 float 包尚未加载),因此它不会修补 float 包代码。

  2. 将加载 minted 包,它将加载 float 包,并执行\newfloat

  3. caption 包将被加载。它确实检测到了 float 和 hyperref 包,并假设 float 包代码已由 hyperref 修补。但在这种情况下,这个假设是错误的。

因此,作为解决方案,您可以在 hyperref 包之前加载 float 包,在 hyperref 包之后加载 minted 包 - 顺便说一句,这无论如何都是正确的加载顺序,有关详细信息,请参阅 hyperref 的 README。

\documentclass{report}

% it's all in the order of the imports

% this one is the correct one:

% 1. Load the float package
\usepackage{float}

% 2. Load the hyperref package; hyperref will patch the float package
\usepackage{hyperref}

% 3. Load the minted package which will use the patched \newfloat now
\usepackage{minted}

% The load order of the caption package is (or should be) irrelevant now
\usepackage{caption}

\begin{document}

\chapter{test}

\clearpage

\begin{listing}[H] \mint{cl}/(car (cons 1 2))/
\caption{Example of a listing.}
\label{lst:example}
\end{listing}
\clearpage

Listing \ref{lst:example} contains an example of a listing.

\end{document}

答案2

我看不出有什么问题?

%pdflatex --shell-escape     
\documentclass{article}
\usepackage{caption}
\usepackage{minted}
\usepackage{hyperref}

\begin{document}
text
\clearpage
text \ref{verb:1}
\begin{listing}
\begin{minted}{xml}
<?xml version="1.0" encoding="UTF-8"?>
\end{minted}
\caption{test minted}\label{verb:1}
\end{listing}
text
\clearpage
text \ref{verb:1}
\end{document}

版本:

caption: v3.1m
minted: v1.7
hyperref: v6.82g

相关内容