![合并/粘合数组](https://linux22.com/image/364396/%E5%90%88%E5%B9%B6%2F%E7%B2%98%E5%90%88%E6%95%B0%E7%BB%84.png)
我正在尝试合并/粘合两个数组。
例如:
\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}}