行首是否存在与查看器无关的可复制空格?

行首是否存在与查看器无关的可复制空格?

我需要包含几个 Python 代码清单,其中行的缩进(使用一定数量的空格)很重要。我希望代码清单可以复制,因此行首的空格需要与文本一起复制。

这个问题以前曾以各种方式被问过(例如如何使列表代码正确可从 PDF 复制并带有超链接, 或者我如何才能让 minted 中包含的源代码可复制?)然而这些问题的重点是如何让行号不可复制。

使行首的空格可复制似乎比较困难:“我不确定是否可以在 PDF 中指定(至少以独立于查看器的方式)缩进也应被复制”(网络奇点)。 在如何使从 PDF 复制时列表代码缩进保持不变?,Philippe Goutet 提出了一个解决方案(将空间变成可见空间,并用背景颜色着色,以便它们出现一个隐藏的 PDF 文档(在 Acrobat Reader 中可用,但在所有阅读器中都不可用)可以工作。他说:“它在 Acrobat Reader 下工作,能够快速复制/粘贴代码而不会出现问题,这非常令人愉快(也许可以通过编写直接 PDF 代码来告诉它是一个空格来规避这个问题,我从来没有时间去尝试)”。

是否可以生成一个带有代码列表的 PDF,其中每行开头都有可复制的真实空格?

最小示例:该行return x应以四个空格开头。

\documentclass{article}

\begin{document}
\begin{verbatim}
def myfunction(x):
    return x
\end{verbatim}
\end{document}

我知道我可以将代码作为文件附加到 PDF,但这不是我想要的。

答案1

似乎除了 crobat reader 之外,其他地方都可以用

这是基于@DavidCarlisle 的示例。

可见空格字符cmtt在不同变体中的标记似乎不同cmtt。对于 cm-super(当我使用时会在此处加载\usepackage[T1]{fontenc}),相应字符的名称uni2423似乎evince在复制该字符时会导致问题。

因此我严格将所有看起来像空间的事物定义为不间断空间。

您可能希望将其限制为逐字逐句;-)

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{color}
\input{glyphtounicode}
\pdfglyphtounicode{visiblespace}{A0}
\pdfglyphtounicode{blank}{A0}
\pdfglyphtounicode{visualspace}{A0}
\pdfglyphtounicode{uni2423}{A0}
\pdfgentounicode=1
\begin{document}\showoutput
\makeatletter
\def\@xobeysp{\textcolor{white}{\char32}}
\makeatother
\begin{verbatim}
def myfunction(x):
    return x
\end{verbatim}
\end{document}

我倾向于认为,显然无法从 Acrobat 复制任何(连续的或行首的)空格,这是一个错误。

或者在任何地方有指定这个吗?

至少它与 PDF 参考等官方 Adob​​e 文档完全相同。

因此,无论如何我认为这个答案有效:-)

答案2

以下内容在 evince 中不起作用,请参阅下面评论中的讨论

正如评论中指出的那样,我怀疑使用颜色是最可靠的方法:

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage{color}
\begin{document}\showoutput
\makeatletter
\def\@xobeysp{\textcolor{white}{\char32}}
\makeatother
\begin{verbatim}
def myfunction(x):
    return x
\end{verbatim}
\end{document}

如果我使用 pdflatex 处理并从 acrobat 中剪切,我会得到:

def myfunction(x):
    return x

相关内容