有哪些好的方法可以使 pdflatex 输出可复制和粘贴?

有哪些好的方法可以使 pdflatex 输出可复制和粘贴?

输出中一个pdflatex可以改进的常见方面是,人们可以在多大程度上从生成的 PDF 文件中选择文本输出并进行复制粘贴。这本质上是一个拥有正确输出编码的问题。这至少有两个重要方面:

  • 在理想情况下,Unicode 将是输出编码。
  • 连字符号(如 fi)最好在输出中取消连字符(此处为“fi”)。

输出编码似乎是通过fontenc包指定的。可能的输出编码范围是多少,最重要的是:有没有办法指定 Unicode 输出编码并以预期的方式处理连字符?

(注:区分输出输入编码。如何使用不同的输入LaTeX 中的编码已得到广泛记录。我的理解是,这最好由包来处理inputenx,因为它取代了inputenc包。)


解决方案快速指南:答案和答案线索中的信息有点分散,因此这里是简短的总结:一种方法是\input glyphtounicode一起使用\pdfgentounicode=1;另一种方法是使用cmap/ mmap

附录:有时需要加载包accsupp并将宏定义括在\BeginAccSupp{method=hex,unicode,ActualText=<codepoint>}[...]中\EndAccSupp{}以生成特定代码点。请参阅有关非 BMP 代码点的警告这里以及修复(从accsupp版本 v0.4 开始,2012/11/18)这里,它提供了新的unichar封装选项。

答案1

你知道 cmap 软件包吗(看看CTAN:cmap)?它会帮你完成这些。将其\usepackage{cmap}作为第一个包加载。

更新:我做了一些研究,发现了一些关于如何使用cmap或的提示mmap结果:cmap并且mmap无法处理基于虚拟字体(文件*.vf*.vpl字体目录中的字体)。因此,如果您使用的字体需要虚拟字体cmapmmap无法工作。您最好使用glyphtounicode。这暗示可能会有用。

顺便说一句:cmap基于 Adob​​e 的字符映射。请参阅 PDF 参考版本 1.6了解更多信息。

更新2texdoc encguide您将获得一份描述 T1 Cork 编码的文档。您将在其中找到一个表格,其中显示了您可以直接写入 pdf 文件的所有字形。因为ä您可以在 pdf 文件中找到一个字形ä。如果没有字形,äLaTeX 必须用两个字符来构建它:"a。您将ä在 pdf 文件中看到它,但找不到它(搜索"a可能会有所帮助;复制和粘贴会将其返回给您)。

更新 3glyphtounicode仅支持 T1 编码,cmap支持更多编码。 的一个优点glyphtounicode是,可以使用一个命令添加更多尚未包含在官方列表中的字形。 有关更多信息,\glyphtounicode请参见此处:tb91thanh-字体.pdf. 确保glyphtounicode.tex从获取最新版本LCDF 型软件看看此警告如何正确使用它。

答案2

由于您没有提供最小示例,我不确定这是否真的解决了您的问题。您尝试过加载glyphtounicode.tex吗?

\documentclass{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}

\input glyphtounicode
\pdfgentounicode=1

\begin{document}

ff ffi ffl ä ü ö ß

auffallen

\end{document}

但是,即使不使用glyphtounicodepdftotext我的系统也会生成 unicode 文本。使用glyphtounicode,连字符会被取消连字符。

答案3

如果您正在使用memoir,则可以使用选项 编译文档ms。输出就像用打字机写的东西,但由于没有连字符,因此很容易复制和粘贴文本以便在其他程序(例如 Word 或 LibreOffice Writer)中重复使用。

我经常使用此选项作为一种快速而简单的方法将 LaTeX 文档中的文本导入 Word。

由于回忆录在 -模式下使用 1.5 倍行距ms,因此将每页的行数设置为不会填满页面的数字非常重要。

一位 MWE 表示:

\documentclass{ms,article}{memoir}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{lipsum}

\input{glyphtounicode}
\pdfgentounicode=1

\setulmargins{*}{*}{1,5}
\setlength{\textheight}{32\baselineskip}
\checkandfixthelayout[lines]


\begin{document}

\lipsum[1-21]

\end{document}

编辑:user14996 询问:为什么glyphtounicode使用 fontenc-line 时输出或粘贴行为没有区别

答案是:这取决于您的字体。我使用MinionPro,它使用小写数字 ( oldstylenums) 作为标准。我还使用间隔小写字母。加载glyphtounicode但不加载 时 fontenc,挪威字符 (æøå ÆØÅ) 无法从 PDF 文件中正确复制。另一方面,所有数字和小写字母都可以复制和粘贴。如果我做相反的事情,删除glyptounicode但保留fontenc,数字就会变成希腊字符,小写字母就会消失。此外,所有连字符 (fi ffi fj) 都会消失。

使用cmap代替glyphtounicode没有帮助。

所以答案是,有时fontenc是您唯一需要的包,但如果您使用字体中的特殊功能(小型大写字母、旧式数字等),而这些功能需要虚拟字体,则需要加载 glyphtounicodecmap不支持虚拟字体。有时甚至不能解决glyphtounicode所有问题。

答案4

我不精通乳胶,但是为了获得可复制的西里尔字母 PDF,您可以使用以下类型的文档。

\documentclass{article}
\usepackage{cmap}
\usepackage[utf8x]{inputenx}
\usepackage[T2A]{fontenc}
\usepackage[T2B]{fontenc}
\usepackage[T2C]{fontenc}

\begin{document}

Кирилица

\end{document}

T2AT2BT2C是西里尔字母的不同变体的集合。

相关内容