使用 tex4ht 时 makecell 出现问题

使用 tex4ht 时 makecell 出现问题

tex4ht我在使用with创建文档时遇到了问题makecell

考虑以下 M(n)WE:

\documentclass{article}

\usepackage[T1]{fontenc}
\usepackage{booktabs}
\usepackage{lipsum}
\usepackage{makecell}

\begin{document}

\lipsum

\begin{tabular}{cccc}
\toprule
 & {\thead{production \\ (kt)}}
 & {\thead{imports \\ (kt)}}
 & {\thead{import. coef. \\ (\%)}} \\
\midrule
1924 & 55138 & 2100 & 3,7 \\
1925 & 62901 & 2200 & 3,4 \\
1926 & 68708 & 2600 & 3,6 \\
1927 & 62732 & 2600 & 4,0 \\
1928 & 63195 & 2500 & 3,8 \\
1929 & 74200 & 3100 & 4,0 \\
1930 & 59346 & 2800 & 4,5 \\
\addlinespace
1935 & 31030 & 1516 & 4,7 \\
1936 & 49398 & 2268 & 4,4 \\
1937 & 72808 & 2481 & 3,3 \\
\bottomrule
\end{tabular}

\lipsum

\end{document}

使用以下方式处理时:

htlatex document.tex "xhtml,ooffice" " -cmozhtf" " -coo"

它输出一个文档。但是表格所在的位置在 .odt 输出中变成了一个“框”,文件就在那里结束。

事实上,.odt 已损坏。LibreOffice 打开它并且没有抱怨,但解压 .odt 是contents.xml无效的,并且在表格中的某个地方结束。

加载 makecell 就足以重现问题(即使不使用其宏,只要有一个表)。

对此有什么想法吗?最好离开makecell?或者有办法解决这个问题吗?

答案1

有两个问题。第一个是array包的配置错误,而 是 所需的makecell。它以某种方式破坏了输出中 tabular 的默认配置ooffice。有问题的代码如下:

\ifTag{vis-\TableNo-\HRow}%                                                                                                                                                                                  
      {\special{t4ht@[}\gdef\end:box{\special{t4ht@]}}}%                                                                                                                                                     
      {\global\let\end:box\empty}% 

\ifTag命令检查文件中定义的交叉引用是否存在.xref-tex4ht保留超链接等内容以及编译之间所需的其他信息。代码

 {\special{t4ht@[}\gdef\end:box{\special{t4ht@]}}}%

在将表添加到文档后,在下一次及后续编译中执行。它使用 禁用对字符和空格的处理\special{t4ht@[},使用 启用对字符和空格的处理\special{t4ht@]},后者在宏中执行\end:box。问题是该指令\special{t4ht@]}在流程中的某个地方再次插入。这会导致tex4ht立即停止输出,因此 XML 文件在表中停止,文档的其余部分被省略。XML 文件当然是无效的。这一切只发生在第二次及后续编译中,而不是第一次编译中,这使得追踪此问题的来源更加困难。

无论如何,我真的不知道为什么要使用这整个东西,我看不出省略它有什么区别。我希望删除它是安全的。因为ooffice.4ht很大,我只会在这里发布所需的补丁:

--- /usr/local/texlive/2018/texmf-dist/tex/generic/tex4ht/ooffice.4ht   2018-06-08 00:41:40.000000000 +0200
+++ makecell/ooffice.4ht    2018-06-15 14:24:09.787127871 +0200
@@ -1794,8 +1794,9 @@
 %
    }
    {\HCode{</table:table>}}
-   {\ifTag{vis-\TableNo-\HRow}%
-      {\special{t4ht@[}\gdef\end:box{\special{t4ht@]}}}%
+   {
+%\ifTag{vis-\TableNo-\HRow}%
+      %{\special{t4ht@[}\gdef\end:box{\special{t4ht@]}}}%
       {\global\let\end:box\empty}%
 %
     \HCode{<table:table-row \Hnewline

第二个问题是插入的子表makecell位于段落内,ODT 格式不支持这种情况。仅使用宏很难解决这个问题,最好使用过滤器 make4ht

文件mybuild.mk4

local domfilter = require "make4ht-domfilter"

local process = domfilter {
  function(dom)
    -- process all tables which are child nodes of text:p element, which is forbidden
    for _, table in ipairs(dom:query_selector("text|p table|table")) do
      print "*******************************************"
      -- replace the text:p with table:table
      local parent = table:get_parent()
      parent:replace_node(table)
      print(parent:get_parent():serialize())
    end
    return dom
  end
}

Make:match("4oo", process)

请注意,需要的是 的开发版本make4ht,而不是 CTAN 上的版本。使用以下命令进行编译:

make4ht -e mybuild.mk4 -f odt filename.tex

结果如下:

在此处输入图片描述

相关内容