我正在处理的一份文档使用了一个不太常见的字符,即带有长音符号的字母“y”:ȳ
最近,我决定为文档的某个部分更换字体,即 Latin Modern Typewriter Prop。文档本身使用 LuaLaTeX 和 fontspec 排版。这种字体非常适合我的目的,除了一个问题,ȳ 不存在于其中!现在,我能够想出一个 hack 式的解决方法:
\newcommand{\yn}{%
\phantom{y}\kern -1ex%
\=i\kern -0.678ex%
\setlength{\fboxsep}{0.2pt}%
\colorbox{white}{\color{white}\i}\kern -1ex y}
本质上,这样做的作用是将字母“i”与长音符号ī叠加,其中没有点的i,ı,用白色表示,只留下长音符号可见,然后再将其与字母“y”叠加。
问题是我已经有大量用于\=y
排版 ȳ 的代码,而更改这些代码将非常耗时。除此之外,如果我再次切换字体(或者如果当前字体获得了 ȳ 的字符),那么不用再改回来就好了。
所以基本上,我的问题是:使用 fontspec(或其他什么),有什么方法可以做到当找不到特定字符时,用特定命令代替?
答案1
更好的解决方案需要两个步骤:首先,您必须取消声明组合\=y
,然后重新定义ȳ
以进行组合。
\documentclass{article}
\usepackage{fontspec}
\usepackage{newunicodechar}
\setmonofont{Latin Modern Mono Prop}
\UndeclareUTFcomposite{x0233}{\=}{y}
\newunicodechar{ȳ}{\=y}
\begin{document}
ȳ \textsf{ȳ} \texttt{ȳ}
\end{document}
为了使组合起作用,\url
你必须将它教给包:
\documentclass{article}
\usepackage{fontspec}
\usepackage{newunicodechar}
\usepackage{hyperref}
\setmonofont{Latin Modern Mono Prop}
\UndeclareUTFcomposite{x0233}{\=}{y}
\newunicodechar{ȳ}{\=y}
\makeatletter % for url
\g@addto@macro\UrlSpecials{\do\ȳ{\=y}}
\makeatother
\begin{document}
ȳ \textsf{ȳ} \texttt{ȳ}
\url{www.ȳ.com}
\end{document}
更新
使用 2017 年 1 月的 XeTeX 版本fontspec
,XeLaTeX 的输入可以简化,因为 Harfbuzz 库将自行处理复合材料:
\documentclass{article}
\usepackage{fontspec}
\usepackage{url}
\setmonofont{Latin Modern Mono Prop}
\makeatletter % for url
\g@addto@macro\UrlSpecials{\do\ȳ{\hbox{ȳ}}}
\makeatother
\begin{document}
ȳ \textsf{ȳ} \texttt{ȳ}
\url{www.ȳ.com}
\end{document}
另一方面,这不适用于 LuaLaTeX,因此最好使用适用于两个引擎的代码。因此,我们假设我们有一个带有 ȳ 字形的文本字体,但等宽字体没有。
可以为有问题的字体定义一个新的编码,在这种情况下,我TUy
根据现在的默认 TU 编码来调用它(名称并不重要,只要它是唯一的)。
\documentclass{article}
\usepackage{fontspec}
\usepackage{newunicodechar}
\usepackage{url}
\makeatletter % reading tuenc.def needs it
\DeclareUnicodeEncoding{TUy}{
\input{tuenc.def}% the new encoding is based on TU
\UndeclareComposite{\=}{y}% but with a change
}
\makeatother
\setmainfont{Libertinus Serif}
\setsansfont{Libertinus Sans}
\setmonofont{Latin Modern Mono Prop}[
NFSSEncoding=TUy
]
\newunicodechar{ȳ}{\=y}
\makeatletter % for url
\g@addto@macro\UrlSpecials{\do\ȳ{\hbox{\=y}}}
\makeatother
\begin{document}
ȳ \textsf{ȳ} \texttt{ȳ}
\url{www.ȳ.com}
\end{document}