当使用 pandoc 将文档转换为 ODT 或 DOCX 时,可以使用 指定参考文档--reference-doc=
。生成的文件将使用参考文档中的样式。这会带来非常精简的工作流程:
- 使用 pandoc 转换您的文档
- 调整输出文档中的样式
- 使用此文档作为未来转换的参考文档
现在,我在想是否可以用 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
。标题样式已更改为使用红色: