转向 XeTeX 的最后一步:字体形状问题

转向 XeTeX 的最后一步:字体形状问题

我正在尝试迁移到 XeTeX 发行版。我目前遇到的问题如下:

如果我保留这些包,那么 Helvetica 就不会有问题了。

\usepackage[portuges,english]{babel}
\usepackage[T1]{fontenc}  
\usepackage[scaled]{helvet}
\renewcommand*\familydefault{\sfdefault}

但是,如果我像这样定义 XeTeX 包和字体:

\usepackage{mathspec}
\defaultfontfeatures{Mapping=tex-text}
\setmainfont{Helvetica}

\usepackage{polyglossia}
\setmainlanguage[variant=uk]{english}
\setotherlanguage{portuges}

\usepackage{xunicode}
\usepackage{unicode-math}

然后我收到有关缺少字体形状的警告,即:

LaTeX Font Warning: Font shape `EU1/phv/b/n' undefined
LaTeX Font Warning: Font shape `EU1/Helvetica(0)/m/sc' undefined

我也尝试过:

\usepackage{mathspec}
\defaultfontfeatures{Mapping=tex-text}
\usepackage[scaled]{helvet}
\renewcommand*\familydefault{\sfdefault}

但字体形状变得更糟了。

有人遇到过这个问题吗?

编辑:

现在我有以下软件包:

\usepackage{mathspec}
\defaultfontfeatures{Mapping=tex-text}
\setmainfont[
        Extension=.otf,
        UprightFont= *-regular,
        BoldFont=*-bold,
        ItalicFont=*-italic,
        BoldItalicFont=*-bolditalic,
    ]{texgyreheros}

\usepackage{polyglossia}
\setmainlanguage[variant=uk]{english}
\setotherlanguage{portuges}

\usepackage{xunicode}
\usepackage{unicode-math}

我开始使用的模板有以下命令:

\newcommand{\helv}{ % 
\fontfamily{phv}\fontseries{b}\fontsize{9}{11}\selectfont}

说实话我不知道它对字体做了什么,但我知道它是最后的抵抗:)

警告是:

LaTeX Font Warning: Font shape `EU1/phv/b/n' undefined

如果我删除\fontfamily命令,我会得到

LaTeX Font Warning: Font shape `EU1/texgyreheros(0)/b/n' undefined

此命令应用于文档的页眉和页脚。

我不知道这个命令是\fontfamily干什么的,但我猜想\fontseries它将字体定义为粗体。是否需要重新定义该命令以匹配 XeTeX?

答案1

TeX Gyre 字体通常带有小写字母。TeX Gyre Heros 看起来与 Helvetica 非常相似(从技术上讲,它基于 URW Nimbus Sans L;因此它具有与 Helvetica 相同的字体指标,但字符可能看起来略有不同)。字体可能已随您的 TeX 发行版安装。要在 XeLaTeX 中使用它们,您必须按以下方式调用它们:

\documentclass{article}
\usepackage{fontspec}

\setmainfont[
    Extension=.otf,
    UprightFont= *-regular,
    BoldFont=*-bold,
    ItalicFont=*-italic,
    BoldItalicFont=*-bolditalic,
]{texgyreheros}

\begin{document}
    CGRart \textsc{CGRart}
\end{document}

TeX Gyra Heroes 示例

答案2

正如 Caramdir 在他的评论中提到的那样,Helvetica 没有自带小写字母,而且似乎许多免费字体(甚至许多专业字体)都没有真正的小写字母。几年前,Will Robertson 在 XeTeX 邮件列表中推荐了以下解决方法。

过去我曾在 fontspec 中考虑过这个问题,但是如果您希望假小型大写字母的行为像 \textsc 那样,那么这实际上就变得不可能了——也就是说,让大写字母显示为真正的大写字母,而小写字母显示为缩放的大写字母。

因此,与使用 fontspec 相比,使用 relsize 包可能更容易,如下所示:

\documentclass{article}
\usepackage{fontspec,relsize}
\begin{document}
\fontspec{Georgia}
THIS IS UPPERCASE and lowercase
{\smaller THIS IS FAKE SMALL CAPS}
\end{document}

您也可以定义一个宏来使其更“语义化”:

