xelatex 和 libertine:\renewcommand\ttdefault 不再有效

xelatex 和 libertine:\renewcommand\ttdefault 不再有效

此 MWE

\documentclass{article}

\usepackage{libertine}
\renewcommand\ttdefault{lmtt}

\begin{document}
foo \texttt{bar}
\end{document}

以前(比如说,大约一年前)bar如果使用 XeLaTeX 处理,则使用 lmtt 排版。现在不再这样了。相反,使用 Libertine 字体系列的成员。显然,更改\ttdefault会被忽略。为什么?

请注意,使用 pdflatex 处理可提供预期的拉丁现代字体。

使用的软件包(来自 TeXLive SVN rev 52404,2019-10-16)

  • LateX2e 2019-10-01
  • 字体规格 2019-10-14
  • 放荡 2019-02-27

[我用 重新生成了所有格式fmtutil-usr --all。]

xelatex 输出

答案1

2019/10/18 更新

Will 澄清说,这个问题是fontspec 在他的评论中.我建议如下临时补丁在 的下一个版本之前fontspec。该补丁适用于 pdfLaTeX、XeLaTeX 和 LuaLaTeX:

\documentclass{article}

\usepackage{libertine}
\renewcommand\ttdefault{lmtt}

% Temporary patch
\makeatletter
\AtBeginDocument{%
  \@ifpackageloaded{fontspec}{%
    \DeclareRobustCommand\ttfamily{%
      \fontencoding{\csname g__fontspec_nfss_enc_tl\endcsname}%
      \fontfamily{\ttdefault}%
      \selectfont
    }%
  }{%
  }%
}
\makeatother

\begin{document}
foo \texttt{bar}
\end{document}

警告:此补丁依赖于fontspec的私有变量\g_@@_nfss_enc_tl,因此可能无法与的较新版本兼容fontspec


原始答案

运行以下 MWE

\documentclass{article}

\usepackage{fontspec}
\setmonofont{Fira Mono}
\renewcommand\ttdefault{lmtt}

\begin{document}
foo \texttt{bar}
\end{document}

fontspec2016/01/30 v2.5, 我有

富吧

但随着fontspec2017/02/12 v2.6或者后来,我得到了

富吧


在 XeLaTeX 或 LuaLaTeX 上运行时,此包会在内部libertine调用。自v2.6 起,的实现已更改。在较新的版本中,发布后,将重新定义为始终使用字体系列,而不是 的字体系列。fontspecfontspec\setmonofont\setmonofont{<Foo>}fontspec\ttfamily<Foo>\ttdefault

在我看来,用户级重新定义\ttdefault从来都不是一个好的语法。我建议使用更高级别的重新定义:

\documentclass{article}

\usepackage{libertine}
% For XeLaTeX or LuaLaTeX
\setmonofont{Latin Modern Mono}[Scale=MatchLowercase]

\begin{document}
foo \texttt{bar}
\end{document}

答案2

这再次适用于 2019-10-19 发布的 fontspec 2.7d 版本。

相关内容