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
之外都可以工作。没有或没有 都可以工作。animate
hyperref
animate
listings
hyperref
可能相关:Hyperref 为列表添加垂直空间这让我想到,如果包之前 (?) 已加载,则listings
使用某些功能。包手册的第 5.3 节中描述了类似的内容。hyperref
listings
答案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}
自动化解决方案
环境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}