我有以下文档,其中使用存储在fonts/
目录中的字体(特别是的几个子目录fonts/
),以及定义的字体子系列。我尝试使用以下命令将其编译成 PDF latexmk
:
\documentclass[10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[margin=0.75in]{geometry}
\usepackage[colorlinks=true]{hyperref}
\usepackage{metalogo}
\usepackage{fontspec}
\setmainfont{FRABK.TTF}[
ItalicFont = FRABKIT.TTF,
BoldFont = FRAMD.TTF,
BoldItalicFont = FRAMDIT.TTF,
FontFace = {db}{n}{ Font = FRADM.TTF, Path = fonts/franklin-gothic/ },
FontFace = {db}{i}{ Font = FRADMIT.TTF, Path = fonts/franklin-gothic/ },
Path = fonts/franklin-gothic/
]
\setsansfont{CGOR45W.TTF}[
ItalicFont=CGOR46W.TTF,
BoldFont=CGOR65W.TTF,
BoldItalicFont=CGOR66W.TTF,
Path = fonts/cg-omega/
]
\setmonofont{CONSOLA.TTF}[
ItalicFont=CONSOLAI.TTF,
BoldFont=CONSOLAB.TTF,
BoldItalicFont=CONSOLAZ.TTF,
Path = fonts/consolas/
]
\newcommand{\lmr}{\fontfamily{lmr}\selectfont} % Latin Modern Roman
\newcommand{\lmss}{\fontfamily{lmss}\selectfont} % Latin Modern Sans
\newcommand{\lmtt}{\fontfamily{lmtt}\selectfont} % Latin Modern Mono
\begin{document}
\section{Foo}
\fontseries{db}\selectfont
Demibold text \\
\normalfont
\textbf{Medium text} \\
Normal text
\noindent
\hrulefill \par
\noindent
\hypersetup{linkcolor=gray}
\small
\url{http://www.example.org/} \hfill \textbf{Date}
\end{document}
由于我使用的是fontspec
,因此需要xelatex
。但是,当我运行时latexmk -pdf -xelatex main.tex
,我收到:
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
! LaTeX error: "kernel/key-unknown"
!
! The key 'fontspec/Path' is unknown and is being ignored.
!
! See the LaTeX3 documentation for further information.
!
! For immediate help type H <return>.
!...............................................
l.17 ]
? h
|'''''''''''''''''''''''''''''''''''''''''''''''
| The module 'fontspec' does not have a key called fontspec/Path'.
| Check that you have spelled the key name correctly.
|...............................................
原因fontspec/Path
未知,我怎样才能让它被认可? 我的调用是否不正确,可能导致它在应该使用的时候latexmk
没有使用?xelatex
更一般地说,是否可以通过更好的组织字体定义或文档编译方法来缓解这一问题?
答案1
每Will Robertson 的评论, 实际上,fontspec
能找到字体;它只是不需要重复告知位置。应用以下 diff 消除了错误:
- FontFace = {db}{n}{ Font = FRADM.TTF, Path = fonts/franklin-gothic/ },
- FontFace = {db}{i}{ Font = FRADMIT.TTF, Path = fonts/franklin-gothic/ }
+ FontFace = {db}{n}{ Font = FRADM.TTF },
+ FontFace = {db}{i}{ Font = FRADMIT.TTF }
完整示例
\documentclass[10pt]{article}
\usepackage[utf8]{inputenc}
\usepackage[margin=0.75in]{geometry}
\usepackage[colorlinks=true]{hyperref}
\usepackage{metalogo}
\usepackage{fontspec}
\setmainfont{FRABK.TTF}[
ItalicFont = FRABKIT.TTF,
BoldFont = FRAMD.TTF,
BoldItalicFont = FRAMDIT.TTF,
FontFace = {db}{n}{ Font = FRADM.TTF },
FontFace = {db}{i}{ Font = FRADMIT.TTF },
Path = fonts/franklin-gothic/
]
\setsansfont{CGOR45W.TTF}[
ItalicFont=CGOR46W.TTF,
BoldFont=CGOR65W.TTF,
BoldItalicFont=CGOR66W.TTF,
Path = fonts/cg-omega/
]
\setmonofont{CONSOLA.TTF}[
ItalicFont=CONSOLAI.TTF,
BoldFont=CONSOLAB.TTF,
BoldItalicFont=CONSOLAZ.TTF,
Path = fonts/consolas/
]
\newcommand{\lmr}{\fontfamily{lmr}\selectfont} % Latin Modern Roman
\newcommand{\lmss}{\fontfamily{lmss}\selectfont} % Latin Modern Sans
\newcommand{\lmtt}{\fontfamily{lmtt}\selectfont} % Latin Modern Mono
\begin{document}
\section{Foo}
\fontseries{db}\selectfont
Demibold text \\
\normalfont
\textbf{Medium text} \\
Normal text
\noindent
\hrulefill \par
\noindent
\hypersetup{linkcolor=gray}
\small
\url{http://www.example.org/} \hfill \textbf{Date}
\end{document}
答案2
最简单的答案:
将字体文件复制到~/.fonts/
,重新运行fc-cache
,然后通过其可读的名称加载它们。
更全面、修订版:
我的第一个回答没有注意到你的问题是你的半粗体字体不起作用。下面是解决方法。为了测试这一点,我将所有 Libertine 字体的符号链接放在一个fonts/
目录中,名称略有改变,这样 XeLaTeX 或 LuaLaTeX 就不可能在原始位置找到它们。
\documentclass{article}
\usepackage{iftex}
\ifPDFTeX
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage{cmbright}
%% Load without Biolinum, or it will replace CM Bright,
%% and without sb, or it will replace bold:
\usepackage[libertine]{libertine}
\else % Assume a Unicode engine.
\usepackage{fontspec}
%% COPY and RENAME the Libertine files to test the engine's ability to find them.
\setmainfont{Libertine_R.otf}[
Path = fonts/,
FontFace = {sb}{n}{ Font = Libertine_RZ.otf},
FontFace = {sb}{it}{ Font = Libertine_RZI.otf},
BoldFont = {Libertine_RB.otf},
ItalicFont = {Libertine_RI.otf},
BoldItalicFont = {Libertine_RBI.otf},
]
\defaultfontfeatures{Scale=MatchLowercase}
\setsansfont[ FontFace = {sb}{n}{CMU Bright SemiBold},
FontFace = {sb}{it}{CMU Bright SemiBold Oblique},
]{CMU Bright}
\fi % \ifPDFTeX
\DeclareOldFontCommand{\sbseries}{\fontseries{sb}\selectfont}{\mathbf}
\DeclareTextFontCommand{\textsb}{\sbseries}
\begin{document}
\framebox[10cm][s]{
\rmfamily \makebox[2.5cm][c]{Normal} \makebox[2.5cm][c]{\mdseries Medium} \makebox[2.5cm][c]{\sbseries Semibold} \makebox[2.5cm][c]{\bfseries Bold} \normalfont
} \par
\framebox[10cm][s]{
\makebox[2.5cm][c]{\textsf{Normal}} \makebox[2.5cm][c]{\textsf{\textmd{Medium}}}\makebox[2.5cm][c]{\textsf{\textsb{Semibold}}} \makebox[2.5cm][c]{\textsf{\textbf{Bold}}}
}
\end{document}
请注意,无需\inputenc
在 中声明,因为它们默认接受 UTF-8,并且\newfontfamily
存在以执行您想要的操作\lmr
。此外,半粗体字体的常用系列名称是{sb}
。
补充笔记
与您的示例有一些不同,但这些不同并不大。与原始示例一样,此解决方案将自定义字体放在子目录中fonts/
。\ifPDFTeX
块仅用于示例将在 PDFLaTeX 上编译并提供参考输出。最后,该\defaultfontfeatures
命令具有将加载的所有字体缩放fontspec
到相同 x 高度的美观效果。