使用 lstlisting 从 PDF 复制和粘贴时出现问题(再次)

使用 lstlisting 从 PDF 复制和粘贴时出现问题(再次)

我已经发布了一个类似的问题关于减号 ( -),但现在我遇到了撇号 ( ) 的问题,'以前的解决方案似乎无法解决。这似乎是一个与此无关的问题,listings因为我甚至无法\verb!'!创建一个在复制时得到 ASCII 代码 39 的 PDF。我所能得到的只是一个扩展字符(根据 hexdump 为 e2 80 99)。

以下是 MWE:

\documentclass{article}
\begin{document}
\verb!'!
\end{document}

所以问题是:

如何创建一个 PDF,使其显示一个单引号,并且复制时具有单引号的 ASCII 值?

答案1

在没有 ToUnicode CMap 的情况下,pdf 查看器将采取一些启发式方法尝试将字形映射到 unicode 代码点,但在 ASCII 之外,这可能会变得不稳定,并且在某些查看器中仅在某些时候有效。(例如,参见本专利)。因此,Stephan Lehmke 看到的结果与 Yossi Farjoun 不同。您可以很容易地添加一个 tounicode 表,但有问题的字符是quoteright通常映射到 的字符U+2019。您可以将 映射quoterightU+0027(字形的代码点quotesingle),这将解决您的直接问题,但文档中其他地方的单右引号(列表之外)将受到影响。我发现有一个未记录的“命名空间”功能,\pdfglyphtounicode允许将重新映射限制为仅打字机字体:

\documentclass{article}
\input glyphtounicode.tex
\input glyphtounicode-cmr.tex
\pdfglyphtounicode{tfm:cmtt10/quoteright}{0027}
\pdfgentounicode=1
\begin{document}
\verb!'! `hello'
\end{document} 

实际上,事实证明 cmtt10 确实包含一个quotesingle您可能更喜欢使用的字形(在这种情况下,\pdfglyphtounicode不需要上面的行)。要访问此字形,请使用\usepackage{textcomp}然后\texttt{\textquotesingle}就可以了。对于 listings 环境,我相信您可以\lstset{upquote=true}让它在看到 ASCII 撇号时使用此字形。

答案2

listings,您可以将该upquote=true选项与以下选项结合使用\usepackage{textcomp}

\documentclass{article}
\usepackage{listings}
\usepackage{textcomp}
\lstset{upquote=true}

\begin{document}
\lstinline!'!
\end{document}

相关内容