Mathematica 中的网格、行和列
基本结构
Mathematica 提供了在屏幕上或页面上布局内容的广泛的且强大的结构. 它们的目的是使初学者立即会用,还允许很好的控制几乎每一个方位的外观.
这些结构可以分为三类:显示在笔记本中的排版结构,产生内容排列在网格上的图形函数,在网格内可以调整格式细节的结构.
Grid、Column 和 Row 形成第一系列,在本教程中是指网格系列. 网格系列的界定特点是,它是 Mathematica 的排版系统紧密集成的一部分. 这意味着,任何可以作为内容出现的表达式和结构它本身可以响应诸如窗口宽度,甚至它的元素大小的变化. 与其它排版结构相同,网格系列的成员是惰性结构,不会计算成其它形式.
| Out[2]= |  |
当处理图形时,结构的并行设置——图形网格系列支持特别有用的功能. 这些结构是 GraphicsGrid、GraphicsColumn 和 GraphicsRow. 虽然图形可以在网格系列中使用,但是图形网格系列支持的大小和编辑行为更适合图形. 图形网格的系列有带参数的函数且可以计算出新的图形表达,这意味着难以使生成的网格与其环境的变化作出反应,但很容易交互地添加任意注释和额外的图形.
最后一个系列——嵌入式结构系列——由嵌入自身网格的结构组成,并从内部改变网格的外观. 为了定义周边的样式,Item 可以封装网格的元素. SpanFromLeft、SpanFromAbove 和 SpanFromBoth 用于创建横跨多个行或列的区域.
以下是所有这些结构的一些基本例子.
网格系列
| Grid[{{expr11,expr12,...},{expr21,expr22,...},...}] |
| 将 放置于二维网格的对象 |
| Column[{expr1,expr2,...}] | 将 排列成一列的对象,其中 在 之上,依此类推 |
| Row[{expr1,expr2,...}] | 将 排成一行、可能延续数行的对象 |
二维格式化结构的网格系列.
| Out[684]= |  |
| Out[686]= |  |
| Out[685]= |  |
图形网格系列
二维图形布局函数的图形网格系列.
| Out[678]= |  |
| Out[689]= |  |
| Out[691]= |  |
嵌入结构系列
在网格和图形网格系列中嵌入元素时,具有特殊意义的结构.
元素

的嵌入风格信息.
| Out[708]= |  |

跨越首两列.
| Out[709]= |  |

跨越首两行.
| Out[710]= |  |

跨越首两列和首两行.
| Out[711]= |  |
功能类别
Grid 和相关的结构允许大量的外观自定义,只需很少的语法. 下表显示所支持的功能,在后面的章节会有详细的说明.
- 可以用跨越元素,或元素本身就是网格的元素来精心制作结构.
选项的语法
调整网格的外观存在着各种各样的选项. 本节介绍了这些选项共同的常用语法. 此语法提供了一种不仅对整个网格分配选项值,而且对单个的行、列、甚至项分配选项值.
对于许多选项的整体语法,诸如 Background 是基于像 Background->{specx, specy} 这种形式,其中
它自己是模块语法包含不同列的值,
包含不同行的值.
| spec | 在所有项应用 spec |
| {specx} | 在连续水平位置应用  |
| {specx,specy} | 在连续水平和垂直位置应用  |
| {specx,specy,rules} | 基于 在数组的位置给出项的规则 |
一般选项的语法.
和
可以有两种形式,如下所示. 第一种形式就是用索引来指定值,第二种形式是按列表中的顺序给出值.
| Out[8]= |  |
| Out[9]= |  |
这两种方法有不同的长处,详见 "使用规则" 和 "使用列表".
使用规则
规则提供了一个直接和可读的方法来提供一个具体的行或列的特定值.
| Out[16]= |  |
| Out[26]= |  |
当有很多行或列时,规则很方便设置其中少数的属性.
| Out[25]= |  |
规则还可以用于对特定的网格构件或分区域赋值. 但是请注意,尽管在概念上是类似的,这下面的语法和先前所讨论的
和
是不同的.
设置在位置

元素的背景.
| Out[27]= |  |
设置从

到

