类似问题在StackExchange上也有提问pdftex - fontawesome and pdflatex,检查了一下MiKTeX的安装路径发现文件是齐全的,MiKTeX也确实是最新的,但是AppData文件夹下没有MiKTeX的缓存文件。 测试代码如下:
\documentclass{article} %\usepackage{fontspec} \usepackage{fontawesome} \begin{document} \faMars \end{document}
字体配置过程
我在 TeX Live 2015 下面试了一下,代码没问题。 简单地说,代码没问题,不是你的错。问题可能是这个字体包当初安装时出现异常错误,此时你需要打开 MiKTeX 的 Package Manager,找到这个包,在里面删除(- 号)再重装(+ 号)fontawesome 包,应该就正常了。问题也可能是 MiKTeX 对字体包打包出错,此时你可能需要等待 MiKTeX 更新更正这个错误,你再跟着 Update。 我找到我的测试机上的 MiKTeX,重现了这个问题。查看了一下文件,确定应该是 MiKTeX 本身的错误。手工解决办法是:
在命令行运行下述命令:
initexmf --edit-config-file updmap
在弹出的记事本中增加下面一行并保存退出:
Map fontawesome.map
在命令行运行下述命令:initexmf --mkmaps
或者 updmap 命令也可。
上面的步骤会手工修复 fontawesome 字体的映射,并保存于用户目录中。 (按:如果从来没有生成过用户目录的字体映射,上面的命令加上 --admin 选项,则会修改系统目录的字体映射文件,也可以,对所有用户有效。但如果用户自己已经生成过字体映射,加 --admin 选项的设置会无效。) 当然,鉴于 TeX Live 没在这里出问题,改为使用 TeX Live 也是一种解决方案。个人以为出现这种问题,是 MiKTeX 处理管理员安装的系统宏包与用户安装宏包时,逻辑有问题造成的错误,还是换 TeX Live 省心。 ------------ 技术细节的分割线 ------------ 在 pdfLaTeX 要使用 fontawesome 字体的 \faMars 命令。顺利的话,这个过程是这样的:
LaTeX 从 fontawesome 宏包代码找到应该使用 U 编码的 fontawesomeone 字体族。
为此,LaTeX 会首先查找 ufontawesomeone.fd 这个字体定义文件:
\DeclareFontFamily{U}{fontawesomeone}{}
\DeclareFontShape{U}{fontawesomeone}{m}{n}{<-> FontAwesome--fontawesomeone}{}
这里字体定义文件将 U/fontawesomeone/m/n 这个 NFSS 字体坐标映射到了 FontAwesome--fontawesomeone 这个实际字体名。
然后一方面,TeX 引擎查找 FontAwesome--fontawesomeone.tfm 文件,找到字体的 metrics 信息,为字符生成合适大小的盒子。
另一方面,pdfTeX 会查找字体映射文件 pdftex.map,在其中找到对应的字体映射行:
FontAwesome--fontawesomeone FontAwesome " fontawesomeone ReEncodeFont " <[fontawesomeone.enc <FontAwesome.pfb
于是知道使用文件 fontawesomeone.enc 来处理字符编码重映射,而实际的字符 glyph 则在字体文件 FontAwesome.pfb 中寻找。
于是 pdfTeX 就从 pfb 字体文件中找到的 glyph 输出到最终的 PDF 文件中,这个符号占用的位置由 tfm 文件决定,而符号的编码由 enc 文件确定。
那么现在,MiKTeX 出错了。问题出在哪个环节?如果对上面过程不够熟悉,可以看 tex-font-errors-cheatsheet 这个文档。就会知道这个错误信息出现在文档中的第 4 步,也就是说没有找到正确的字体映射(注意到 fontawesome 并没有使用 virtual font):文档已经给出了大致的解决思路,即为 pdfTeX 重建字体映射。对于这个问题,应该是:
首先确定字体本身的字体映射文件存在。即应该有 fontawesome.map 文件,并在 TEXMF/fonts/map/dvips/fontawesome/ 目录下,其中 TEXMF 是 MiKTeX 的包安装根路径。如果不在或者位置不对,说明宏包安装时出错,或者 MiKTeX 打包有问题。
然后使用字体映射更新工具 updmap,将 fontawesome.map 文件加入其配置文件。图里面给的是 Linux 下 TeX Live 的命令,MiKTeX 应该用 initexmf --edit-config-file 修改配置文件,加入 fontawesome.map,并用 updmap 更新。
上面做完应该就好了。
作者:刘海洋
链接:https://www.zhihu.com/question/27589739/answer/37255728
来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
发表评论 取消回复