如何使列表代码正确可从 PDF 复制并带有超链接

如何使列表代码正确可从 PDF 复制并带有超链接

如果我生成带有行号的列表代码并从 PDF 中复制结果,则无法再次将其用作 tex 代码。首先,包含了不应该出现的行号,其次,包含了不应该出现的空格。

例如以下代码:

\documentclass{scrbook}

\usepackage{listings}

\lstdefinestyle{demostyle}{
    basicstyle=\small\ttfamily,
    numbers=left,
    stepnumber=1,
    frame=single,
}

\begin{document}
\begin{lstlisting}[style=demostyle]
\textbf{\textit{foobar}}
\textit{\sffamily foobar}}
\end{lstlisting}
\end{document}

你会得到这个结果:

1    \ textbf {\ textit { foobar }}
2    \ textit {\ sffamily   foobar }}

在这里我找到了解决方案如何使从 PDF 复制时列表代码缩进保持不变?

\lstset{columns=flexible}
\lstset{keepspaces=true}
\makeatletter
\def\lst@outputspace{{\ifx\lst@bkgcolor\empty\color{white}\else\lst@bkgcolor\fi\lst@visiblespace}}
\makeatother

但是我不清楚这个解决方案对读者的安全性如何。它在 PDF-XChange 中对我有用。但是,行号仍然可以复制。这也能解决吗?

除了这个问题之外,是否可以添加一个 PDF 链接,将代码复制到剪贴板?代码不应该在文件中,它应该是 PDF 的一部分,但仍然通过超链接作为要下载的文件链接。

编辑(嵌入文件不符合我的预期)

\documentclass{scrbook}
\usepackage{embedfile}
\usepackage{filecontents}

\begin{filecontents*}{democode}
\so{letterspacing}, \\
\ul{underlining},   \\
\st{overstriking}   \\
and \hl{highlighting}. 
\end{filecontents*}

\begin{document}
Any Text.

\embedfile[]{democode.tex}
\embedfilesetup{view}
\end{document}

基本上代码可以编译,但看不到其他内容。从文档中我不明白如何使用这个包。特别是我不知道如何链接或查看嵌入的文件。

EDIT2(附加文件)

我还测试了附加文件包。它链接到一个文件,但链接不是文本,而是几乎看不见的注释。测试使用:

\textattachfile{democode.tex}{source code} 

答案1

您可以标记行号,以便不复制它们,即复制空文本,使用中描述的技术从 PDF 复制文本时是否可以提供替代文本?numberstyle。可以使用选项 if添加所需的代码listings,如下所示。如果您想向数字添加其他格式宏,请将其添加到宏之前\noncopynumber或宏内部。

您在以下位置找到的空间的解决方案如何使从 PDF 复制时列表代码缩进保持不变?应该独立于 PDF 查看器。我看不出为什么不同的 PDF 查看器应该以不同的方式显示它。一旦空间被冻结到 PDF,所有查看器的呈现效果都应该相同。这就是 PDF 标准背后的基本思想。

使用一些 JavaScript 可以将文本复制到剪贴板,但添加起来并不容易。我会将列表作为文件附加到 PDF 中,并提供指向该文件的链接(正如评论中其他人所建议的那样)。

\documentclass{scrbook}
\usepackage{xcolor}
\usepackage{accsupp}

\usepackage{listings}

\lstdefinestyle{demostyle}{
    basicstyle=\small\ttfamily,
    numbers=left,
    stepnumber=1,
    frame=single,
    columns=flexible,
    keepspaces=true,
    numberstyle=\noncopynumber
}

\newcommand{\noncopynumber}[1]{%
    \BeginAccSupp{method=escape,ActualText={}}%
    #1%
    \EndAccSupp{}%
}

\makeatletter
\def\lst@outputspace{{\ifx\lst@bkgcolor\empty\color{white}\else\lst@bkgcolor\fi\lst@visiblespace}}
\makeatother

\begin{document}
\begin{lstlisting}[style=demostyle]
\textbf{\textit{foobar}}
\textit{\sffamily foobar}}
\end{lstlisting}
\end{document}

使用此功能,我在复制文本时得到以下信息:

\textbf{\textit{foobar}}
\textit{\sffamily foobar}}

对于较长的文本,例如多页长,您将遇到页脚和页眉问题。可以使用相同的技术使它们不可复制。将列表附加为文件在这里是一个不错的选择。

相关内容