我的 TeX 系统是 Windows 10 上的 MikTeX 2.9 Portable,但我相信这个问题对于任何 TeX 安装都具有普遍适用性。
考虑这个通用文档:
\documentclass[12pt]{article}
\begin{document}
Yada yada yada.
\end{document}
我没有指定字体。我的 TeX 系统默认选择 Computer Modern 字体系列。我相信在其他情况下(更复杂的文档,没有字体指定)它会选择 Latin Modern 字体系列。
现在,我知道了如何在文档中指定默认字体。但我想知道,当我根本没有提供字体选择时,TeX 在哪里选择 CM(或 LM)作为默认字体系列?
我之所以问这个问题,是因为我不从事数学工作,因此不需要如今 opentype 字体中普遍提供的字符以外的字符。我希望确保文档中出现的任何字体都是我拥有的授权商业字体之一,或者是 SIL 授权字体。因此,我希望将默认字体系列从 CM 或 LM 指向我已安装的(Adobe/Google)Source 字体之类的字体。
再次强调,这是当文档未指定任何字体时的情况。我不想在文档中添加字体规范,我想更改 TeX 系统默认值。我已经搜索了不少,但只发现了如何在文档中指定字体。
我意识到 GUST 和 Latex 项目许可证非常好,但我想将字体嵌入限制为商业或 SIL 许可字体。
答案1
由于您似乎正在使用fontspec
,因此解决方案要简单得多。
创建适当的结构
/usr/local/texlive/texmf-local/tex/latex/fontspec
并将分发文件的以下修改复制到那里fontspec.cfg
:
%%% FONTSPEC.CFG %%%
%
% This configuration file sets up TeX Ligatures by default for all fonts loaded
% with `\setmainfont` and `\setsansfont`.
%
% In addition, `\setmonofont` has default features to enforce "monospace"
% settings with regard to space stretchability and shrinkability.
%
% Make a copy of this file in your own home TEXMF directory to set up your own
% defaults.
\defaultfontfeatures
[\rmfamily,\sffamily]
{Ligatures=TeX}
\defaultfontfeatures
[\ttfamily]
{WordSpace={1,0,0},
PunctuationSpace=WordSpace}
%%% Modifications start here
\AtBeginDocument{
\setmainfont{SourceSerifPro}[
Extension=.otf,
UprightFont=*-Regular,
ItalicFont=*-Regular, % no italic
BoldFont=*-Bold,
BoldItalicFont=*-Bold, % no bold italic
]
\setsansfont{SourceSansPro}[
Extension=.otf,
UprightFont=*-Regular,
ItalicFont=*-RegularIt,
BoldFont=*-Bold,
BoldItalicFont=*-BoldIt,
]
\setmonofont{SourceCodePro}[
Extension=.otf,
UprightFont=*-Regular,
ItalicFont=*-RegularIt,
BoldFont=*-Bold,
BoldItalicFont=*-BoldIt,
]
}
运行mktexlsr
;现在修改后的fontspec.cfg
文件将优先于分发的文件。尝试以下测试文件:
\documentclass{article}
\usepackage{fontspec}
\begin{document}
Main:
Normal \textit{Italic} \textbf{Bold \textit{BoldItalic}}
{\sffamily Sans:
Normal \textit{Italic} \textbf{Bold \textit{BoldItalic}}
}
{\ttfamily Mono:
Normal \textit{Italic} \textbf{Bold \textit{BoldItalic}}
}
\end{document}
输出将是
以下只是为了确认的输出pdffonts test.pdf
。
name type encoding emb sub uni object ID
------------------------------------ ----------------- ---------------- --- --- --- ---------
CUDPZP+SourceSerifPro-Regular-Identity-H CID Type 0C Identity-H yes yes yes 5 0
YCFVOZ+SourceSerifPro-Bold-Identity-H CID Type 0C Identity-H yes yes yes 7 0
OKVEPQ+SourceSansPro-Regular-Identity-H CID Type 0C Identity-H yes yes yes 9 0
OLDNKC+SourceSansPro-It-Identity-H CID Type 0C Identity-H yes yes yes 11 0
KKFWEH+SourceSansPro-Bold-Identity-H CID Type 0C Identity-H yes yes yes 13 0
VXEFYK+SourceSansPro-BoldIt-Identity-H CID Type 0C Identity-H yes yes yes 15 0
IVVCWG+SourceCodePro-Regular-Identity-H CID Type 0C Identity-H yes yes yes 17 0
OSDIQN+SourceCodePro-It-Identity-H CID Type 0C Identity-H yes yes yes 19 0
NTAJGT+SourceCodePro-Bold-Identity-H CID Type 0C Identity-H yes yes yes 21 0
LSJKOA+SourceCodePro-BoldIt-Identity-H CID Type 0C Identity-H yes yes yes 23 0
答案2
事实证明(针对我的情况)有一个非常简单的解决方法:
我可以使用 Source (Serif、Sans、Mono) Pro 字体,因为它们有正确的许可证。所以我安装了它们。我获得了 OpenType 和 Type1 字体,但由于我只使用 LuaLaTeX(其他字体也必须如此),因此只对 OpenType 字体感兴趣。
我将这些字体复制到 fonts/opentype/public/lm 中,lm 字体就驻留在此位置。然后,我删除 lm 字体文件,并复制最近的源字体,但文件名已更改。因此,我用 SourceSerifPro.otf 替换了真正的 lmroman5-regular.otf、lmroman6-regular-.otf(等等),只是我将文件名更改为 lmroman5-regular.otf、lmroman6-regular.otf(等等)。
现在,当 fontspec 查找 lm opentype 字体时,它会在正确的文件夹中看到正确的文件名,并使用这些字体。它不知道它实际上使用的是源字体。PDF 中显示的是源字体(以其自身名称命名)。
我无法在我的本地(自定义)目录中完成这项工作。我不得不在主树中完成这项工作。如果 lm 字体包有更新,这可能会成为一个问题。因此,我制作了一个破解字体文件的 zip 副本,并将其保存在其他地方以备将来使用。
对于那些不使用 LuaLaTeX/fontspec 和 OpenType 字体的人来说,这将会更加费力。
请注意,我没有更改任何字体的内部名称。只更改了文件名。没关系。
实际使用 lm 字体的其他人不应该这样做。
这些都是胡说八道,因为我的商业印刷服务对实际字体文件中缺少 SIL 许可证感到不满意。