我需要包含几个 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 参考等官方 Adobe 文档完全相同。
因此,无论如何我认为这个答案有效:-)
答案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