我一直在研究一个array
环境,但我意识到如果它沿对角线反射,它将占用更少的空间(我想这与翻转或旋转不完全相同,但我认为我会包含这些关键词以增加相似性)。这个认识来得太晚了,因为我需要很长时间才能以反射的方式重写所有内容。我在想,有没有办法快速解决我的懒惰?我想要一种不旋转任何元素的方法来反射下面的数组。也就是说,我希望x_1
,...,x_8
在第一行从左到右穿过顶部,b_{1,1}
,...,b_{8,1}
从左到右穿过第二行,依此类推。旋转后将是x_8
,...,x_1
从左到右,我想这是一个不错的解决方案(尽管我更喜欢反射的那个)。
我尝试了rotatebox
、adjustbox
和sidewaystable
,但所有这些方法也会旋转元素。这是我的代码:
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{shapes}
\newcommand\squared[1]{\noindent\framebox{\bf{#1}}}
\newcommand*\circled[1]{\tikz[baseline=(char.base)]{
\node[shape=circle,draw,inner sep=2pt] (char) {#1};}}
\newcommand*\triangled[1]{\tikz[baseline=(char.base)]{
\node[shape=regular polygon,regular polygon sides=3,draw,inner sep=0pt] (char) {#1};}}
\begin{document}
$
\begin{array}{c|c c c c c c c c c}
x_1 & \squared{$b_{1,1}$} & \circled{$b_{1,2}$} & b_{1,3} & b_{1,4} & b_{1,5} & b_{1,6} & b_{1,7} & b_{1,8} & \cdots \\
x_2 & b_{2,1} & b_{2,2} & b_{2,3} & b_{2,4} & b_{2,5} & b_{2,6} & b_{2,7} & b_{2,8} & \cdots \\
x_3 & \squared{$b_{3,1}$} & \circled{$b_{3,2}$} & \triangled{$b_{3,3}$} & b_{3,4} & b_{3,5} & b_{3,6} & b_{3,7} & b_{3,8} & \cdots \\
x_4 & \squared{$b_{4,1}$} & b_{4,2} & b_{4,3} & b_{4,4} & b_{4,5} & b_{4,6} & b_{4,7} & b_{4,8} & \cdots \\
x_5 & b_{5,1} & b_{5,2} & b_{5,3} & b_{5,4} & b_{5,5} & b_{5,6} & b_{5,7} & b_{5,8} & \cdots \\
x_6 & \squared{$b_{6,1}$} & b_{6,2} & b_{6,3} & b_{6,4} & b_{6,5} & b_{6,6} & b_{6,7} & b_{6,8} & \cdots \\
x_7 & \squared{$b_{7,1}$} & \circled{$b_{7,2}$} & \triangled{$b_{7,3}$} & b_{7,4} & b_{7,5} & b_{7,6} & b_{7,7} & b_{7,8} & \cdots \\
x_8 & \squared{$b_{8,1}$} & \circled{$b_{8,2}$} & b_{8,3} & b_{8,4} & b_{8,5} & b_{8,6} & b_{8,7} & b_{8,8} & \cdots \\
\vdots &
\end{array}
$
\end{document}
谢谢你的帮助。
答案1
这里的方法与我链接的方法略有不同。您可能需要对其进行一些调整才能得到您想要的结果:
\documentclass{standalone}
\usepackage{environ}
\usepackage{etoolbox}
\usepackage{tikz}
\usetikzlibrary{shapes}
\newcommand\squared[1]{\noindent\framebox{\bf{#1}}}
\newcommand*\circled[1]{\tikz[baseline=(char.base)]{
\node[shape=circle,draw,inner sep=2pt] (char) {#1};}}
\newcommand*\triangled[1]{\tikz[baseline=(char.base)]{
\node[shape=regular polygon,regular polygon sides=3,draw,inner sep=0pt] (char) {#1};}}
%-@-(1)------------------------------------------------------------------------------------
\makeatletter
\def\ae@transposed@array{}
\NewEnviron{tarray}[1]
{\let\ae@transposed@array\relax
\def\ae@column@max{0}%%
\expandafter\ae@build@array\BODY\\\@nil
\def\ae@column@cnt{0}%%
\ae@assemble@array
\edef\ae@transposed@array{%%
\noexpand\begin{array}{#1}
\expandonce\ae@transposed@array
\noexpand\end{array}}%%
\typeout{====>\detokenize\expandafter{\ae@transposed@array}}%%
\ae@transposed@array
}
\def\ae@build@array#1\\#2\@nil{%%
%\typeout{==> row --> NUM1:\detokenize{#1}}%%
%\typeout{==> row --> NUM2:\detokenize{#2}}%%
\def\ae@continue@array{}%%
\def\ae@column@cnt{0}%%
\expandafter\ifx\expandafter\relax\detokenize{#2}\relax
\ae@parse@row@into@columns#1&\@nil
\else
\ae@parse@row@into@columns#1&\@nil
%\typeout{@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@}%%
\def\ae@continue@array{\ae@build@array#2\@nil}%%
\fi
%\typeout{====> columns:\ae@column@cnt:\ae@column@max}%%
\ae@continue@array
}
\def\ae@parse@row@into@columns#1\@nil{%%
\def\ae@continue@row{}%%
\edef\ae@column@cnt{\number\numexpr\ae@column@cnt+1\relax}%%
\ifnum\ae@column@cnt>\ae@column@max\relax
\edef\ae@column@max{\ae@column@cnt}%%%
\fi
%\typeout{==> row ==> \ae@column@cnt ==> \detokenize{#1}}%%
%\typeout{==> row ==> \ae@column@cnt ==> \detokenize{#2}}%%
\expandafter\ifx\expandafter\relax\detokenize{#2}\relax
\else
\@ifundefined{ae@row@\ae@column@cnt}
{\def\ae@tmp{#1}%%
\expandafter\edef\csname ae@row@\ae@column@cnt\endcsname{\expandonce\ae@tmp}}%%
{\def\ae@tmp{#1}%%
\expandafter\edef\csname ae@row@\ae@column@cnt\endcsname{\expandafter\expandonce\csname ae@row@\ae@column@cnt\endcsname&\expandonce\ae@tmp}}
\def\ae@continue@row{\ae@parse@row@into@columns#2\@nil}%%
%\typeout{-----------------------------------}%%
\fi
\ae@continue@row
}
\def\ae@assemble@array{%%
\def\ae@continue{}%%
\ifnum\ae@column@cnt<\ae@column@max\relax
\typeout{==:\ae@column@cnt:}%%
\edef\ae@column@cnt{\number\numexpr\ae@column@cnt+1\relax}%%
\typeout{==:\ae@column@cnt:}%%
\@ifundefined{ae@transposed@array}
{\edef\ae@transposed@array{\expandafter\expandonce\csname ae@row@\ae@column@cnt\endcsname\noexpand\\}}%%
{\edef\ae@transposed@array{\expandonce\ae@transposed@array\expandafter\expandonce\csname ae@row@\ae@column@cnt\endcsname\noexpand\\}}
\def\ae@continue{\ae@assemble@array}%%
\fi
\typeout{==> \ae@column@cnt}%%
\ae@continue
}
\makeatother
%-@-(2)------------------------------------------------------------------------------------
\begin{document}
$
\begin{tarray}{c|c c c c c c c c c}
x_1 & \squared{$b_{1,1}$} & \circled{$b_{1,2}$} & b_{1,3} & b_{1,4} & b_{1,5} & b_{1,6} & b_{1,7} & b_{1,8} & \cdots \\
x_2 & b_{2,1} & b_{2,2} & b_{2,3} & b_{2,4} & b_{2,5} & b_{2,6} & b_{2,7} & b_{2,8} & \cdots \\
x_3 & \squared{$b_{3,1}$} & \circled{$b_{3,2}$} & \triangled{$b_{3,3}$} & b_{3,4} & b_{3,5} & b_{3,6} & b_{3,7} & b_{3,8} & \cdots \\
x_4 & \squared{$b_{4,1}$} & b_{4,2} & b_{4,3} & b_{4,4} & b_{4,5} & b_{4,6} & b_{4,7} & b_{4,8} & \cdots \\
x_5 & b_{5,1} & b_{5,2} & b_{5,3} & b_{5,4} & b_{5,5} & b_{5,6} & b_{5,7} & b_{5,8} & \cdots \\
x_6 & \squared{$b_{6,1}$} & b_{6,2} & b_{6,3} & b_{6,4} & b_{6,5} & b_{6,6} & b_{6,7} & b_{6,8} & \cdots \\
x_7 & \squared{$b_{7,1}$} & \circled{$b_{7,2}$} & \triangled{$b_{7,3}$} & b_{7,4} & b_{7,5} & b_{7,6} & b_{7,7} & b_{7,8} & \cdots \\
x_8 & \squared{$b_{8,1}$} & \circled{$b_{8,2}$} & b_{8,3} & b_{8,4} & b_{8,5} & b_{8,6} & b_{8,7} & b_{8,8} & \cdots \\
\vdots &
\end{tarray}
$
\end{document}
可能需要提出一些评论:
\\
这里的主要思想是根据以 结尾的行和以 分隔的列条目来解析表格&
,然后重建表格,以便行和列被转置。
有两个主要的宏:第一个是\ae@build@array
剥离每一行并将该行发送到宏\ae@parse@row@into@columns
。我使用伪计数器(以免弄乱计数器寄存器——不知道我是否真的应该担心这个)来跟踪当前行柱子正在添加到。
解析完整个表格后,我重新组装了新表格。恰好,您有同样多的行和列,但第一个参数应该是格式化每一列转置表。(我认为这在哲学上与链接问题有所不同。)
将规则放入表格中可能有点棘手。现在,我先不解决这个令人头痛的问题。
我保留了\typeout
用于帮助我跟踪组装桌子时所做工作的宏。这样,您可以更好地了解组装的进展情况(如果您愿意的话)(特别是如果您尝试调整并且出现问题)。
我毫无顾忌地使用 的资源etoolbox
。你可能想看看是否有任何禁忌症与其他软件包:我不知道有什么。我还使用该environ
软件包,这使得将表的内容传递给宏进行解析和重新设计变得特别容易。(再次,您可能希望检查与您可能正在使用的其他软件包的冲突。)