\newcommand\fakesc[1]{{\smaller #1}}

原始信息这里

答案3

只是想发布我的结果 - 似乎最大的问题是字体编码;显然两者都无法\sffamily处理\sfdefault它 - 因此,虽然可以以多种方式将“ phv”设置为helvetica 字体,但该字体似乎仅存在于 T1 编码中。这种情况的一个迹象是,如果我使用pdflatex(先前删除所有fontspec相关内容)-我加载时得到helvet.sty

(/path/to/texlive/2011/texmf-dist/tex/latex/psnfss/ot1phv.fd
File: ot1phv.fd 2001/06/04 scalable font definitions for OT1/phv.

问题是,这fontspec将切换到不同的编码 - 如果使用 构建xelatex,则为 EU1,如果使用 构建,则为 EU2 lualatex(或者至少到目前为止我看到的情况是这样的)。因此,\sffamily可能会告诉 fontspec 查找phv,但如果编码设置为 EU2,则fontspec查找EU2/phv不存在的(而不是T1/phv存在的)。

解决方案似乎是明确发出这样的命令:

\fontencoding{T1}\fontfamily{phv}\selectfont

\sffamily... 并且如下面的 MWE 所示,我还没有找到重新定义或\sfdefault切换到 T1 编码的方法(例如使用显式\fontencoding{T1})。另一种方法可能是使用类似以下内容:

\DeclareFontShape{EU2}{phv}{m}{n}{<->ssub * phv/bx/n}{} % nope 

... 本着字体“映射”的精神这个帖子用于xelatex生成 fake-bold smallcaps 系列;并将原始字体中缺失的粗体小写字母映射到 fake-bold 中);不幸的是,它似乎\DeclareFontShape只能在相同编码的字体之间进行映射——我看不到在右侧 T1 行指定某些内容的方法。

MWE 的输出如下(点击查看完整分辨率):

测试.png

...这就是pdffonts在那里看到的:

$ pdffonts test.pdf 
name                                 type              emb sub uni object ID
------------------------------------ ----------------- --- --- --- ---------
UGSGGF+Junicode                      CID TrueType      yes yes yes      8  0
GEDPKS+LMRoman10-Regular             CID Type 0C       yes yes yes      9  0
ZRGIMP+NimbusSanL-Bold               Type 1            yes yes no      10  0
[none]                               Type 3            yes no  no      11  0
EURSKX+Junicode-Bold                 CID TrueType      yes yes yes     12  0

...这是代码:

\documentclass[10pt]{article}

\usepackage{fontspec}
\defaultfontfeatures{Ligatures=TeX}
\setmainfont[Scale=1.0]{Junicode}

\usepackage[left=10pt,right=10pt]{geometry}
\usepackage{tikz}

\usepackage{helvet}

% for debugging fonts: https://tex.stackexchange.com/a/14382/2595
\makeatletter
\newcommand{\showfont}{Encoding: \f@encoding{},
  Family: \f@family{},
  Series: \f@series{},
  Shape: \f@shape{},
  Size: \f@size{},
  \edef\tmpfn{\font@name}
  font@name: \meaning\font@name \\
}
\makeatother

\begin{document}

  Testing 1 \showfont

    \sffamily\selectfont

  Testing 2 \showfont

    % texlive/2011/texmf-dist/tex/latex/psnfss/helvet.sty
    \renewcommand{\sfdefault}{phv}\sfdefault\selectfont

  Testing 3 \showfont

    \fontencoding{T1}\fontfamily{phv}\bfseries\selectfont

  Testing 4 \showfont % macro:->\T1/phv/bx/n/12

    \rmfamily\selectfont

  Testing 5 \showfont

    \fontencoding{EU2}\selectfont

  Testing 6 \showfont

    \sffamily\selectfont

  Testing 7 \showfont

    \fontencoding{T1}\selectfont

  Testing 8 \showfont

    \fontencoding{EU2}\rmfamily\selectfont

  Testing 9 \showfont

%     \DeclareFontShape{EU2}{phv}{m}{n}{<->ssub * phv/bx/n}{} % nope
%     \renewcommand{\sfdefault}{\T1/phv/bx/n/12} % nope
    \sffamily\selectfont

  Testing 10 \showfont

    \typeout{ .. \expandafter\meaning\csname sffamily \endcsname -- \meaning\sffamily} %  .. \long macro:->\not@math@alphabet \sffamily \mathsf \fontfamily \sfdefault \selectfont -- macro:->\protect \sffamily
    \typeout{ .. \expandafter\meaning\csname sfdefault \endcsname -- \meaning\sfdefault} % \relax-- \long macro:->phv
    \typeout{ .. \expandafter\meaning\csname fontfamily \endcsname -- \meaning\fontfamily} % \long macro:#1->\edef \f@family {#1}-- macro:->\protect \fontfamily
    \typeout{ .. \expandafter\meaning\csname selectfont \endcsname -- \meaning\selectfont} %

\end{document}

好吧,希望这对某人有帮助,
干杯!

相关内容