\IfBold 命令不再适用于 fontspec

\IfBold 命令不再适用于 fontspec

下列的这个例子我创建了一个命令来检查当前是否选择了粗体字体。

这肯定曾经在一段时间前起作用fontspec(使用 TeXlive2018,如果 pdf 元数据是可信的),但现在不再起作用了(只是tlmgr在我的 TeXlive2020 安装上运行),如以下 MWE 所示:

%!TEX program = lualatex
\documentclass{scrbook}
\usepackage{etoolbox}
\usepackage{hyperref}

%-- Font setup
\usepackage[euler-digits]{eulervm}
\usepackage[no-math]{fontspec}
\defaultfontfeatures{Extension=.otf}
\setmainfont{XCharter} % <-- COMMENT THIS LINE!

%-- IfBold Command
\makeatletter
\newcommand*{\IfBold}{%
  \ifx\f@series\my@test@bx
    \expandafter\@firstoftwo
  \else
    \expandafter\@secondoftwo
  \fi
}
\newcommand*{\my@test@bx}{bx}
\makeatother

%-- Define a command for K-theory
\newcommand{\Kay}{\IfBold{\ensuremath{\mathbold{K}}}{\ensuremath{K}}}
\robustify{\Kay}
\newcommand{\K}{\texorpdfstring{\Kay}{K}}

\begin{document}

\section*{I like \K-Theory}
This is the regular \K.
\textbf{This is \IfBold{bold}{non-bold} text.}
This is \IfBold{bold}{non-bold} text.

\end{document}

这是新引入的错误还是我遗漏了什么?

答案1

我已经\IfFontSeriesContextTF在内核中添加了 NFSS 命令集,以便可以可靠地确定字体系列上下文,即使在一种字体中“粗体”表示半粗体或......

第一个参数要么是bf(我是否在 中排版\bfseries?)要么是md(我是否在 `\mdseries 中排版?)。这是一个参数,因为有一天可能会有更多系列上下文可用。

这是\DeclareFontSeriesDefault可以指定“粗体”含义等等的\sffamily匹配。

该代码将在接下来的几天内以 latex-dev 格式的新上传形式出现,并将在 2020 年秋季发布时正式出现。

现在,您可以使用下面的代码代替示例中的代码(我知道,代码会更长一些)。latex-dev 出来后,您所需要的只是 的定义\IfBold,即一行,然后使用

lualatex-dev  myfile

来编译它。

%-- IfBold Command
\makeatletter

\DeclareRobustCommand\IfFontSeriesContextTF[1]{%
  \expand@font@defaults
  \@font@series@contextfalse
  \def\requested@test@context{#1}%
  \expandafter\edef\csname ??def@ult\endcsname{\f@family}%
  \let\@elt\test@font@series@context
      \@meta@family@list
      \@elt{??}%
  \let\@elt\relax
  \if@font@series@context
  \expandafter\@firstoftwo
  \else
  \expandafter\@secondoftwo
  \fi
}

\def\test@font@series@context#1{%
  \edef\reserved@a{\csname #1def@ult\endcsname}%
  \ifx\f@family\reserved@a
    \let\@elt\@gobble
    \expandafter\ifx
                \csname\requested@test@context series@#1\endcsname\f@series
      \@font@series@contexttrue
    \else
      \expandafter\ifx
                  \csname\requested@test@context def@ult\endcsname\f@series
        \@font@series@contexttrue
  \fi\fi\fi
}

\newif\if@font@series@context

\newcommand\IfBold{\IfFontSeriesContextTF{bf}}

\makeatother

结果是:

在此处输入图片描述

发短信快乐

更新 2020/05

现在,该实现已添加到 LaTeX 的开发格式中,可以使用lualatex-dev等进行测试。它将于 2020 年秋季的下一个主要版本中推出。

相关内容