如何从 lstlistings 复制/粘贴多个空格?

如何从 lstlistings 复制/粘贴多个空格?

这是我已经提出的问题的延续:如何从 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)之前,您应该三思而后行,原因如下。

  1. 复制跨越 PDF 文档多页的列表非常繁琐且容易出错;
  2. 从 PDF 复制内容并随后粘贴的结果在不同的 PDF 查看器之间差异很大(并且您无法控制读者使用哪个查看器);
  3. 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}

相关内容