是否有可能不复制使用 lstlisting 的编号?

是否有可能不复制使用 lstlisting 的编号?

请考虑以下 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. (Martin Scharrer 解决方案)示例 1

  2. (我添加的)示例 2

  3. (建议来自技术解答示例 3

正如你所看到的,问题在于参考编号(123)已复制即使使用建议的解决方案,也可以从 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(或者\**)可以得到正确的字符,可以按照您期望的方式进行复制。

相关内容