跳转至

使用 BookML 为博客添加对原生 LaTeX 的支持

配置本地环境(MS Windows)

配置本地环境便于预览使用 LaTeXML 生成的 HTML 文件。

根据 BookML 的 官方指南 安装依赖。

对下载的模板文件进行 gmake 时,可能会有以下报错:

PS ...\bookml\template> gmake       
 Targets: template.zip SCORM.template.zip 
 pdflatex: template.tex  template.pdf 
texfot --no-stderr latexmk  -synctex=5  -g -norc -interaction=nonstopmode -halt-on-error -recorder -deps -deps-out="auxdir/deps/template.pdfdeps" -MP -output-directory="auxdir/pdf" -pdf -dvi- -ps- "template.tex"
c:\texlive\2021\texmf-dist\scripts\texfot\texfot.pl: aborting, open(>/tmp/fot) failed: No such file or directory at c:\texlive\2021\texmf-dist\scripts\texfot\texfot.pl line 66.
C:\texlive\2021\bin\win32\runscript.tlu:915: command failed with exit code 2:
perl.exe c:\texlive\2021\texmf-dist\scripts\texfot\texfot.pl --no-stderr latexmk  -synctex=5  -g -norc -interaction=nonstopmode -halt-on-error -recorder -deps -deps-out="auxdir/deps/template.pdfdeps" -MP -output-directory="auxdir/pdf" -pdf -dvi- -ps- "template.tex"
gmake: *** [bookml/bookml.mk:332: auxdir/pdf/template.pdf] Error 2

解决方案:将 TEXFOT 变量设置为空:通过 gmake TEXFOT= 构建,以禁用 texfot,绕过相关问题。

或者将 template/bookml/bookml.mk 中的 TEXFOT 变量设置为空:

# (9) texfot (optional, disable with TEXFOT=)
TEXFOT      =

适配性修改

支持中文

BookML 在默认情况下使用 pdflatex 编译 LaTeX 文档,而中文支持所需的 CJK 宏包并未包含在 LaTeXML 的 有限宏包列表 中。

即使直接向 latexmk 传递 -xelatex 选项,latexmk 仍会优先选择其内部的 pdflatex 规则。其根本原因在于 latexmk 默认启用了强制 pdflatex 的选项(如 -pdf-dvi--ps-),从而覆盖了 -xelatex 的设置。通过去除这些选项并明确指定 -xelatex,便可让 latexmk 使用 XeLaTeX。

解决方案:在 bookml/bookml.mk 中修改规则:

# ...existing code...
LATEKMKFLAGS ?= 
# ...existing code...

# build PDF and deps files (in $(AUX_DIR))
-include $(wildcard $(AUX_DIR)/deps/*.pdfdeps)

# force rebuild if pdfdeps file is missing
$(AUX_DIR)/pdf/%.pdf: %.tex $$(if $$(wildcard $(AUX_DIR)/deps/$$*.pdfdeps),,FORCE) | $(AUX_DIR)/pdf $(AUX_DIR)/deps
    @$(call bml.prog,xelatex: $*.tex  $*.pdf)
    @$(call bml.cmd,$(TEXFOT) $(TEXFOTFLAGS) $(LATEXMK) $(LATEKMKFLAGS) \
        -synctex=$(SYNCTEX) -g -norc -interaction=nonstopmode -halt-on-error \
        -recorder -deps -deps-out="$(AUX_DIR)/deps/$*.pdfdeps" -MP \
        -output-directory="$(AUX_DIR)/pdf" "$<")
    @$(PERL) -pi -e "if (s/^ +/\t/) { s/ /$(if $(bml.is.win),\\,\\\\) /g; s/^\t/    /; }" "$(AUX_DIR)/deps/$*.pdfdeps"
# ...existing code...

修改为

# ...existing code...
LATEKMKFLAGS ?= -xelatex
# ...existing code...

# build PDF and deps files (in $(AUX_DIR))
-include $(wildcard $(AUX_DIR)/deps/*.pdfdeps)

# force rebuild if pdfdeps file is missing
$(AUX_DIR)/pdf/%.pdf: %.tex $$(if $$(wildcard $(AUX_DIR)/deps/$$*.pdfdeps),,FORCE) | $(AUX_DIR)/pdf $(AUX_DIR)/deps
    @$(call bml.prog,xelatex: $*.tex  $*.pdf)
    @$(call bml.cmd,$(TEXFOT) $(TEXFOTFLAGS) $(LATEXMK) $(LATEKMKFLAGS) \
        -synctex=$(SYNCTEX) -g -norc -interaction=nonstopmode -halt-on-error \
        -recorder -deps -deps-out="$(AUX_DIR)/deps/$*.pdfdeps" -MP \
        -output-directory="$(AUX_DIR)/pdf" "$<")
    @$(PERL) -pi -e "if (s/^ +/\t/) { s/ /$(if $(bml.is.win),\\,\\\\) /g; s/^\t/    /; }" "$(AUX_DIR)/deps/$*.pdfdeps"
# ...existing code...

同时,在 .tex 源文件中的导言区添加以下内容:

\RequirePackage{bookml/bookml}
\iflatexml
    \documentclass{article}
    \usepackage[british]{babel}
\else
    \documentclass[UTF8]{ctexart}
\fi

这将使得在使用 LaTeXML 编译时,使用英文的 babel 宏包,而在使用 XeLaTeX 编译时,使用 ctex 宏包来支持中文。

由于 LaTeXML 生成出来的 HTML 文件使用 UTF-8 字符集,因此并不需要对中文进行特殊处理。上面的操作只是保证编译出来的 PDF 文件能够正确显示中文,并且消除了在 gmake 时的报错。

与 Material for MkDocs 集成

🔧