![如何使用 lua|xelatex 和 Garamond Premier Pro Opticals (Regular) 正确放置德文双引号?](https://linux22.com/image/311131/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20lua%7Cxelatex%20%E5%92%8C%20Garamond%20Premier%20Pro%20Opticals%20(Regular)%20%E6%AD%A3%E7%A1%AE%E6%94%BE%E7%BD%AE%E5%BE%B7%E6%96%87%E5%8F%8C%E5%BC%95%E5%8F%B7%EF%BC%9F.png)
使用 Adobe 的 Garamond Premier Pro Opticals(最新版本:2.104),结束的德文双引号被设置在句子结束点的正上方(而不是后面)(例如,问号不受影响)。以下屏幕截图中的红色标记显示了结果。屏幕截图还显示,似乎只有 Regular-shape 受到影响,因为使用 Subhead-sizes 和 Caption-sizes 的输出没有问题(参见绿色标记):
系统环境:Windows 7 Pro 64位
Tex 环境:texlive 2014;最新更新(冻结);lualtex 或 xelatex
字体:GaramondPremrPro 版本 2.104;PS 2.000;hotconv 1.0.70;makeotf.lib2.5.5900
最小工作示例:
\documentclass[12pt]{article}
\usepackage{fontspec}
%\setmainfont{Times New Roman}
\setmainfont{Garamond Premier Pro}
\usepackage{polyglossia}
\setdefaultlanguage[babelshorthands=true,variant=german,spelling=new]{german}
\setotherlanguage[variant=british]{english}
\setotherlanguage{french}
\usepackage[autostyle=true,german=quotes]{csquotes}
\newcommand{\testOutput}{%
"`Hallo Welt."' (old school)
\enquote{Hallo Welt.} (enquote)
\enquote{Hallo Welt,} (enquote)
\foreignquote{english}{Hello World.} (foreignquote, en.)
\foreignquote{french}{Salut tout le monde.} (foreignquote, fr.)
\hrulefill
}
\begin{document}
\noindent
GaramondPremierPro-Regular:
\testOutput
\Large
\noindent
GaramondPremierPro-Subhead:
\testOutput
\tiny
\noindent
GaramondPremierPro-Caption:
\testOutput
\end{document}
如果用逗号代替点,结果对我来说似乎更好一些,但还不够优秀(与副标题或标题大小直接比较)。
问题:您能重现输出吗?如果能,最可能的原因是什么?下一步应该采取什么措施来进一步缩小原因范围?什么可能是合适的解决方案或至少是一种解决方法?
答案1
我不会认为这是一个错误。至少对于一些设计师/排版员来说,以这种方式调整句号和引号的字距是一种常识。不过,必要的字距调整量取决于字体,并且取决于设计师的眼光。
在我的系统上,所有光学尺寸都应用相同的字距调整:
在 XeTeX 中,您可以定义字母(组/类)之间的自定义字距:
启用自定义字距调整:
\XeTeXinterchartokenstate = 1
定义一个新类:
\newXeTeXintercharclass <classmacro>
将字母添加到类别中:
\XeTeXcharclass <letter code> = <classmacro>
要添加字母,不是通过其代码,而是直接使用反引号,例如
`“
在两个类别之间添加额外的字符(例如字距调整):
\XeTeXinterchartoks <classmacro 1> <classmacro 2> = <tokens>
请注意,类别必须与文档中出现的字母位于同一行。
将此代码添加到您的示例中,以“修复”字距调整:
\XeTeXinterchartokenstate=1
\newXeTeXintercharclass \kernclassRQuote
\XeTeXcharclass `“ = \kernclassRQuote
\newXeTeXintercharclass \kerncharclassDot
\XeTeXcharclass `. = \kerncharclassDot
\XeTeXcharclass `, = \kerncharclassDot
\XeTeXinterchartoks \kerncharclassDot \kernclassRQuote = {\kern-0.05em}
正如我所说,你喜欢的价值观不一定是其他人的“正确”价值观;-)
答案2
我不知道这个丑陋的解决方法会导致什么负面影响,但它似乎有效(用 lualatex 测试):
\enquote{Hallo Welt\mbox{.}}
还有更好的选择吗?
是的,旁边Tobi 的答案解决了 xeLaTeX以下解决方案与 luaLaTeX 兼容。它实现了一个字体功能文件,该文件引入了两个与常规尺寸(直立和粗体)绑定的附加功能。它们被称为:
kruq
(字距常规直立引用blleft)krbq
(kern 常规粗体 quotedblleft)
以下 MWE 显示了详细信息 - 字距调整空间(900 - 1600)非常大,只是为了直观地看到差异。您应该能够轻松适应并扩展它们以满足您的需求:
\documentclass[12pt]{article}
\usepackage{filecontents,fontspec}
\begin{filecontents*}{gpp20104.fea}
languagesystem DFLT dflt;
languagesystem latn dflt;
lookup reg_up_quotedblleft {
pos [period ellipsis]' 1600 quotedblleft;
pos comma' 1200 quotedblleft;
} reg_up_quotedblleft;
lookup reg_bd_quotedblleft {
pos [period ellipsis]' 1200 quotedblleft;
pos comma' 900 quotedblleft;
} reg_bd_quotedblleft;
feature kruq {
lookup reg_up_quotedblleft;
} kruq;
feature krbq {
lookup reg_bd_quotedblleft;
} krbq;
\end{filecontents*}
\setmainfont[%
FeatureFile=gpp20104.fea,
Extension = .otf ,
Path=C:/GaramondPremrPro/ ,
BoldItalicFont = {*-BdIt},
BoldFont = {*-Bd},
ItalicFont = {*-It},
UprightFont = {*},
UprightFeatures = {%
SizeFeatures={%
{Size={-8.9},Font={*-Capt}},
{Size={8.91-14.9},Font={*},RawFeature={+kruq}},
{Size={14.91-22.9},Font={*-Subh}},
{Size={22.91-},Font={*-Disp}},
},%
},%
ItalicFeatures = {%
SizeFeatures={%
{Size={-8.9},Font={*-ItCapt}},
{Size={8.91-14.9},Font={*-It}},
{Size={14.91-22.9},Font={*-ItSubh}},
{Size={22.91-},Font={*-ItDisp}},
},%
},%
BoldFeatures = {%
SizeFeatures={%
{Size={-8.9},Font={*-BdCapt}},
{Size={8.91-14.9},Font={*-Bd},RawFeature={+krbq}},
{Size={14.91-22.9},Font={*-BdSubh}},
{Size={22.91-},Font={*-BdDisp}},
},%
},%
BoldItalicFeatures = {%
SizeFeatures={%
{Size={-8.9},Font={*-BdItCapt}},
{Size={8.91-14.9},Font={*-BdIt}},
{Size={14.91-22.9},Font={*-BdItSubh}},
{Size={22.91-},Font={*-BdItDisp}},
},%
},%
]{GaramondPremrPro}
\usepackage{polyglossia}
\setdefaultlanguage[babelshorthands=true,variant=german,spelling=new]{german}
\usepackage[autostyle=true,german=quotes]{csquotes}
\newcommand{\hw}{Hallo}
\newcommand{\hwplain}{"`{\hw}"'}
\newcommand{\hwperiod}{"`{\hw}."'}
\newcommand{\hwcomma}{"`{\hw},"'}
\newcommand{\hwscolon}{"`{\hw};"'}
\newcommand{\hwcolon}{"`{\hw}:"'}
\newcommand{\hwellip}{"`{\hw} \ldots"'}
\newcommand{\hwquest}{"`{\hw}?"'}
\newcommand{\hwexcla}{"`{\hw}!"'}
\newcommand{\testOutput}{%
{\hwplain} \emph{\hwplain} \textbf{\hwplain} \emph{\textbf{\hwplain}}\\
{\hwperiod} \emph{\hwperiod} \textbf{\hwperiod} \emph{\textbf{\hwperiod}}\\
{\hwcomma} \emph{\hwcomma} \textbf{\hwcomma} \emph{\textbf{\hwcomma}}\\
{\hwscolon} \emph{\hwscolon} \textbf{\hwscolon} \emph{\textbf{\hwscolon}}\\
{\hwcolon} \emph{\hwcolon} \textbf{\hwcolon} \emph{\textbf{\hwcolon}}\\
{\hwellip} \emph{\hwellip} \textbf{\hwellip} \emph{\textbf{\hwellip}}\\
{\hwquest} \emph{\hwquest} \textbf{\hwquest} \emph{\textbf{\hwquest}}\\
{\hwexcla} \emph{\hwexcla} \textbf{\hwexcla} \emph{\textbf{\hwexcla}}%
}
\begin{document}
\tiny
\noindent
Caption:\\
\testOutput
\normalsize
\noindent
Regular:\\
\testOutput
\Large
\noindent
Subhead:\\
\testOutput
\Huge
\noindent
Display:\\
\testOutput
\end{document}
更新:
不需要全局加载 FeatureFile,而是可以在大小块内(就在 RawFeature 选项之前)本地加载它:
{Size={8.91-14.9},Font={*},FeatureFile=gpp20104.fea,RawFeature={+kruq}}
优点:编译速度略快,因为并非每种字体都会加载未使用的功能(您可以比较 texmf-var\luatex-cache\generic\fonts\otf\*.lua 中的 font-lua 文件数量,使用本地断言的 FileFeatures 时,应该只有两个 *-gpp20104.lua 文件)。
我之前提到的关于冒号的其他字距调整问题(请参阅我在问题下方的评论)不是由字体的字距调整表引起的:原因似乎是 csquote 的 \foreignquote{}{} 不会自动切换回默认语言。也许我会问一个新问题 -我这样做了。