虚拟解决方案:在一个 TTF 字形中使用另一个 TTF 字形的重音符号

虚拟解决方案:在一个 TTF 字形中使用另一个 TTF 字形的重音符号

我正在制作一份文件约瑟芬·桑斯字体在 LaTeX 中(使用 XeLaTeX)。但是,我需要的一对符号(Žž)在那里不见了;PDF 中只有一个空白。我对字体一无所知,但还是决定试一试,因为我真的需要它。我使用 Type light 3.2 字体编辑器,找到缺失的字形(017D 和 017E),将相应的 Z 和 z 字形复制并粘贴在那里,并从其他字形中添加垂直翻转的抑扬符。在 OpenOffice Writer 中,这个技巧有效。(字符间距搞砸了,但我可以忍受:我的文档中只需要这些符号几次,所以我可以在 TeX 中手动移动它们。)但是在 TeX 中,符号仍然没有排版---我收到空白。

我认为我的做法不是正确的,但我确实需要它。有人能解释一下为什么 XeLaTeX 不排版新符号吗?是否有更好的解决方案?

我的 tex 代码:

\documentclass{article}
\usepackage{fontspec}
\setsansfont{Josefin Sans}
\begin{document}
Žž{\textsf{ZzŽžZz}
\end{document}

字体文件可用这里

答案1

这确实很复杂,但优点是输入的是普通字符。

\documentclass{article}
\usepackage{graphicx,newunicodechar}

\usepackage{fontspec}
\setsansfont{Josefin Sans}

\makeatletter
%% flip the caron
\def\fakehacekchar{\smash{\raisebox{\depth}{\scalebox{1}[-1]{\char"5E}}}}
%% define a "fake accent command"
\def\fakehacek#1{%
  \leavevmode\vbox{\baselineskip\z@skip \lineskip\z@skip
    \ialign{\hfil##\hfil\cr\fakehacekchar\cr#1\cr}}}
%% check if we have to use the fake háček
\ExplSyntaxOn
\cs_new_protected:Npn \makefakehacek #1 #2
 {
  \tl_if_in:VnTF \f@family {JosefinSans} {\fakehacek{#1}} { #2 }
 }
\cs_generate_variant:Nn \tl_if_in:nnTF { V }
\ExplSyntaxOff
\makeatother

\newunicodechar{Ž}{\makefakehacek{Z}{Ž}}
\newunicodechar{ž}{\makefakehacek{z}{ž}}

\begin{document}
Žž\textsf{ZzŽžZz}
\end{document}

如果可以选择的话,我不会选择 Josefine Sans。:)

在此处输入图片描述

改变一下\fakehacekchar可能会更有吸引力:x 和 y 方向的比例因子不同:

\def\fakehacekchar{\smash{\raisebox{\depth}{\scalebox{1.2}[-.8]{\char"5E}}}}

结果如下:

在此处输入图片描述


如何获得假的háček:

  1. 我垂直翻转一个caron:\scalebox{1}[-1}{\char"5E}

  2. 上述操作会将卡龙送到基线深处,因此我将其抬起,使其位于基线上:\raise{\depth}{...}

  3. 最后我将其尺寸设为零,这样它就不会影响排版决策:\smash{...}

如何将假 háček 叠加到角色上:

  1. 我构建了一个由对齐组成的框,其中重音符号正好位于字符上方,居中。\leavevmode如果段落以这个重音符号开头,则需要使用 。

  2. 在框内,我没有设置基线跳过和行跳过,因此由重音和字符组成的两个框将彼此重叠而没有任何垂直分离。

  3. 对齐是通过tabularc列类似的低级方式实现的。

该宏\makefakehacek检查当前字体系列是否为 JosefinSans;如果是,则检查;\fakehacek{#1}否则检查#2。因此,\fakehacek{Z}{Ž}将调用正确的排版。

最后一步:告诉 XeLaTeX 我们希望Ž被解释为\fakehacek{Z}{Ž},这是的工作\newunicodechar

第二个例子使用了一个不同的假 háček,其构造与上面相同,但

\scalebox{1.2}[-.8]{\char"5E}}}

将 caron 在水平方向上扩展 20%(1.2),在垂直方向上压缩 20%,并且由于比例为负(-.8),因此垂直翻转。

答案2

这并不是真正的答案,但我为可能处于类似绝望境地的人找到了一种解决方法:我基本上使用 TeX 本身重复了问题中描述的方法:

\documentclass{article}
\usepackage{fontspec}
\usepackage{graphicx,trimclip}
\setsansfont{Josefin Sans}

\newcommand{\lz}{\marginbox*{0 1.8ex 0 0}{\rotatebox{180}{\clipbox{0 1.1ex 0 0}{ê}}}\hspace{-.45em}z}
\newcommand{\lZ}{\marginbox*{0 2.5ex 0 0}{\rotatebox{180}{\clipbox{0 2ex 0 0}{Ê}}}\hspace{-.63em}Z}

\begin{document}
\textsf{Kata\lz{}ina}
\end{document}

TeX 的强大功能永远令我惊叹不已!

PS 现在我正在耐心等待原帖的答复,因为上面的解决方案实际上只是一个“解决方案”。此外,我很好奇我的字体编辑方法到底有什么问题。

相关内容