我想从单独的文件中读取/输入表格主体。我主要使用以下方法解决了这个问题这个问题。
但是当我尝试从单独的文件读取多列表时,失败了。以下是示例。
%main.tex
\documentclass{article}
\usepackage{filecontents,catchfile}
\begin{filecontents*}{table.tex}
%table.tex
\hline
A & B & C & D \\ \hline
E & \multicolumn{3}{l|}{This is generated by excel2latex macro. I want to let it auto wrap according to the width of (B+C+D) } \\ \hline
\end{filecontents*}
\begin{document}
Table test.
\section{Insert a full table}
\begin{tabular}{|p{2cm}|p{2cm}|p{2cm}|p{2cm}|}
\hline
A & B & C & D \\ \hline
E & \multicolumn{3}{p{6cm}|}{This is generated by excel2latex macro. I want to let it auto wrap according to the width of (B+C+D) } \\ \hline
\end{tabular}%
\section{ Input the body of table from a separate file}
\CatchFileDef{\mytable}{table.tex}{}% table.tex > \mytable
\begin{tabular}{|p{2cm}|p{2cm}|p{2cm}|p{2cm}|}
\mytable
\end{tabular}%
\end{document}
我只是不想手动定义表体中的宽度,因为它是自动生成的。
答案1
假设 B、C 和 D 列属于p
以下类型可用的宽度由长度参数 、 和 给出\colB
。\colC
在\colD
您的示例代码中,这些长度相等2cm
。全部的但是,B、C 和 D 列的宽度为不是等于2cm
。相反,每列的总宽度等于2cm+2\tabcolsep
,其中\tabcolsep
是控制插入到列左侧和右侧的空白量的参数。(在标准 LaTeX 文档类中,此参数的默认值为6pt
。)
这合并B、C 和 D 列的宽度(不计算 B 列左侧和 D 列右侧的垂直条的宽度)为
\colB + \colC + \colD + 6\tabcolsep + 2\arrayrulewidth
(我隐含地假设包array
正在被加载。如果不是这样,那么应该省略这个2\arrayrulewidth
术语。)您可能猜到它2\arrayrulewidth
代表两个内部垂直条的组合宽度——将 B 与 C 以及 C 与 D 分隔开的垂直条。此参数的默认值在0.4pt
标准文档类中。
这可用的三列的宽度略小一些,因为我们不能在\tabcolsep
B 的左边缘和 D 的右边缘施加。因此给出
\colB + \colC + \colD + 4\tabcolsep + 2\arrayrulewidth
可以创建一个名为的长度变量,\combinedlength
并将其值设置为上面的表达式。因此,外部文件的内容table.tex
将由
\hline
A & B & C & D \\ \hline
E & \multicolumn{3}{p{\combinedlength}|}{This is generated by excel2latex macro. I want to let it auto wrap according to the width of (B+C+D) } \\
\hline
完整的 MWE:
\documentclass{article}
\usepackage{array,filecontents,catchfile}
\begin{filecontents*}{table.tex}
\hline
A & B & C & D \\ \hline
E & \multicolumn{3}{p{\combinedlength}|}{This is generated by excel2latex macro. I
want to let it auto wrap according to the width of (B+C+D) } \\
\hline
\end{filecontents*}
%% Define some length parameters and set their values
\newlength\colB \setlength\colB{2cm}
\newlength\colC \setlength\colC{2cm}
\newlength\colD \setlength\colD{2cm}
\newlength\combinedlength
\setlength\combinedlength{%
\dimexpr\colB+\colC+\colD+4\tabcolsep+%
2\arrayrulewidth\relax}
\begin{document}
\section{ Input the body of table from a separate file}
\CatchFileDef{\mytable}{table.tex}{}% table.tex > \mytable
\begin{tabular}{|p{2cm}|p{\colB}|p{\colC}|p{\colD}|}
\mytable
\end{tabular}%
\end{document}
答案2
我已经通过指定 \multicolumn{ncols}{ p{\tablewidth} }{long sentence...} 解决了这个问题
然后在其外部使用小页面环境
%main.tex
\documentclass{article}
\usepackage{filecontents,catchfile}
\begin{filecontents*}{table.tex}
%table.tex
\hline
A & B & C & D \\ \hline
E & \multicolumn{3}{ p{\tablewidth} }{This is generated by excel2latex macro. This is generated by excel2latex macro. This is generated by excel2latex macro. I want to let it auto wrap according to the width of (B+C+D) } \\ \hline
\end{filecontents*}
\begin{document}
Table test.
\section{Insert a full table}
\begin{tabular}{|p{2cm}|p{2cm}|p{2cm}|p{2cm}|}
\hline
A & B & C & D \\ \hline
E & \multicolumn{3}{p{6cm}|}{This is generated by excel2latex macro. I want to let it auto wrap according to the width of (B+C+D) } \\ \hline
\end{tabular}%
\section{ Input the body of table from a separate file}
\CatchFileDef{\mytable}{table.tex}{}% table.tex > \mytable
\begin{tabular}{|p{2cm}|p{2cm}|p{2cm}|p{2cm}|}
\mytable
\end{tabular}%
\end{document}
答案3
我使用 tabularx 环境及其 X 列格式并解决了这个问题。
\documentclass{article}
\usepackage{bigstrut}
\usepackage{tabularx}
\begin{document}
\begin{tabularx}{70mm}{|p{20mm}|p{20mm}|l|}
% Table generated by Excel2LaTeX from sheet 'Sheet1'
\hline
A & B & C \bigstrut\\
\hline
\multicolumn{3}{|X|}{This is combined from A+B+C, and the contents is very very long.} \bigstrut\\
\hline
\end{tabularx}%
\end{document}