使用 \raisebox 和 \kern 移动组合字符

使用 \raisebox 和 \kern 移动组合字符

我使用的字体 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{+}向前推进。

相关内容