我想知道是否可以自定义 tex4ht 和 make4ht 以允许在 odt 文件中非常精确地构建表格,特别是手动指定列宽 ( p{x dim}
)。这个问题类似于但扩展到 odt/docx 编译:
- tex4ht:如何创建固定宽度的表格列
- 在我之前的一个问题中,有一个有趣的解决方法,适用于 html 文件,但不适用于 odt 或 docx 文件(\pbox{max width}{text} 可以在 tex4ht 中使用吗)
在我使用 tex4ht 实现的过程中,我得到的解决方案来自:
- 补丁到软件包(即 cleveref 提供的补丁:htlatex (TeX4HT) 和 cleveref 兼容吗?)
- 宏/命令调整
- CSS 自定义到配置文件自定义(在参考模板中使用 ODT 样式来格式化 make4ht)
- 以及令人难以置信的令人印象深刻的 make4ht 构建/make 文件(像在 latex 中一样在 tex4ht 中嵌套表格)
- 甚至是其中多个的组合(从 mk4ht oolatex 自定义 ODT 输出)
以下 MWE 可以使用 xelatex 和 make4ht 很好地进行编译,但实际上无法实现我想要控制的参数(p{x dim}
)。
\documentclass{article}
\begin{document}
Test
\begin{tabular}{l p{1 cm} }
A1 & B1 \\
A2 & B2 \\
A3 & B3 \\
\end{tabular}
\begin{tabular}{ l p{3cm}}
\hline
Outer column & Detail column\\
\hline
a &
\begin{tabular}{c c }
A1 & B1 \\
A2 & B2 \\
A3 & B3 \\
\end{tabular}
\\
\hline
b
&
\begin{tabular}{c c }
A1 & B1 \\
A2 & B2 \\
A3 & B3 \\
\end{tabular}
\\
\hline
d & etc \\
\hline
\end{tabular}
\end{document}
我认为 make4ht makefile 有很大的潜力,但是当我解压成功创建的 word 文件时,我无法找到我希望控制的 xml 中的表。我的想法是在 make 文件中编写一个 lua 函数来替换定义表的 xml 字符串,但这依赖于在一个地方完成表创建,以及保留一个注释,该注释发出可以从注释或其他内容中解析出来的 p 宽度请求。
有什么想法、建议或起点可以让我探索将此控制功能添加到 odt/docx 列宽中?
答案1
以下代码将列样式与列宽一起保存:
\Preamble{xhtml}
\catcode`\:=11
\Configure{tabular}
{\ifvmode \IgnorePar\fi \EndP \halignTB{tabular}%
\putVBorder
%
}
{\HCode{</table:table>}}
{\ifTag{vis-\TableNo-\HRow}%
{\special{t4ht@[}\gdef\end:box{\special{t4ht@]}}}%
{\global\let\end:box\empty}%
%
\HCode{<table:table-row \Hnewline
\ifTag{vis-\TableNo-\HRow}{table:visibility="collapse" }{}
%
table:style-name="TBL-\TableNo-\HRow-}%
\halignTR
\HCode{">}}
{\HCode{</table:table-row>}\end:box
%
}
{\HCode{<table:table-cell \Hnewline}%
\ifnum \HMultispan>1
\HCode{table:number-columns-spanned="\HMultispan"\Hnewline}%
\bgroup
\def\:temp{\ifnum \HMultispan>1
\HAdvance\HMultispan by -1
\HCode{<table:covered-table-cell/>}%
\expandafter\:temp
\fi}%
\egroup
\fi
%
\HCode{ table:style-name="TBL-\TableNo-\HRow-\HCol">}%
\edef\Aligh:Wrap{\halignTD}%
\if !\Aligh:Wrap!\let\not:Pcell=\:gobble
\save:table:width%
\else \let\not:Pcell\empty \fi
\not:Pcell{\HCode{<text:p
\Hnewline text:style-name="}\cell:sty
\HCode{"
>}}%
\par \ShowPar
%
\PushStack\Table:Stck\TableNo
}
{\IgnorePar \EndP
\PopStack\Table:Stck\TableNo
%
\csname not:Pcell\endcsname{\HCode{</text:p>}}%
\HCode{</table:table-cell>}}
\def\save:table:width{%
\edef\current:column{TBL-\TableNo -\ar:cnt}
\ifx\HColWidth\relax\else
\ifcsname used\current:column\endcsname\else
\typeout{width:\HColWidth, \current:column}
\expandafter\xdef\csname used\current:column\endcsname{yes}
\OOstyles{%
<style:style
style:name="\current:column"
style:family="table-column">
<style:table-column-properties style:column-width="\the\dimexpr\HColWidth\relax" />
</style:style>
}
\fi
\fi
}
\catcode`\:=12
\begin{document}
\EndPreamble
该\Configure{tabular}
部分来自ooffice.4ht
并包含表格的配置。我只更改了以下几行,引入了\save:table:width
宏:
\if !\Aligh:Wrap!\let\not:Pcell=\:gobble
\save:table:width%
\else \let\not:Pcell\empty \fi
这个宏定义如下:
\def\save:table:width{%
\edef\current:column{TBL-\TableNo -\ar:cnt}
\ifx\HColWidth\relax\else
\ifcsname used\current:column\endcsname\else
\typeout{width:\HColWidth, \current:column}
\expandafter\xdef\csname used\current:column\endcsname{yes}
\OOstyles{%
<style:style
style:name="\current:column"
style:family="table-column">
<style:table-column-properties style:column-width="\the\dimexpr\HColWidth\relax" />
</style:style>
}
\fi
\fi
}
该\current:column
宏包含当前列名,\HColWidth
包含传递给列规范的宽度p
。测试宽度是否存在,并进行另一次检查以防止多次插入样式定义,就像\save:table:width
对每个具有固定宽度的单元格执行的那样。如果是第一次执行,它会使用命令将宽度插入到文档样式中\OOstyles
。该 \the\dimexpr\HColWidth\relax
命令用于将文档中指定的原始大小转换为点,因为 ODF 不支持所有单位,如 TeX。
styles.xml
这是文件中为文档引入的代码:
<style:style style:name="TBL-1-2" style:family="table-column"> <style:table-column-properties style:column-width="28.45274pt" /> </style:style>
尽管如此,它对 LO 中呈现的文件没有任何影响,因此可能缺少了某些内容。OpenDocument Format 的文档在这种情况下似乎没有太大帮助,因此如果有人知道问题是什么,我会非常乐意修复它。