![在 \newfontfamily 中参数化字体名称](https://linux22.com/image/438381/%E5%9C%A8%20%5Cnewfontfamily%20%E4%B8%AD%E5%8F%82%E6%95%B0%E5%8C%96%E5%AD%97%E4%BD%93%E5%90%8D%E7%A7%B0.png)
我想创建一个命令来创建新的字体系列。但我无法让该\newfontfamily
命令与参数化的字体名称一起使用。我正在使用 Lualatex。
我该怎么做才能在命令\newfontfamily
内部工作\mkfnt
?
\documentclass{article}
\usepackage{fontspec}
\newcommand\mkfnt[3]{%
\defaultfontfeatures[#2]{
UprightFont = LinLibertine_R ,
ItalicFont = LinLibertine_RI ,
BoldFont = LinLibertine_R#3 ,
BoldItalicFont = LinLibertine_R#3I ,
Extension = .otf
}
%\newfontfamily\#1{#2} % Want to create font family here
}
\mkfnt{mylib}{mylibD}{B}
\newfontfamily\mylib{mylibD} % Want to eliminate this line
\begin{document}
Hello
{\mylib Hello in Libertine}
\end{document}
答案1
该标记\#
只是排版#
,与宏参数的使用无关。
你不想\expandafter\newfontfamily\csname#1\endcsname
或\newfontfamily\#1
使用\newfontfamily#1
和\mkfnt{\mylib}{mylibD}{B}
我可能会使用后一种语法,以便定义的命令\mylib
在定义调用中是明确的,但这只是一个品味的问题。
答案2
我认为这种方法毫无理由:
\mkfnt{\mylib}{mylibD}{B}
很简单,它还会检查命令是否被定义。另一方面,还有一种更简单的方法。
\documentclass{article}
\usepackage{fontspec}
\newcommand\mkfnt[2]{%
\newfontfamily#1{LinLibertine}[
UprightFont = *_R,
ItalicFont = *_RI,
BoldFont = *_R#2,
BoldItalicFont = *_R#2I,
Extension = .otf,
]%
}
\mkfnt{\mylib}{B}
\begin{document}
Hello
{\mylib Hello in Libertine}
\end{document}
以下是日志文件的相关部分:
Package fontspec Info: Font family 'LinLibertine(0)' created for font
(fontspec) 'LinLibertine' with options [UprightFont =
(fontspec) *_R,ItalicFont = *_RI,BoldFont = *_RB,BoldItalicFont =
(fontspec) *_RBI,Extension = .otf].