tex4ht - make4ht:如何为 odt 和 docx 文件创建固定宽度的表格列

tex4ht - make4ht:如何为 odt 和 docx 文件创建固定宽度的表格列

我想知道是否可以自定义 tex4ht 和 make4ht 以允许在 odt 文件中非常精确地构建表格,特别是手动指定列宽 ( p{x dim})。这个问题类似于但扩展到 odt/docx 编译:

在我使用 tex4ht 实现的过程中,我得到的解决方案来自:

以下 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 的文档在这种情况下似乎没有太大帮助,因此如果有人知道问题是什么,我会非常乐意修复它。

相关内容