使用 make4ht 的 ODT 模板

使用 make4ht 的 ODT 模板

当使用 pandoc 将文档转换为 ODT 或 DOCX 时,可以使用 指定参考文档--reference-doc=。生成的文件将使用参考文档中的样式。这会带来非常精简的工作流程:

  1. 使用 pandoc 转换您的文档
  2. 调整输出文档中的样式
  3. 使用此文档作为未来转换的参考文档

现在,我在想是否可以用 make4ht 做类似的事情。

我知道可以调整生成的 ODT 文件中的样式,并且现在也可以运行 lua 过滤器(请参阅此问题)。然而,由于 ODT 文件基本上只是 ZIP 档案,我认为可能有一个更简单的解决方案:styles.xml从 ODT 文件(参考文档)中提取文件并将其添加到使用 tex4ht 生成的 ODT 文件中。

是否可以使用 make4ht 自动执行此过程?(当然,使用简单的 makefile 是一种解决方案,但我认为更集成的解决方案可能会更好。)

答案1

编辑

的开发版本make4ht已将以下代码集成为odttemplate过滤器和扩展。可按以下方式使用:

 make4ht -f odt+odttemplate filename.tex "odttemplate=template.odt"

原始答案:

以下构建文件styles.xml从模板 ODT 文件中提取。它充当生成的样式文件的过滤器tex4ht,并用提取的文件替换其内容:

local filter = require "make4ht-filter"
local mkutils = require "mkutils"
local zip = require "zip"

-- filter_settings "odttemplate" {
--   filename = "test.odt"
-- }

local function get_template_filename()
  -- either get the template odt filename from tex4ht.sty options (make4ht filename.tex "odttemplate=test.odt")
  local tex4ht_settings = settings.tex4ht_sty_par
  local templatefile = tex4ht_settings:match("odttemplate=([^%,]+)")
  if templatefile then return templatefile end
  -- read the template odt filename from settings
  local filtersettings = get_filter_settings "odttemplate"
  return filtersettings.filename
end

local process = filter {function(content)
  local templatefile = get_template_filename()
  -- don't do anything if the template file doesn't exist
  if not templatefile or not mkutils.file_exists(templatefile) then return content end
  local odtfile = zip.open(templatefile)
  local stylesfile = odtfile:open("styles.xml")
  -- just break if the styles cannot be found
  if not stylesfile then return content end
  local styles = stylesfile:read("*all")
  return styles
end}
-- the styles.xml is saved in a file with .4oy extension
Make:match("4oy$", process)

有两种方法可以将模板文件的信息传递给过滤器。第一种方法是在构建文件中注释掉。使用以下函数filter_settings

 filter_settings "odttemplate" {
   filename = "test.odt"
 }

第二种方法是将其传递到tex4ht.sty选项中。这意味着要么在命令行上,要么在\Preamble私有配置文件中的命令中。这是从命令行使用它的方法:

make4ht -f odt -u sample.tex "odttemplate=test.odt"

以下是使用 制作的修改过的 ODT 文件的示例tex4ht。标题样式已更改为使用红色:

enter image description here

相关内容