区域的元素的背景.
| Out[28]= |  |
规则可以有效地指定值的例外. 然而,当用手动指定网格的每块的值时,它们的效率较低.
| Out[31]= |  |
为了获得重复模式,建议您使用 下一节 讲述的列表语法.
使用列表
给出列表的序列值是一种紧密方便的方式,可以指定相邻的行或列的大量选项值.
| Out[52]= |  |
另外,可以用子列来指定循环使用的值.
| Out[53]= |  |
这些循环子列表,可以填充在开始或结束.
| Out[58]= |  |
| Out[57]= |  |
| Out[7]= |  |
因为列表中的位置与网格位置相对应,指定中间位置的单个值需要给出它前面的所有值. 若要更直接地获得这些,使用本节 "使用规则" 所描述的规则.
| Out[61]= |  |
| Out[62]= |  |
同时使用
最好是两全其美,使用列表语法指定网格的重复部分,同时使用规则语法指定例外.
| Out[746]= |  |
| Out[89]= |  |
| {s1,s2,...,sn} | 使用 到 ;然后是缺省值 |
| {{c}} | 所有情况下使用 c |
| {{c1,c2}} | 在 和 间变换 |
| {{c1,c2,...}} | 循环使用所有的  |
| {s,{c}} | 使用 s,然后重复使用 c |
| {s1,{c},sn} | 使用 ,然后重复使用 c,最后使用  |
| {s1,s2,...,{c1,c2,...},sm,...,sn} | 开头使用 第一个序列,然后循环使用 ,结尾使用 的剩余序列 |
| {s1,s2,...,{},sm,...,sn} | 开头使用 第一个序列,结尾使用 的剩余序列 |
| {i1->v1,i2->v2,...} | 指定在位置 使用什么 |
| {spec,rules} | 使用 rules 覆盖 spec 中的规则 |
和
的语法总结.
列、行、 缝隙和项
正如在 前面部分 所介绍的, Mathematica 提供灵活的语法,可以在网格的不同区域改变选项的值. 本节提供该语言的前后关系和阐述更精细的区分.
网格术语.
| column | 项的垂直序列 |
| row | 项的水平序列 |
| item | 包含一个网格元素的区域 |
| gutter | 连续行或列之间的边界 |
二维网格的不同部分
Grid 和 GraphicsGrid 遵循描述网格不同部分的相同的约定. Column、GraphicsColumn 和 GraphicsRow 遵循相同的约定,但它们只处理两维中的一维. Row 不参与这种约定.
选项集合
下表列出了可以处理的选项,没有选项适用于所有的结构. 从下表中可以看出在给定的结构中可以使用哪些选项.
| Out[54]= |  |
| Out[53]= |  |
注意 Row 没有采纳任何选项.
先列后行
要记住选项的语法,最重要的一步是要知道,首先指定列的具体值,然后是指定行的值.
| opt->val | 所有的项使用 val |
| opt->colspec,rowspec} | 列使用 colspec,行使用 rowspec |
| opt->{colspec} | 列使用 colspec,行使用缺省值 |
Grid 和 GraphicsGrid 的选项结构.
在 Mathematica 中,带有横向设置 h 和垂直设置 v 的选项指定为
. ImageSize 和 PlotRange 是两个常用的建立该约定的选项.
在网格中,这些横向和纵向设置分别对应列和行的值. 这是因为列水平堆叠,因此它们的属性:如宽度和位置,是与水平方向相对应的. 行是垂直叠放,而它们的属性是与纵向相对应的.
| Out[37]= |  |
如下网格中,每个项的宽是2个 "ems",高是1个 "ex".
| Out[1]= |  |
| Out[29]= |  |
| Out[2]= |  |
| Out[6]= |  |
缝隙
与属性相关的许多 Grid 选项最终与网格中的一列,行或项相关.
然而还有处理行与列的间隙的选项.
行和列间的缝隙选项.
| Out[85]= |  |
| Out[86]= |  |
Dividers 和 Spacings 的语法与其它选项一样. 对于一个在特定方向上有 n 个项的网格,Dividers 和 Spacings 可以指定元素之间的
个间隔,在第一个元素之前开始和在最后一个元素之后结束.
项
描述最细致的是项,在网格中的每个项都可以自己的值,如 Background、 Alignment 和 Frame.
| Out[100]= |  |
另外,使用项的

