如何使用 minted 配置 tcblisting 以允许从带有空格字符的列表中复制/粘贴?

如何使用 minted 配置 tcblisting 以允许从带有空格字符的列表中复制/粘贴?

这个答案来自类似问题的解决方案非常接近最终的复制/粘贴解决方案,但对我来说不起作用,因为它不选择空格。我问了一个新问题,因为链接的问题已经有好几年了,我的问题特别关注列表中空格的复制/粘贴,最好是在跨平台解决方案中。也就是说,生成的 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}

使用 Adob​​e 可以正确复制,但使用 Sumatra 则不行。

这里提到了类似的差异/问题如何更改 Type1 字体中的字符代码?

最好嵌入/附加代码,而不是依赖复制和粘贴。

相关内容