字符“ß”的字形在 Latin Modern 和 CMU 字体(CMU Serif、CMU Sans Serif 等,使用与ß
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}