这个答案来自类似问题的解决方案非常接近最终的复制/粘贴解决方案,但对我来说不起作用,因为它不选择空格。我问了一个新问题,因为链接的问题已经有好几年了,我的问题特别关注列表中空格的复制/粘贴,最好是在跨平台解决方案中。也就是说,生成的 pdf 将允许使用 acrobat/evince/ocular/etc 从文档中复制/粘贴到 windows/mac/linux 上的编辑器中。如果跨平台在这种意义上是不现实的,如果可能的话,我至少希望在 linux 上使用 evince 实现这种功能。
我正在 Fedora 29 机器上工作,需要能够从 PDF 中剪切并粘贴 Python 代码片段到编辑器中,并且能够运行该代码片段而无需手动编辑。这对于 Python 代码片段至关重要,因为代码块是通过空格缩进的变化来指定的。
这是我的最小工作示例(MWE)。
\documentclass{article}
\usepackage{tcolorbox}
\usepackage{hyperref}
\tcbuselibrary{theorems,listings,skins,breakable,minted}
% Patch accsupp to avoid copying line numbers when copying from listing
\usepackage{accsupp}
\newcommand\emptyaccsupp[1]{\BeginAccSupp{ActualText={}}#1\EndAccSupp{}}
\let\theHFancyVerbLine\theFancyVerbLine
\def\theFancyVerbLine{\rmfamily\tiny\emptyaccsupp{\arabic{FancyVerbLine}}}
\newcounter{listings}
\begin{document}
Listing~\ref{lst:example} shows an example code snippet.
\begin{tcblisting}{%
theorem={Listing}{listings}{Example Listing}{lst:example},
fonttitle=\scriptsize\bfseries,
listing engine=minted,
minted language=python,
minted options={%
linenos,
breaklines,
autogobble,
fontsize=\small,
numbersep=2mm,
baselinestretch=1},
overlay={%
\begin{tcbclipinterior}
\fill[gray!25] (frame.south west) rectangle ([xshift=4mm]frame.north west);
\end{tcbclipinterior}},
breakable, enhanced, listing only}
import os
import sys
SCRIPT_PATH = os.path.abspath(os.path.dirname(__file__))
class CopyPasteTest:
"""
Testing that copy/paste works from pdf listings.
"""
def __init__(self, numbers):
for number in numbers:
print number
if __name__ == "__main__":
CopyPasteTest([1, 2, 3, 4])
\end{tcblisting}
\end{document}
其结果为以下pdf。
但是当我在 evince 中选择文本时,您会发现它没有突出显示空白。
当粘贴到 gedit 中时,它失去了缩进和空行,从而破坏了示例。
如能提供任何有关将 Python 代码片段从 PDF 复制/粘贴到另一个编辑器的帮助,我们将不胜感激!
答案1
在我看来,它无法可靠地工作。pdf 查看器不尊重空格字符,也不会以相同的方式处理它们。例如,如果您使用 lualatex 编译此文档(pdflatex 给出类似的结果):
\documentclass{article}
\usepackage{tagpdf}
\tagpdfsetup{activate-mc,uncompress,interwordspace=true}
\begin{document}
x\ \pdffakespace\ \pdffakespace\ \pdffakespace\ \pdffakespace y
\end{document}
然后你会在 pdf 中得到四个真正的空格字形(0067 是空格):
[<007400670067006700670067>525<0076>]TJ
但是复制和粘贴(adobe + sumatra)只留下一个空格:x y
。
我也尝试过/ActualText
(你可以使用 accsupp 做类似的事情):
\documentclass{article}
\usepackage{tagpdf}
\tagpdfsetup{activate-all,uncompress}
\begin{document}
\tagstructbegin{tag=Document}
\tagmcbegin{tag=P,raw={/ActualText <FEFF007800200020002000200079>}}
\verb+x y+
\tagmcend
\tagstructend
\end{document}
使用 Adobe 可以正确复制,但使用 Sumatra 则不行。
这里提到了类似的差异/问题如何更改 Type1 字体中的字符代码?。
最好嵌入/附加代码,而不是依赖复制和粘贴。