latexmk 说 fontspec/Path 未知

latexmk 说 fontspec/Path 未知

我有以下文档,其中使用存储在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 高度的美观效果。

相关内容