如何防止 accsupp 和 hyperref 之间发生冲突?

如何防止 accsupp 和 hyperref 之间发生冲突?

这个问题与问题的答案有关是否有一个 LaTeX 技巧可以防止 PDF 查看器复制行号?

除非你关闭hyperref,否则以下 MWE

\documentclass{article}

\usepackage{listings}
\usepackage{accsupp}
\renewcommand*{\thelstnumber}{\protect\BeginAccSupp{ActualText={}}\arabic{lstnumber}\protect\EndAccSupp{}}

\lstset
{
    language={[LaTeX]TeX},
    numbers=left,
    columns=flexible,
}

\usepackage{hyperref}

\begin{document}

\begin{lstlisting}
Hello\\
Universe!
\end{lstlisting}

\end{document}

无法编译,错误信息如下:

在此处输入图片描述

如何防止accsupp和之间发生冲突hyperref

答案1

我会避免\thelstnumber以这种方式重新定义。该命令可用于各种地方,这些地方的脆弱内容很容易被破坏。对于列表,我建议改用键numberstyle

\documentclass{article}

\usepackage{listings}
\usepackage{accsupp}

\newcommand\emptyaccsupp[1]{\BeginAccSupp{ActualText={}}#1\EndAccSupp{}}

\lstset
{
    language={[LaTeX]TeX},
    numbers=left,
    columns=flexible,
    numberstyle=\emptyaccsupp
}

\usepackage{hyperref}

\begin{document}

\begin{lstlisting}
Hello\\
Universe!
\end{lstlisting}

\end{document}

答案2

似乎在未正确设置的上下文(例如普通的)中hyperref扩展了,从而破坏了脆弱的代码。您可以通过定义由使用的来修复此问题。此宏显然是在文档开头设置的,因此您需要在之后重新定义它。请注意,原始定义还包括一个前导,您可能也想添加它。\thelstnumber\protect\edef\theHlstnumberhyperrefhyperref\ifx \lst@@caption \@empty \lst@neglisting \else \thelstlisting \fi

\documentclass{article}

\usepackage{listings}
\usepackage{accsupp}
\renewcommand*{\thelstnumber}{\protect\BeginAccSupp{ActualText={}}\arabic{lstnumber}\protect\EndAccSupp{}}

\lstset
{
    language={[LaTeX]TeX},
    numbers=left,
    columns=flexible,
}

\usepackage{hyperref}
\AtBeginDocument{\renewcommand*{\theHlstnumber}{\arabic{lstnumber}}}% or manually put it after `\begin{document}`
\begin{document}
\begin{lstlisting}
Hello\\
Universe!
\end{lstlisting}
\end{document}

相关内容