创建 Matrixlist 包

创建 Matrixlist 包

我一直没能找到一个能满足我需求的合适软件包。最接近的软件包是parcolumns,我花了好几个小时试图理解 TeX 编程和parcolumns风格。虽然我了解了大部分内容,但我尝试对其进行了调整,但就是无法让它满足我的要求。

我很好奇,是否有人知道一个软件包或者可以快速编写一个执行以下操作的软件包:

  1. 你给它一个\\终止列表,就像枚举和列数一样;

  2. 它在内部按列数对列表进行分组。 (a,b,c,d,e)columns=2将被分组为 ((a,b,c),(d,e));

  3. 然后它创建 m 行(\hbox取决于元素数量和列大小)。第 n 行包含\hbox每组中第 n 个元素。这将创建一个矩阵

    广告

  4. 行中的每个元素都试图沿水平方向均匀分布,但是,如果一个元素与下一个元素重叠,它就会“推动”它,而不是与它重叠(并且这种情况会一直持续,直到不需要推动为止);

  5. 行之间没有间隙并且最后一列没有末端间隙(因此必须获取最后一列中最大元素的宽度并将列大小设置为该宽度)。

这里的重点是,我们有一个盒子矩阵,但是如果一个盒子的水平内容大于给定的空间,它就会简单地移动相邻的盒子为其腾出空间,但如果没有,它会以分布式方式对齐。

希望这有意义,而且已经有一个包可以做到这一点。parcolumns我有两个问题:当我的元素在水平方向上太大(即使只是一点点)时,它们会与下一列重叠,我必须手动将下一个元素推过去(这可能会导致连锁反应)。


\documentclass{article}
\usepackage{tikz}
\scrollmode


\begin{document}

\newcommand{\drawrect}[1]{\fbox{\begin{tikzpicture} \fill (-#1,-1) rectangle (#1,1);\end{tikzpicture}}}

\noindent\fbox{\hbox to \linewidth{%
\drawrect{1.5}\hspace*{\fill}\drawrect{1.5}\hspace*{\fill}\drawrect{1.5}\\}}
\fbox{\hbox to \linewidth{\drawrect{2}\hspace{0.2cm}\drawrect{1.5}\hspace{1.2cm}\drawrect{1.5}\\}}
\fbox{\hbox to \linewidth{\drawrect{2.5}\hspace{0.2cm}\drawrect{1.5}\hspace{0.2cm}\drawrect{1.5}\\}}
\fbox{\hbox to \linewidth{\drawrect{2.4}\hspace{0.4cm}\drawrect{1.5}\hspace{0.2cm}\drawrect{1.5}\\}}

\end{document}

在此处输入图片描述

以下是示例情况

  1. 请注意,第 3 行的第一个元素“推入”或重叠到第 2 行的元素中。
  2. 这会导致第二个元素偏移一定量(用户指定)。但第三个元素不会改变位置。
  3. 在第 4 行中,第一个元素稍微小一些,但请注意,第二个元素与其正上方的元素对齐,因为出于视觉原因它会捕捉到该位置。
  4. 此外,如果您要向最后一列中的每个元素添加固定数量的空格,那么最终会导致问题(但取决于您如何设置)。我想消除这个问题。要解决这个问题,我们基本上必须删除空格,以便最后一列中至少一个元素没有空格。因此,我们只需从所有列中“减去”适当数量的空格,然后至少有一列将没有空格。请注意,这仅用于计算列间距。本质上,我们只需计算(\linewidth+ x)​​/#columns,其中 x 是最后一列单元格集中最小的空格量。这实际上增加了\linewidth最后一列中未使用的空格。

答案1

嗯,...根据上下行来视觉对齐框并不是真正的 tex 方式(并非不可能,但是......)我会选择这样的布局,其中条目在行中等距分布。

在此处输入图片描述

为了使每个框(或者如果您愿意,只是最后一列的框)具有自然宽度而不是指定的短宽度,请使用\begin{minipage}{\xxx}固定框和\begin{varwidth}{\xxx}至少最后一列的框,其中\xxx文本宽度除以列数,调整列之间的任何空间或规则。varwidth来自同名包的方法是相似的minipage,但将框的宽度设置为可能的更窄。

如果您varwidth在最后一列使用,整个构造将不会是全宽,但可以居中(\centering在这种情况下)正如我认为您想要的那样。

如果该布局可以接受,则可以根据需要对其他语法问题进行排序,例如计算列宽以及按列主序而不是行主序输入单元格。

\documentclass{article}
\usepackage{tikz}
\scrollmode


\begin{document}

\noindent X\dotfill X

\noindent X\dotfill X

\newcommand{\drawrect}[1]{\fbox{\begin{tikzpicture} \fill (-#1,-1) rectangle (#1,1);\end{tikzpicture}}}

\def\onerow#1{\par\noindent\fbox{%
  \dimen0=\textwidth
  \advance\dimen0-2\fboxsep
  \advance\dimen0-2\fboxrule
\hbox to \dimen0{#1}}}


\onerow{\drawrect{1.5}\hfill\drawrect{1.5}\hfill\drawrect{1.5}}
\onerow{\drawrect{2}\hfill\drawrect{1.5}\hfill\drawrect{1.5}}
\onerow{\drawrect{2.5}\hfill\drawrect{1.5}\hspace{0.2cm}\drawrect{1.5}}
\onerow{\drawrect{2.4}\hfill\drawrect{1.5}\hspace{0.2cm}\drawrect{1.5}}

\end{document}

相关内容