索引来分配值.
| Out[101]= |  |
| Out[103]= |  |
| Out[105]= |  |
| Out[109]= |  |
分割线和框架
Mathematica 提供一个延伸的系统描述在网格中应画怎样的分割线和框架.
画分割线和框架的选项.
| Out[131]= |  |
| Out[141]= |  |
Frame 总是在封闭区域的四面画线,Dividers 允许更低层次的控制.
| Out[140]= |  |
使用分割线时,线只适用与单个方向.
| Out[147]= |  |
| Out[146]= |  |
| Out[150]= |  |
分割线和框架的样式
| Out[94]= |  |
| Out[95]= |  |
| Out[50]= |  |
| Out[48]= |  |
一般来说,可以使用任何线和色彩指令,包括 Hue、Thickness、Dashing、 Dotted 和其它. 多种指令可以用 Directive 来组合.
优先级
当样式给定有冲突时,Dividers 优先于 Frame,它们优先于 FrameStyle. Item 定义的样式优先级最高.
| Out[177]= |  |
| Out[185]= |  |
对齐和位置
漂亮的网格往往需要对齐,Mathematica 对于网格中的不同对齐有相当的支持.
Alignment 选项可以被传递到整个网格.
| Out[53]= |  |
还可以不同的列有不同的横向对齐,不同的行有不同的纵向对齐.
| Out[61]= |  |
还可以对于网格中的个别项给出不同的对齐.
设置在

位置的元素左对齐,在

位置的元素右对齐.
| Out[62]= |  |
| Out[63]= |  |
还可以按小数点或任意字符对齐.
| Out[65]= |  |
在其包围环境中定位网格可以用 BaselinePosition.
| Out[67]= |  |
| Out[73]= |  |
对齐网格,使该

元素的基线是在整体基线上.
| Out[74]= |  |
背景和样式
普通常识
当与元素集合一起工作时,Grid 提供了设置单独背景的方法.
虽然单个元素可以有自己的背景,但当您把所有元素放在一起时,结果会很糟糕.
| Out[193]= |  |
Grid 和相关的函数把背景放在包含这些元素的全部项的组合上.
| Out[194]= |  |
使用更复杂的语法,各种模式都很容易实现.
| Out[195]= |  |
| Out[196]= |  |
| Out[197]= |  |
| Out[107]= |  |
重叠背景设置的优先级
| Out[198]= |  |
| Out[199]= |  |
| Out[200]= |  |
| Out[201]= |  |
跨越和嵌套
二维空间的复杂分区可以通过嵌套网格结构和/或使用跨越元素来实现.
顾名思义, 跨越元素允许跨越多列、多行或两者兼而有之.

跨越前两列.
| Out[709]= |  |

跨越前两行.
| Out[710]= |  |

跨越前两列和前两行.
| Out[711]= |  |
重要的是要注意:跨越区域必须是矩形,不在矩形内的项不会跨越,而只会显示跨越字符.
| Out[75]= |  |
虽然许多布局可以用跨越元素实现,有时使用简单的嵌套网格结构更快、更方便.
| Out[81]= |  |
| Out[84]= |  |
尤其是复杂的网格,往往使用 Row 和 Column 来创建所需的具体结构更清晰,而不是试图设计一种复杂的跨越系统.
尺寸和间隙
网格中的尺寸
Grid 通常不修改其内容的大小. 此外,默认情况下,行和列设计成只需容纳内容即可.
| Out[275]= |  |
在上面的例子中,第二行比第一行长,第二列比第一列窄,但元素的尺寸没有改变.
如果在网格中的元素交互或动态变化,整个网格的大小将自动适当调整.
一个有用的例外是, Button 将自动填充可用空间.
| Out[277]= |  |
ItemSize 可以用来覆盖缺省的设置.
| Out[278]= |  |
| Out[256]= |  |
ItemSize 的单位是排版单位:"exs" 和 "ems".
它也可以使用 Scaled 来指定封闭区的一小部分的宽度.
| Out[274]= |  |
网格中的换行
如果列太窄,文本项会换行,但这会导致行比设置的最小值高.
| Out[266]= |  |
| Out[271]= |  |
| Out[273]= |  |
GraphicsGrid 中的尺寸
默认情况下,GraphicsGrid 将返回一个有相同大小项的网格.
| Out[289]= |  |
它会自动选择适合整个元素集合的纵横比.
和相同的 Grid 例子比较,它并没有改变任何一个整体大小或纵横比.
| Out[290]= |  |
GraphicsGrid 不支持 ItemSize 选项,但是支持 ImageSize.
| Out[294]= |  |