从 mk4ht oolatex 自定义 ODT 输出

从 mk4ht oolatex 自定义 ODT 输出

受到编译过程中引用的 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="&apos;Times New Roman&apos;" 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="&apos;Times New Roman&apos;" 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文件。由于它不易获得,因此需要明确设置输出的设置。make4htmake4ht -f odtodt

Make:match函数中,从文件中提取 settings.xmlodt并使用 Times New Roman 的声明进行更新。

相关内容