我正在尝试使用 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}
将会做预期的事情。