问题的描述
用 listings 包排版源代码时通常为了便于说明,会显示代码的行号,但是,我们在文档复制的时候却发现,复制代码的时候,同时会把行号也复制出来了,如下:
我们想实现如下的复制,更便于读者提取文档中的源代码进行相关测试。
一次尝试
LaTeX studio 提供了一个解决方案。但是该方案是有问题的,因为 \thelstnumber 在很多地方都要用到,所以直接重定义这个宏是很危险的——比如,无法和 hyperref 宏包一起使用。下面的测试代码说明了这个问题:
1 2 3 4 5 6 7 8 9 10 11 12 13
| \documentclass{minimal} \usepackage{hyperref} \usepackage{listings} \usepackage{accsupp} \renewcommand{\thelstnumber}{ \protect\BeginAccSupp{ActualText={}}\arabic{lstnumber}\protect\EndAccSupp{} } \lstset{numbers = left} \begin{document} \begin{lstlisting} \foo \end{lstlisting} \end{document}
|
最终的解决
更健壮的办法,可以定义一个新的命令,然后用 listings 宏包的 numberstyle 选项来加载这一命令,如下
1 2 3 4 5 6 7 8 9 10 11
| \documentclass{minimal} \usepackage{hyperref} \usepackage{listings} \usepackage{accsupp} \newcommand\emptyaccsupp[1]{\BeginAccSupp{ActualText={}}#1\EndAccSupp{}} \lstset{numbers = left, numberstyle=\emptyaccsupp} \begin{document} \begin{lstlisting} \foo \end{lstlisting} \end{document}
|