Wolfram 语言中的网格、行和列

基本结构

Wolfram 语言提供了在屏幕上或页面上布局内容的广泛的且强大的结构. 它们的目的是使初学者立即会用,还允许很好的控制几乎每一个方位的外观.

这些结构可以分为三类:显示在笔记本中的排版结构,产生内容排列在网格上的图形函数,在网格内可以调整格式细节的结构.

GridColumnRow 形成第一系列,在本教程中是指网格系列. 网格系列的界定特点是,它是 Wolfram 语言的排版系统紧密集成的一部分. 这意味着,任何可以作为内容出现的表达式和结构它本身可以响应诸如窗口宽度,甚至它的元素大小的变化. 与其它排版结构相同,网格系列的成员是惰性结构,不会计算成其它形式.

In[2]:=
Click for copyable input
Out[2]=

当处理图形时,结构的并行设置图形网格系列支持特别有用的功能. 这些结构是 GraphicsGridGraphicsColumnGraphicsRow. 虽然图形可以在网格系列中使用,但是图形网格系列支持的大小和编辑行为更适合图形. 图形网格的系列有带参数的函数且可以计算出新的图形表达,这意味着难以使生成的网格与其环境的变化作出反应,但很容易交互地添加任意注释和额外的图形.

Click for copyable input

最后一个系列嵌入式结构系列由嵌入自身网格的结构组成,并从内部改变网格的外观. 为了定义周边的样式,Item 可以封装网格的元素. SpanFromLeftSpanFromAboveSpanFromBoth 用于创建横跨多个行或列的区域.

Click for copyable input

以下是所有这些结构的一些基本例子.

网格系列

Grid[{{expr11,expr12,},{expr21,expr22,},}]
放置于二维网格的对象
Column[{expr1,expr2,}] 排列成一列的对象,其中 之上,依此类推
Row[{expr1,expr2,}] 排成一行、可能延续数行的对象

二维格式化结构的网格系列.

一个网格元素.
In[684]:=
Click for copyable input
Out[684]=
一列元素.
In[686]:=
Click for copyable input
Out[686]=
一行元素.
In[685]:=
Click for copyable input
Out[685]=

图形网格系列

GraphicsGrid[{{g11,g12,},}]生成一个图形,其中 布局在一个二维网格中
GraphicsColumn[{g1,g2,}]生成一个图形, 布局在一列中,其中 位于 上方,依此类推
GraphicsRow[{g1,g2,}]生成一个图形, 布局在一行中

二维图形布局函数的图形网格系列.

在图形网格中显示元素.
In[678]:=
Click for copyable input
Out[678]=
在图形列中显示元素.
In[689]:=
Click for copyable input
Out[689]=
在图形行中显示元素.
In[691]:=
Click for copyable input
Out[691]=

嵌入结构系列

Item[expr,options]显示 expr 内容,指定适用于包含 expr 区域的选项
SpanFromLeft指定该位置被它左方的内容占用
SpanFromAbove指定该位置被它上方的内容占用
SpanFromBoth指定该位置被它上方和左方的内容占用

在网格和图形网格系列中嵌入元素时,具有特殊意义的结构.

元素 的嵌入风格信息.
In[708]:=
Click for copyable input
Out[708]=
跨越首两列.
In[709]:=
Click for copyable input
Out[709]=
跨越首两行.
In[710]:=
Click for copyable input
Out[710]=
跨越首两列和首两行.
In[711]:=
Click for copyable input
Out[711]=

功能类别

Grid 和相关的结构允许大量的外观自定义,只需很少的语法. 下表显示所支持的功能,在后面的章节会有详细的说明.

    • 框架和分割线可以放置在任何位置划分网格区域.
    • 网格及其内容可以以多种方式对齐和放置.
    • 背景和样式可以强加在任何区域.
    • 可以用跨越元素,或元素本身就是网格的元素来精心制作结构.
    • 网格中的大小和空隙可以调整.

    除了这些样式特点,各种交互式编辑和动态行为的形式也是可能的.

选项的语法

调整网格的外观存在着各种各样的选项. 本节介绍了这些选项共同的常用语法. 此语法提供了一种不仅对整个网格分配选项值,而且对单个的行、列、甚至项分配选项值.

对于许多选项的整体语法,诸如 Background 是基于像 Background->{specx,specy} 这种形式,其中 它自己是模块语法包含不同列的值, 包含不同行的值.

