![具有计算列宽和单元格列表的表格](https://linux22.com/image/371497/%E5%85%B7%E6%9C%89%E8%AE%A1%E7%AE%97%E5%88%97%E5%AE%BD%E5%92%8C%E5%8D%95%E5%85%83%E6%A0%BC%E5%88%97%E8%A1%A8%E7%9A%84%E8%A1%A8%E6%A0%BC.png)
我正在创建一个工具来将 wiki 内容导出到 LaTeX(http://extensions.xwiki.org/xwiki/bin/view/Extension/LaTeX/Syntax%201.0/) 并且在我的 wiki 语法中(以及在 HTML 中),表格单元格可以包含任何内容(列表、部分、表格、多行等)。
我需要找到一种方法来生成执行类似操作的有效 LaTeX。
我还不想指定表格列的任何列宽,因为我的输入中没有这方面信息(wiki 语法通常生成 HTML,而 HTML 会计算列宽)。
最初我是这样做的:
\begin{center}
\begin{tabular}{|l|l|l|}
\hline
cell 1 & cell 2 & cell 3\\
\hline
\end{tabular}
\end{center}
这工作得很好,我喜欢这个结果,以及列宽自动调整以及列宽具有包含单元格数据的最小宽度的事实。
但是“l”列类型不支持列表之类的元素。
我尝试了各种选择,但没有一个能满足我的需要。
例如,我尝试了 tabularx 环境和“X”列类型,但它会生成相同大小的列,并且表格会占据整行宽度。
我还查看了听起来很有希望的 minipage 环境,但我必须指定一个宽度。
有没有办法在 LaTeX 中实现这个需求?
谢谢 PS:我是 LaTeX 新手(两周前才开始学习)
答案1
包varwidth
可以提供帮助。它会尝试尽可能减小宽度:
\documentclass{article}
\usepackage{booktabs}
\usepackage{varwidth}
\begin{document}
\begin{center}
\begin{tabular}{lll}
\toprule
header 1 & header 2 & header 3\\
\midrule
cell 4 &
\begin{varwidth}[t]{\linewidth}
\settowidth{\leftmargini}{\labelitemi}%
\addtolength{\leftmargini}{\dimexpr\labelsep-\itemindent\relax}%
\begin{itemize}
\item item a
\item item b
\item item c
\end{itemize}
\end{varwidth} &
\begin{varwidth}[t]{\linewidth}
\settowidth{\leftmargini}{3.}%
\addtolength{\leftmargini}{\dimexpr\labelsep-\itemindent\relax}%
\begin{enumerate}
\item foo
\item bar
\item baz
\end{enumerate}
\end{varwidth} \\
\bottomrule
\end{tabular}
\end{center}
\end{document}
如果行太长,TeX 会发出过满\hbox
警告。然后,插入手动换行符来限制行长或切换到固定宽度列。