如果我生成带有行号的列表代码并从 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}}
对于较长的文本,例如多页长,您将遇到页脚和页眉问题。可以使用相同的技术使它们不可复制。将列表附加为文件在这里是一个不错的选择。