![minted 的列表环境与 hyperref 和 caption 包一起](https://linux22.com/image/237469/minted%20%E7%9A%84%E5%88%97%E8%A1%A8%E7%8E%AF%E5%A2%83%E4%B8%8E%20hyperref%20%E5%92%8C%20caption%20%E5%8C%85%E4%B8%80%E8%B5%B7.png)
我用铸造包用于代码高亮。我使用它的列表环境。
我还使用 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 包时都会发生问题。以下情况就是这种情况:
hyperref 包将被加载。它不会检测 float 包(因为 float 包尚未加载),因此它不会修补 float 包代码。
将加载 minted 包,它将加载 float 包,并执行
\newfloat
。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