XeTeX 使用 \newunicodechar 进行字距调整

XeTeX 使用 \newunicodechar 进行字距调整

我正在使用 Adob​​e Garamond Pro,需要该字体中不存在的两个字符 ʾ 和 ʿ。我通过将 ˘ 旋转 90 度并用 制作这些新的 unicode 字符解决了这个问题newunicodechar。这样我就可以直接在源代码中输入 ʿ 和 ʾ 来获得正确的输出。现在,这些字符非常奇怪,需要调整一些字距。我想用 来做到这一点\XeTeXinterchartoks。问题是这对新创建的字符不起作用。为什么会这样?有解决方法吗?

\documentclass{article}
\usepackage{fontspec}
\usepackage{newunicodechar}
\setmainfont{Adobe Garamond Pro} %substitute as desired

% make new character
\newunicodechar{ʾ}{\rotatebox[origin=center]{90}{˘}\hspace{-1.2ex}}

% (absurly large) kerning
\XeTeXinterchartokenstate=1
\newXeTeXintercharclass\dia
\XeTeXcharclass `\ʾ=\dia
\newXeTeXintercharclass\el
\XeTeXcharclass `\l=\el
\XeTeXinterchartoks \el \el {\kern 1em}
\XeTeXinterchartoks \dia \el {\kern 1em}


\begin{document}

\Huge
llʾllll
\end{document}

在此处输入图片描述

附加问题:有没有办法只旋转字形 ˘ 而不旋转其下方的空间?

答案1

当您这样做时\newunicodechar{<char>}{<tokens>},其效果就像一个宏,因此它会在到达应用<char>该功能的阶段之前消失。\XeTeXinterchartoks

但是,您可以通过对以未使用的字符结尾的字符进行扩展来解决这个问题;这里我设置了 U+FEFF(零宽度无间断空格):

\documentclass{article}
\usepackage{fontspec}
\usepackage{newunicodechar}
\setmainfont{Old Standard} %substitute as desired

\usepackage{graphicx}

% make new character
\newunicodechar{ʾ}{\rotatebox[origin=center]{90}{˘}\hspace{-1.2ex}^^^^feff}

% (absurly large) kerning
\XeTeXinterchartokenstate=1
\newXeTeXintercharclass\dia
\XeTeXcharclass "FEFF=\dia
\newXeTeXintercharclass\el
\XeTeXcharclass `\l=\el
\XeTeXinterchartoks \el \el {\kern 1em}
\XeTeXinterchartoks \dia \el {\kern 1em}


\begin{document}

\Huge
llʾllll
\end{document}

该语法^^^^feff相当于直接输入字符(在这种情况下更好,因为它会显示字符)。十六进制数"FEFF可用于将字符分配给类别(请注意,符号需要小写^^^^,而十六进制数必须使用大写)。

在此处输入图片描述

答案2

这只回答了你的附加问题。一般来说,没有自动修复,因为字形的位置通常会有不对称的上下空间,这无法提前知道。但只要稍加努力,就可以找到解决方案(这是否比 OP 所做的更好,由您决定)。

要获得相同宽度的项目,请将其放在与原始字形宽度相同的框中。为了正确获得水平字距,我提供了旋转字形的框版本,以便您确定适当的偏移量。确定适当的偏移量后,只需使用该偏移量\xrb[offset]{glyph}即可\rb[offset]{glyph}

\documentclass{article}
\usepackage{graphicx}
\usepackage{calc}
\fboxsep=-\fboxrule
\newcommand\xrb[2][0pt]{\fbox{\makebox[\widthof{#2}][r]{%
  \raisebox{#1}{\rotatebox{90}{\raisebox{-#1}{#2}}\kern-#1}}}}
\newcommand\rb[2][0pt]{\makebox[\widthof{#2}][r]{%
  \raisebox{#1}{\rotatebox{90}{\raisebox{-#1}{#2}}\kern-#1}}}
\begin{document}
\fbox{'} \xrb[0pt]{'} \xrb[1pt]{'} \xrb[2pt]{'} \xrb[3pt]{'} \xrb[4pt]{'}

Steve\rb[4pt]{'}s test
\end{document}

在此处输入图片描述

相关内容