spec在所有项应用 spec
{specx}在连续水平位置应用
{specx,specy}在连续水平和垂直位置应用
{specx,specy,rules}基于 在数组的位置给出项的规则

一般选项的语法.

可以有两种形式,如下所示. 第一种形式就是用索引来指定值,第二种形式是按列表中的顺序给出值.

用列的索引指定背景颜色.
In[8]:=
Click for copyable input
Out[8]=
用于连续列的相当于列表的背景颜色值.
In[9]:=
Click for copyable input
Out[9]=

这两种方法有不同的长处,详见 使用规则使用列表.

使用规则

规则提供了一个直接和可读的方法来提供一个具体的行或列的特定值.

对具体的列设置背景颜色.
In[16]:=
Click for copyable input
Out[16]=
对具体的行设置背景颜色.
In[26]:=
Click for copyable input
Out[26]=

当有很多行或列时,规则很方便设置其中少数的属性.

在可能的少数位置中应用选项.
In[25]:=
Click for copyable input
Out[25]=

规则还可以用于对特定的网格构件或分区域赋值. 但是请注意,尽管在概念上是类似的,这下面的语法和先前所讨论的 是不同的.

设置在位置 元素的背景.
In[27]:=
Click for copyable input
Out[27]=
设置从 区域的元素的背景.
In[28]:=
Click for copyable input
Out[28]=

规则可以有效地指定值的例外. 然而,当用手动指定网格的每块的值时,它们的效率较低.

使用规则手动指定替换的模式.
In[31]:=
Click for copyable input
Out[31]=

为了获得重复模式,建议您使用 下一节 讲述的列表语法.

使用列表

给出列表的序列值是一种紧密方便的方式,可以指定相邻的行或列的大量选项值.

列出连续列所使用的值.
In[52]:=
Click for copyable input
Out[52]=

另外,可以用子列来指定循环使用的值.

指定循环使用列表.
In[53]:=
Click for copyable input
Out[53]=

这些循环子列表,可以填充在开始或结束.

在循环之前给出初始值.
In[58]:=
Click for copyable input
Out[58]=
给出最后的值.
In[57]:=
Click for copyable input
Out[57]=
在中间使用缺省值.
In[7]:=
Click for copyable input
Out[7]=

因为列表中的位置与网格位置相对应,指定中间位置的单个值需要给出它前面的所有值. 若要更直接地获得这些,使用本节 使用规则 所描述的规则.

使用列表语法指定第五列为红色.
In[61]:=
Click for copyable input
Out[61]=
使用规则直接分配背景颜色.
In[62]:=
Click for copyable input
Out[62]=

同时使用

最好是两全其美,使用列表语法指定网格的重复部分,同时使用规则语法指定例外.

列轮流使用蓝色和绿色,除第一个和最后一个是红色.
In[746]:=
Click for copyable input
Out[746]=
所有的列为蓝色,除了第一列和第五列.
In[89]:=
Click for copyable input
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 中的规则

的语法总结.

列、行、 缝隙和项

正如在 前面部分 所介绍的,Wolfram 语言提供灵活的语法,可以在网格的不同区域改变选项的值. 本节提供该语言的前后关系和阐述更精细的区分.

网格术语.

column项的垂直序列
row项的水平序列
item包含一个网格元素的区域
gutter连续行或列之间的边界

二维网格的不同部分

GridGraphicsGrid 遵循描述网格不同部分的相同的约定. ColumnGraphicsColumnGraphicsRow 遵循相同的约定,但它们只处理两维中的一维. Row 不参与这种约定.

选项集合

下表列出了可以处理的选项,没有选项适用于所有的结构. 从下表中可以看出在给定的结构中可以使用哪些选项.

Out[54]=
Out[53]=

注意 Row 没有采纳任何选项.

先列后行

要记住选项的语法,最重要的一步是要知道,首先指定列的具体值,然后是指定行的值.

opt->val所有的项使用 val
opt->{colspec,rowspec}列使用 colspec,行使用 rowspec
opt->{colspec}列使用 colspec,行使用缺省值

GridGraphicsGrid 的选项结构.

在 Wolfram 语言中,带有横向设置 h 和垂直设置 v 的选项指定为 . ImageSizePlotRange 是两个常用的建立该约定的选项.

