多列 X 段落?

多列 X 段落?
\documentclass[a4paper,10pt]{article}
\usepackage{array,tabularx,longtable,tabu}
\usepackage{lipsum}

\begin{document}

\begin{longtabu} to \linewidth {Xccr}
    \lipsum[1] & Val1/1 & Val1/2 & Qty 1 \\
    \multicolumn{2}{l}{\lipsum[2]} & Qty 2 \\
\end{longtabu}

\end{document}

看起来像这样:

在此处输入图片描述

奇怪的行为:如果我不使用多列,那么简单的 X 列会自动变成一个段落。(例如,我可以使用 X 而不是 X[p],不知道为什么。)

但是,如果我使用多列,那么它就不会自动成为一个段落。

好的,我可以这样做:

\begin{longtabu} to \linewidth {Xccr}
    \lipsum[1] & Val1/1 & Val1/2 & Qty 1 \\
    \multicolumn{3}{p{5cm}}{\lipsum[2]} & Qty 2 \\
\end{longtabu}

但在这里我必须指定 5cm 的固定宽度,这看起来很糟糕:

在此处输入图片描述

我不想使用固定格式。我想使用可用空间。在这种情况下:前三列中的所有空间都可用。我可以使用简单的 \multicolumn{3}{l} 来实现这一点,但这样它就不是一个段落了。或者我可以使用 \multicolumn{3}{p{5cm}},这样它就会成为一个段落,但这样它就不能具有灵活的大小了。

为什么我不能同时做这两件事?例如,有一个宽度灵活的段落?

问题与页面大小或表格本身的宽度无关,因此解决方案也必须是独立的。当然,我可以用尺子测量所需的宽度并写入固定值,但这不是我想要的。当我更改纸张大小、方向或表格宽度等时,解决方案应该有效。我试过这些,但都不起作用:

\multicolumn{3}{l}{\lipsum[2]} % not a pararaph
\multicolumn{3}{p{5cm}}{\lipsum[2]} % not flexible width
\multicolumn{3}{p{X}}{\lipsum[2]} % X cannot be used here
\multicolumn{3}{p}{\lipsum[2]} % missing argument for width
\multicolumn{3}{X[p,l]}{\lipsum[2]} % X cannot be used here (why?)

我似乎甚至没有找到 \multicolumn{1} 的解决方案,所以这里一定有一些我没看到的基本问题。有一组关于多列 + 自动调整列大小的问题总是出现,我永远找不到好的解决方案。似乎多列 + 列大小有些地方不能正常工作,或者至少没人知道如何按照我想象的方式去做。我之前在这个主题中问过一个更一般的问题(https://tex.stackexchange.com/questions/202103/) 可以解决我所有的问题,为此悬赏,但根本没有得到答案。这个特定问题是一般情况的特殊版本,因为在这个特殊情况下只有一个 X 列,并且可以通过测量最后三列所需的空间来计算所有列宽。最后三列所需的大小可以轻松计算出来,非常简单!但出于某种原因,即使在这个非常简单的情况下,我也找不到好的解决方案。

我是一名程序员。按照自己喜欢的方式开发自己的列大小计算有多难?我不太擅长 C 语言编程。我必须用 C 语言来做这件事吗?还是可以用纯 TeX 来做?LateX 似乎有一个很长的学习曲线,而且语言本身的语法非常隐晦,但如果可能的话,也许我会开始研究它。我想这需要对 TeX 内部有深入的了解,而我还没有。

答案1

您可以从存储它们的辅助文件中检索列大小longtable:您需要删除.aux最初的列以避免从早期的尝试中拾取错误的长度。

在此处输入图片描述

\documentclass[a4paper,10pt]{article}
\usepackage{array,tabularx,longtable,tabu}
\usepackage{lipsum}

\begin{document}

\makeatletter
\ifx\LT@i\@undefined
\def\mcspec#1{}
\else
 \global\dimen1=\z@
{\count@=\z@
 \def\LT@entry#1#2{%
 \advance\count@\@ne
 \ifnum\count@<4 \global\advance\dimen1 #2\relax\fi}
 \LT@i}
  \advance\dimen1 -2\tabcolsep
  \edef\mcspec{\noexpand\multicolumn{3}{p{\the\dimen1}}}


\fi
%\show\mcspec
\makeatother




\begin{longtabu} to \linewidth {Xccr}
    \lipsum[1] & Val1/1 & Val1/2 & Qty 1 \\
    \mcspec{\lipsum[2]} & Qty 2 \\
\end{longtabu}

\end{document}

相关内容