制作一个不会因 fontspec/xelatex 而发生泄漏的字体函数

制作一个不会因 fontspec/xelatex 而发生泄漏的字体函数

我正在尝试使用 fontspec 和 xelatex 创建一个 \noteunic 函数,该函数允许我使用 unicode 字体仅在文本的有限部分中书写。但是当我写这个时,字体会泄漏到它应该限制的域之外。

\documentclass[10pt,a4paper]{article}
\usepackage[utf8]{inputenc}

\usepackage{fontspec} % 
\newfontfamily\noteunic[BoldFont=meiryob.ttc]{meiryo.ttc}
\newcommand\textunic[1]{\noteunic {#1}}

\begin{document}
Main font \\
\noteunic{Something} \\
Not main font
\end{document}

我究竟做错了什么 ?

答案1

代码

\newfontfamily\noteunic[BoldFont=meiryob.ttc]{meiryo.ttc}

定义了\noteunic一个宣言,即其效果只结束于命令出现的组的命令。 而不是带有参数的命令; 同样适用于\bfseries、 \itshape ,\large` 等。

因此如果你输入

\noteunic{Abc}

你不是说只Abc应该打印在meiryo字体中,而是“meiryo从此时开始使用”。但是,组的结束将关闭字体选择。因此代码应该是

{\notenuic Abc}

并将}有效关闭字体选择。

在上述情况下,Abc被包含在一个组中,但该组不执行任何操作。按照您的 定义\textunic,代码\textunic{Abc}\noteunic{Abc}由于宏替换而变为,从而导致如图所示的“泄漏”。

LaTeX 提供了一种优雅的方法来定义字体改变声明的“参数”版本:

\DeclareTextFontCommand{\textunic}{\noteunic}

并在序言中加入了这段代码

\textunic{Abc}

将会做预期的事情。

相关内容