我想说的是,如果我生成 PDF 文件,LaTeX 通常会在行之间拆分单词以正确添加“-”。例如“example-ple”。所以,我的问题是,我该怎么做才能避免复制的文本也复制“-”,而只得到单词“example”。
答案1
经过一些研究,我找到了一个适用于 LuaTeX 的非常巧妙的解决方案。
基本思想是 LuaTeX 中的字体带有tounicode
属性,该属性决定了 LaTeX 字符如何转换为 UTF16-BE 序列。可以找到此映射的示例这里。显然,我们需要更改此映射,以便将连字符符号翻译为没有什么。幸好 LuaTeX 提供了\prehyphenchar
属性可以设置使用哪个字符进行自动断字。因此,方案如下:
- 找到一个“burner”连字符来满足我们的目的,因为我们不想影响正常连字符的行为。从这个桌子,我选择 U+2010(十进制为 8208)。因此,我设置了
\prehyphenchar=8208
。 - 当文档结束时,我更新了 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 编译器中实现这一点,这些链接可能会有所帮助: