hyperref、列表和动画之间的奇怪交互

hyperref、列表和动画之间的奇怪交互

listing我正在尝试在环境中使用。但是如果包已加载,animate我就无法做到这一点。hyperref

这是一个MWE,显然在实际应用中我需要hyperref文档的其他部分。有解决方法吗?hyperref例如某些选项?

\documentclass{article}
\usepackage{animate}
\usepackage{listings}
\usepackage{hyperref} % comment this line to make the example work
\begin{document}
\begin{animateinline}[autoplay, loop]{5}
\begin{lstlisting}
listing inside animate
\end{lstlisting}
\newframe
text in frame
\newframe
\end{animateinline}

\begin{lstlisting}
listing outside animate
\end{lstlisting}

\end{document}

错误是

! LuaTeX error (ext4): destinations cannot be inside an XForm.
<argument> ... resources {\the \pdfpageresources }\@anim@box 
                                                  \xdef \@anim@lastxform {\t...

该错误实际上是三个包之间的交互。在或没有listing之外都可以工作。没有或没有 都可以工作。animatehyperrefanimatelistingshyperref

可能相关:Hyperref 为列表添加垂直空间这让我想到,如果包之前 (?) 已加载,则listings使用某些功能。包手册的第 5.3 节中描述了类似的内容。hyperreflistings

答案1

问题是包animate必须使用XForm对象来显示注释流。pdfTeX 不允许使用由hyperref列表自动添加的目标。

一个解决方法是NoHyper使用包的环境hyperref,它会hyperref暂时禁用这些内容:

\documentclass{article}
\usepackage{hyperref}
\usepackage{animate}
\usepackage{listings}
\begin{document}

\begin{NoHyper} 
\begin{animateinline}[autoplay, loop]{5}
\begin{lstlisting}
listing inside animate
\end{lstlisting}
\newframe
text in frame
\newframe
\end{animateinline}
\end{NoHyper}

\begin{lstlisting}
listing outside animate
\end{lstlisting}
\end{document}

Result

自动化解决方案

环境NoHyper可以放入 environment 中animateinline。以下示例使用包etoolbox进行修补:

\documentclass{article}
\usepackage{hyperref}
\usepackage{animate}
\usepackage{listings}

\usepackage{etoolbox}
\pretocmd\animateinline{\NoHyper}{}{%
  \errmessage{Cannot patch \string\animateinline}%
}
\apptocmd\endanimateinline{\endNoHyper}{}{%
  \errmessage{Cannot patch \string\endanimateinline}%
}

\begin{document}
\begin{animateinline}[autoplay, loop]{1}
\begin{lstlisting}
listing inside animate
\end{lstlisting}
\newframe
text in frame
\newframe
\end{animateinline}

\begin{lstlisting}
listing outside animate
\end{lstlisting}
\end{document}

相关内容