我正在制作一份文件约瑟芬·桑斯字体在 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:
我垂直翻转一个caron:
\scalebox{1}[-1}{\char"5E}
上述操作会将卡龙送到基线深处,因此我将其抬起,使其位于基线上:
\raise{\depth}{...}
最后我将其尺寸设为零,这样它就不会影响排版决策:
\smash{...}
如何将假 háček 叠加到角色上:
我构建了一个由对齐组成的框,其中重音符号正好位于字符上方,居中。
\leavevmode
如果段落以这个重音符号开头,则需要使用 。在框内,我没有设置基线跳过和行跳过,因此由重音和字符组成的两个框将彼此重叠而没有任何垂直分离。
对齐是通过
tabular
与c
列类似的低级方式实现的。
该宏\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 现在我正在耐心等待原帖的答复,因为上面的解决方案实际上只是一个“解决方案”。此外,我很好奇我的字体编辑方法到底有什么问题。