![是否有可能不复制使用 lstlisting 的编号?](https://linux22.com/image/379702/%E6%98%AF%E5%90%A6%E6%9C%89%E5%8F%AF%E8%83%BD%E4%B8%8D%E5%A4%8D%E5%88%B6%E4%BD%BF%E7%94%A8%20lstlisting%20%E7%9A%84%E7%BC%96%E5%8F%B7%EF%BC%9F.png)
请考虑以下 MWE:
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[spanish]{babel}
\usepackage{color}
\usepackage{enumitem}
\usepackage{listings}
\definecolor{codegreen}{rgb}{0,0.6,0}
\definecolor{codegray}{rgb}{0.5,0.5,0.5}
\definecolor{codepurple}{rgb}{0.58,0,0.82}
\definecolor{backcolour}{rgb}{0.95,0.95,0.92}
\lstset {%
backgroundcolor=\color{backcolour},
commentstyle=\color{codegreen},
keywordstyle=\color{magenta},
stringstyle=\color{codepurple},
basicstyle=\scriptsize,
breakatwhitespace=false,
breaklines=true,
captionpos=b,
keepspaces=true,
numbers=left,
numbersep=5pt,
showspaces=false,
showstringspaces=false,
showtabs=false,
tabsize=2,
%columns=fullflexible,
keepspaces=true,
language=C++,
columns=flexible,
%numberstyle=\noncopynumber % 1. If this line is only uncommented it produces 6 errors
%numberstyle=\tiny\color{codegray} % 2. If this line is only uncommented it compiles
%numberstyle=\tiny\color{codegray}\noncopynumber % 3. If this line is only uncommented it produces 6 errors
}
%\newcommand{\noncopynumber}[1]{% % Answer
%\BeginAccSupp{method=escape,ActualText={}}%
%#1%
%\EndAccSupp{}%
%}
%\makeatletter % Answer
%\def\lst@outputspace{{\ifx\lst@bkgcolor\empty\color{white}\else\lst@bkgcolor\fi\lst@visiblespace}}
%\makeatother
\begin{document}
\begin{lstlisting}
Example code line 1
*
... and 3
\end{lstlisting}
\end{document}
当我使用其进行编译时,LaTeX->PS->PDF
输出非常奇特:
但是,当我要复制文本并将其粘贴到编译器(或其他任何地方)时:
我尝试过Martin Scharrer 解决方案有不同的选择:
(建议来自技术解答)
正如你所看到的,问题在于参考编号(1
,2
和3
)已复制即使使用建议的解决方案,也可以从 PDF 转换为任何文本编辑器。
我也看看这里,这里和这里但它对我来说也不起作用(顺便说一下,请检查解决方案)。
我有整个文档的全部代码。
这个问题有简单的解决办法吗?
谢谢!
编辑: TeXnician 的解决方案对我来说,只要我保持PDF
文件保存在我的电脑上就可以无需通过互联网分享。但是,当我尝试将其上传到 Outlook 等时,他的解决方案无效。您可以在此动图 (使用全屏模式可以更好地查看所选文本PDF
)。
编辑 2:还测试了 Werner 解决方案是否有一个 LaTeX 技巧可以防止 PDF 查看器复制行号?(\protect
在 TeXnician 的新命令中添加命令和/或更新命令\thelstnumber
)结果相同。
答案1
你的代码中有一个明显的问题:你将numberstyle
其设置为不可复制,然后用花哨的字体重置它。任何选项在以后使用时都会被覆盖。效果不相符。所以你需要这样一行:numberstyle=\tiny\color{codegray}\noncopynumber
。
真正的 MWE 展示了如何应用宏
\documentclass{article}
\usepackage{enumitem}
\usepackage{listings}
\usepackage{accsupp}
\newcommand{\noncopynumber}[1]{%
\BeginAccSupp{method=escape,ActualText={}}%
#1%
\EndAccSupp{}%
}
\lstset {%
numbers = left,%
numberstyle=\tiny\noncopynumber
}
\begin{document}
\begin{lstlisting}
Example code line 1
*
... and 3
\end{lstlisting}
\end{document}
关于您对星号的问题,我不知道您读的是什么,但使用正确的unicode代码点{*}{{\char"002A}}1
(或者\**
)可以得到正确的字符,可以按照您期望的方式进行复制。