如何解决make4ht编译Sweave文件时调用Cambria字体出错的问题
问题原因确认
你遇到的报错确实是由旧版本tex4ht的fontspec适配文件导致的。2017版的fontspec-xetex.4ht中调用了未定义的内部变量\fontspec_ht_scripts,该变量是后续tex4ht版本更新fontspec支持时才新增的,旧版本缺失对应定义直接触发编译错误。
无需升级系统包的可行解决方案
以下方案所有操作均在当前工作目录完成,不需要管理员权限修改系统TeX环境。
方案1:绕过fontspec包,通过CSS配置指定HTML字体(推荐)
该方案改动最小,兼容性最好,不需要额外修改原有PDF编译逻辑
你的需求是最终HTML文件使用Cambria字体、UTF-8编码,无需在TeX侧加载fontspec包,直接通过tex4ht的自定义配置注入CSS即可实现:
- 修改TeX源文件,删除
\usepackage{fontspec}和\setmainfont{Cambria}两行(如果需要同时编译PDF版本,可以把这两行包在条件判断里,仅非tex4ht编译时加载) - 在工作目录新建自定义配置文件
myconfig.cfg,内容如下:
\Preamble{xhtml} % 全局设置HTML字体为Cambria,fallback为系统衬线字体 \Css{body {font-family: Cambria, serif;}} \begin{document} \EndPreamble
- 替换编译命令为:
make4ht -u -c myconfig.cfg foo.tex
该命令默认使用pdfTeX引擎编译,输出UTF-8编码文件,生成的HTML会自动应用Cambria字体,行内非公式的希腊字母只要源文件为UTF-8编码即可正常显示,公式转图片逻辑不受影响。
方案2:保留fontspec加载逻辑,本地覆盖修复4ht文件
如果你的场景需要同时兼容PDF和HTML编译,不想修改源文件的fontspec加载逻辑,可以通过本地放置修复后的适配文件绕过系统旧版本的问题:
- 在当前工作目录新建
fontspec-xetex.4ht文件,先在开头补加缺失的变量定义:\def\fontspec_ht_scripts{} - 将系统目录下旧版
fontspec-xetex.4ht的全部内容复制追加到上述新建文件的末尾 - 继续使用原有
make4ht -xu foo.tex命令编译即可,TeX会优先加载当前目录下的修复版适配文件,不会触发未定义报错。
注意事项
- 两种方案均不需要修改系统级TeX包,所有文件均保存在当前工作目录即可生效
- 非公式的希腊字母、特殊符号只要源文件以UTF-8编码保存,均可正常在HTML中显示
- 公式转图片的逻辑与原有配置完全一致,不会出现显示异常
内容的提问来源于stack exchange,提问作者user16833340
相关产品推荐
相关产品推荐

