是否可以在 make4ht / htlatex 编译期间使用与文档源代码中指定的文档类不同的文档类而不更改源代码?
假设我有一个文档来源:
\documentclass[varwidth=160mm]{standalone}
\usepackage{lipsum}
\begin{document}
\lipsum[1-2]
\end{document}
我不想更改文档源代码,因为这会破坏我在其他地方的设置。我可以在编译期间配置编译器(htlatex 或 TeX4ht)以使用特定的文档类(例如 article)吗?
答案1
您可以使用make4ht
构建文件来完成此任务。可以加载 TeX 文件,使用 Lua 正则表达式对其进行修改,将其保存到临时文件并编译该临时文件。
将以下文件另存为mybuild.mk4
:
local tempfile
Make:add("patchdocumentclass", function(arg)
-- open the TeX file and load it as string
local filename = arg.tex_file
local file = io.open(filename, "r")
local content = file:read("*all")
file:close()
-- replace the standalone class with article
local newcontent = content:gsub("\\documentclass%[?[^%]]*%]?{standalone}", "\\documentclass{article}")
-- make temporary file
local newname = "temp-" .. filename
local file = io.open(newname, "w")
-- save the modified content to the temp file
file:write(newcontent)
file:close()
-- call latex with modified TeX file
Make:htlatex {tex_file = newname}
-- we can't remove the temp file right now, because the compilation hasn't started yet
-- instead, we must save the temp name and remove it later
tempfile = newname
end)
if mode == "draft" then
Make:patchdocumentclass {}
else
Make:patchdocumentclass {}
Make:patchdocumentclass {}
Make:patchdocumentclass {}
end
-- remove the temp file
Make:match("tmp$", function(arg)
print("removing temp file: ".. tempfile)
os.remove(tempfile)
end)
您可以使用选项请求构建文件-e
:
make4ht -um draft -e mybuild.mk4 filename.tex
此构建文件中定义了一个新命令patchdocumentclass
。它是 Lua 函数,用于加载 TeX 文件并使用以下正则表达式替换standalone
文档类:article
local newcontent = content:gsub("\\documentclass%[?[^%]]*%]?{standalone}", "\\documentclass{article}")
然后将修改后的 TeX 代码保存到临时文件中,并使用以下代码开始编译
Make:htlatex {tex_file = newname}
我使用以下构造:
if mode == "draft" then
Make:patchdocumentclass {}
else
Make:patchdocumentclass {}
Make:patchdocumentclass {}
Make:patchdocumentclass {}
end
决定文档应编译多少次。如果draft
使用模式(如make4ht -m draft
),则仅编译一次,否则编译三次。因此,草稿模式可以节省大量时间。