这是我已经提出的问题的延续:如何从 lstlistings 复制/粘贴?。
如果 lstlistings 环境中的文本包含连续空格,则此处提出的解决方案不起作用。连续空格将被复制为单个空格。请参见以下示例:
\documentclass[letterpaper]{article}
\usepackage{amsmath}
\usepackage{graphicx}
\usepackage{fancyhdr}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage[lmargin=2.5cm,rmargin=2.5cm,tmargin=1.5cm,bmargin=3.5cm]{geometry}
\usepackage{listings} % Environment meant for source code (useful for word-wrapping verbatim text)
\lstset{language=[LaTeX]TeX,breaklines=true} % Word wrap within listings environment
\begin{document}
\lstset{basicstyle = \verbatim@font}
\begin{lstlisting}
There are no spaces in here []
There is one spaces in here [ ]
There are two spaces in here [ ]
\end{lstlisting}
\end{document}
内容被复制/粘贴,导致第三行只包含一个空格,而它应该包含两个空格。有人知道如何修复这个问题吗?
There are no spaces in here []
There is one spaces in here [ ]
There are two spaces in here [ ]
谢谢
答案1
不幸的是,空格字符无法可靠地从 PDF 中复制。超级用户上的这个答案非常正确:
PDF 的问题在于它实际上并不对文本进行编码。它所做的只是说“把那些字形放在那里,那些字形放在那里”。它是一种用于打印和在屏幕上进行高保真文档预览的格式,但实际上并不保留任何语义或内容。
因此,PDF 阅读器唯一能看到的就是一行中字母的大概位置。它无法将空格视为空格字符,因为 PDF 中没有空格。它只有字母之间的间隙越来越小和越来越大。而且由于字距调整或对齐文本,这些间隙甚至不一致。
因此,PDF 阅读器通常会猜测哪些间隙是空格,哪些间隙不是。根据所用的算法,结果是相当好的或糟糕的。
此外,在鼓励读者复制粘贴 PDF 中排版的代码(例如listings
)之前,您应该三思而后行,原因如下。
- 复制跨越 PDF 文档多页的列表非常繁琐且容易出错;
- 从 PDF 复制内容并随后粘贴的结果在不同的 PDF 查看器之间差异很大(并且您无法控制读者使用哪个查看器);
listings
如果逐字复制并粘贴由's引入的换行符breaklines
,则可能会转换为所使用的语言中无效的语法。
这根本不是一种可靠的代码分发方式。
答案2
许多 pdf 阅读器从 \lstlisting 环境复制粘贴时都会得到可接受的结果。也许这会有所帮助:
\documentclass{article}
\usepackage{listings}
\lstset{
basicstyle=\ttfamily,
columns=fullflexible,
literate={\ }{{\copyablespace}}1 {\ \ }{{\copyablespaceTwo}}1
}
\usepackage[space=true]{accsupp}
\newcommand{\copyablespace}{\BeginAccSupp{method=hex,unicode,ActualText=00A0}\ \EndAccSupp{}}
\newcommand{\copyablespaceTwo}{\BeginAccSupp{method=hex, unicode, ActualText=00A000A0}\ \ \EndAccSupp{}}
\begin{document}
\begin{lstlisting}
There are no spaces in here []
There is one spaces in here [ ]
There are two spaces in here [ ]
\end{lstlisting}
\end{document}