在网格中,这些横向和纵向设置分别对应列和行的值. 这是因为列水平堆叠,因此它们的属性:如宽度和位置,是与水平方向相对应的. 行是垂直叠放,而它们的属性是与纵向相对应的.

长是高的两倍的图形.
In[37]:=
Click for copyable input
Out[37]=
如下网格中,每个项的宽是2个 ems,高是1个 ex.
In[1]:=
Click for copyable input
Out[1]=
每一列有单独的设置,而不是所有的列只有一个宽度.
In[29]:=
Click for copyable input
Out[29]=
In[2]:=
Click for copyable input
Out[2]=
同样,在连续的水平位置可以给不同的背景颜色.
In[6]:=
Click for copyable input
Out[6]=

缝隙

与属性相关的许多 Grid 选项最终与网格中的一列,行或项相关.

然而还有处理行与列的间隙的选项.

Dividers在网格中何处画分割线
Spacings水平和垂直空隙

行和列间的缝隙选项.

与任何单个行或列无关的线.
In[85]:=
Click for copyable input
Out[85]=
与框架相比较.
In[86]:=
Click for copyable input
Out[86]=

DividersSpacings 的语法与其它选项一样. 对于一个在特定方向上有 n 个项的网格,DividersSpacings 可以指定元素之间的 个间隔,在第一个元素之前开始和在最后一个元素之后结束.

描述最细致的是项,在网格中的每个项都可以自己的值,如 BackgroundAlignmentFrame.

Item 可以用来清楚列明所需的设置.
In[100]:=
Click for copyable input
Out[100]=
另外,使用项的 索引来分配值.
In[101]:=
Click for copyable input
Out[101]=
编程产生的网格.
In[103]:=
Click for copyable input
Out[103]=
设置网格的整个区域.
In[105]:=
Click for copyable input
Out[105]=
In[109]:=
Click for copyable input
Out[109]=

分割线和框架

Wolfram 语言提供一个延伸的系统描述在网格中应画怎样的分割线和框架.

Dividers在行或列间画分割线
Frame围绕着网格区域画框架
FrameStyle用于线的整体样式

画分割线和框架的选项.

使用 Frame 在区域的四边或一系列区域画线.
In[131]:=
Click for copyable input
Out[131]=
突出特定的行或列.
In[141]:=
Click for copyable input
Out[141]=

Frame 总是在封闭区域的四面画线,Dividers 允许更低层次的控制.

In[140]:=
Click for copyable input
Out[140]=

使用分割线时,线只适用与单个方向.

In[147]:=
Click for copyable input
Out[147]=
In[146]:=
Click for copyable input
Out[146]=
这个短形式绘制中心分割线.
In[150]:=
Click for copyable input
Out[150]=

分割线和框架的样式

FrameStyle 设置了在 FrameDividers 中使用的基本样式.
In[94]:=
Click for copyable input
Out[94]=
In[95]:=
Click for copyable input
Out[95]=
FrameDividers 允许特定的样式.
In[50]:=
Click for copyable input
Out[50]=
In[48]:=
Click for copyable input
Out[48]=

一般来说,可以使用任何线和色彩指令,包括 HueThicknessDashingDotted 和其它. 多种指令可以用 Directive 来组合.

优先级

当样式给定有冲突时,Dividers 优先于 Frame,它们优先于 FrameStyle. Item 定义的样式优先级最高.

分割线和框架加在一起.
In[177]:=
Click for copyable input
Out[177]=
不同来源的风格结合在一起.
In[185]:=
Click for copyable input
Out[185]=

对齐和位置

漂亮的网格往往需要对齐,Wolfram 语言对于网格中的不同对齐有相当的支持.

Alignment 选项可以被传递到整个网格.

右对齐.
In[53]:=
Click for copyable input
Out[53]=

还可以不同的列有不同的横向对齐,不同的行有不同的纵向对齐.

第一列右对齐,第二列左对齐.
In[61]:=
Click for copyable input
Out[61]=

还可以对于网格中的个别项给出不同的对齐.

设置在 位置的元素左对齐,在 位置的元素右对齐.
In[62]:=
Click for copyable input
Out[62]=
还可以在 Item 中设置 AlignmentItem 的指标具有优先级.
In[63]:=
Click for copyable input
Out[63]=

还可以按小数点或任意字符对齐.

. 对齐.
In[65]:=
Click for copyable input
Out[65]=

在其包围环境中定位网格可以用 BaselinePosition.

