我使用的字体 Linux Libertine O 无法正确将脱字符 (U+0302) 与前面带有长音符号的元音符号 (例如 U+014D) 组合:
\documentclass[17pt]{extarticle}
\usepackage{fontspec,xunicode,xltxtra}
\defaultfontfeatures{Mapping=tex-text}
\setmainfont{Linux Libertine O}
\newcommand{\schleifton}{\char"014D\char"0302}
\begin{document}
\textit{*-{\schleifton}z}.
\end{document}
我尝试用以下方式提高抑扬符\raisebox
:
\documentclass[17pt]{extarticle}
\usepackage{fontspec,xunicode,xltxtra}
\defaultfontfeatures{Mapping=tex-text}
\setmainfont{Linux Libertine O}
\newcommand{\schleifton}{\char"014D\raisebox{.3ex}{\char"0302}}
\begin{document}
\textit{*-{\schleifton}z}.
\end{document}
脱字符太靠右了,所以我尝试用 将其移近前一个字符\kern
。如您所见,问题在于它还会将下一个字符(“z”)移到左侧。我该如何解决这个问题?
\documentclass[17pt]{extarticle}
\usepackage{fontspec,xunicode,xltxtra}
\defaultfontfeatures{Mapping=tex-text}
\setmainfont{Linux Libertine O}
\newcommand{\schleifton}{\char"014D\kern-.1em\raisebox{.3ex}{\char"0302}}
\begin{document}
\textit{*-{\schleifton}z}.
\end{document}
正如 egreg 在他的回答中指出的那样,需要使用\kern
第二次来撤消字符的左移。但是,他还指出,使用这些命令对于常规字体和倾斜字体的结果会略有不同。他提出了一种处理该问题的方法。下面,我决定分别指定常规字符和倾斜字符:
\documentclass[17pt]{extarticle}
\usepackage{fontspec, xunicode, xltxtra}
\defaultfontfeatures{Mapping = tex-text}
\setmainfont{Linux Libertine O}
\newcommand{\schleifton}{\char"014D\kern-.11em\raisebox{.15ex}{\char"0302}\kern.11em}
\newcommand{\schleiftonitalic}{\char"014D\kern-.08em\raisebox{.25ex}{\char"0302}\kern.08em}
\begin{document}
\Huge{*-{\schleifton}z}.
\Huge\textit{*-{\schleiftonitalic}z}.
\end{document}
答案1
插入重音符后,您还需要调整字距:
\newcommand{\schleifton}{%
\char"014D\kern-.1em\raisebox{.3ex}{\char"0302}\kern.1em }
但是,通过使用更复杂的定义,您可以获得同时考虑当前字体倾斜度的字距。下面是一些示例。
\documentclass[17pt]{extarticle}
\usepackage{fontspec}
\defaultfontfeatures{Ligatures=TeX}
\setmainfont{Linux Libertine O}
\makeatletter
\def\schkern#1{\kern#1\dimexpr0.11em-\strip@pt\fontdimen1\font\dimexpr0.1em\relax\relax}
\makeatother
\newcommand{\schleifton}{\char"014D\schkern{-}\raisebox{.3ex}{\char"0302}\schkern{+}}
\begin{document}
\textit{*-oz}.
\textit{*-{\schleifton}z}.
\schleifton
\Large
\textit{*-{\schleifton}z}.
\schleifton
\end{document}
我们该怎么办?这个想法和你的想法一样,但经过了改进。
在\fontdimen1\font
(Xe)TeX 中,将当前字体的倾斜因子保存为单位点中的维度,因此\strip@pt\fontdimen1\font
我们得到倾斜因子,我们简单地称之为 σ。
我们需要后退一点,然后前进一点,以便将倾斜考虑在内。因此,主要后退量(通过反复试验发现)为 0.11em;较小的量等于 0.1em 乘以 σ。因此,我们后退
0.11em - σ * 0.1em
为了执行第二次乘法,我们需要转换0.1em
为 TeX 维度,该维度由 获得\dimexpr0.1em\relax
。因此我们可以写
0.11em - σ\dimexpr0.1em\relax
但为了满足\kern
它的需求,我们还需要另一种\dimexpr
:
\kern\dimexpr 0.11em - σ\dimexpr0.1em\relax\relax
但是我们还需要撤消重音符号后的字距调整,因此\schkern
用一个参数来定义,该参数要么是+
,要么是-
,后者用于备份:
\def\schkern#1{\kern#1\dimexpr0.11em-\strip@pt\fontdimen1\font\dimexpr0.1em\relax\relax}
这样\schkern{-}
一边后退,一边\schkern{+}
向前推进。