更新

更新

我正在处理的一份文档使用了一个不太常见的字符,即带有长音符号的字母“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}

在此处输入图片描述

相关内容