缺省位置.
In[67]:=
Click for copyable input
Out[67]=
网格的底部与封闭表达式的基线对齐.
In[73]:=
Click for copyable input
Out[73]=
对齐网格,使该 元素的基线是在整体基线上.
In[74]:=
Click for copyable input
Out[74]=

背景和样式

普通常识

当与元素集合一起工作时,Grid 提供了设置单独背景的方法.

虽然单个元素可以有自己的背景,但当您把所有元素放在一起时,结果会很糟糕.

In[193]:=
Click for copyable input
Out[193]=

Grid 和相关的函数把背景放在包含这些元素的全部项的组合上.

In[194]:=
Click for copyable input
Out[194]=

使用更复杂的语法,各种模式都很容易实现.

交替背景.
In[195]:=
Click for copyable input
Out[195]=
In[196]:=
Click for copyable input
Out[196]=
突出相交的行和列.
In[197]:=
Click for copyable input
Out[197]=
在网格内的特定项目中嵌入背景.
In[107]:=
Click for copyable input
Out[107]=

重叠背景设置的优先级

在交叉处混合背景.
In[198]:=
Click for copyable input
Out[198]=
使用索引插入的背景具有优先级.
In[199]:=
Click for copyable input
Out[199]=
使用索引的列优先于使用索引的行.
In[200]:=
Click for copyable input
Out[200]=
Item 指明的背景具有最高优先级.
In[201]:=
Click for copyable input
Out[201]=

跨越和嵌套

二维空间的复杂分区可以通过嵌套网格结构和/或使用跨越元素来实现.

顾名思义, 跨越元素允许跨越多列、多行或两者兼而有之.

跨越前两列.
In[709]:=
Click for copyable input
Out[709]=
跨越前两行.
In[710]:=
Click for copyable input
Out[710]=
跨越前两列和前两行.
In[711]:=
Click for copyable input
Out[711]=

重要的是要注意:跨越区域必须是矩形,不在矩形内的项不会跨越,而只会显示跨越字符.

跨越只是在矩形块中进行.
In[75]:=
Click for copyable input
Out[75]=
虽然许多布局可以用跨越元素实现,有时使用简单的嵌套网格结构更快、更方便.
In[81]:=
Click for copyable input
Out[81]=
In[84]:=
Click for copyable input
Out[84]=

尤其是复杂的网格,往往使用 RowColumn 来创建所需的具体结构更清晰,而不是试图设计一种复杂的跨越系统.

尺寸和间隙

网格中的尺寸

Grid 通常不修改其内容的大小. 此外,默认情况下,行和列设计成只需容纳内容即可.

In[275]:=
Click for copyable input
Out[275]=

在上面的例子中,第二行比第一行长,第二列比第一列窄,但元素的尺寸没有改变.

如果在网格中的元素交互或动态变化,整个网格的大小将自动适当调整.

一个有用的例外是, Button 将自动填充可用空间.

In[277]:=
Click for copyable input
Out[277]=

ItemSize 可以用来覆盖缺省的设置.

使各项尺寸相同.
In[278]:=
Click for copyable input
Out[278]=
指明单个列和行的宽和高.
In[256]:=
Click for copyable input
Out[256]=

ItemSize 的单位是排版单位:exsems.

它也可以使用 Scaled 来指定封闭区的一小部分的宽度.

首两列是页宽的 .3 .
In[274]:=
Click for copyable input
Out[274]=

网格中的换行

如果列太窄,文本项会换行,但这会导致行比设置的最小值高.

In[266]:=
Click for copyable input
Out[266]=
设置 ItemSize->Automatic,文本项会根据页面宽度换行.
In[271]:=
Click for copyable input
Out[271]=
设置 ItemSize->Full,可以避免断行.
In[273]:=
Click for copyable input
Out[273]=

GraphicsGrid 中的尺寸

默认情况下,GraphicsGrid 将返回一个有相同大小项的网格.

In[286]:=
Click for copyable input
In[289]:=
Click for copyable input
Out[289]=

它会自动选择适合整个元素集合的纵横比.

和相同的 Grid 例子比较,它并没有改变任何一个整体大小或纵横比.

In[290]:=
Click for copyable input
Out[290]=

GraphicsGrid 不支持 ItemSize 选项,但是支持 ImageSize.

In[294]:=
Click for copyable input
Out[294]=