配置本地环境便于预览使用 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
时的报错。
🔧