我记得,大约在 2014 年使用 pdfTeX 时,可以强制嵌入字体的空格字符。然后,空格字符将出现在 PDF 中。后来,如果使用 FontForge 提取字体,它将具有空格字符。
这种行为似乎在一段时间内消失了,或者我再也不知道该怎么做了。事实上,我现在对 LuaLaTeX 比 pdfTeX 更感兴趣。
我并不打算在文档中出现空格的每个位置都放置空格字符。对于每个使用的字体,只需包含一次即可。
我为什么问这个问题:早在 2014 年,我就注意到如果嵌入了空格字符,PDF 阅读器就可以更可靠地从 PDF 中提取文本。我猜想如果没有空格字符,阅读器会根据间隙与某些默认字体(Times Roman?)的空格宽度的比较来计算空格应该在哪里。但如果它知道字体空格的实际前进宽度,它就能更准确地提取单词,尤其是在跟踪接近时。
请注意,我不想打印“明确的空间”(如 U)。
答案1
如果你只想插入空格字符您可以将 luatex\char
或\symbol
命令与 (十六进制)"20
或 (十进制) 32一起使用X\char"20 X
。
请注意,这些字符不会拉伸或收缩。如果需要,我建议使用\rlap
额外的正常空格。
对于以下文档 - 如果使用 luatex 编译 - 解压缩后的 pdf 包含
<00730067007300670073>-29334<0073>
和
<00730067>-9670<00730067>-9670<0073>-9994<0073>
其中0067
是空格字符,-29334
是正常空格(这里拉伸了很多)。
\RequirePackage{luatex85}
\pdfcompresslevel=0
\pdfobjcompresslevel=0
\documentclass{article}
\begin{document}
X\symbol{32}X\char32X X\linebreak
YYY
X\rlap{\symbol{32}} X\rlap{\char32} X X\linebreak
YYY
\end{document}
答案2
根据我上面接受的有用信息,我对此进行了更详细的研究。我相信我已经找到了一个解决方案,它 (a) 在文本中出现空格的任何地方嵌入实际的字体空格字符(不只是一次),以便 Adobe Reader 正确地重新排列它,(b) 允许正确的连字,以及 (c) 允许微字体突出,至少在右边距,这更重要。
这是一个仅支持 LuaLaTeX 的解决方案,带有字体规范。此外,这是一个“纯文本”解决方案,这意味着我还没有在数学模式下测试过它(而且我也不打算这么做,因为我不懂数学)。
首先,必须对文档正文进行预处理。这可以在文本编辑器中通过搜索和替换轻松完成(使用 \n 作为换行符的正则表达式),并且对于有相关知识的人来说,可以使用 sed 脚本自动完成。
(A)不能有多个空格字符。
(B)没有空格字符后面跟着换行符。
(C)没有换行符后跟空格字符。
(D) 如果文档主体中有任何宏定义(不仅仅是对宏的调用),则将它们移至主体顶部。以下命令必须位于任何其他宏定义之后。原因:您可能不希望在宏定义中将任何普通空格转换为真实空格!
(E) 在某些情况下,宏后面的普通空格不会被吞掉,因为它会变成真正的空格。因此,请手动编辑,将这些普通空格替换为 {}。因此:
\noindent{}This is not indented.\par
{\centering{}This is centered.\par}
\noindent{}Left\hfill{}Right\par
到目前为止,文档应该没有实质性的改变。除非您使用的是逐字文本,否则它的编译结果应该与以前一样。
第二,在 \begin{document}(不在序言中)之后,放置以下代码。宏“\ibs”代表“itty bitty space”,如果名称冲突,可以重新命名。选择加减字符是因为我在文档中没有用到它,但它可以是任何 Unicode 字符(对于文本编辑器的字体,您可以随意选择切诺基或平假名字符,只要您可以从字符映射中粘贴它并在文本编辑器中看到它即可)。
\def\ibs{{\addfontfeature{Scale=.001}\char"20}}
\catcode`\±=10\relax
\catcode`\ =13\relax
\def {±\ibs}
第三,在 \end{document} 之前写下:
\catcode`\ =10\relax
我不确定上述做法是否总是必要的,但它肯定不会有害。
结果:编译需要非常非常长的时间。但是编译成功,PDF 令人满意。对于实际使用的每种字体(常规、斜体等),无论在何处使用,PDF 中都会出现空格字符。在 Adobe Reader 中,请求“视图”>“重排”将正确重排 PDF,并带有单词间距。
我以为 PDF 会比没有空格时大 20% 左右,但实际上要大得多。也许我可以调整压缩,但我还没有考虑过。
注意:任何涉及框的字符(例如 \rlap)都可能破坏那里的连字符。
编辑:经过进一步调查,我发现当项目在表格或居中布局中,或者具有某种水平位置时,Adobe Reader 使用某种启发式算法进行重排。该算法并不明显。例如,如果连续的独立居中行以数字开头,则它们将作为单独的行重排,但如果它们不以数字开头(并且罗马数字不被视为数字),则会连接起来。但是,Adobe Acrobat Pro 的“添加标签”功能做得更好,显然仅基于位置。