合并/粘合数组

合并/粘合数组

我正在尝试合并/粘合两个数组。

例如:

\documentclass[]{article}
\usepackage{graphics}
\begin{document}
\newcommand{\maybe}[1]{#1}
$\begin{array}{c}a\\b\end{array}\maybe{\begin{array}{c}\scalebox{10}{C}\\d\end{array}}$
\end{document}

这显然行不通:两个数组的行不对齐。我希望它表现得好像是一样$\begin{array}{cc}a\maybe{&\scalebox{10}{C}}\\b\maybe{&d}\end{array}}$。但我想避免在任何地方添加\maybe(在这里添加是因为我将多次使用相同的代码,有时我不想显示这部分)。

答案1

根据 OP 的评论修改答案。由于希望根据后续数组的垂直间距修改早期数组的垂直间距,因此唯一可行的解​​决方案是保存数组,而不是渲染它们,然后在最后选择要合并的数组。

逻辑使用\definearray{<label>}{<array>}宏来定义可能进入或不进入最终数组的组件数组。宏使用包listofitems将数组的单元格解析为\array<label>[<row>,<col>]索引数据。定义完所有数组后,宏将以适当的方式组合标签列表中数组中的数据。这种适当的方式需要 3 个嵌套的- -\mergearrays{<comma-separated-label-list>}循环,以便以正确的方式重新生成原始标记<row><comma-separated-label-list><col>...&...&...\\...形式重新生成原始标记,以供 TABstack 消化。

正如在 MWE 中看到的,垂直间距会进行调整,以保持合并后的每一行的基线对齐。

注意:在文本模式下完成,但添加\stackMath以进行更改。堆叠间隙设置(此处为 10pt),但可以调整以适应。列间间隙也是如此(当前为 1ex)。

\documentclass[]{article}
\usepackage{graphics}
\usepackage{tabstackengine,listofitems,pgffor}
\newtoks\arraytoks
\newcommand\definearray[2]{\setsepchar{\\/&}%
  \expandafter\readlist\expandafter*\csname array#1\endcsname{#2}}
\newcommand\addtoarray[1]{\global\arraytoks\expandafter{\the\arraytoks#1}}%
\newcommand\mergearrays[1]{%
  \setsepchar{,}%
  \readlist*\arraylist{#1}%
  \arraytoks{}%
  \foreach\Row in{1,...,\expandafter\listlen\csname array\arraylist[1]\endcsname[]}{%
    \ifnum\Row=1\relax\else\addtoarray{\\}\fi
    \foreachitem\Arr\in\arraylist[]{%
      \ifnum\Arrcnt=1\relax\else\addtoarray{&}\fi
      \expandafter\foreachitem\expandafter\Col\expandafter\in%
        \csname array\Arr\endcsname[\Row]{%
        \ifnum\Colcnt=1\relax\else\addtoarray{&}\fi
        \expandafter\addtoarray\expandafter{\Col}%
      }%
    }%
  }%
  \expandafter\tabbedShortstack\expandafter{\the\arraytoks}%
}
\parskip 1em
\setstackgap{S}{10pt}
\setstacktabbedgap{1ex}
\begin{document}
\definearray{A}{a\\b}
\definearray{B}{\scalebox{10}{C}\\d}
\definearray{C}{e & g\\f & \scalebox{5}{H}}
Array A: \fbox{\mergearrays{A}},
\quad
Array B: \fbox{\mergearrays{B}},
\quad
Array C: \fbox{\mergearrays{C}}.\par
Merging A and B: \fbox{\mergearrays{A, B}}\par
Merging A and C: \fbox{\mergearrays{A, C}}\par
Merging B and C: \fbox{\mergearrays{B, C}}\par
Merging C, B and A: \fbox{\mergearrays{C, B, A}}
\end{document}

在此处输入图片描述

只要每个数组具有相同的行数,它就可以适用于任意数量的行和列。以下是一个 3 行示例:

\definearray{A}{a\\\scalebox{2}{B}\\c}
\definearray{B}{\scalebox{7}{D}\\e\\f}
\definearray{C}{g & j\\h & \scalebox{4}{K}\\i& l}
Array A: \fbox{\mergearrays{A}},
\quad
Array B: \fbox{\mergearrays{B}},
\quad
Array C: \fbox{\mergearrays{C}}.\par
Merging A and B: \fbox{\mergearrays{A, B}}\par
Merging A and C: \fbox{\mergearrays{A, C}}\par
Merging B and C: \fbox{\mergearrays{B, C}}\par
Merging C, B and A: \fbox{\mergearrays{C, B, A}}

在此处输入图片描述

相关内容