在 \newfontfamily 中参数化字体名称

在 \newfontfamily 中参数化字体名称

我想创建一个命令来创建新的字体系列。但我无法让该\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].

相关内容