与 TeX4ht 使用不同的文档类

与 TeX4ht 使用不同的文档类

是否可以在 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),则仅编译一次,否则编译三次。因此,草稿模式可以节省大量时间。

相关内容