受到编译过程中引用的 cfg 文件创建的自定义环境的启发,mk4ht oolatex test.tex custom.cfg
如答案所示
配置 tex4ht/oolatex 输出
我想知道这能走多远。例如,从上述问题中的测试代码开始,我无法对这个引文环境的文本进行任何实际更改,例如字体大小更改或字体更改。下面在略作修改的 MWE 中可以看到一些更改工作。具体来说,我尝试插入: style:font-name="Times New Roman"
and,fo:font-size="18pt"
但我没有看到我的 odt 文件有任何变化。我尝试了十几个“字体名称”的逻辑变体,例如:
- 字体
- 字体名称
- 字体
- 字体
- 字体系列
但都没有改变我的格式。文档编译也没有崩溃,所以我甚至不确定我是否成功使用了 cfg 文件的这一部分。
文档中是否有我错过的 oolatex 可解析样式属性列表?
自定义配置文件
\Preamble{xhtml}
\makeatletter
\ConfigureEnv{quote}
{\ifvmode \IgnorePar\fi \EndP}
{\ifvmode \IgnorePar\fi\EndP\par\ShowPar}
{\EndP \ifvmode \IgnorePar\fi
\bgroup \Configure{HtmlPar}
{\EndP \HCode{<!--l. \the\inputlineno-->%
<text:p text:style-name="quote\if@rl-rtl\fi">}}
{\EndP \HCode{<!--l. \the\inputlineno-->%
<text:p text:style-name="quote\if@rl-rtl\fi">}}
{\HCode{</text:p>}}
{\HCode{</text:p>}}%
}
{\IgnorePar\EndP \egroup \ShowPar \ShowIndent}
\ConfigureOO{quote}{\Hnewline
<style:style style:name="quote"
style:font-name="Times New Roman"
fo:font-size="18pt"
style:family="paragraph"
style:parent-style-name="Text-body"
style:next-style-name="Text-body">\Hnewline
<style:paragraph-properties fo:margin-left="2cm"
fo:margin-right="1cm"
fo:margin-top="0.199cm"
fo:margin-bottom="0.199cm"
fo:text-indent="0cm"
style:auto-text-indent="false"/>\Hnewline
</style:style>
\Hnewline <style:style style:name="quote-trl"
style:family="paragraph"
style:parent-style-name="Text-body-trl"
style:next-style-name="Text-body-trl">\Hnewline
<style:paragraph-properties fo:margin-left="1cm"
fo:margin-right="1cm"
fo:margin-top="0.199cm"
fo:margin-bottom="0.199cm"
fo:text-indent="0cm"
style:auto-text-indent="false"
fo:text-align="end"
style:writing-mode="rl-tb" />\Hnewline
</style:style>
\Hnewline
}
\makeatother
\begin{document}
\EndPreamble
测试.tex
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage[T1]{fontenc}
\begin{document}
This is a normal paragraph.
\begin{quote}
This is an blockquote.
\end{quote}
Another paragraph.
\end{document}
最终我希望能够控制:
- 字体
- 字体大小
- 边距格式
- 段落间距和对齐类型(即正方形或不规则)
- 标题枚举
- 连续分节符
- 列控制(列数、间距等)
但是,在这些办公文档中自定义样式(xml?或css?)还需要迈出新的一步。
答案1
<style:text-properties>
我认为字体更改必须在 的子元素中完成<style:style>
。请参阅可能的属性列表,另一个列表。遗憾的是,我找不到任何可读的描述。无论如何,试试这个:
\Preamble{xhtml}
\makeatletter
\ConfigureEnv{quote}
{\ifvmode \IgnorePar\fi \EndP}
{\ifvmode \IgnorePar\fi\EndP\par\ShowPar}
{\EndP \ifvmode \IgnorePar\fi
\bgroup \Configure{HtmlPar}
{\EndP \HCode{<!--l. \the\inputlineno-->%
<text:p text:style-name="quote\if@rl-rtl\fi">}}
{\EndP \HCode{<!--l. \the\inputlineno-->%
<text:p text:style-name="quote\if@rl-rtl\fi">}}
{\HCode{</text:p>}}
{\HCode{</text:p>}}%
}
{\IgnorePar\EndP \egroup \ShowPar \ShowIndent}
\ConfigureOO{quote}{\Hnewline
<style:style style:name="quote"
style:family="paragraph"
style:parent-style-name="Text-body"
style:next-style-name="Text-body">\Hnewline
<style:paragraph-properties fo:margin-left="2cm"
fo:margin-right="1cm"
fo:margin-top="0.199cm"
fo:margin-bottom="0.199cm"
fo:text-indent="0cm"
style:auto-text-indent="false"/>\Hnewline
<style:text-properties
fo:font-size="18pt"
style:font-name="Times New Roman"
/>\Hnewline
</style:style>
\Hnewline <style:style style:name="quote-trl"
style:family="paragraph"
style:parent-style-name="Text-body-trl"
style:next-style-name="Text-body-trl">\Hnewline
<style:paragraph-properties fo:margin-left="1cm"
fo:margin-right="1cm"
fo:margin-top="0.199cm"
fo:margin-bottom="0.199cm"
fo:text-indent="0cm"
style:auto-text-indent="false"
fo:text-align="end"
style:writing-mode="rl-tb" />\Hnewline
</style:style>
\Hnewline
}
\makeatother
\begin{document}
\EndPreamble
结果如下:
2018 年 11 月编辑:
make4ht
现在可以直接输出 ODT 文件,并支持过滤器。因此下面的代码可以大大简化:
local filter = require "make4ht-filter"
local process = filter {
function(content)
content = content:gsub("<office:font%-face%-decls>", [[<office:font-face-decls>
<style:font-face style:name="Times New Roman" svg:font-family="'Times New Roman'" style:font-family-generic="roman" style:font-pitch="variable"/>]])
return content
end
}
Make:match("styles.4oy$", process)
可以使用以下方式执行
make4ht -e buildfilename.mk4 -c configfile.cfg -f odt filename.tex
文件styles.4oy$
模式将文件与 ooffice 样式进行匹配,并执行声明在文档中使用“Times New Roman”字体的过滤器。
编辑:
文档中未使用 Times New Roman,因为未声明它。要声明新字体,必须修改文件styles.xml
。不幸的是,没有提供此声明的接口,因此我们必须使用涉及构建文件tex4ht
的技巧:mk4
local mkutils = require "mkutils"
local zip = require "zip"
settings_add {
tex4ht_sty_par = ",ooffice",
tex4ht_par = " ooffice/! -cmozhtf",
t4ht_par = " -cooxtpipes -coo "
}
Make:match("tmp$", function(name, par)
local odtname = mkutils.remove_extension(name) .. ".odt"
local stylesname = "styles.xml"
local odtfile = zip.open(odtname)
local styles = odtfile:open("styles.xml")
local content = styles:read("*all")
styles:close()
odtfile:close()
content = content:gsub("<office:font%-face%-decls>", [[<office:font-face-decls>
<style:font-face style:name="Times New Roman" svg:font-family="'Times New Roman'" style:font-family-generic="roman" style:font-pitch="variable"/>]])
print(content)
local styles_file = io.open(stylesname,"w")
styles_file:write(content)
styles_file:close()
os.execute("zip " .. odtname .. " " .. stylesname)
os.remove(stylesname)
end)
用作
make4ht -e buildfilename.mk4 -c configfile.cfg filename.tex
在 TL 2018 中,可以直接使用with创建odt
文件。由于它不易获得,因此需要明确设置输出的设置。make4ht
make4ht -f odt
odt
在Make:match
函数中,从文件中提取 settings.xmlodt
并使用 Times New Roman 的声明进行更新。