我怎样才能生成 PDF 文件,以便我可以像复制纯文本一样复制文本

我怎样才能生成 PDF 文件,以便我可以像复制纯文本一样复制文本

我想说的是,如果我生成 PDF 文件,LaTeX 通常会在行之间拆分单词以正确添加“-”。例如“example-ple”。所以,我的问题是,我该怎么做才能避免复制的文本也复制“-”,而只得到单词“example”。

答案1

经过一些研究,我找到了一个适用于 LuaTeX 的非常巧妙的解决方案。

基本思想是 LuaTeX 中的字体带有tounicode属性,该属性决定了 LaTeX 字符如何转换为 UTF16-BE 序列。可以找到此映射的示例这里。显然,我们需要更改此映射,以便将连字符符号翻译为没有什么。幸好 LuaTeX 提供了\prehyphenchar属性可以设置使用哪个字符进行自动断字。因此,方案如下:

  1. 找到一个“burner”连字符来满足我们的目的,因为我们不想影响正常连字符的行为。从这个桌子,我选择 U+2010(十进制为 8208)。因此,我设置了\prehyphenchar=8208
  2. 当文档结束时,我更新了 LuaTeX 中的所有内部字体,有效地将字符 8208 映射到没有什么。(当然,你可以将它映射到其他东西,只是为了好玩。)为此,请create_new_font使用正确的字体模式调用来更新字体tounicode表。我尝试在日志文件中打印所有字体的名称,以防你不知道要更新哪些字体。当然,你可以放弃这个模式匹配步骤create_new_font,只需修改所有可用的字体。

经过以上这些步骤,在编译出来的文档中,当你复制“contem-porary”时,得到的文本就是“contemporary”;当你复制“ab”时,得到的文本依然是“ab”。

\documentclass[a4paper]{article}
\usepackage{fontspec}
\usepackage{luacode}

\setmainfont{DejaVu Serif}
% using U+2010
% http://jkorpela.fi/dashes.html
\prehyphenchar=8208


\begin{document}

contemporary contemporary contemporary contemporary contemporary contemporary contemporary

a-b

\begin{luacode}
-- show all fonts in the log
for i,f in font.each() do
  texio.write_nl(f.name)
end

function create_new_font(pattern)
    local tounicodevalues = {
        [8208] = "",
    }
    for i,f in font.each() do
        if (string.match(f.name, pattern)) then
            for u, v in pairs(tounicodevalues) do
                f.characters[u].tounicode = v
            end
            font.define(i, f)
        end
    end
end
\end{luacode}

\directlua{
  create_new_font("DejaVuSerif")
}


\end{document}

如果您想深入研究这个问题或弄清楚如何在其他 TeX 编译器中实现这一点,这些链接可能会有所帮助:

相关内容