![tabu 和 tabularx 兼容性 - 用于 htlatex、tex4ht 以及 tabu 和 tabularx 之间的迁移](https://linux22.com/image/303588/tabu%20%E5%92%8C%20tabularx%20%E5%85%BC%E5%AE%B9%E6%80%A7%20-%20%E7%94%A8%E4%BA%8E%20htlatex%E3%80%81tex4ht%20%E4%BB%A5%E5%8F%8A%20tabu%20%E5%92%8C%20tabularx%20%E4%B9%8B%E9%97%B4%E7%9A%84%E8%BF%81%E7%A7%BB.png)
是否可以更新 tabularx 环境,以便它采用 tabularx 样式参数?或者反过来?
\begin{tabularx}{\textwidth}{ ... }
% ...
\end{tabularx}
\begin{tabu} to \linewidth { ... }
% ...
\end{tabu}
就像是:
\renewenvironment{tabularx}{\begin{tabu} to #1 ...}{\end{tabu}}
或者
\renewenvironment{tabu}{\begin{tabularx}{#1} ...}{\end{tabularx}}
这将有助于我查明 tabularx 包是否可用于 tex4ht,tabu 包是否可用于 pdflatex。我知道 tabu 似乎更强大,但乍一看,似乎大多数 tabu 参数都可以定义,因此在生成 html 表时它们将被忽略。
答案1
如果你想改变\begin{tabu} to <dimen>
,\begin{tabularx}{<dimen}
同时保持正常tabu
环境,你可以这样做
\documentclass{article}
\usepackage{tabularx,tabu}
\makeatletter
\let\originaltabu\tabu
\def\tabu#1#{%
\setbox\z@=\hbox#1{}%
\ifdim\wd\z@=\z@
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{\originaltabu}%
{\let\endtabu\endtabularx\tabularx{\wd\z@}}%
}
\makeatother
\begin{document}
\begin{tabu}{|c|c|c|}
aa & bbbb & ccc \\
1 & 0 & 2
\end{tabu}
\bigskip
\begin{tabu} to 8cm{|X|X|X|}
aa & bbbb & ccc \\
1 & 0 & 2
\end{tabu}
\end{document}
我要求的作者tabu
避免使用语法to <dimen>
,但他不愿意接受这个建议。然而,吸收所有标记直到第一个括号的技巧允许我们利用(也许是滥用)\hbox
接受这种语法的事实。
因此第一个tabu
执行\setbox0=\hbox{}
(\z@
对于数字或长度为零的框,是内部的),并且框的宽度为零。因此,遵循“true”部分并\originaltabu
执行。
第二个tabu
则相反,它确实发生了变化\setbox0=\hbox to 8cm{}
,并且盒子的宽度变成了 8 厘米,因此接下来是“false”部分,导致对 进行(局部)重新定义,\endtabu
并\endtabularx
执行\tabularx{8cm}
,之后列说明符被吸收。
我添加垂直规则只是为了更好地显示结果,而不是因为我推荐使用它们(实际上,我并不推荐)。
答案2
我不明白为什么,但这似乎有效:
\let\tabuo\tabu
\let\endtabuo\endtabu
\renewenvironment{tabu}[2]{\tabuo to #1 {#2}}{\endtabuo}
\LetLtxMacro
用代替会更安全吗\let
?
那么反过来它又如何工作呢(即定义一个映射到 tabularx 语法的 tabu 环境)?
编辑:也许我也用另一种方式解决了这个问题,但仅限于它被一个空格隔开并且to
确实一直存在的情况。
\def\tabu #1 to #2#3{\tabularx{#2}{#3}}
\let\endtabu\endtabularx
或者
\def\tabu #1#2 #3#4{\tabularx{#3}{#4}}
\let\endtabu\endtabularx
\def
有人能告诉我TeX后面双空格的魔力是什么吗?