如何使用 lua|xelatex 和 Garamond Premier Pro Opticals (Regular) 正确放置德文双引号?

如何使用 lua|xelatex 和 Garamond Premier Pro Opticals (Regular) 正确放置德文双引号?

使用 Adob​​e 的 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 中,您可以定义字母(组/类)之间的自定义字距:

  1. 启用自定义字距调整:

    \XeTeXinterchartokenstate = 1
    
  2. 定义一个新类:

    \newXeTeXintercharclass <classmacro>
    
  3. 将字母添加到类别中:

    \XeTeXcharclass <letter code> = <classmacro>
    

    要添加字母,不是通过其代码,而是直接使用反引号,例如`“

  4. 在两个类别之间添加额外的字符(例如字距调整):

    \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 兼容。它实现了一个字体功能文件,该文件引入了两个与常规尺寸(直立和粗体)绑定的附加功能。它们被称为:

  1. kruq(字距常规直立引用blleft)
  2. 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{}{} 不会自动切换回默认语言。也许我会问一个新问题 -我这样做了

相关内容