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
结果如下: