如何从 \the\font 中提取字体名称

如何从 \the\font 中提取字体名称

我知道 LaTeX 没有这样的字符串,但我希望能够获取并保存当前字体名称的人类可读版本。

\f@family无法按预期工作,因为它显示的是基本字体而不是变体。

我在这里看到 @DavidCarlisle 的回答,它提供了我想要的信息,但我再也找不到那个答案了。它确实\expandafter\meaning\the\font打印了我需要的东西以及我不需要的东西。

我如何“保存”该信息并提取仅是人性化字体名称的子字符串?因此它将NotoSerif-ExtraBold从下面的示例 c 中捕获。

我以为源代码fontspec可能会向我展示,但我无法理解。

我已经看到\StrBetweenxstring,但我无法让它工作。

StrBetween ( \StrBetween{\expandafter\meaning\the\font}{s}{t} )

两耳之间什么都没有()我认为它至少应该elec在输出开始时打印select font。我以为可能StrBetween看到的是实际情况\expandafter...,所以我试了一下\expandafter\expandafter...,但那也没有用。

最小不工作示例

\documentclass{article}
\usepackage{fontspec,xstring}

% I don't know if you are supposed to load the packages
\usepackage{AnonymousPro}
\usepackage{noto}

% The font choices are deliberately silly to show the font name printing is working
\setmainfont{NotoSerif-Medium}[
     BoldFont       = NotoSerif-ExtraBold
    ,ItalicFont     = NotoSerif-ExtraLightItalic
    ,BoldItalicFont = NotoSerif-BlackItalic
]
\setsansfont{NotoSans-CondensedMedium}[
     BoldFont       = NotoSans-ExtraCondensedBlack
    ,ItalicFont     = NotoSans-LightItalic
    ,BoldItalicFont = NotoSans-CondensedSemiBoldItalic
]
\setmonofont{NotoSansMono-Regular}[
     BoldFont       = NotoSansMono-ExtraCondensedExtraBold
    ,ItalicFont     = AnonymousPro-Italic
    ,BoldItalicFont = AnonymousPro-BoldItalic.ttf
    % could not get it to work without the .ttf
]

\makeatletter
\newcommand*{\howbig}{\f@size}
\newcommand*{\whatfontami}{\f@family}
\makeatother


\begin{document}
a. \normalfont serif normal \rmdefault\ \howbig\ pt

b. \normalfont serif normal \expandafter\meaning\the\font\ \howbig\ pt

c. \normalfont serif bold \bfseries\expandafter\meaning\the\font\ \howbig\ pt

d. \normalfont sans italic \sffamily\expandafter\meaning\the\font\ \howbig\ pt

e. \normalfont mono bold italic \ttfamily\bfseries\itshape\expandafter\meaning\the\font\ \howbig\ pt
\end{document}

正确但不可用的输出

用于\expandafter\meaning\the\font打印一些字体信息,例如:

. 字体名称我 w

答案1

这是你想要的吗?抱歉没有混合单色字体,但 AnonymousPro 存在问题。

\documentclass{article}
\usepackage{fontspec}

% The font choices are deliberately silly to show the font name printing is working
\setmainfont{NotoSerif}[
  UprightFont    = *-Medium,
  BoldFont       = *-ExtraBold,
  ItalicFont     = *-ExtraLightItalic,
  BoldItalicFont = *-BlackItalic,
  Scale = 0.9
]
\setsansfont{NotoSans}[
  UprightFont    = *-CondensedMedium,
  BoldFont       = *-ExtraCondensedBlack,
  ItalicFont     = *-LightItalic,
  BoldItalicFont = *-CondensedSemiBoldItalic,
  Scale = MatchUppercase,
]
\setmonofont{AnonymousPro}[
  Extension=.ttf,
  UprightFont    = *-Regular,
  BoldFont       = *-Bold,
  ItalicFont     = *-Italic,
  BoldItalicFont = *-BoldItalic,
  Scale = MatchUppercase,
]

\ExplSyntaxOn
\NewDocumentCommand{\extractfont}{}
 {
  \str_set:Nx \l_tmpa_str { \fontname\font }
  \regex_replace_once:nnN { \:.* } { } \l_tmpa_str
  \regex_replace_once:nnN { \A \[(.*)\] \Z } { \1 } \l_tmpa_str
  \regex_replace_once:nnN { \.[^\.]* \Z } { } \l_tmpa_str
  \str_use:N \l_tmpa_str
 }
\ExplSyntaxOff

\makeatletter
\newcommand*{\howbig}{\f@size}
\newcommand*{\whatfontami}{\f@family}
\makeatother


\begin{document}

a. {serif normal \rmdefault\ \howbig\ pt}

b. {serif normal \extractfont\ \howbig\ pt}

c. {serif bold \bfseries\extractfont\ \howbig\ pt}

d. {sans italic \sffamily\extractfont\ \howbig\ pt}

e. {mono bold italic \ttfamily\bfseries\itshape\extractfont\ \howbig\ pt}

\end{document}

在此处输入图片描述

原始构造\fontname\font提供当前字体名称(select font开头没有),我删除了从第一个冒号开始的所有内容,然后删除了[]字体名称周围的可能的括号,最后删除了可能的扩展名(从句点后跟不包括句点的字符到结尾)。

相关内容