我正在尝试迁移到 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}
答案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
”设置为helvet
ica 字体,但该字体似乎仅存在于 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 的输出如下(点击查看完整分辨率):
...这就是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}
好吧,希望这对某人有帮助,
干杯!