这是一个简单的例子:
\documentclass{minimal}
\usepackage{fontspec}\setmainfont{Cambria}
\begin{document}aöz\end{document}
使用 将其编译为 PDFlualatex
并使用 提取文本pdftotext
,我得到字符串aö z
,即:
U+0061(a) U+006f(o) U+0308(combining diaeresis) U+0020(space) U+007a(z)
这样做有两个问题:有一个不必要的空格(由于一些 PDF 格式技巧,未压缩的数据流显示Tm[<…>125<01C5>-124<…>]TJ
),并且我不希望将变音符号拆分为基本字符和组合字符,因为出于某种原因,在更改字体大小时,它会呈现奇怪的效果。我希望输出为
U+0061(a) U+00f6(ö) U+007a(z)
最糟糕的是:使用\setmainfont{Lucida Grande}
,我得到的正是这种结果。但使用 Cambria 时不会出现这种情况。
两者都是 TTF 格式。检查 中的字体fontforge
显示,它们的U+00f6
字形都定义为由 组成U+006f U+0308
,唯一的区别是 Cambria 将其 OTF 类定义为“基本字形”,而在 Lucida Grande 中则为“自动”(不知道这是什么意思)。
这是一个fontspec
具体的问题:
\documentclass{minimal}
\usepackage{luaotfload}
\font\foo={name:Cambria} at 10pt
\begin{document}
aöz \foo aöz
\end{document}
生成我期望的结果,第一个变音符号也如预期的那样丢失:
U+0061(a) U+007a(z) U+0020(space) U+0061(a) U+00f6(ö) U+007a(z)
但
\documentclass{minimal}
\usepackage{fontspec}
\begin{document}
aöz \fontspec{Cambria} aöz
\end{document}
生成
U+0061(a) U+00f6(ö) U+007a(z) U+0020 U+0061(a) U+006f(o) U+0308 U+0020 U+007a(z)
使用\DeclareUTFcharacter{x00F6}{\foo}
和替换时ö
也是一样\foo{}
,所以我想这不是xunicode
的错?
答案1
从这个答案我了解到有一个Renderer=Basic
选项会导致未知数量的副作用。
\documentclass{minimal}
\usepackage{fontspec}
\defaultfontfeatures{Renderer=Basic}
\begin{document}
aöz \fontspec{Cambria} aöz ffi
\end{document}
字体似乎不使用连字,我想使用特殊功能,例如VerticalPosition=Numerator
对于粗俗的分数,我可以直接切换到Renderer=Full
。
但是,有一种既能防止它在我的 unicode 中混乱,又能保留所有功能的方法会更好……
从那时起,我一直在使用 Basic 渲染器,它似乎毕竟支持字体的内置连字符(对于 Cambria 查看ti
),但没有像破折号那样的 TeX 连字符---
,需要将它们输入为 unicode—