LuaLaTeX:替换 CMU 字体中的字符“ß”

LuaLaTeX:替换 CMU 字体中的字符“ß”

字符“ß”的字形在 Latin Modern 和 CMU 字体(CMU Serif、CMU Sans Serif 等,使用与ßcm-super 相同的字形)之间存在很大差异;参见这个答案):

比较 lmodern 与 cm-super

我更喜欢 Latin Modern 的版本ß,但我想使用 CMU 字体,因为它们具有 Unicode 功能(它们提供的字符比 Latin Modern 多得多)。我想避免编辑字体文件(我不想维护我自己的字体版本!)。

相反,我想知道如何在 LuaLaTeX 中用另一种字体替换单个字符。我见过 XeTeX 解决方案(例如这个问题),但没有适用于 LuaTeX 的。到目前为止,我尝试了以下方法:

\documentclass{scrartcl}
\usepackage{fontspec}
\setmainfont{CMU Serif}
\setsansfont{CMU Sans Serif}
\setmonofont{CMU Typewriter Text}

\usepackage{newunicodechar}
\newunicodechar{ß}{{\fontspec{Latin Modern Roman}ß}}

\begin{document}
    ß
\end{document}

但是,这种方法有两个问题:

  • \newunicodechar的定义中ß,我需要某种方法来检测字体是否应该设置为衬线、无衬线或打字机(粗体、斜体等变体似乎有效)。
  • 我怀疑制作ß一个主动角色是否是个好主意。我听说在这种情况下,TeX 中的连字/字距调整/其他细节可能会出现问题。

实现这一替换的最佳方法是什么?

更新:我已经扩展了检测字体系列变化的首次尝试。但问题是,使用活动字符是否会导致任何不必要的问题。

\documentclass{scrartcl}
\usepackage{fontspec}
\setmainfont{CMU Serif}
\setsansfont{CMU Sans Serif}
\setmonofont{CMU Typewriter Text}
\usepackage{newunicodechar}

\newfontfamily{\lmodernrm}{Latin Modern Roman}
\newfontfamily{\lmodernsf}{Latin Modern Sans}
\newfontfamily{\lmoderntt}{Latin Modern Mono}
\DeclareTextFontCommand{\textlmodernrm}{\lmodernrm}
\DeclareTextFontCommand{\textlmodernsf}{\lmodernsf}
\DeclareTextFontCommand{\textlmoderntt}{\lmoderntt}

\makeatletter
\newunicodechar{ß}{%
    \ifx\f@family\rmdefault\textlmodernrm{ß}%
    \else\ifx\f@family\sfdefault\textlmodernsf{ß}%
    \else\ifx\f@family\ttdefault\textlmoderntt{ß}%
    \fi\fi\fi}
\makeatother

\begin{document}
    ß \textsl{ß} \textit{ß} \textbf{ß}

    \sffamily
    ß \textsl{ß} \textit{ß} \textbf{ß}

    \ttfamily
    ß \textsl{ß} \textit{ß}
\end{document}

答案1

如果您喜欢拉丁语范围,您可以将 Latin Modern 设置为主要字体,然后使用 CMU Serif 作为更高 Unicode 范围的后备字体。取决于您需要多高的 Unicode。我仍然希望有人能设计出一种像 CSS 中的自动字体后备系统的机制。(为 LuaLaTeX 中的特定 Unicode 字符定义后备字体

\documentclass{article}
\usepackage{fontspec}
\setmainfont{Latin Modern Roman}
\newfontfamily{\unicodefont}{CMU Serif}
\DeclareTextFontCommand{\textunicode}{\unicodefont}
\begin{document}
Straße \textunicode{μετανοεῖτε}
\end{document}

在此处输入图片描述

答案2

Latin Modern字体系列也适用于 OpenType 格式;请参阅拉丁现代 (LM) 字体系列网站。更棒的是,它与 TeXLive 和 MikTeX 一起发布。(我可能遗漏了CMU中没有的功能吗LM?)因此,您可以编写

% !TEX TS-program = lualatex
\documentclass{scrartcl}
\usepackage{fontspec}
\setmainfont{Latin Modern Roman}
\setsansfont{Latin Modern Sans}
\setmonofont{Latin Modern Mono}
\begin{document}
ß \textsf{ß} \texttt{ß}
\end{document}

在此处输入图片描述

相关内容