我正在尝试将我的 Latex 文档导出为 HTML,但在使用禁忌环境。
作为测试用例,我使用以下源文件
\documentclass{article}
\usepackage[utf8]{inputenc}
\usepackage{tabu}
\begin{document}
\begin{table}[htbp]
\begin{tabu} to \textwidth{X[1,m,c]|X[1,m,c]}
A & B \\
\hline
1 & 2 \\
\end{tabu}
\caption{Some test table-}
\label{tab:test}
\end{table}
\end{document}
然后通过make4ht
作为包装器(从我得到的结果来看,它与直接使用相同htlatex
),这会导致以下错误消息:
Package tabu Warning: \@arrayright is missing from the
(tabu) definition of \endarray.
(tabu) Comptability with delarray.sty is broken. on input line 6
.
! Argument of \g:Advance has an extra }.
<inserted text>
\par
l.6 \begin{document}
?
我目前使用的命令
make4ht -uf html5 -d html test.tex "fn-in"
关于其他几个软件包,我读到了一些关于重新定义环境以应对此类错误的内容。有人能告诉我如何对 tabu 进行这样的操作吗?
旁注:
- 输出不必完全对齐等。我可以在 HTML 输出上运行另一个脚本。但我至少需要一个有效的表结构。
- 我希望保留
tabu
原始来源,因为有时 PDF 输出需要它。我更喜欢使用一些仅在使用 HTML 转换时适用的(重新)定义。
答案1
的问题tabu
是它重新定义了很多 LaTeX 宏,这与 的是一样的tex4ht
。而且它们相互冲突。为 、tex4ht
、创建补丁文件tabu.4ht
以便编译示例文档而不出现错误非常困难:
% we must suppress \everyrow redefintion by tabu, so some macro patching is necessary
\def\tabu@AtBeginDocument{
\ifdefined\CT@arc@ \else \let\CT@arc@ \relax \fi
\ifdefined\CT@drsc@\else \let\CT@drsc@ \relax \fi
\let\tabu@arc@L \CT@arc@ \let\tabu@drsc@L \CT@drsc@
% \everyrow{}%
}
\let\orig:hline\hline
\def\tabu@firstline{\orig:hline}
\def\tabu@firsthline{\orig:hline}
\def\tabu@lastline {\orig:hline}
\def\tabu@lasthline {\orig:hline}
% there is a clash between tabu and tex4ht on \hline handling
% we will just use \cr in place of \hline
\def\tabu@hline {\cr}% \tabu@hline
% this is basically a rewrite of the \tabu@select macro
% the original code just crashed everything
\def\tabu@select {%
\expandafter \tabuthepreamble
}% \tabu@select
\def\tabu@setup{\tabu@alloc@
\ifcase \tabu@nested
\ifmmode \else \iftabu@spread\else \ifdim\tabu@target=\z@
\let\tabu@afterendpar \par
\fi\fi\fi
\def\tabu@aligndefault{c}
\tabu@init
\tabu@indent
\else % <nested tabu>
\def\tabu@aligndefault{t}
\let\tabudefaulttarget \linewidth
\fi
\let\tabu@thetarget \tabudefaulttarget \let\tabu@restored \@undefined
\edef\tabu@NC@list{\the\NC@list}\NC@list{\NC@do \tabu@rewritefirst}%
%\everycr{} % don't let tabu redefine \everycr
\let\@startpbox \tabu@startpbox % for nested tabu inside longtabu...
\let\@endpbox \tabu@endpbox % idem " " " " " "
\let\@tabarray \tabu@tabarray % idem " " " " " "
\tabu@setcleanup
% \tabu@setreset % this causes issues
}% \tabu@setup
基本上,它会阻止某些tabu
宏的执行。这并不理想,因为它会丢失有关表格规则和边框的信息,但至少它会生成一个有效的表格。还有一个问题:它仍然会破坏一些低级tex4ht
定义,我无法在tabu.4ht
文件中修复它。它需要使用该no-halign
选项进行修复。因此文件的编译可能如下所示:
make4ht -uf html5 -d html test.tex "fn-in,no-halign"
结果如下: