用于创建和编辑可变数据文档的用户界面的制作方法

文档序号:6427157阅读:311来源:国知局
专利名称:用于创建和编辑可变数据文档的用户界面的制作方法
技术领域
本发明涉及用于创建、编辑和印刷由文本和图形组成的文档的软件实现方法和处理,并且尤其涉及可变数据文档的创建、编辑和印刷。
背景技术
可变数据印刷传统上,当印刷大量文档时,使用的印刷处理是需要文档的物理表示的模拟处理。这些物理表示包括必须在印刷前制造的溴化物和/或印刷版。这意味着生成定制文档是昂贵的,并且大量文档操作通常涉及印刷多份完全相同的文档。
可以使用数字印刷处理来生成定制文档,其中无需在印刷前准备文档的物理拷贝。直到最近,要么是数字处理昂贵,要么就是效果比传统的模拟印刷处理产生的质量要差。
然而,在过去的五年中,数字印刷方面的进展已经显著降低了创建高质量定制文档的成本。这些进展已经使得可变数据印刷越来越普遍。可变数据印刷软件正变得可用于允许文档作者不仅仅创建单个文档而且可以创建相关文档族,其中每篇文档都是为它的预期读者定制的。
为了使高质量的定制印刷切实可行,需要解决几个问题。一个问题是印刷产品的质量。直到最近,数字处理才能够接近传统印刷处理的分辨率。另一个问题是,通常需要大量数据才能以数字形式表示高质量的文档,特别是在文档包含许多高分辨率图像时。这使得不可能通过计算机网络将大量定制文档电子地传送到数字印刷机。第三个问题是,与简单文档相比,定制文档通常需要更多的努力和技能来进行创建和维护。定制文档是通过将可变数据插入到文档模板中而创建的。文档模板是具有用于插入可变数据的空位的文档。文档模板可以包括某些由许多文档共用的数据,以及定义了如何布置每个定制文档的信息,其中定制文档是通过将数据插入到模板的可变数据空位中生成的。因为需要将页面的版面定义为能够处理不同大小的数据或缺失的数据项,所以创作可变数据模板比创作简单文档更加困难。另外,还需要定义和维护模板和数据之间的关系。同样,经常需要数据库技能,以便能够利用可变数据印刷技术创建定制文档。
数字印刷硬件的质量已经提高到其效果可与高端模拟印刷生成的效果相媲美的程度,同时其成本也已显著下降。诸如PPML之类的新标准允许在不发送大量重复数据的情况下,经由网络将多组相关文档发送到印刷机。这降低了可变数据印刷所需的网络带宽。
对于可变数据文档的创作和管理的复杂性问题,没有容易的解决方案。定制印刷以“邮件合并”的形式在字处理软件中已经粗略地应用许多年了,但是邮件合并仅仅支持对各个输出文档的版面进行非常粗略的控制。最新的可变数据印刷软件允许创建复杂、灵活的版面,该版面适应于每个文档中可能不同的数据项尺寸和形状,但是这些应用程序仍然是复杂的,并且难以使用。
版面模型通常,将包含文本和图形的文档组织为不同类型的项目的集合。项目可以是文本、图形、或者诸如组之类的作为项目集合的其它种类的抽象对象。版面项目通常具有矩形形状,或者具有矩形区域。每个应用程序允许的用于定义如何布置项目的规则,表示一个版面模型。在可变数据印刷应用程序中,规则必须对当项目尺寸改变时如何计算版面进行定义。
分层版面模型当前的可变数据印刷解决方案通常使用分层模型来定义版面。这些模型类似于HTML和XML文档所使用的模型。此类模型的例子为CSS盒子模型(CSS box model)和XSLFO。在此类版面模型中,通过在版面区域内垂直或水平地堆叠矩形项目,将矩形项目布置在矩形版面区域内。
除了水平和垂直堆叠之外,某些应用程序支持的另一种更普通的备选方案是,允许以垂直列或水平行方式堆叠项目,如页面上的几行文字那样。在此种形式的版面中,如果项目太多以致于不合适在一行或一列内,则开始一个新的行或列,并且超出的项目“自动换行”到下一行或下一列。这类似于字处理器中的文字自动换行。对于页面或版面区域的尺寸可能变化很大的应用程序、诸如web应用程序来说,这种布置项目的方式是最有用的。对于可变数据印刷应用程序而言,堆叠不太有用,这是因为在可变数据印刷应用程序中,版面的质量通常是重要的,并且当项目自动换行到下一行或下一列时,版面通常会使人感到不舒适。
在分层版面模型中,可以通过使用项目组对复杂的版面进行定义。组是包含其它项目的矩形版面项目,并且实质上是一个版面。组内的项目布置在组的边界矩形内。
可以利用对齐方式选项对版面内项目的位置进行控制,例如,垂直堆叠中的项目可以左对齐,以便使项目总是尽可能地靠近包含垂直堆叠的矩形的左侧。可以把对齐方式和组关联起来,以使组中的所有项目具有相同的对齐方式,或者组内的每个项目可以具有相应的关联对齐方式选项。通常支持多种对齐方式选项,包括居中、左对齐和右对齐。
利用与各项目关联的边距、或者与包含的版面或组关联的边距,也可以控制项目的位置。边距定义了两个相邻项目之间的最小允许距离。
基于约束的模型与先前开发的更普通的基于约束的模型相比,当前的分层版面模型更易于理解。基于约束的模型已经用于计算机辅助设计(CAD)应用程序、用户界面构造以及窗口管理。在用户界面构造应用程序中,要布置的对象是诸如按钮和输入区域之类的窗口小部件。在窗口管理应用程序中,要布置的对象是用于表示数据视图的窗口,其作为计算机操作系统的用户界面的一部分。
在用户界面构造应用程序中,使用动态的版面约束,以允许图形用户界面(GUI)适合于不同的屏幕分辨率、以及诸如使用不同字体和文本大小之类引起的变化。动态版面简化了构造多平台用户界面的过程。
在窗口管理应用程序中,用户能够应用动态约束,来创建在添加、删除窗口时或者在窗口改变大小或位置时保留的窗口之间的关系。
CAD应用程序涉及很普通的几何约束,并且版面模型更加复杂,更难以使用,并且对版面的计算比文档版面模型更慢。例如,用于CAD应用程序的某些约束解算器,支持对两条线段平行的指定,而两条线段平行是无法使用线性方程表示的。
如果在图形编辑操作期间每秒可能需要更新版面许多次,则用户界面(UI)和窗口管理应用程序所使用的基于约束的版面模型必须足够快,以便经常交互使用,所以,版面方法需要足够快,以支持此类操作。此类应用程序通常使用专用约束解算器进行版面计算。这些应用程序所使用的约束解算器通常支持线性约束,线性约束可以表示为线性方程(即线性等式)、或者线性不等式或者这二者。通常,此类约束解算器还有一个对解的质量进行定义的目标函数。约束解算器的目标是在不违反任何约束的条件下,最小化(或最大化)目标函数的值。如果目标函数也是线性的,则此类问题称为线性规划。此类问题是非常公知的优化问题,并且存在求解此类问题的已知算法。通常利用一种被称为单形算法的算法来求解此类问题。
假定由一组约束和一个目标函数定义了一个版面问题,该问题可能是过约束的,以致于没有解。作为选择,该问题可能是欠约束的,以致于有许多解,或者可能有一个解。为了对版面进行计算,版面模型必须确保版面恰好有一个解。实现它的一种方法是,向用户报告没有解或有许多解,并允许用户修正该问题。这通常不是一种可接受的解决方案,是因为很难向用户提供关于为何该问题是过约束或欠约束的有意义的信息。如果系统是过约束的,则许多约束可能同时互相矛盾。如果系统是欠约束的,则如何防止用户添加矛盾的约束也不是显然的。在使用图形界面对约束进行编辑时,这一点尤其困难。
避免无解的一种已知方法是,将约束优先级划分为所谓的约束层级。如果对于约束无解,则按照优先级的相反次序忽略约束,直至可能有解为止。
避免欠约束问题的一种已知方法,是使用非线性目标函数。如果使用合适的严格凸函数,则问题总是有唯一解。通常使用二次目标函数,是因为存在解决带有线性约束和二次目标函数的优化问题的公知技术。其中最简单的是改进的单形算法。
生成可变数据文档的另一个问题,是对正在生成的文档进行预览。字处理器和桌面印刷应用程序通常使用“印刷预览”功能,以便帮助用户在提交印刷之前对其工作进行全面评估。当需要预览大量文档时,这是很费力的。

发明内容
本发明的目的在于基本上克服或至少改善一个或多个与可变文档印刷相关联的问题。
根据本发明的一个方面,公开了一种基于模板创建可变数据文档的版面的方法,该方法包括以下步骤在该模板中设置至少一个容器,以形成版面;建立至少一个与该容器的至少一个特征中每个选定特征相关联的约束;使用图形用户界面(GUI)显示由建立步骤建立的、与由设置步骤设置的容器相关联的约束;以及修改版面,以便通过把内容放置到多个容器中而生成文档,其中在满足版面内的每个约束的条件下,根据所放置内容的属性,改变该至少一个容器的至少一维尺寸和该至少一个容器在版面内的位置中的至少一个。
同时还公开了本发明的其他方面,包括用于执行该方法的装置和计算机程序。


以下参照

本发明的至少一种实施方式,其中图1A表示用于可变数据印刷的计算机系统配置;图1B是图1A中的计算机模块的示意方框图;图2表示用于可变数据印刷的另一备选计算机系统配置;图3表示应用程序主窗口的示例,该主窗口包括菜单栏、工具栏、工作区和浮动调色板;图4表示了一个屏幕、工具和图标,以说明本公开的各个方面,包括示例性容器创建、容器间的第一类支柱、锚点和滑块;图5A-5D表示第一示例性容器规则;图6A-6C表示第三容器规则;图6D和图6E是描述了容器区域创建的流程图;图7A-7B表示一个具有三个栏的文本容器,以及通过使用指示设备的直接操作调整栏宽和装订线宽度大小的方法;图8表示了一个屏幕、工具和图标,以说明字符大小同步操作;图9表示了一个屏幕、工具和图标,以说明内部边距自动调整操作;图10表示在两个容器的边缘之间添加支柱以便对距离约束进行描述的方法;
图11表示了一个屏幕、工具和图标,以说明用户界面的几种特征(feature)(包括第二示例性容器之间的支柱)的操作;图12表示了一个屏幕,以说明不固定导向的操作;图13和图14表示数据源选择方法;图15表示用于数据源过滤的用户界面;图16和图17表示一个用户界面,用以说明用于浏览数据源的方法;图18表示一个用户界面示例,以说明数据源的变量以及用于浏览数据源的方法;图19表示一个用户界面,用于将数据源的变量与可变文档模板相关联;图20表示一个用户界面,用于现场校对与可变文档模板合并的数据源内容;图21A和图21B表示用于选择性校对的一种利用各文档的容器的宽度和高度来计算普通文档和最大差异文档的方法;图22为一个示例性版面,用于说明版面项目以及用作版面方法输入的约束;图23仅表示了对应于图22中的示例的垂直约束;图24是表示图23中的垂直约束的有向图;图25表示在执行推动操作时所涉及的步骤;图26表示推动操作的一个备选实现方式所涉及的步骤;图27A-27F表示使用的推动操作示例,其中图27A和图27B表示推动操作示例的起始位置,图27C和图27D表示推动操作示例的中间阶段,图27E和图27F表示推动操作示例的结果;图28表示基于图的版面计算中的高级步骤;图29表示基于图的版面计算实现中的高级步骤;图30A表示基于图的版面计算如何通过移动垂直标记来降低能量函数的值;图30B表示基于图的版面方法的另一种实现方式,它包括对固定中心规则的处理;图31表示在基于图的版面计算中如何计算移动一组标记的距离;图32表示在将一组标记向右推动时,对推动的正向标记组和反向标记组进行计算所涉及的步骤;图33A-33C显示了如何利用基本模型的不同表示来规定容器的最小和最大高度;图34是修改容器在版面中的边缘位置以及与其它边缘的相互作用的流程图;图35是用于编辑模板文档的另一推动操作示例的流程图;图36是生成并且印刷可变数据文档的方法的流程图;图37A-37D表示与图4相对应的示例性版面、以及对该版面中的各种约束进行存储的方式;图38说明了使用高度和宽度条来表示第二容器规则中的容器约束;图39表示在一维空间上操作的版面引擎的使用示例;图40A和图40B表示在二维空间上操作的版面引擎的使用示例;图41A-41K描述了在容器内的文本布置以及它可能如何受到容器形状的影响;以及图42A-42C表示表的构造方法。
具体实施例方式
1.概述公开了一种可变数据文档创建和印刷系统,它最好是被实现为一个软件应用程序。该应用程序允许创建多篇形式相似但其内容不同的文档。这可以通过创建和编辑文档模板、以及将文档模板上的区域和各种数据相关联来实现。
一个文档模板可以包含多个容器,其中每个容器被配置为保存诸如文本或图像数据之类的内容。容器的位置和尺寸可以是固定的,或者可以根据用户规定的规则在尺寸或位置方面因文档不同而改变。这些容器的内容可以是静态的或可变的(即,取决于某些诸如数据库之类的数据源)。
用户可以规定从中获取数据的各类数据源。数据源包含多个数据记录。应用程序提供了用于把数据和文档模板中的容器关联起来的机制。
然后,根据数据源和文档模板中的容器之间的关联,将文档模板和数据源中的数据“合并”起来,以便生成多个文档。通常,为数据源中的每条记录或每组记录生成一个文档。然后能够根据需要将文档保存到磁盘或进行印刷。
这些方案与现有技术相比提供了许多独立优势。例如,与现有技术不同,当对文档模板进行编辑时,用户可以选择总是查看合并文档之一。这是由于文档模板和数据是动态合并的。因此,在编辑模板时,有可能至少看见生成文档之一看上去是什么样,而不用像现有技术中那样,必须到特定的预览区域才能看见文档(而不是文档模板)看上去是什么样。
在适当的位置显示有关容器的约束(其决定了容器能够移动和改变尺寸的方式),并且无需像现有技术中那样必须到独立的屏幕或区域,而是能够通过点击容器上的各个位置,在适当的位置对有关容器的约束进行编辑。与现有技术相比,这简化了文档模板的创建。
2.实现方式概述基本实现方式是可变数据文档创建和印刷应用程序,它包括至少一个用户界面和一个版面引擎。一种具体的实现方式是,可在连有印刷机的个人计算机上执行的软件。在另一种实现方式中,应用程序被实现为可在嵌入在印刷机或印刷控制器中的处理器上执行的软件,其中印刷机或印刷机控制器支持对可变数据文档集的印刷。在另一种实现方式中,应用程序被实现为可在web服务器上执行的软件,其中web服务器能够提供为浏览者定制的文档。这些实现方式还包括在适当的硬件装置上执行时的这种软件。
可变数据印刷是指印刷相关文档的集合。在不可变数据印刷中,文档是单独印刷的,并且通常各文档的数据是单独发送到印刷机的。在可变数据印刷中,将包括多个相关文档的印刷作业发送到印刷机。通常,可变数据印刷作业中的文档包括多个文档中出现的共享单元。通常这个数据每个作业仅向印刷机发送一次,而不是为每篇文档重复发送。当印刷可变数据印刷作业时,将共享的数据插入到每个文档中。这可能要求在印刷页面时对文档页面的版面进行计算。在这种情况下,版面方法可能是印刷机或印刷机服务器中的软件的一部分。更通常地,在客户机上对每篇文档的版面进行计算,并且将版面作为印刷作业的一部分发送到印刷机,在这种情况下,版面方法是在客户机上执行的。
3.系统描述图1A表示用于印刷可变数据文档的系统100。可以在图1B详细描述的通用计算机模块101内,实施在此描述的方法,其中可以用软件(诸如在计算机模块101内执行并且可在系统100上运行的版面编辑应用程序121)全部或部分地实现所述处理。特别地,可以利用计算机101执行的软件中的指令,实现版面编辑和随后的印刷步骤。可以将该软件存储到计算机可读介质中,计算机可读介质例如包括下文描述的存储设备。从计算机可读介质中将该软件加载到计算机中,并且由计算机101执行。其上记录有此类软件或计算机程序的计算机可读介质是计算机程序产品。在计算机中使用计算机程序产品,最好是产生一种用于文档版面编辑和可变文档印刷的有利装置。
计算机模块101连接到诸如键盘132之类的输入设备、和诸如鼠标133之类的指示设备,并且还连接到包括显示设备144的输出设备,以及可选地连接到本地印刷机145。输入/输出接口138能够经由网络连接107,将计算机模块101连接到系统100的其它计算设备。网络连接107通常为局域网(LAN)或广域网(WAN)。
计算机模块101通常包括至少一个处理器单元135、一个存储器单元136、和输入/输出(I/O)接口,其中存储器单元136例如是由半导体随机存取存储器(RAM)和只读存储器(ROM)构成的,输入/输出(I/O)接口包括视频接口137、以及用于键盘132和鼠标133的I/O接口143。提供了一个存储设备139,该设备通常包括硬盘驱动器140和软盘驱动器141。也可以使用磁带驱动器(未示出)。CD-ROM驱动器142通常被提供作为非易失性数据源。正如相关领域技术人员已知的那样,计算机模块101使用诸如GNU/Linux或Microsoft Windows之类的操作系统,并且计算机模块101的组件135到143通常根据操作系统经由互连总线134进行通信,并且其通信方式产生了由此形成的计算机系统的常规操作方式。可以在其上实施所描述方案的计算机示例,包括IBM-PC及其兼容机、Sun Sparcstation或由此衍生的类似计算机系统。
通常,版面编辑应用程序121驻留在硬盘驱动器140上,并且在其执行中由处理器135进行读取控制。通过使用半导体存储器136,可能和硬盘驱动器140合作,可以实现对程序121以及从网络1020中读取的任意数据的中间存储。在一些例子中,可以通过将应用程序121编码到CD-ROM或软盘上,并经由相应的驱动器142或141对其进行读取,来向用户提供应用程序121,或者可选地,应用程序121可以由用户从网络连接107上进行读取。另外,也可以从其它合适大小的计算机可读介质中将软件加载到计算机模块101中,所述介质包括磁带、ROM或集成电路、磁光盘、计算机模块101与另一设备之间的无线或红外传输信道、诸如PCMCIA卡之类的计算机可读卡、以及包括电子邮件传输和网站上记录的信息等的因特网和内联网。以上仅仅是相关计算机可读介质的示例。可以使用其它计算机可读介质。
同时名为版面编辑的应用程序121,还操作用以执行可变数据印刷(VDP),并且该程序包括两个软件组件。这些组件中的第一个组件是版面引擎105,它是用于计算具有给定约束和尺寸的矩形和线条在矩形区域内的位置的软件。第二个组件-用户界面103组件提供了一种机制,用于允许用户构造文档模板以及将文档模板中的区域和数据源关联起来。用户界面103和版面引擎105经由通信信道123进行通信。用于文档生成的数据源通常是驻留在数据库服务器117上的数据库119,数据库服务器117通常由在其上运行数据库应用程序的另一台计算机构成。主机101借助于网络连接107与数据库服务器117进行通信。可变数据印刷应用程序121生成文档模板,该文档模板能够被保存到主机101或文件服务器115上,其中文件服务器115通常由另一台计算机构成。可变数据印刷应用程序121还生成由文档模板合并数据而形成的文档。可以将这些文档保存到主机101上的本地文件系统中,保存到文件服务器115上,或直接发送到印刷服务器109或印刷机113用于进行印刷。印刷服务器109是一台计算机,用于向不能直接联网的印刷机提供网络能力。将印刷服务器109和印刷机113经由典型通信信道111进行连接。
除了增加了引擎服务器227以外,图2与图1类似,其中引擎服务器227包含版面引擎105的独立版本225。引擎服务器227是另一台典型计算机。可以由版面引擎225将文件服务器115上存储的文档模板和数据库119中存储的数据进行组合,以便生成文档,用于印刷或其它目的。可以通过用户界面103对此类操作进行请求,或者仅仅请求印刷一条具体记录。
4.主窗口参照图3,用户界面103包括由应用程序窗口301构成的图形用户界面,当运行时,将应用程序窗口301显示在视频显示器144上。窗口301的特征在于菜单栏302、工具栏区域303、工作区306、可选的浮动调色板311、以及光标/指针设备313,其中工具栏区域303在某些实现方式中可以分离出来并移动到屏幕上的不同位置,光标/指针设备313的位置通常与鼠标133的位置或运动相关联。
菜单栏302具有许多菜单项304,正如现有技术中常见的那样,它在被激活时扩展为菜单选项的分层结构。
工具栏303具有许多工具按钮或小部件305,可以根据应用程序的特定模式对其每一个进行隐藏或显示。
可选标尺308可以用于指示指针、页面、线条、边距向导、容器或其它对象在工作区中的位置。标尺308可以显示所用单位的数字指示,所用单位例如是英寸、毫米或像素。
浮动调色板311可以用于访问诸如可变数据库之类的附加功能。调色板311具有其特有的窗口控件312,该窗口控件312允许对调色板311进行移动、调整大小或关闭。可选地,调色板311可以一直保持在工作区的前面,或者可以隐藏在其它对象的后面。可以限制调色板311只出现在应用程序窗口301的范围之内,或者可以允许它部分或全部地出现在应用程序窗口301之外。
参照图4,显示了工具栏区域303,它具有至少下列用户可选的图标“按钮”·选择工具按钮403用于对容器边缘进行选择、移动、缩放、调整大小和锁定/解除锁定。通过围绕容器拖动选择框或者在选择容器时同时按下CTRL键,可以对容器进行多重选择。
·图像容器工具按钮405用于创建用于保存静态或可变图像的容器。
·文本容器工具按钮404用于创建用于保存静态或可变文本的容器。
·支柱工具按钮406用于对容器之间的距离进行控制。
正如现有技术中公知的那样,可利用上下文敏感的工具提示来实现此类按钮。
5.文档模板工作区306用于查看和编辑文档模板的设计。这允许用户设计正在准备的文档的印刷外观,并根据正在与文档模板合并的可变数据的数量和大小,理解各合并文档是如何变化的。
如果已经将外部数据源链接到该模板,则在其容器中显示可变文本和图像,从而使用户能够在他们工作时预览当前的文档。
每当用户滚动光标或选择容器时,就对描述了文档结构及其可变数据容器的行为的可视线索进行显示。
工作区306的特征在于滚动条307、可选标尺308以及文档模板309。文档模板309能够显示多个页面。
正如现有技术中公知的那样,给定文档模板的页面大小是由用户规定的。各文档中的实际页数可以取决于可变数据而发生变化。如果不适于在一个页面上,则自动创建附加页面以便显示数据。
在每个页面边界内是一个指示页面上可印刷对象的最大范围的可选页边距310。
图4还示出了多个对象的示例,这些对象可能出现在文档模板309的一个页面上的,它们是多个容器407和408、特征可选的锚点图标409、不固定的边缘410、支柱412和滑块413。
6.容器容器是文档模板内的空间,其中可以放置诸如文本或图像之类的静态或动态内容,以及其它容器或对象。可以通过如在用户界面所描述的那样利用指示设备313对容器进行操作,以及借助鼠标133进行控制,对容器进行移动、缩放和调整形状。
更准确地说,容器具有设置、可视外观以及交互和编辑行为的集合。以下是容器的全部定义·容器可以有静态和/或动态内容。动态内容是动态的,是指它来源于数据源,并且对于不同的文档来说可能不同。不打算使动态内容包括动画的或随时间变化的内容,是因为此类内容不适合印刷。类似地,静态内容在使用该容器生成的所有文档中将会是相同的,尽管由于动态内容的作用,可能为每个文档放置不同的静态内容。
·容器可以有装饰特征,诸如背景颜色、边界、诸如字体和字型之类的文本设置,此类特征应用于容器的内容。
·生成文档时可以合并容器和来自数据源的数据。装饰特征通常在印刷品中是可见的,就像任何静态内容那样。动态内容将导致出现来自于数据源的特定数据。例如,可以对容器的这种表示进行印刷,或在屏幕144上进行显示,或者两者兼而有之。
·容器可以具有一个用户界面,例如用于对容器设置进行编辑和查看的交互图形用户界面。界面组件通常出现在屏幕144上,而不是出现在所印刷的文档中。用户界面103可显示容器的某些装饰特征,诸如背景颜色或字体,并且还可以添加特征,以便允许对容器的设置进行编辑和查看。专用用户界面特征的例子是,用于对容器的尺寸或位置进行交互显示和改变的边界图标或角图标,或者是在将容器和来自数据源的数据进行合并时,用来指示容器的行为的覆盖数字、线条、图标或文本。
本公开的一个方面是一组新的直接操作技术,以及涉及容器的图形用户界面组件的显示方法。
6.1容器约束根据本公开,一个容器可以有若干约束,该约束控制在各文档中如何对相关联的内容进行显示。这些约束连同把静态和动态内容与容器相关联起来的方法,是用户对从单个文档模板生成多个文档进行控制的主要方法。约束的一个例子是“该容器的内容的最大高度为四英寸”。另一个约束可能是“该容器的内容的左边缘在各文档中必须出现在相同的水平位置上”。此处描述的是用于利用图形用户界面对此类容器进行显示和编辑的一组方法。
对静态内容的位置进行规定的内容占位符在数字印刷领域中是众所周知的,其中静态内容例如是在页面上具有某一已定义位置的图像。在以下论述中,可以假设容器具有位置和尺寸,并且可以以与现有技术中类似的方式对其进行显示和编辑。相反,本公开集中在特别对于可变数据印刷的显示和编辑方法。
容器允许用户规定内容在文档中的尺寸和位置。由于可从单个文档模板生成若干文档,因此容器必须具有用于对多种可能性和约束进行规定和显示的用户界面。
容器的边缘定义一个虚拟边界,在边界内的相关联内容将出现在文档中。因此,在本专利说明书中,讨论容器的左边缘,可以相当于讨论在生成的任何文档中能够显示相关联内容的位置的最左边缘。同样,讨论容器的高度,可以理解为讨论与在生成的任何文档中相关联内容的高度有关的约束。在本专利说明书参照用户界面103讨论容器的边缘或尺寸时,以上区别将会更加清楚。
在以下的论述中,术语“固定的”定义了用于控制内容外观的某个值在所有文档中是相同的·如果容器的宽度是固定的,则这意味着相关联内容所允许的宽度在所有文档中将会是相同的。
·如果容器的高度是固定的,则这意味着相关联内容所允许的高度在所有文档中将会是相同的。
·如果距离约束是固定的,则对于所有文档来说所指定的距离为常数。
·如果容器的左边缘或右边缘是固定的,则这意味着相对于该页面该边缘的水平位置对于所有文档来说都是相同的,但是可以对容器的高度或垂直位置进行改变。例如,如果容器的左边缘是固定的,则相关联内容在一个文档中可以出现得接近该页面的顶部,而在另一个文档中可以出现得接近该页面的底部,但是,在所有情况中左边缘将具有相同的水平位置。
·如果容器的顶边缘或底边缘是固定的,则这意味着相对于该页面该边缘的垂直位置对于所有文档来说都是相同的,但是容器的宽度或水平位置可以改变。
·容器的垂直轴是位于该容器的左边缘和右边缘的中间位置、并与左右边缘平行的假想垂直线。如果容器的垂直轴是固定的,则该容器的左边缘和右边缘的水平位置的平均值对于所有文档来说都是相同的。利用该约束,可以对容器的宽度进行改变,因此在不同文档中左边缘和右边缘可远离或靠近垂直轴,但是对于所有文档来说,垂直轴保持在同一水平位置。容器的高度和垂直位置不受该约束影响。
·类似地,如果水平轴是固定的,则尽管高度不受该约束影响,容器的顶边缘和底边缘是垂直定位的。
·如果水平轴和垂直轴都是固定的,则这意味着容器的中心点是固定的,但是其宽度和高度不受该约束影响。
·如果容器的一个角、容器的某个边缘的中点、或容器的中心点是固定的,则这意味着该点在所有文档中出现在相同位置,并且相对于该容器出现在相同位置。例如,如果容器的左上角是固定的,则这意味着其内容可能放置的位置的左上角对于所有文档来说都是相同的。
·可以相对于页面的左边缘、右边缘、左页边距、右页边距或某个其它水平位置,固定垂直边缘或垂直轴。类似地,可以相对于页面的顶边缘、底边缘、边距或某个其它垂直位置,固定水平边缘或水平轴。由于如果页面大小对于所有文档是相同的,则上述可能性在生成的文档中没有区别,所以只有页面大小在文档间变化时,术语“固定的”的细微差别才有意义。
“固定的”的反义是“不固定的”,它意味着边缘、轴、角、中点、或距离约束可在文档间变化,但是在特定的一组文档中未必如此。例如,可能存在其它实际上防止边缘的位置进行改变的外部约束,但是,如果不应用那些外部约束则该边缘的位置能够改变的事实,意味着仍然将该边缘标记为不固定的。
6.2容器状态将容器的“边缘状态”定义为8个属性的集合,如上所述,属性可以是“固定的”或“不固定的”,这些属性为左边缘、右边缘、垂直轴、顶边缘、底边缘、水平轴、宽度和高度。由于边缘还可能受到诸如最小或最大容器尺寸设置之类的其它约束的影响,或者受到其它容器的位置的影响,所以边缘状态可能不能完全限定一个边缘的位置。因此,“边缘状态”仅指容器可能具有的状态全集的一部分。
在大部分的实现方式中,边缘状态是重要的,因为容器的图形用户界面部分是从边缘状态到图形表示上的映射所导出的,以及是从边缘和容器表示的直接操作到对边缘状态的调整上的映射所导出的。
更佳地,容器的全部状态不只是包括边缘状态。容器可以具有对宽度和高度的最小和最大设置,该设置对边缘的位置进一步进行控制。内部边距对可以显示相关联内容的位置进行控制,显示位置继而影响容器边缘能够放置的位置。文本字体、字型、大小和对齐方式设置以及图像剪切、缩放等,也可以作为容器状态的一部分,并且影响内容的位置、尺寸和外观。诸如背景和边界颜色、边界线磅重、线型等的装饰设置,也是各容器状态的一部分。同时,上述方面可能不会影响内容在文档中的位置,但是它们将影响外观。
在某些实现方式中,边缘状态包括上述8个属性,属性可以是固定的或不固定的。页面大小不能改变,因此,术语“固定的”在这里没有进一步的限定词。这8个属性产生28种不同的边缘状态,即256种可能性。
不需要使用全部的这256种边缘状态。例如,考虑以下状态容器的左边缘是固定的,垂直轴是固定的,而右边缘是不固定的。由于垂直轴是固定的,所以对于所有文档来说,从左边缘到垂直轴的距离必须与从右边缘到垂直轴的距离相等。由于左边缘也是固定的,所以对于所有文档来说,左边缘距垂直轴的距离为常数,这意味着右边缘也是固定的。
某些实现方式对边缘状态的一个子集进行了建模,其中每一个都呈现出独特的行为。由于其行为等同于若干其它状态,所以没有在所有实现方式中使用上述边缘状态。一种可选的实现方式可能采用此类状态,并且在用户界面中对其进行表示,作为对边缘是否固定进行模拟和编辑而不是对独特的容器行为进行建模的方法。
一种具体的实现方式使用36种容器状态,它是由6种独特的水平约束和6种独特的垂直约束的乘积形成的。
有关容器的水平约束为
1.左边缘、右边缘,垂直轴和宽度是不固定的;2.只有左边缘是固定的;3.只有右边缘是固定的;4.左边缘和右边缘都是固定的;5.只有垂直轴是固定的;以及6.宽度是固定的,但是左边缘、右边缘和垂直轴都是不固定的。
有关容器的垂直约束为1.顶边缘、底边缘、水平轴和高度是不固定的;2.只有顶边缘是固定的;3.只有底边缘是固定的;4.顶边缘和底边缘都是固定的;5.只有水平轴是固定的;6.高度是固定的,但是顶边缘、底边缘和水平轴是不固定的。
如果术语“固定的”有限定词,例如,如果每个边缘或轴相对于页面的左边缘或右边缘是固定的,则这将产生36种以上的独特边缘状态。
注意到,在上述列表中,标记为“左边缘和右边缘都是固定的”的约束,具有与“左边缘、右边缘、垂直轴和宽度都是固定的”、和“左边缘和垂直轴是固定的”、以及其它几种类似约束相同的行为。因为如果边缘状态采用较少的“固定”约束,则使用可视线索来表示各种“固定”概念的实现方式可以采用较少的这种线索,所以比较简单的对称约束通常是首选的,这与其它情况相比可以产生较少的视觉混乱。
如下所述,本公开的一个方面把边缘状态与容器的图形表示和编辑方法关联起来。
6.3显示和编辑容器6.3.1创建新容器的方法描述了两类容器文本容器和图像容器。文本容器保存文本和/或嵌入的图像。图像容器只保存图像。
参照图4,通过使用鼠标133分别对文本容器工具404或图像容器工具405进行点击,然后在文档模板309中拖动矩形,可以在文档模板309中创建新的文本容器和图像容器。
可选地,通过在激活适当的工具404、405后在文档模板309中进行点击,可以对容器进行简单地创建。或者插入具有默认尺寸的容器,或者提供对话框或其它提示用于输入新容器的尺寸。根据某种预定义的或计算的方案,可以对某些容器进行自动创建和放置。可以设计其它备选方案。
6.3.2显示容器的方法更佳地,将上述36种边缘状态中的每种状态映射到一个图形表示上。可以有少于36种的图形表示,因为在某些情况下某些边缘状态共享一个表示。
图5A-5D表示容器的第一示例性边缘规则。
应用程序121将边缘绘制成实线(参见项目503)或虚线(参见504),并且其特征在于锚点(在边缘上或其附近绘制,并且由如506、507、509所示的线条、形状和/或图标构成)、手柄(在边缘或形状上或其附近绘制的控制点,以允许对其进行移动或修改,参见502)、滑块(在边缘的任一侧绘制的短平行线,参见图4,标号为413的项目)、增长图标(参见505)以及颜色,用以表示边缘状态。
用于图5A-5D的容器显示方法的规则依次为1.对于每条固定边缘,将该边缘绘制成实线;2.如果宽度是固定的,则将左边缘和右边缘绘制成实线;3.如果高度是固定的,则将顶边缘和底边缘绘制成实线;4.不绘制轴;5.将尚未绘制的所有边缘绘制成在每条边缘附近绘制有增长图标的虚线;6.对于每对垂直边缘和/或垂直轴,如果它们都是固定的,则在其交点上绘制一个锚点;7.对于每条固定边缘,如果尚未在该边缘的任何位置上绘制锚点,则在该边缘的中点绘制一个滑块;以及8.对于每对垂直边缘和/或垂直轴,如果尚未在其交点处绘制锚点或滑块,则在其交点上绘制一个手柄。
规则1、2和3确保如果线条是固定的或受约束的,则将线条绘制成实线。规则5确保将不固定边缘绘制成虚线。规则6、7和8确保固定点显示锚点,某些固定边缘显示滑块,并且其它显示手柄。
在上文中,边缘只需绘制一次,因此,如果某条规则使得对一条边缘进行了绘制,则后续规则将不会使该边缘被再次绘制。如果方便的话,例如,如果容器很小,并且图标彼此重叠或遮挡表示的其它特征,则可以按不同方式绘制图标或者省略图标。
绘制不固定边缘的准确位置,可以取决于容器的内容。正如下文所述,使用“现场校对”,这意味着对内容和文档模板进行合并,并且该内容在用户界面中是可见的。一种备选的实现方式能够使用在所有文档上平均的容器内容区域,或者某些其它确定不固定边缘在用户界面上应当放置在何处的方法。
容器的这些表示提供了一种用于显示容器边缘状态的图形方法。该表示的解释如下·虚线意味着文档中那个边缘的位置取决于容器的内容。在图4中,此类边缘被标记为410。
·实线意味着边缘是受限制的,因为该边缘是固定的(诸如边缘414),或者因为容器的宽度和高度是固定的(在容器408中二者都是固定的)。
·锚点意味着与该锚点相交的边缘和/或轴是固定的。因此,锚点在所有文档中将出现在相同的水平和垂直位置。因此,根据定义,锚点是固定的。图4中的图标409是锚点图标的一个例子,它表示相交边缘414是固定的。
·滑块意味着相关联边缘是固定的,但容器可以位于沿该边缘“纵向滑动”的许多位置上。例如,在图4中,滑块413表示容器408的内容在文档中可以出现在特定图中所看到的位置的左边或右边。
是否绘制这些图标或边缘的某些或全部,取决于哪个工具或哪些容器被选择、高亮显示或者激活了。一般而言,在所印刷的文档中不绘制容器的边缘和图标,因为它们是设计文档模板的辅助工具。
可以在辅助对话窗口中显示诸如最小和最大宽度和高度之类的设置。
在图5A中,容器501的宽度和高度都是不固定的。用实线表示固定的边缘503。用虚线表示不固定的边缘504。增长图标505是附加的或可选的指示符,表示相邻边缘504是不固定的。
在图5B中,容器501的宽度和高度都是不固定的。锚点图标506附加地或可选地表示在该图标处相交的两条边缘503都是固定的。
在图5C中,容器501的宽度和高度都是不固定的,围绕着如可选锚点图标507所示的中心点同样地进行容器的扩大或缩小。
在图5D中,除了顶边缘508是固定的外,容器501的宽度和高度都是不固定的。锚点图标509表示该图标位于其中心的顶边缘508是固定的,并且还表示该容器的左边缘和右边缘围绕着通过该图标垂直绘制的中心轴(垂直轴)进行扩大或缩小。
6.3.3用于在适当位置编辑容器属性的方法通过用鼠标133和指示设备313点击任一边缘503、504或在其附近进行点击,使得边缘503/504在固定和不固定的状态之间进行转换,并且由此更新用户界面301中的图形表示。
使用鼠标133和指示设备313的组合,可以对控制点502进行拖动,从而使得相应的一条或多条边缘跟随控制点502的位置。当从利用鼠标133/指针313的选择中释放控制点502时,假定不存在使新位置无效的外部约束,则固定边缘保持在已经将其拖到的位置处,而不固定的边缘将返回到其计算位置,其中该计算位置由诸如该容器内内容的尺寸和形状之类的因素、以及可能应用于该容器或边缘的任何其它约束来进行确定。对用于确定不固定边缘和容器的位置的算法的完整描述,参见下文。
位于不固定边缘的中心点或者两条不固定边缘的交点处的控制点,可以是固定的,或者可以根本不对其进行显示,并且位于不固定边缘的任一端处的控制点,可以被限制为沿与该边缘平行的方向进行移动。
另外,可以通过在容器的顶点或边缘附近、或者在位于该顶点处的控制点上、或者在边缘的中心用指示设备133进行点击,向容器的顶点或边缘添加锚点。还可以通过在锚点图标附近进行点击,或者可选地通过选择锚点而后激活该界面中的菜单项、按钮或其它控件,对锚点进行删除。
以这种方式添加锚点,将会使得与该锚点相交的一条或几条边缘、一条或几条轴变为固定的。
容器最好有至少一个固定的点,除非另有外部约束,因为如果没有该要求,则有可能会创建其水平和垂直位置没有明确进行定义的容器。例如,如果该容器没有其它有效的外部约束,则没有固定边缘或轴的容器的内容逻辑上可能出现在页面上的任意位置。这使用户很难对此类容器的内容在文档中将出现在何处进行预测。因此,通过不允许将容器放置在这种未明确定义的状态中的转换,某些实现方式避免了上述可能性。
如上所述,倘若该容器具有外部约束,则容器可以有固定的宽度或高度而并不具有相应的固定边缘。例如,倘若能够利用某种水平约束确定容器的水平位置,则尽管容器的左边缘和右边缘是不固定的,容器也可以有固定的宽度。以下将论述此类外部约束,并将其称为“支柱”。
倘若将外部约束支柱附加到容器上,就能够以与上述用于固定边缘的方式类似的方式对边缘进行点击,来固定宽度或高度。在该情况中,如果存在与该容器相连的水平支柱,则对不固定的左边缘、右边缘或在其附近进行点击,将会固定容器的宽度。如果存在与该容器相连的垂直支柱,则对不固定的顶边缘、底边缘或在其附近进行点击,将会固定其高度。
对边缘、轴、宽度和高度的固定性进行操作,相当于在容器的边缘状态之间进行转换。其它操作,例如对固定边缘或角的位置进行改变,会修改其它容器状态信息。
更佳地,为了确保各容器总是具有有效的边缘状态,每当向容器添加约束或从容器中删除约束时,都应用一组规则,并且对其它约束进行必要调整,以便解决所有问题。通过更新屏幕显示以显示新的约束配置,立即向用户指出有关调整。这使得用户界面103能够防止容器到达所不期望的状态。
向每个容器的水平和垂直尺寸应用如下规则1.如果任一边缘变成固定的或受到外部约束的作用,则与该边缘平行的轴变为不固定的。
2.如果一个轴变成不固定的,则至少一条平行边缘必须变成固定的或受到外部约束的作用。
3.如果相对边缘变成不固定的,并且除去了那些边缘上的所有外部约束,则与那些边缘平行的轴变成固定的。
4.如果轴变成固定的,则与该轴平行的边缘变成不固定的,并且除去在那些边缘上起作用的外部约束。
5.如果宽度变成固定的,则左边缘、右边缘和垂直轴变成不固定的。
6.如果高度变成固定的,则顶边缘、底边缘和水平轴变成不固定的。
6.3.4备选的容器用户界面独立约束容器用户界面的替换(第二种)实现方式,可以以将容器的边缘状态划分为视觉上不同并且可独立编辑的约束的方式,显示并且允许对容器进行编辑。
在该实现方式中,利用跨越容器内容区域的条表示宽度和高度约束。边缘只表示边缘的固定或不固定性质。
根据容器显示方法,用于第二种实现方式的规则依次为1.对于每条边缘或轴,如果其线条是固定的,则绘制成实线,否则绘制成虚线;2.如果宽度是固定的,则绘制一条跨越内容区域的宽度条,否则绘制成虚线;3.如果高度是固定的,则沿着内容区域向下绘制一条实心高度条,否则绘制成虚线;以及4.对于每对垂直边缘和/或垂直轴,如果都是固定的,则在其交点绘制一个锚点,否则绘制一个手柄。
在第二种实现方式中,不需要如前所述的滑块,因为实线已经表示了与滑块相同的行为。而前一种实现方式则不然,因为前一种实现方式除了使用实线表示边缘的固定性之外,还使用实线表示宽度和高度约束。
第二种实现方式中的宽度条和高度条,是分别对容器的宽度和高度约束进行显示和编辑的图形方法。这些条可能看起来像边缘,并具有分别表示固定性和不固定性的实线或虚线外观。在图38中,显示了跨越两个容器3802和3803的宽度条3805和高度条3806,其水平和垂直位置分别由容器3801的尺寸和连接支柱3804的长度来确定。可选地,如果诸如固定边缘之类的其它约束使得宽度或高度的固定无意义,则这些条可能不起作用,或者不对其进行绘制。例如,如果容器的左边缘是固定的,并且右边缘是不固定的,则最好防止用户固定宽度,因为这会使容器处于一种超出先前论述的36种首选边缘状态集合之外的边缘状态。在该情况中,可能不显示宽度条。
为了在第二种实现方式中编辑容器,使用鼠标133和指针313对边缘、轴、宽度条或高度条进行点击,将边缘从固定的改为不固定的,或者反之亦然。对边缘、手柄或锚点的拖动,以与上述类似的方式起作用,并且对锚点进行点击,将会固定与其相交的任一不固定的边缘或轴,或者如果两条相交线已经是固定的,则同时将它们变成不固定的。如果以上操作使容器的水平位置或垂直位置未明确定义,则固定任一或两个中心轴可以对此问题进行纠正。例如,如果点击锚点使得容器的所有边缘变为不固定的,则存在多个可能的内容位置,因此,为了纠正此问题,通过固定其垂直轴和水平轴,可以锚定该容器的中点。其它外部约束或规则可能使得该步骤并非必要,或者只固定一个轴可能就足够了。
6.3.5备选的容器用户界面尺寸框在另一种(第三种)实现方式中,通过对最小和最大区域的直接操作控制容器的行为,其中最小和最大区域分别由一个单独的矩形框表示。
图6A-6C表示容器的第三示例性规则。
参照图6A,容器601包括其控制点603位于各顶点以及可选地位于各边缘中心点的最小区域框602,和其控制点605位于各顶点以及可选地位于各边缘中心点的最大区域框604。
最小区域框602在水平和垂直方向总是出现在最大区域框604之内,或与其相重合。
第三框606表示容器内的内容的实际区域。内容框606总是出现在最大区域框之内或与其重合,并且总是出现在最小区域框之外或与其重合。由诸如容器内内容的尺寸和形状之类的因素、以及可能应用于该容器的任何其它约束,对内容框的首选尺寸进行确定。
为了使用户易于区分这三个框,可选地,可以通过不同线磅重、线型或颜色对各个框及其控制点进行表示。
在查看包括一个或多个容器的文档模板时,为了减少视觉混乱,可以可选地隐藏最小和最大区域框602、604及其相关联的控制点603、605、以及内容框606,除非与它们关联的特定容器是“有效的”,例如,通过把指针放置在该容器占据的区域内或者利用鼠标点击该容器来实现。
通过使用指示设备133对其各自的控制点603或605进行直接操作,可以调整最小区域框602和最大区域框604的大小。通过调整最小区域框602的大小,不管容器内可能出现何种内容,用户都可以确定内容框606的最小可能尺寸。通过调整最大区域框604的大小,不管容器内可能出现何种内容,用户都可以确定内容框606的最大可能尺寸。
在调整最小区域框602的大小时,如果将该框的任一顶点或边缘的位置拖放到最大区域框604的外部,则自动移动该顶点或边缘,以便使它在释放控制点后与最大区域框的相应顶点或边缘相同;或者该顶点或边缘在它到达最大区域框604的相应顶点或边缘之后停止移动;或者自动扩大到最大区域框604的相应顶点或边缘,以便与当前拖动的顶点或边缘重合或者在其之外。
在调整最大区域框604的大小时,如果将该框的任一顶点或边缘的位置拖动到最小区域框602的内部,则自动移动该顶点或边缘,以便使它在释放控制点后与最小区域框的相应顶点或边缘相同;或者该顶点或边缘在它到达最小区域框602的相应顶点或边缘之后停止移动;或者自动缩小最小区域框602的相应顶点或边缘,以便与当前拖动的顶点或边缘重合或者在其内部。
根据最小区域框602在最大区域框604中的相对位置,确定内容框606在最大区域框604中的位置。
通过用指示设备133拖动最小区域框602,可以将其移动到最大区域框604内的任意位置。
可选地,可以对最小区域框602进行编程,以便在利用指示设备133拖动该框时,“咬住”最大区域框604内的首选位置选择中最靠近的位置,其中首选位置包括水平方向上的左对齐、右对齐和居中,以及垂直方向上的顶对齐、底对齐和居中。
图6A中的水平尺寸a、b、c和d表示最大区域框604、内容框606以及最小区域框602的各个垂直边缘之间的距离。
假定内容框606的任意尺寸在任何特定时刻由框内的内容所决定,则尺寸a、b、c和d总是符合以下等式a∶b=d∶c相应等式适用于相应的垂直尺寸,并且图中未对垂直尺寸进行标记。
因此,根据求解的水平尺寸a、b、c和d以及相应的垂直尺寸,对内容框606在最大区域框604内的位置进行确定。
图6B表示一种特殊情况,其中最小区域框602位于最大区域框604的左上角,并且因此内容框606也位于最大区域的左上角。
图6C表示另一种特殊情况,其中最小区域框602在水平和垂直方向上位于最大区域框604的中心,并且因此内容框606同时在水平和垂直方向上也位于最大区域的中心。
图6D和6E表示用于生成其中使用容器区域的可变数据文档的方法620。在应用程序121内实现方法620,并且该方法的起始点为622,其后在步骤624中,对文档模板进行检索,并且在显示屏144上的GUI301内对其进行显示。步骤626中,通常通过鼠标133和相应指针313的移动,对用户绘制容器进行检测。
在默认情况下,容器在绘制时具有两个约束,即最小容器区域和最大容器区域,诸如图6A-6C所示的最小容器区域和最大容器区域。在容器的初始状态中,最小容器区域与最大容器区域相重合。在步骤634中,可以对任一区域的控制点进行操作,以便由此对容器区域进行修改。
为了形成版面,在模板中表示该容器,此后在步骤628中可以应用各种约束。步骤628可以包括在该版面内的容器当中合并在此描述的多种类型的约束。在当前论述的实现方式中,所应用的约束是容器区域中的约束,诸如在图6A-6C中所示的那些。在步骤630中,再次使用鼠标133和指针313对容器区域进行绘制,然后在步骤632中,将容器区域和版面中的容器进行关联。在步骤634中,可以选择该区域的控制点,并且对控制点进行操作以便修改容器区域。此类修改包括设置该区域的一条或多条边缘,以便与容器的边缘相重合(图6B),以及相对于相关联的容器对区域框进行移动或定位。
接下来是步骤636,通过返回到步骤628,用户可以应用更多的约束。更多约束包括另一个区域框,由此提供了构造最小和最大区域框的机会。还可以应用其它约束。例如,在最大区域框和与最大区域框无关联的另一个容器之间应用支柱。这使得区域框能够根据另一个容器的变化进行动态地移动,同时继续限制与最大区域框相关联的容器的尺寸。
在步骤636之后,通过步骤638的操作,用户可以向版面中添加更多容器,直至版面完成为止。一旦版面完成,步骤640就将一条内容记录放置到版面中以便生成文档。步骤642允许为所有内容记录重复该过程,从而创建一组可变数据文档。一旦已经用尽了所有记录并生成文档,就如在步骤644中请求的那样,对文档进行校对(参见章节11.10-11.13)和/或印刷。方法620在步骤646中结束。
7.图像容器图像容器是特定类型的容器,其目的是用于包含诸如照片、插图、徽标或图表之类的图像。
最好是,图像容器具有一个行为选择,以便控制将要包含的图像的缩放,其中行为选择包括·“适合整幅图像”,对图像进行放大或缩小,从而使得整幅图像适合容器,并且图像的纵横比不变;·“使图像适合容器的尺寸”,对图像进行放大或缩小,从而将该图像填满整个容器,并且图像的纵横比不变,而且从视图中将图像的剩余部分剪切掉;·“拉伸以适合”,对图像进行放大或缩小,以便在水平和垂直尺寸上完全适合容器的尺寸,忽略图像的原始纵横比;·“不进行缩放”,不对图像进行缩放,并且从视图中剪切掉任何超出容器范围的图像部分。
另外,可以对图像容器进行设置,以便使在该容器内、并且其大小小于容器尺寸的任何图像向特定方向对齐,包括水平方向上的左对齐、居中、右对齐以及垂直方向上的顶对齐、居中、底对齐的任意组合。
8.文本容器文本容器是特定类型的容器,其目的是用于包含一段文本,并且可以利用各种字体和段落样式对其进行格式化,并且可以向文本容器的各个边缘进行对齐或调整。
文本容器包含静态文本、可变文本或者二者的组合。可以将诸如图像之类的其它对象插入到文本容器中,并且其它对象以与文本流动相同的方式进行流动。
通过直接输入将静态文本输入到容器中。如章节11中详细说明的那样,通过将可变数据对象从库中拖动到容器中,对可变文本进行添加。单个文本容器中可显示一个以上的可变文本对象。
静态文本的格式化可应用于单个字母、词语或整个段落,然而格式化选项只能应用于整个可变文本项实例。
8.1文本格式化文本格式化包括以下选项·字体·字体大小·加粗·倾斜·下划线·颜色·行间距·强制大写字母·自动断字
8.2对齐在某些特定实现方式中允许以下文本对齐选项·水平对齐左对齐(默认)、水平居中、右对齐或分散对齐。
·垂直对齐顶对齐(默认)、垂直居中、底对齐。
在不同的实现方式中,其它选项也是合适的,如垂直分散对齐文本。
8.3栏可以将文本容器中的文本排列为一栏、两栏或多栏,通过称为“间距”的间隔将每一栏的左右边缘和相邻的栏分开。
在现有技术中,通过拖动相邻栏之间的分界线来调整栏宽,是公知的,并且通过修改属性表或对话框中的值,或者通过类似的间接方法,可以预先对间距进行设置。
图7A-7B表示一个具有三个栏的文本容器701,以及通过利用诸如鼠标133和指针313之类的指示设备的直接操作,来调整栏宽和间距宽度的方法。
参照图7A,将文本容器701划分为三个文本栏702。如图所示,线条703表示相邻栏之间的中心分界线,线条704表示相邻栏702之间的间距边界。
通过利用鼠标133和指示设备133拖动中心分界线703,能够调整相邻栏的宽度。在拖动操作期间,显示一个特殊指针705代替默认指针,以表示栏拖动操作是有效的。
正如图7B所示的那样,通过利用指示设备拖动间距边界线704,可以调整间距的宽度。在拖动操作期间,显示一个特殊指针706代替默认指针,以表示间距拖动操作是有效的。
同时调整在同一栏间间隔内的两条间距边界线,从而使每条间距边界线和中心分界线之间总是保持相等间隔。
如在图7B中所见,其中可以多于两栏,可以对每个间距进行独立操作。
8.4可变字体大小可以改变文本容器内文本的字体大小,以允许通过减小或变大使各种容量的文本与容器相适合,并且允许容器的尺寸根据外部约束发生变化,同时仍然能够使文本整体与容器相适合。可以为每个文本容器设置最小和最大的字体大小,从而限定可能的字体大小范围。可以使用折半搜索算法确定要使用的最佳字体大小,以便使所有文本与容器相适合。如果字体大小达到最小尺寸,而文本仍然不能与容器相适合,则向用户显示一个错误信息。
8.5容器间的字体大小同步可以在两个或多个文本容器之间创建一个约束,该约束规定无论是否对任何容器的字体大小进行改变,所有容器中字体大小必须相等,以便允许某些文本内容恰当地与容器相适合。
更佳地,如果在添加约束前为上述同步所选择的文本容器具有不同的字体大小,则首先对字体大小取平均,然后应用于每个所选容器。一种备选的实现方式可以使用最初选择的容器的字体大小,并且将该字体大小应用于所有其它容器。另一种备选方案是将外部字体大小设置应用于每个容器。
参照图8,应用程序窗口301具有如前所述的工具栏区域303。工具栏区域303包含至少一个字体选择器803、一个字体大小选择器804和一个用于添加字体大小同步约束的按钮805。可以利用字体选择器803和字体大小选择器804,来改变文本容器中文本的属性。在选择了若干文本容器后,点击字体大小同步按钮805将会使所有所选容器的字体大小同步。
已经预先将多个文本容器806、807放置在文本模板309中。通过操作鼠标133,通过用指针313点击容器,通过在其周围拖动选择矩形,或者通过其它方法,可以对容器进行选择。可以使用可视方法表示当前选择了文本容器,诸如通过在容器上显示控制点来实现。
通过选择两个或多个文本容器806、807,以及通过激活同步按钮805,对约束进行添加。在其它实现方式中,可以通过下拉菜单、键盘命令或其它方法,应用字体大小同步约束。
可选地,借助于在各个文本容器806、807上或在其附近的图标808或其它图形表示,在用户界面中示出该约束。另外,可选地,可以在由约束链接的文本容器的各个图标之间绘制连接线809,以表示哪些文本容器彼此链接。
在其它实现方式中,可以提供视频显示屏144的一个独立区域,用于显示所选对象的各种属性,并且可以利用该区域表示所选的文本容器具有应用于它的字体大小同步约束,并且标识通过该约束链接了哪些其它容器。
可以通过选择由该约束链接的一个或多个文本容器,并且重复最初用于应用该约束的命令或序列,对字体大小约束进行删除。这可以通过下列方式实现激活同步按钮805;选择由该约束链接的一个或多个文本容器,并且应用专为此目的提供的附加命令或序列;或者点击表示图标808或连接线809,并且应用命令或序列,诸如启动键盘132上的或者在显示屏144上显示的菜单命令中的“删除(delete)”键。
如果用户将字体大小约束应用于已经包含具有不同字体大小的文本的两个或多个文本容器,则将最大字体大小、最小字体大小,或者平均字体大小应用于所有文本容器。可选地,可利用弹出对话框或者类似方式,提示用户对字体大小进行选择。
如果用户手动更改已经由字体大小约束链接的任一容器的字体大小,例如通过从字体大小选择器804中选择新的字体大小来实现,则将新的字体大小应用于由该约束链接的所有容器。
8.6内部边距的自动应用根据文本容器是否有可视边界和/或可视背景,可以自动设置文本容器的内部边距。
参照图9,应用程序窗口301具有如前所述的工具栏区域303。工具栏区域303包含至少一个边界选择器903和一个背景颜色选择器904。
文本容器905没有可视边界或背景颜色,并且在容器的边缘与容器内的文本之间也没有边距。
文本容器906具有可视边界,并且在容器的边缘与容器内的文本之间在四侧都有边距907。
在如图9所示的系统状态之前,通过用指针133点击容器906,通过在其周围拖动选择矩形,或者利用其它方法,对文本容器906进行选择,其中文本容器906处于与文本容器905类似的状态,没有可视边界或背景,并且没有边距。可以使用可视方法表示当前选择了文本容器,诸如通过在容器上显示控制点来实现。
然后,利用边界选择器903来应用可视边界,或者可选地,利用背景颜色选择器904来应用背景颜色。
当将可视边界或背景应用于文本容器时,如果没有设置内部边距,则将预定的内部边距907在四侧自动地应用于文本容器。只要在文本容器的背景颜色与模板的主要环绕背景颜色间存在可视差别,就可以自动添加内部边距。
可以为容器自动设置内部边距的另一种情况,是在容器的背景颜色与页面颜色不同时。在这种情况下,可以对内部边距进行添加,以便提供内容和页面背景间的视差,而不是允许内容移动到容器的边缘上。如果容器的背景颜色是完全透明的,则根据定义将其内容绘制在与页面相同的背景上,并且因此无需添加内部边距。
8.7容器之间的文本流可以将两个或多个文本容器顺页序地链接起来,以便如果文本容量超出前一个容器的尺寸,则允许文本从一个容器流动到下一个容器中。
当文本不适合所有此类链接容器的组合区域时,必须为每一个容器找到一个允许文本与之相适合的字体大小,同时设法保持不同容器的字体大小之间的关系。
对一组链接的容器而言,实现上述处理的理想方法是,使用折半搜索算法以调节字体大小,直到文本恰好适合为止,或者直到所有链接容器到达小于其各自的最小字体大小的字体大小为止(此时,向用户显示操作未完成的错误或其它指示)。注意到,如果一个容器在其它容器之前到达其最小字体大小,则不一定会使该算法终止。在此类情况中,该算法试图保持容器之间的字体大小关系,但并不保证这样做。
实现上述处理的一种备选方法是,使用与上述方法类似的方法,但是,如果任一链接的容器到达了小于其最小字体大小的字体大小,则用错误或其它指示进行终止。该备选方法保持了链接容器之间的相对字体大小,但是可能产生错误,并且与折半搜索算法相比,在大多数情况下不能产生解答。该备选方法将会用于实现文本流,其中也期望所有链接容器间的字体大小同步。
利用字体收缩来实现文本流的另一种方法是,简单地减小所链接集合中第一个容器的字体大小,直到文本与该组容器相适合、或者第一个容器到达其最小字体大小为止。如果是后一种情况,则通过缩小第二容器继续该处理,诸如此类,直至文本相适合或者所有容器都到达其最小字体大小为止。如果文本仍然不能完全与容器相适合,则用某种方式对其进行表示,可能会用错误通知来表示。在该方法中,容器的排序是重要的,并且将其定义为文本流动的顺序,因此,如果文本从容器A开始并且在容器B中继续,则A是第一容器,B是第二容器。
9.导向导向是跨越页面宽度或高度的垂直或水平线,以便辅助容器或其它导向的定位。有两类导向,固定和不固定的(或浮动的)。经由支柱(距离约束,在稍后说明)将导向连接到其它导向或容器。导向不出现在文档中,只出现在文档模板309中,作为设计的辅助工具。通过将指示设备从标尺区拖动到工作区中,可以对导向进行创建。
9.1固定导向将固定导向固定到页面上,或页面的某一部分上,诸如可印刷区域上。固定导向是固定的,是指它对于所有文档来说具有相同位置。可以相对于页面的特定边缘或者页面的可印刷部分,例如相对于左边缘,对此类导向进行固定。在本例中,如果调整页面的大小(例如在不同大小的纸张上印刷),则导向与左边缘的距离保持不变,但是与任何其它各边缘的距离未必如此。
9.2不固定导向在不同的文档中,或者当文档内的数据变化时,例如当文档模板与来自数据源的记录进行合并时,不固定的或浮动的导向可以具有不同的位置。在该例子中,当对数据与文档模板进行合并时,一个或多个容器可以保存来自数据源的数据,该数据可能使得通过支柱的作用对不固定导向的位置进行确定。在对该数据与文档模板进行合并前,不固定导向的位置可能是未知的,或者可以为编辑和设计的目的给出初始位置(可能是任意的)。在某些实现方式中,当对来自数据源的数据与文档模板进行合并时,浮动导向总是具有可由用户进行编辑或者由版面引擎105进行改变的位置。
9.3导向实现方式在具体实现方式中,固定和不固定导向都由实线表示,其中实线可以延伸到位于工作空间的边缘上的标尺、页面边界或页面的可印刷区域。利用颜色对固定和不固定导向进行区分。可选地,可利用实线表示固定导向,而利用虚线或点线表示不固定导向。
参照图12,通过用指针133从标尺308的水平部分进行拖动,在GUI301中已经预先创建了不固定导向1204。第一容器1201具有一条不固定边缘1202。已经从边缘1202到不固定导向1204创建了一个支柱1203。依靠直接与导向1204对齐的容器1205的顶边缘,直接将第二容器1205附加到导向1204。由支柱1207将第三容器1206连接到导向1204。同时,由支柱1209将第四容器1208连接到导向1204。
当不固定边缘1202由于容器1201的高度变化而移动时,导向1204将改变其垂直位置,以便保持支柱约束1203。容器1205、1206和1208随之移动,以便保持与导向1204相关的约束。类似地,如果由于数据与文档模板的合并而对容器尺寸进行确定或改变,则支柱的作用可能使得不固定导向根据哪些容器内的内容获取位置。
用于在容器和导向之间添加支柱约束的方法,与说明书其它部分描述的在容器之间添加支柱的方法类似。
用于添加约束从而将容器、例如图12的容器1205的一条边缘直接附加到导向上的首选方法是通过将容器或容器边缘拖动到距导向预定距离内的某个位置上,其中在该位置上容器或容器边缘可视地“咬住”到导向上;或者类似地,通过拖动导向到距容器边缘预定距离内的某个位置上,其中在该位置上导向咬住容器边缘。在咬住状态下,当从拖动操作中释放容器、边缘或导向时,将对约束进行创建。
10.支柱支柱是一类约束,用于维持容器的特定边缘与诸如导向和边距之类的其它对象之间的固定距离。
更佳地,将每个支柱准确地应用到属于同一文档模板内的两个不同容器的两条平行边缘,或者应用到容器的一条边缘和一个平行导向,或者应用到两个平行导向之间。其它实现方式可以限制与支柱连接的对象,或者允许支柱连接一个容器的边缘,作为规定其宽度或高度约束的方法,或者允许支柱把边缘或导向和平行页边距或边缘连接起来。
支柱是对称的,是指就位置而言,由支柱所附加的边缘都不优于另一边缘。
可以可视地或数字地或利用二者的组合,表示支柱的长度。在一些实现方式中,所有支柱通过图形表示(支柱图标)的长度可视地显示其当前长度,而其它属性作为对话框内的数字或可视设置是可见的。
回到图4,通过支柱约束将第一容器407的边缘410连接到第二容器408的边缘411。通过支柱图标412表示支柱约束,其中,可选地,可以在应用程序的各种模式下,例如在预览模式下,隐藏支柱图标。
在正常操作模式中,支柱图标通常是隐藏的,并且当与鼠标133相关联的指针313位于该支柱、或者容器、或者边缘、或者与该支柱相连的导向的附近时,显示支柱图标。其附近可以包括任何其它支柱、容器、边缘、或者直接或经由任何数目的支柱间接与该支柱相连的导向。
由于支柱只有一维长度,因此可从与该支柱相连的边缘的当前位置导出在这一维方向上的支柱位置。因此,在边缘410和411之间绘制支柱412。可采用各种方式计算垂直方向上的支柱位置。一种方法是对相连边缘的中点取平均,并且将支柱的中点定位在该平均值上。因此,支柱412的中点恰好在边缘410和411的中点之间的正中位置处。
容器的内容可能随文档变化,因此对于不同文档来说,容器的任何不固定边缘可能位于相对于页面的不同位置。支柱约束的作用是保持边缘或导向之间的距离,因此,由支柱所连接的边缘或导向可以具有在文档内的可能位置的有限范围。
参照图4,如果容器407的第一条边缘410移动时,例如如果用户使用指示设备313通过用户界面对某条边缘进行操作时,可能“推动”或“拉动”第二条连接边缘411,以便保持两条边缘之间的支柱约束(412)。在推动或拉动连接边缘或导向时,尽管用户可以察觉到支柱的操作,但是用户界面上的实际操作与生成文档所用的操作相同。
在另一种实现方式中,当激活支柱工具时,可以对以上叙述的显示支柱的方法进行修改,以便在激活支柱工具时显示所有支柱。可选地,只有当指针直接在支柱上时,才显示支柱,而在那时不显示其它支柱。
如图4所示,尽管通过支柱412连接的边缘410和411是相邻的并彼此相对,但是可以将支柱应用于独立容器的任意两条平行边缘,而不考虑两条边缘是否相邻,或者是否彼此相对,或者两者都不是。
图11表示容器之间的支柱,使用以上参照图6A-6C描述的容器的第三组示例性规则对其进行说明。第一容器1101具有一个最小区域框1103、一个最大区域框1105和一个内容框1104。将支柱1106连接到内容框1104的相应边缘。显示了第二容器1102,其最小和最大区域是相同的。因此,在该配置中容器1102具有固定尺寸。支柱1106作用于整个容器1102上,因此,可以在水平方向上推动或拉动该容器。
因此,可以在第一容器的内容框的任意一条边缘与最大区域框或者第二容器的内容框的一条平行边缘之间,或者与平行导向、边距或其它对象之间,创建支柱。
10.2在容器之间创建支柱参照图10,首先通过用鼠标133和指针313点击工具栏区域303中的支柱工具按钮406,激活支柱工具,由此创建一个新支柱。接着,执行两步操作之一,以便链接两个容器。首先,通过在第一容器1001内的任意一点1003按下并保持鼠标133,并且将指针313拖动到第二容器1002内的任意一个点,并在该点释放对鼠标133的按压,能够对路径1004进行拖动。这通过图10中的指针313的位置进行说明。可选地,如图10中的指针313的位置所示,通过首先在第一容器1001内的任意一点1003点击(即按下后释放)鼠标133,然后在第二容器1002内的任意一点点击鼠标,可以形成容器1001和1002之间的支柱。
在具体实现方式中,所述支柱创建过程以及对将要连接的两个容器进行选择的过程,基于路径1004的起点和终点到各个容器的各个边缘的最近距离,对容器的连接边缘进行选择。例如,起点1003到第一容器1001的右边缘1006的距离小于它到第一容器1001的左边缘1005的距离,因此将对右边缘1006进行连接。类似地,对第二容器1002的左边缘1007进行连接。
在一种替换的实现方式中,所选择的边缘是两个容器中最接近的一对平行相邻边缘,例如,如图10所示的容器1001和1002中的边缘1006和1007。
在另一种实现方式中,所选择的边缘是在指针从第一容器的内部移动到其外部时指针路径第一次穿过的边缘,以及在指针从第二容器的外部移动到其内部时指针路径第一次穿过的边缘。
为了帮助用户选择恰当的第二条边缘,在定义了支柱的第一点1003后,当指针进入邻近区域时,以图形方式对潜在的第二边缘进行表示,例如通过改变边缘的线型、或者通过在边缘的附近显示一个图标来实现。只对将潜在地创建有效支柱的边缘进行表示,包括除了第一点定义的容器之外的容器上的平行边缘。
另外,如果支柱是不对称的,例如,如果由于某些原因支柱必须以不同方式处理与其连接的每一条边缘,则上述支柱创建过程可用图形方式对此进行表示。例如,由于起点1003在第一容器1001内,终点在第二容器1002内,所以支柱操作以不同于边缘1007的方式对第一容器的边缘1006进行处理,并且支柱可以以图形方式对该情况进行表示。
10.3在导向之间创建支柱导向之间的支柱创建类似于上述在容器边缘之间的支柱创建。由于导向不像容器那样具有宽度和高度,因此可能的用户界面较少。另一种方法允许对支柱工具406进行选择,然后对第一导向进行选择,并且拖动指示设备,以便将这样创建的支柱附加到第二导向。
另一种实现方式允许对两个导向进行选择,然后选择支柱创建按钮(图标),由此创建导向之间的不定向支柱。可以通过将导向的选择顺序考虑作为一种区分主动边缘和从动边缘的方式的另一种实现方式,来创建定向支柱。
10.4在导向和容器之间创建支柱在一种实现方式中,将导向拖动到容器的一条边缘上,会创建一个距离约束,它通常规定导向和边缘之间为零距离。可以由支柱表示这个距离约束,因此,拖动导向的方法(或者在构造导向或容器期间,或者在编辑时)可能实际上创建了一个支柱。
最好是,可以以与在容器边缘之间创建支柱类似的方式(选择工具、点击边缘或导向、拖动、释放),在导向和容器边缘之间创建支柱。
10.5创建到达边距的支柱可能也期望在页边距和导向或容器边缘之间存在距离约束。支柱可用于上述目的。在一些实现方式中,这是不必要的,因为可以在相对于页面的一条边缘的位置对导向和容器边缘进行固定,其作用与支柱相同。页边距和导向或容器边缘之间的支柱也是不必要的,因为可以创建相对于所需页边距固定的导向,并且可能经由支柱将其它导向和容器边缘与其进行链接。因此,支柱不必将页边距链接到导向或容器边缘。
在另一种实现方式中,导向和容器边缘可能不具有相对于页边距固定的能力。在这种情况下,最好使用支柱表示到页边距的距离约束。
10.6支柱和容器之间的交互作用支柱以多种方式与容器进行交互作用。作为确定在文档中将内容放置在何处的方式,支柱的最简单操作是限制容器边缘和导向所处的位置。然而,支柱到容器的连接还可能对容器的状态进行修改,特别是对容器的边缘状态进行修改,以便将容器保持在允许的状态集合之内。
在具体实现方式中,保证将支柱附加到容器的规则为1.如果把支柱连接在两条固定边缘之间,则所选定边缘变为不固定的。
2.如果将支柱连接到两条固定边缘之间,则第二条选定边缘变成不固定的,并且如果在与支柱方向相对应的一维方向上容器的长度是固定的,则与支柱垂直的两条边缘都是不固定的,而所述一维方向上的容器长度保持不变。例如,如果第二条选定边缘是固定宽度容器的垂直边缘,则该容器的两条垂直边缘将变成不固定的,以便使该容器可水平移动,而其宽度保持不变。
3.如果附加到支柱的两条容器边缘和/或导向变成固定的,则删除该支柱。
4.如果用户对固定容器边缘或导向进行移动,则可以修改附加到它的任何支柱的长度设置,以便使与该支柱相连的其它边缘或导向保持不变。
11.可变数据用户界面103允许用户将数据源和可变文档模板相关联,并且设计该模板以便在数据源和模板进行合并时生成有效文档。合并是以交互方式在后台执行的,或者在软件应用程序121的版面引擎105组件要求时执行的。
更佳地,以交互方式将数据源和可变文档模板相关联,并且在用户以交互方式浏览所合并的文档时,版面引擎105根据请求合并并且布置文档页面。另一种实现方式可以对数据和模板进行合并,并且印刷所合并的文档,而在合并处理期间不需要交互的用户界面。另一种实现方式可以在后台合并数据和模板,以生成合并的文档,并且通过消息提醒用户合并处理期间出现的问题,其中该消息与用户对合并文档的浏览异步地出现。
11.1数据源选择为了对可变文档模板和数据源合并,必须将适当的数据源和模板相关联。实现上述关联的一种方法是,使用图13所示的数据源选择窗口,其中该窗口构成了用户界面103的一部分。
图13表示由UI应用程序103在显示屏114上显示的GUI窗口,该窗口允许用户以交互方式对数据源进行选择,其中数据源可以是数据库、文件、多个数据库的联合、或某些其它信息源。如图14所示,一旦选定了数据源,就将数据源和模板相关联起来,直到明确或隐含地解除关联为止。
11.2数据过滤有可能数据源内的所有数据对于特定合并操作而言不是都有效的。当出现此类情况时,对于用户来说可以有许多可能的方式来限制将要使用的数据的范围。一种实现方式是允许算法数据过滤,以便限制将要使用数据的种类和数量。例如,可以选择邮政编码的范围,以便只使用与所需地理区域相关联的记录来生成文档。这类算法过滤在本领域中是非常公知的。另一种实现方式可以是,当数据源和模板相关联之后,用户经由用户界面选择并标记将要使用的数据。
图17表示在通过选择菜单项将数据源和可变文档模板相关联之后,用户能够经由用户界面103的GUI301访问数据过滤操作的首选方法。
11.3数据排序与过滤有关的是对数据集进行排序以便找到相关数据的能力。一种实现方式允许用户基于用户选择的数据源的“关键字”变量,对数据源记录的排序方法进行选择。按照所选关键字变量的字母表升序对所有记录进行排序。例如,如果关键字是变量“名称(Name)”,则在执行排序操作后,将会遇到名称以字母A开始的记录,然后遇到名称以字母B开始的记录(在英语文本的情况下)。图15表示一个适合的用户界面的一部分,该图表示排序可作为数据源选择处理的一部分。通过如图17所示的菜单选择,也有可能在关联数据源之后进行排序。
另一种实现方式可以允许用户为不同种类的数据选择排序方法,诸如数字的或语言特定的方法。另一种实现方式可以基于所存储的信息的种类和所选的关键字变量,自动对排序方法进行选择,在自动选择的方法是一个较差的选择时,可能需要借助忽略(override)机制。
11.4记录浏览一个数据源包含许多记录,每条记录是相关信息的集合。例如,数据库可能包含描述客户的记录,或者可能包含产品记录。如果能够将数据库内的记录排序成为一个序列,并且由用户进行浏览,则这是有益的。
首选的浏览方法是,显示可由指示设备313和鼠标133激活的一组GUI按钮,如图18中的符号1805所示。每个按钮要么在记录序列中前进或后退一条记录,要么到达序列的开始或结尾处,要么跳过某几条记录。一种方法还包括一个由指示设备313/鼠标133或者键盘132所激活的菜单,其中菜单显示这些选项(如图17所示),并且除此以外还允许用户对特定编号的记录进行浏览。
当浏览到特定记录时,软件应用程序121在显示屏144上以某种方式显示当前记录。通过对该记录与可变文档模板进行合并,并且对该序列内的当前记录的索引进行显示,可能产生上述处理。
11.5变量各数据源可由许多命名变量组成,其中命名变量适用于数据源内的记录。例如,客户数据源可能具有用于客户名称和客户地址的变量。它们是变量,原因在于尽管对每条记录来说变量名称可能是相同的,但是每条记录的值可以不同。
具有显示变量的方法,以便使用户可以对数据源内的记录进行检查,并且对与可变文档模板相关联的变量进行选择,是有用的。
用于显示变量的首选方法是,如图18所示,在浮动窗口内,按名称和当前值垂直地列出每个变量。通过检查当前记录,以及在数据源内查找该记录的各个变量的值,来对当前值进行确定。可以如前所述那样利用记录浏览对当前记录进行选择。注意到,不是所有的值或变量名称都需要显示。如果信息太多以致于不适应窗口时,可以有浏览机制以便允许用户对各变量或值进行查看。另一种实现方式可以使用类似显示,它是另一个窗口的一部分(换句话说,子窗口)。如果没有与文档模板相关联的数据源,则窗口将不会包含变量,如图16所示。
变量可以包含若干种类的数据。变量可以存储文本值,或者可以存储图像。在下文中,这些变量分别称为文本变量和图像变量。
更佳地,数据源的变量具有一种类型的值,因此变量可显示文本或图像,但不能同时对其二者进行显示。不同的实现方式允许数据源的变量对每个记录存储不同类型的数据。例如,在一条记录中产品描述变量可能包含文本描述,而在同一数据源的另一条记录中同一变量具有图像值。
11.6文本变量文本变量包括数据源内的每条记录的文本值。应用程序121通过在数据源的变量列表内在变量名称附近放置不同的标签,如图18中的标签1801所示,来向用户通知变量是文本变量。另一种实现方式可能在变量名称的附近对变量的值进行显示,以此作为通知变量类型的方式,如文本1802所示,尽管此方法本身不能保证是明确的,因为在一些情况中图像数据可能看起来与文本数据相同。应用程序121只使用该技术作为显示变量数据的辅助方法,而不是作为区分变量类型的主要方法。
11.7图像变量图像变量包含在数据源的每条记录中的图像值。该值可以是压缩格式或非压缩格式的图像数据、或者文件名称、或者其它用于定位图像资源的存取方法。应用程序121通过在数据源的变量列表内在变量名称附近放置不同标签,如图18中的标签1803所示,来向用户通知该变量是图像变量。另一种方法是在变量名称的附近显示变量的值,如文本1804所示,尽管该方法不能保证是明确的,因为图像文件名称(例如)可能与文本数据相混淆。
11.8拖放到容器当数据源的变量可见时,具有用于允许用户构建可变文档模板的方法,以便使用户能够了解存在哪些变量,是有用的。允许根据给定变量创建适当类型的容器,也是有用的。
通过允许用户使用鼠标133和指示设备313直接操作变量列表中的变量(如图19所示),应用程序121经由用户界面103允许创建适当类型的容器。用户使用指示设备313选择一个变量(例如用1902标记的矩形区域中的一个),并且将其拖动到设计表面上,然后释放该选择1906。这作为将创建适当类型的容器并用该变量进行初始化的信号。例如,按上述方式拖动到设计表面上的文本变量(如标签1901所示),将生成一个文本容器,该文本容器显示当前记录的变量值(如文本1903所示)。如果将图像变量1904拖动到设计表面上,生成一个图像容器,该图像容器显示文件名称1905和/或图像本身,并根据用户使用的设置进行缩放、剪切和对齐处理。
这样生成的文本容器的初始状态是用户可配置的,但是另一种方法是利用用户释放选择时的位置作为线索,将该容器锚定到页面上。
也许不可能使用该位置作为容器的精确位置,因为该位置可能是无效的,诸如在设计窗口外或在页面外(如果是无效的话),因此该位置可以是线索。容器可以以该位置为中心;或者其一角接近于该位置;或者在不违反其它约束的情况下,将该容器放置得尽可能靠近该位置,例如完全在页面内;或者只将容器放置到一个默认位置或随机位置上,并且忽略该位置。有多种可能的实现方式对由于拖动指示设备而新建的对象进行定位。
应用程序121还创建一个足够大的容器,以便对拖动到该设计上的变量的所有当前记录内容进行存储。因此大段文本将生成一个大的文本容器。另一种方法可以预先计算被拖动变量中的数据的中值大小,并且生成足以显示中值大小的容器。其它方法能够使用该方法的派生方法,以创建大到足以存储最大记录数据或最小记录数据的容器,或使用某些其它算法。
另一种方法是将变量拖动到设计空间中,然后为保存该变量值的容器清除一个矩形。再一种方法是选择变量,然后为该容器清除一个矩形,而无需首先执行拖动操作。另一种备选方案是利用指示设备对变量表示进行双击,并且使相应容器在该设计中出现在随机位置或由算法选择的位置上。
另一种实现方式是一旦数据源和设计相关联后,就使数据源内的所有变量均在设计中出现作为容器,并且使用户根据需要对容器进行定位或删除。按此方式创建的容器的初始位置和尺寸,取决于数据源内的数据的排序以及各变量中内容的相对尺寸。在此类实现方式中,如果表示特定变量的容器已经存在,则把数据源和现有设计相关联,将不会为该变量创建容器。该方法不是首选方法,因为它不便于对引用同一变量的多个容器进行创建。
具体实现方式还支持数据源变量与已经创建的容器的链接。该方法允许用户对设计进行创建而不必首先关联数据源。此类实现方式还可以提供任意顺序的数据源的关联、容器的创建、以及变量与容器的链接,以支持灵活的工作流。
此类方法还允许利用拖放机制对现有容器的内容进行修改,其中可利用鼠标133和指针313的组合实现拖放机制,以便使拖动变量到容器内可以重新指定容器显示的内容,或者增加容器保存的内容。例如,已构建包含静态文本“Dear”的容器,然后将名称为“First Name”的变量拖动到该容器中,接着将名称为“Last Name”的变量拖动到该容器中。取决于操作模式和容器的设置,这可以产生一个对所有数据进行显示的容器,或者可以产生一个只对最后变量的值进行显示的容器。
11.9显示和浏览多个文档由于文档是对文档模板和数据源中的数据进行合并的产物,因此作为单个合并操作的结果,能够生成许多文档。可使用多种方法对此类文档进行浏览和显示。
一种实现方式包含许多显示和浏览文档的方式,并依赖于“现场校对”(在下文进行描述),其中在现场校对中,在需要时将数据源的每条记录与文档模板进行合并,以便生成文档模板的约束和给定合并文档的数据的视图。对此类实现方式,取决于用户设置和/或生成的文档的性质,存在几种可能的用户界面。此类用户界面的概要如下·在与字处理文档或电子表格类似的垂直和/或水平组织的流动文档中,对每篇文档进行显示,并且通过滚动机制、指示设备和/或键盘对其进行浏览。可使用诸如图18中的按钮1805之类的独立机制,对数据源中的记录进行浏览。
·合并时每条记录能够产生有许多页面的文档。按垂直方式和/或水平方式对这些页进行组织并显示。可以使用独立机制浏览数据源中的记录。
·如果与每条记录合并时文档模板生成很少的页面,则可以按垂直方式和/或水平方式对几篇文档进行显示。例如,如果每篇文档在长度上只有一个页面,则有可能将所有文档按线性顺序排列,使用分窗系统显示它们,并使用滚动机制来浏览文档。这将文档内的浏览和数据源的记录之间的浏览映射到空间浏览上。
·如果每篇文档具有一个或多个页面,则可以按水平方式对其进行组织,然后通过把每个后续文档放置到表示前一条记录的文档的下面,能够使用垂直方向遍历数据源的记录,因此使用一个方向对文档空间进行浏览。可以互换水平方向和垂直方向,其作用相似。
在上述每种情况下,可以有其它方法在记录之间以及页面和/或文档之间进行浏览,如通过按钮、菜单等来实现。
在替换的实现方式中,可以独立于合并文档对文档模板进行显示。只在“印刷预览”形式下才生成合并文档,其中在印刷预览中,只能对单条记录与模板的合并结果进行显示而不能进行编辑。在另一种备选方案中,文档模板可以是可见的,并且非交互的印刷预览以及现场校对预览也是可见的,其中现场校对预览允许对文档模板以及合并文档的预览进行编辑。上述工作方式的其它组合也是可能的。
11.10校对在使用可变数据的屏上作业和印刷作业中,通过有效地对表示正在合并的记录的全部范围的记录进行查找,特别是从一组可变数据记录中进行查找的极端情况,能够显著提高生产率,以便使用户理解最终的合并文档将如何出现。
预览和试印许多记录,以查看不同大小的可变图像和不同长度的文本如何对合并文档进行影响,是有用的。用于印刷的最有用的样本记录包括·将如何印刷大部分的记录;以及·有很少或很多正在显示的内容的记录。
该原则的更复杂的扩展包括·当文本已经缩小到很小或到达其最小尺寸时;·当不对任何可变数据文本进行显示时;·当图像放大太大时(印刷质量可能变差);以及·当图像的纵横比失真太多时。
当处理可变数据时,文档中记录或版本的数目可能很大,并且没有自动校对机制,用户必须对每条记录进行手工审查,以便检查所有合并文档的最终外观是否是可接受的。例如,可能数据库中只有一条记录包含将会生成让人不愉快的外观的内容,并且很难对该记录进行查找。对于记录数目很大的可变数据作业来说更是如此。
公开了一种预览和试印可变数据印刷作业的有效方法,该方法确保了每篇文档的最终外观都是可接受的,并且将正确地进行印刷。选择有限数目的记录用于进行屏上预览和/或试印,所述记录表示最终印刷的所有其它记录。通过对每条记录的合并外观进行分析,并且通过使用预定规则集合确定对文档外观有最重要影响的记录,来对这些记录进行选择。
选择性预览和校对提供了包含极端情况在内的输出结果的轮廓,从而在印刷整个作业时用户不会感到惊讶。显示极端情况,即显示具有最短和最长显示尺寸的那些记录,是一种有价值并且经济的方法,可以推广该方法以包括“典型”情况、最极端情况以及在中间和最极端情况之间的许多记录的短列表,其中典型情况包括中间显示尺寸。
11.11现场校对现场校对是在需要时以交互方式与可变文档模板合并的可变数据对进行显示的过程。图20表示图形用户界面2000,在该界面上将具有项目2010-2020的数据源的记录与模板对进行合并,以便说明(2002)如果印刷的话该记录的部分看上去会是什么样。对额外边界2004和颜色2006进行添加,以便使可变文档模板内定义的约束是可见的,但并不印刷此类人为产物。
现场校对比单独的合并过程更加有利,因为通过交互浏览很可能及早地发现模板设计中的错误。
应用程序121的具体实现方式应用了现场校对。替换的实现方式应用现场校对作为一个可选项,或者根本不使用现场校对。
11.12选择性校对选择性校对是在可变数据印刷应用程序121中仅查看选定记录的一种方法,选定记录要么是典型的普通文档,要么最不像普通文档。
在选择性校对期间,如果用户能够规定要测量的多种类型的项目,则将是有用的。以下度量可以应用于单独的容器、链接容器的支柱、页面、数据源中的记录、或数据源中的变量。在以下选择性校对的描述中这些一并称为“设计项”。术语“合并尺寸”是指将来自数据源的记录与可变文档模板进行合并后设计项的尺寸度量。稍后将论述各种尺寸度量。
当激活选择性预览或选择性校对时,用户以交互方式或者根据首选项设置选择设计项。对每一条记录和可变文档模板进行独立合并。对于每一条记录,对选定设计项的合并尺寸进行记录(存储)。将这些合并尺寸进行比较,以找到选定设计项的合并尺寸是以下尺寸的记录·最小值;·中值、平均值或集合中项的一些其它度量;以及·最大值。
为了找到最相关的记录,应用程序121检查每条记录的实际显示尺寸,而不是仅仅检查字符数。例如,“w”比“i”占据更多空间,并且其对于容器尺寸和文档的整体外观有更大的影响。
一旦识别了这些记录后,就把它们提供给用户用于进行屏上预览和/或印刷。
用户还可以预览或者试印合并文档中的附加记录,以提高他们对可变数据印刷作业中的所有记录都将正确显示的信心。最好是,使用与集合中项之间的偏差对设计项进行排序,以便首先或以最显著的方式向用户提供其选定设计项的合并尺寸最不相同的记录。
11.12.1最小和最大内容尺寸设计项尺寸的有用度量是对其最小或者最大宽度、高度或内容面积进行考虑。关于独立容器来说,上述度量容易计算。对于链接容器的支柱而言,宽度或者高度是有意义的,但二者不是同时有意义的,因此面积不是有意义的度量。对于独立页面而言,可使用容器的宽度之和、或容器的高度之和、或容器的面积之和作为度量。对于记录而言,可使用为显示该记录所需的所有页面的这些度量之和作为度量。对于变量而言,可使用部分或全部显示该变量值的所有容器作为度量。还可以使用其它方法来选择度量并计算度量之和。
11.12.2典型尺寸内容尺寸的另一种有用度量是对其给定设计项的典型尺寸进行考虑。典型尺寸可以是平均宽度或高度、或者平均面积、或者面积之和的平均值、或者宽度和高度的平方和的平均值、或者其它可能性。另一种度量是使用中值代替以上各项的平均值。可以使用其它统计方法。
可以使用这些度量中的任何一个或全部来定位特定设计项的典型实例。例如,可以定位其特定容器面积与平均面积最接近的记录。
11.12.3空白(white-space)尺寸空白是确定合并文档集合内的设计项的典型性的另一种有用度量。可以用多种方式定义空白。例如,可以将空白定义为由容器约束定义的容器面积与在和特定记录合并时该容器内的内容面积之间的面积差,例如,当容器具有最小尺寸并且内容与该尺寸不相适应时,可以这样进行定义。可选地,可以将空白定义为容器的尺寸与该容器中内容的尺寸在一维方向、诸如宽度或高度方向上的差。
空白的最大化类似但又不同于内容尺寸的最小化,反之亦然。由于诸如最小尺寸之类的容器约束在计算中起作用,所以它们并不相同。例如,查找具有最大内容面积的记录与查找具有最小空白面积的记录未必相同。
11.12.4最不同的尺寸最影响可变数据印刷的是对与众不同的文档进行定位。因此需要异常性(unusualness)度量。可以用多种方式定义此度量。此度量的一个例子是计算与设计项的中值尺寸的最大偏差。将尺寸定义为宽度、高度、面积、宽度和高度之和、宽度和高度的平方和等中的某个度量。中值尺寸可以通过下列方式进行计算对于数据源中的每一条记录,检查正在讨论的各设计项,查找该设计项的尺寸,然后查找这样确定的所有尺寸的中值。接着计算各设计项的尺寸与中值尺寸的最大差值,从而能够找到具有最大偏差的设计项。
图21A和21B表示用于利用各文档的容器的宽度和高度计算普通文档和最大差异文档的方法2100。方法2100可以执行作为应用程序121的子模块。
该过程在步骤2101开始。首先,方法2100对数据源中的所有记录进行迭代,在步骤2102中从第一条记录开始,并且使用由步骤2103、2104和2105构成的循环过程,对该文档内的每个容器的位置和尺寸进行计算。
在步骤2106中,方法2100通过在所有文档上将宽度和高度进行相加,然后除以文档数,来计算文档模板中各容器的平均宽度和高度。
一旦已知文档模板内各容器的宽度和高度的平均值后,方法2100在步骤2107中从第一条记录开始,并经由由步骤2108、2113和2116构成的循环,对所有记录进行迭代处理。对于由步骤2108、2111和2115组成的另一个循环定义的文档内的每个容器,方法2100在步骤2109中对该容器的宽度与平均宽度的差值进行计算,在步骤2110中该容器的高度与平均高度的差值对进行计算。步骤2110计算上述每个值的平方,然后将它们加在一起,以便提供该文档的数值。将结果求平方,意味着值距离平均值越远其权重越大。
对于任意给定文档上的任意给定容器来说,一旦计算出上述数值后,就有可能计算出该容器与平均尺寸的接近程度。如果该容器具有最小值,则其最接近平均值。另一方面,如果该容器具有最大值,则其距离平均值最远。
如果用户希望知道哪个文档是最普通的文档,或者哪个文档是最大差异的文档,则在步骤2112中将每篇文档上的每个容器的值加在一起。由此形成一个列表,然后在步骤2114中对其进行排序,从而结束方法2100。
具有最小值的文档最接近各容器上的普通文档。具有最大值的文档最不像普通文档。然后根据需要可以向用户显示许多此类文档,诸如5个最差文档、或者10个最差文档。
其它方法能够在不同于容器的宽度和高度的属性上能够执行上述计算。其它有用的属性是内容的尺寸、字体大小(用于字体变大和缩小的容器)、文档上的空白面积、支柱的长度或者容器边缘的位置。
11.13印前检查(Pre-Flight Check)上述类型的尺寸度量可以用于发现典型的、非典型的或有问题的设计项。“印前检查”是在可变数据印刷领域内使用的一个术语,用来描述自动预印刷过程,该过程试图在将整个作业提交给硬拷贝印刷之前发现合并文档的问题或其它特征。
上述检查可以是简单地对将会可接受地印刷所有记录进行确定而不作其它额外工作,报告不存在问题,或者以某种方式引起对有问题记录的注意。
更佳地,根据用户的请求执行印前检查,并且提醒用户该检查是否发现问题。如果发现问题,则向用户显示遇到的第一个问题,同时通过可视或文本方法向用户显示对该问题特性的解释。
另一个实现方式能够发现并列出全部问题,然后由用户进行调查。当用户编辑可变文档模板时,在后台进行上述检查,以便在窗口或子窗口中提供问题的连续更新列表。如果列表为空,则用表示没有发现问题的条目将其替代。这个后台检查可以仅仅在该软件空闲时出现,可以连续出现,或者在其它时间点或情形时出现。
12.版面方法概述本公开的一个方面是在页面上布置项目的方法。版面包括要布置的项目的集合,以及定义该项目在版面上的布置位置的一组规则或约束。描述了几种版面方法,包括1.用于定义版面的模型。版面模型定义了能够出现在版面中的项目的类型和属性,以及用来定义应当如何布置项目的允许规则或约束。利用数据结构在计算机101的工作存储器中存储版面。以下将详细说明几种版面模型。
2.创建和编辑版面的方法。它包括能够用于创建版面的一组操作。可以用软件功能的方式实现此类操作,可以对软件功能进行调用以便根据版面模型构建数据结构。以下将详细说明此类操作。
3.计算版面中项目的位置和尺寸的方法。给定一个由一组项目和规则定义的版面,这种版面计算方法对根据规则如何布置项目进行了规定,并且它可以由在计算机101上执行的软件105形成。以下将详细说明计算版面的方法。
最好是,将根据特定版面模型创建和编辑版面的方法、以及为该版面模型计算项目位置的方法合起来实现为一个软件组件,即先前提及的版面引擎105。注意到,版面引擎105不包括用户界面103。可以将许多不同的用户界面同先前参照图1A所描述的版面引擎105一起使用。
13.版面模型概述版面模型包括基础版面模型和基础模型的几种扩展。基础版面模型定义了版面项目的基本属性,以及用来定义版面的规则。还定义了几条附加规则,用于扩展基础版面模型。规则的某些组合是益处的,因为它们产生了简单的版面模型。其它组合是有益处的,因为它们易于使版面模型的用户理解。
以下说明基础版面模型和附加规则。将会说明包含特定规则组合的几种实现方式。
14.版面创建和编辑概述版面通常与文档中的一个页面部分相关联。假定创建和编辑操作对最初被创建为空版面的版面起作用,并且创建和编辑操作是由用户界面软件103所调用的功能。在组合数据和文档模板以生成文档时,也可以由服务器软件执行此类操作,而无需用户的直接输入。
更佳地,用于创建或编辑版面的操作不直接对应于软件用户执行的操作。通常由用户界面软件103或更佳地由另一层软件,将用户的单个操作翻译成多个版面创建操作,其中另一层软件向版面引擎105提供比版面引擎105直接支持的操作更高层的接口。
创建和编辑版面的方法至少包括以下操作1.添加项目;2.删除项目;3.添加规则;以及4.删除规则。
可以增加其它操作以便对项目或规则进行修改。编辑操作的准确形式取决于所使用的具体版面模型。许多不同形式都是可能的。以下详细说明此类操作。
在向版面中添加项目和规则时,容易添加矛盾的规则组合,矛盾的含义是指无论怎样放置项目均不能满足所有规则。此类版面称为过约束的。相反,规则的给定组合可能容许多种可能的解决方案,也是有可能。例如,该项目的多种可能放置方式均满足所有规则。此类版面称为欠约束的。最好确保每个版面只有一种解决方案。因此,除用于创建版面的操作之外,应用程序121还包括用来确保只有一种解决方案的方法。该方法被合并到版面创建方法和用于计算版面的方法之中。
由于需要防止用户对没有解决方案或有多种解决方案的版面进行创建,所以可以协同编辑操作一起执行一致性和唯一性检查。可以在每个编辑操作后执行此类检查,以便测试该操作是否有效。如果无效,则不允许改变,并且立即向用户提供适合的反馈。
因此,一致性和/或唯一性检查可以被包括作为编辑操作的一部分。可选的,版面计算能够确保为使用版面创建和编辑操作所创建的每个可能版面计算出一个定义明确的解决方案。
以下将详细说明确保版面解决方案存在并且唯一的方法。
15.版面计算概述对于每个版面模型,都有对版面项目的位置和尺寸进行计算的相应方法。可以在对于该问题而言方便的任意二维坐标系中对位置和尺寸进行定义。
可以使用多种方法对版面项目的位置和尺寸进行计算,它们包括1.树遍历方法;2.单形法;3.带有二次目标函数的改进型单形法;以及4.基于图的版面。
树遍历方法适用于由基础版面模型所组成的有限版面模型。其它方法用于基础模型的各种扩展。对于解决各种优化问题来说,方法2、3和4是等效的。
优化问题包括一组约束和一个必须被最小化或最大化的目标函数。在应用程序121中,对版面进行定义的某些规则表示约束,而一些规则用于对目标函数进行定义。
单形法是用于求解特定类型的优化问题的公知方法。单形法适合于与作为本公开一部分的一些版面模型一起使用。
单形法只支持线性目标函数,因此需要有一个严格的凸函数,以确保版面有唯一的解决方案。通常使用二次目标函数,因为存在用于求解具有线性约束和二次目标函数的优化问题的公知技术。最简单的方法是对单形法进行修改。此类方法在求解优化问题领域中是非常公知的,并且可以使用任意方法,而并不背离本公开的范围。
16.版面模型的详细描述16.1基础版面模型应用程序121的一个方面包括一种布置版面项目集合的方法。通常,根据一组规则或约束将项目布置在矩形空间内。图22表示一组项目和约束的例子。
为了定义此类版面,描述了一个基础版面模型。基础版面模型用于定义版面的基本结构、以及对版面可变性的限制。例如,使用基础版面模型,来定义版面项目之间的基本关系,设置项目的最小和最大尺寸,以及对项目的位置设置限制。使用基础版面模型的扩展,来提供对版面的精确控制。基础版面模型的优点是1.版面设计者易于理解诸如刚性对象和可移动对象之类的物理模拟;2.易于通过图形用户界面进行表示和操作;3.软件表示简单,可以通过明确定义的操作集合来进行操作。
如图22所示,在基础版面模型中,版面包括一个或多个被称为盒子的矩形版面项2201;由水平边缘2215和垂直边缘2216定义的、用于放置盒子的版面矩形;以及零条或多条规则2207、2211。
通常,将要在其中布置项目的矩形空间,表示文档中一个页面或一个页面一部分的可印刷区域,其中每个项目表示一个图形图像或一个文本块,尽管在基础版面模型的某些应用中该版面矩形可能并不存在。
版面中每个盒子的大小和位置,由它的外接矩形的四条边缘的位置来定义。可以用版面单位规定大小和位置,其中版面单位通常与诸如毫米之类的绝对度量单位有关。规则2207、2209、2211和2213对项目或版面矩形的各条边缘之间的关系进行定义。规则可以定义同一个项目的相对边缘之间的关系,诸如规则2211、2213;可以定义某个项目的边缘与另一个项目的边缘之间的关系,诸如规则2209;可以定义某个项目的边缘与版面矩形的一条边缘之间的关系,诸如规则2207;或者,可以定义版面矩形的相对边缘之间的关系,诸如规则2217。在这个说明书中,边缘是指项目或对象的左边缘、右边缘、顶边缘或底边缘。
在基础版面模型中,将每个盒子的边缘与称为“对齐标记”或仅称为“标记”的抽象版面项相关联。还把版面区域的边缘与标记相关联。因此,基础版面模型支持两种类型的版面项盒子和标记。
术语“对齐标记”是对印刷机所使用的对准标记的抽象和概括,以使将要印刷的多幅图像彼此顶端对齐。有两种类型的对齐标记水平标记和垂直标记。水平标记表示页面或版面上的垂直位置,并且可以看作是具有不确定长度或无限长的水平线。垂直标记表示页面上的水平位置,并且在概念上是具有不确定长度或无限长的垂直线。
通常并不希望对对齐标记进行印刷——它们仅仅用于对盒子之间的定位和关系进行定义。用户界面可采用多种方式显示对齐标记(或者根本不显示)。
将版面与二维坐标系相关联。版面引擎105的任务是,确定所选坐标系中每个标记的位置或坐标。垂直标记具有水平坐标,而水平标记具有垂直坐标。更佳地,通过向一个指定的垂直标记和一个指定的水平标记分配坐标,对坐标系进行规定。通过相对于所指定标记的偏移值,确定所有其它标记的坐标。如果版面是具有固定尺寸的,则用于规定坐标系的标记通常是版面矩形的两条边缘。
盒子是通常与某些文本或图形相关联的矩形区域。在计算版面时,可利用盒子对容器进行表示。每个盒子与四个标记相关联,其中四个标记对盒子的边缘进行定义。盒子实质上是四个标记之间的关系。在基础版面模型的扩展中,可以将附加标记与盒子相关联。在基础版面模型中,完全用与盒子的边缘相关联的标记来,对用于确定盒子的位置和尺寸的版面规则进行描述,但是在模型扩展中,将附加规则与盒子相关联。
盒子和标记还用于对与文档中出现的对象的形状和位置不直接相对应的形状和位置进行表示。例如,也用盒子表示项目的理想尺寸,该尺寸可能与版面引擎105所计算的尺寸不同。可以使用标记来定义有关其它项目放置的限制,例如,可以将标记放置在表示页边距的位置上,并且可以添加规则以确保版面引擎105不会把项目放置到页边距之外。
在基础模型中,每条规则表示垂直偏移2209或者水平偏移2213,并且每条规则具有规定的大小2207,或者具有未知的非负大小2213(如虚线所示)。固定偏移规则对版面中的两个标记之间的垂直或水平偏移的大小和方向进行了规定。未知偏移约束只规定两个标记之间偏移的方向。例如,偏移2211指示盒子2219的边缘2221必须总在同一盒子的边缘2223之上。未知偏移约束的大小,表示需要由版面方法计算的值。
因此,在基础模型中,有两种类型的规则固定偏移规则和非负偏移规则。每种类型的偏移规则定义了与一对标记的相对位置相关的约束。
固定偏移规则指示第一标记位置和第二标记位置之间的偏移必须具有规定的值。例如,给定标记m和n,固定偏移规则是由fixed(m,n,d)所表示的约束,其由以下等式定义pos(n)-pos(m)=d,其中d为非负数。将支柱412表示为版面引擎内的固定偏移规则。而且,如果容器具有固定宽度,则通过添加与表示该容器的左边缘和右边缘的标记相关的固定偏移约束,将其指示给版面引擎。类似地,如果容器具有固定高度,则通过在表示该容器的顶边缘和底边缘的标记之间的固定偏移约束,在版面引擎中进行表示。
距离d表示从一个标记到另一个标记的偏移,并且pos(u)表示标记u的位置。水平标记的位置是从版面坐标系的原点到该标记的垂直距离。垂直标记的位置是从版面坐标系的原点到该标记的水平距离。可以使用任何便于定义版面的坐标系。在固定偏移规则中,两个标记必须是相同方向的。在这一点上,标记必须同为水平标记或者同为垂直标记。
注意到,上下文中的术语“固定的”,是指作为版面计算方法的输入的值,并且版面引擎105不能对其进行改变。
非负偏移规则是这样一个约束,该约束规定了两个标记之间的偏移是非负的。标记m和标记n之间的非负规则,是由non-negative(m,n)所表示的约束,并且其由以下不等式定义pos(n)≥pos(m)。在非负偏移规则中,两个标记必须是相同方向的。例如,标记必须同为水平标记或者同为垂直标记。
在基础版面模型中,水平规则独立于垂直约束,因此可以将计算版面的问题分成两个独立问题。图23仅仅表示与图22所示的版面相对应的垂直偏移。在该实现方式中,用逻辑单位对距离进行规定。在图23中,固定偏移规则已经标记了以逻辑单位表示的偏移大小。在这种情况下,为了简单起见假定每个逻辑单位相当于1mm。逻辑单位可以是任何对于该应用来说方便的尺寸,但是通常一个逻辑单位会小于最小可独立寻址的印刷点。可采用如图24所示的有向图2400表示如图23所示的垂直偏移规则。在图24中,每个顶点2401表示一个水平标记,并且每个箭头2403表示一条规则。用实线表示固定偏移规则(例如2402),并且用虚线表示非负偏移规则(例如2405)。在图24中,例如,在根节点2404和终端节点2406之间的箭头2402,表示图23中的固定偏移规则2217,并且该规则定义了图22中的版面矩形的高度。另外,非负偏移规则在由固定偏移规则所建立的边界之内是可变的。例如,增加h1的值,将使得h2和h3的值相应减小,其二者均依赖于h1的终端节点2408。
通常,版面区域是具有固定大小的。通过将与具有固定偏移规则的版面区域的相对边缘相关联的标记进行连接,对其进行规定。在某些应用程序中,还使版面引擎105根据版面区域的边缘和版面内的项目之间的关系,计算版面矩形的大小。通常,向该版面中添加规则,以便确保表示可印刷项目的盒子被限制在版面区域内,但是在某些实现方式中,这可能并不适用,并且可能不需要版面区域矩形。在基础版面模型的某些应用中,可能缺少版面矩形。
16.2基础版面模型的替换表示在另一种实现方式中,以与上述方法不同但等效的方式,对基础版面模型进行表示。这里,仅仅使用一种类型的规则、即最小偏移规则对基础版面模型进行表示。
最小偏移规则规定了在第一标记和第二标记之间的最小允许偏移。在标记m和标记n之间的最小偏移规则,是由min(m,n,d)所表示的约束,并且其由以下不等式定义pos(n)-pos(m)≥d,其中d是一个表示最小允许偏移的数。在该表示中,数d可以是正数、负数或零,并且与最小偏移规则相关的两个标记必须具有相同方向(即,同为水平标记或者同为垂直标记)。
在另一种等效实现方式中,可以使用最大偏移规则代替最小偏移规则。由max(m,n,d)所表示的最大偏移规则,由以下不等式定义pos(n)-pos(m)≤d,其中d是一个表示最大允许偏移的数。
为了证明只需要以上两类规则中的一类规则,注意到,由于以下恒等式存在,所以任意最大偏移规则可以由等效的最小偏移规则所代替max(m,n,d)≡min(n,m,-d)。
为了证明基础版面模型的替换表示与先前描述的表示等效,注意到,如以下恒等式所示的那样,非负偏移规则是最小偏移规则的特例nonnegative(m,n)≡min(m,n,0),并且,正如以下恒等式所示,任意固定偏移规则等效于两个最小偏移规则fixed(m,n,d)≡min(m,n,d)和max(m,n,d)≡min(m,n,d)和min(n,m,-d)。
相反,任意最小偏移规则可以使用额外标记t、固定偏移规则以及非负偏移来进行表示,如以下恒等式所示min(m,n,d)≡fixed(m,t,d)和nonnegative(t,n),如果d>0≡fixed(t,m,-d)和nonnegative(n,t),如果d<0,其中t为一个额外标记,用于标记相对于m的n的允许位置的限制。在d=0的特殊情况下,可以用m替代t,并且固定偏移规则是冗余的。
因此,存在许多允许对最小和最大偏移、固定偏移和非负偏移进行规定的等效表示。最小偏移规则可以用于表示所有这些类型的规则,因为该规则简化了用于表示版面的数据结构、以及用于处理该数据结构的软件。
更佳地,使用有向图表示符合基础版面模型的版面,其中图的每个顶点对应于一个标记,并且通过一个数字标记图的每条边缘,其中数字表示从由该边缘的源顶点表示的标记到由该边缘的目的顶点表示的标记之间的最小允许偏移。因此,对于任何给定版面,可生成一个图形表示,其中由图中的一个相应顶点表示该版面中的每个标记,并且由一条相应的有向边缘表示每个最小偏移规则。在基础版面模型中,可以在其表示中忽略盒子,因为每个盒子完全由与其边缘相对应的标记来进行描述。
有多种方法在计算机的存储器中表示一个图形,并且可以使用任何合适的表示。通常,为了进行显示和编辑,采用除图形表示之外的形式对包括项目和约束的版面进行存储,是方便的,因此在交互式应用程序中,通常不总是采用图形的形式来对版面进行直接表示。图形表示可以包括根据需要用数字或其它信息对图形的边缘和顶点进行标记的方法。
图33A-33C显示了如何可以只使用固定偏移规则和非负偏移规则以及只使用最小偏移规则来表示容器的最小和最大高度。在图33A中,显示了一个容器3300,它具有40个单位的最小允许高度、和100个单位的最大高度。通过一个其顶边缘与标记3301相关联并且其底边缘与标记3303相关联的盒子,在版面引擎105中对容器3300进行表示。图33B中的有向图具有四个顶点3305、3307、3309和3311。顶点3305表示标记3301,顶点3307表示标记3303。其它两个顶点3309和3311表示额外标记,该额外标记对标记3303相对于标记3301的允许移动范围进行了定义。使用由该图中的实线边缘3317所表示的固定偏移规则,相对于标记3301对以上标记的位置进行固定。使用由该图中的虚线边缘3319所表示的两个非负偏移规则,以便将标记3303的位置限制在两个额外标记3311和3309之间。图33C中的第二有向图表示只使用两个顶点3313和3315的相同约束,其中顶点3313表示标记3301,并且顶点3315表示标记3303。使用两条边缘3319来表示最小偏移规则。从顶点3313到3315的边缘,表示最小值为40的最小偏移规则。从顶点3315到3313的边缘,表示具有最小偏移-100的最小偏移规则。这等效于最大值为100的从3313到3315的最大偏移规则。
16.3形状规则在可变数据印刷应用程序中,能够定义盒子的宽度和高度之间的关系,是方便的。但在基础版面模型中无法实现。
例如,一个盒子可以对应于将要被插入到版面中的一幅图像,并且可能需要对图像的大小进行调整,以便与可用空间相适应。这种情况下,最好是能够对盒子的纵横比进行规定,并且使版面引擎105根据该版面中其它项目的尺寸确定盒子的最佳大小。另一个例子是,盒子可以对应于未规定其高度和宽度的文本块的外接框,因此需要由版面引擎105对其高度和宽度进行确定。
可以扩展基础版面模型,以便允许称为形状规则的附加规则,该规则定义盒子的宽度和高度之间的关系,并且包括两种类型的形状规则幅形(aspect)规则和文本规则。
幅形规则规定盒子必须具有特定的纵横比。文本规则规定盒子的外形应该是特定文本框的外接框。通过专用模块处理文本的版面。稍后说明文本版面的例子。
以下详细描述形状规则的行为,因为其准确的行为取决于计算版面所用的方法。取决于为计算项目的位置和尺寸所选的方法,在不同的实现方式中,上述规则可以具有不同的行为。
16.4相同偏移规则在规定版面时便于拥有的另一类约束,是能够规定两个距离相等的约束。利用由标记m、n、s和t的equal(m,n,s,t)所表示的相同偏移规则,来对该约束进行规定,其中m和n具有相同方向,s和t具有相同方向。通过以下等式对相同偏移规则equal(m,n,s,t)进行定义offset(m,n)=offset(s,t),其中offset(a,b)表示从第一标记a到第二标记b的偏移,从而offset(a,b)=pos(b)-pos(a)。
通过添加相同偏移规则,可以扩展基础版面模型。在版面模型中允许相同偏移规则,能够非常容易地对过约束的版面进行创建。
并非所有实现方式都支持相同偏移规则,因为相同偏移规则需要更通用的版面方法,该方法不如版面引擎105中首选方法有效。更佳地,版面引擎105包括下面定义的最小化距离规则,取代相同偏移规则作为用于使各个偏移相等的备选方法。
16.5涉及盒子的中心的规则在基础版面模型中,只有盒子的边缘参与版面规则。还希望能够对盒子的中心之间的关系进行定义。在基础版面模型的扩展中,每个盒子总是与两个附加标记相关联。这些标记包括通过盒子的中心的垂直标记和水平标记。
在允许相同偏移规则的模型中,通过使用相同偏移规则,可以把标记和每个盒子的中心相关联,因此并不需要向模型中增加规则来支持涉及盒子中心的规则。
16.6固定中心规则作为涉及盒子中心的规则的特殊情况,在另一种实现方式中,存在对基础版面模型的扩展,该扩展允许相对于页面、或者相对于页面或版面区域的边缘,对每个盒子的中心的垂直或水平位置进行固定。这个特殊情况避免了对相同偏移规则的需求,因此可以使用更简单的计算版面的方法。
可以把固定中心规则认为是与盒子的相对边缘相关联的一对标记之间的关系,因此不需要向版面中添加通过盒子中心的附加标记。
16.7最大化偏移和最小化偏移规则到目前为止所描述的基础模型版面规则和附加规则,对于规定准确约束、诸如项目的精确尺寸和项目之间的间隔,以及对于规定项目的位置和尺寸变化性限制来说,是有用的。借助上述规则,能够容易地实现对过约束或欠约束的版面进行定义。为了更精确地控制版面,一种好的策略是,使用基础模型规则以及诸如相同偏移规则和固定中心规则之类的其它精确规则,来定义欠约束的版面,并且添加附加的、更灵活的规则,用于对项目的尺寸和位置的首选项进行规定。为此,可使用两种附加类型的规则最小化和最大化规则。
到目前为止所定义的规则对版面方法必须遵守的约束进行定义。与上面定义的规则不同,最小化和最大化规则为版面方法定义目标函数。
由minimizeoffset(m,n)所表示的最小化偏移规则,向版面引擎105指示从标记m到标记n的偏移应该尽可能小(即,为负)。以下详细定义该规则的行为,因为其取决于计算版面的方法。
由maximizeoffset(m,n)所表示的最大化偏移规则,向版面引擎105指示从标记m到标记n的偏移应该尽可能大(即,为正)。以下详细定义该规则的行为,因为其取决于计算版面的方法。
最小化偏移和最大化偏移规则对于包括在线性目标函数中来说,是有用的,并且由此可以被包括在适合使用单形法进行计算的版面模型中。如果使用线性目标函数,则每个最小化规则或最大化规则贡献一个线性项给目标函数。在这种情况下,这两类规则中只有一类规则是必需的,因为规则minimizeoffset(m,n)等效于maximizeoffset(n,m)。因此,包括这些类规则的版面模型的数据表示只需要对其中一类规则进行支持。例如,数据结构可能只支持最小化偏移规则,并且使用等效的最小化偏移规则对每个最大化偏移规则进行表示。
16.8最小化距离规则最大化偏移和最小化偏移规则的使用,可能产生其中两个标记之间的理想间隔为无穷大的版面,因此上述规则并不总是产生明确定义的版面。为了避免此问题,可以用其它类型的规则代替最大化偏移规则和最小化偏移规则。可选地,利用由minimizedist(m,n)所表示的称为最小化距离规则的另一类规则,来对距离进行规定。例如,两个标记m和n之间的偏移的绝对值应尽可能小。最小化距离规则仅仅应用于具有相同方向的标记之间。在具体实现方式中,使用下文描述的称为首选偏移规则的另一类规则代替最小化距离规则。
注意到,通过使用以下恒等式,可以使用固定偏移规则、最小化和最大化偏移规则以及非负偏移规则对最小化距离规则进行近似minimizedist(m,n)≡minimizeoffset(m,t)和minimizeoffset(n,t)和nonnegative(m,t)和nonnegative(n,t),其中t是添加到版面中的额外标记,并且在任何其它规则中都不涉及。上述近似可能是不精确的,并且它取决于所使用的精确版面计算方法。特别地,版面方法计算的项目的精确布置取决于所选的目标函数。
还会注意到,通过使用以下恒等式,还可使用最小化距离规则对最小化偏移规则进行近似minimizeoffset(m,n)≡minimizedist(t,m)和fixed(t,n,d);其中t是添加到版面中的额外标记,并且d是一个大的正数,表示比m和n之间的最大期望距离更大的距离。上述近似是不精确的,并且项目的精确布置取决于版面计算方法的精确实现,但是可以证明,通过向允许固定偏移和非负偏移规则的任何版面模型中仅仅添加最小化距离规则,能够提供与最大化和最小化偏移规则类似的功能。
在某些实现方式中,最小化距离规则还可以包括表示规则强度的额外值。可以将此规则表示为minimizeoffset(m,n,s),其中m和n是与该规则相关的标记,s是表示规则强度的正数。在这种情况下,当一条以上的最小化距离规则影响标记的位置时,较强的规则与较弱的规则相比对位置的影响更大。
16.9首选偏移规则在具体实现方式中,使用称为“首选偏移规则”的另一类规则,代替使用最小化距离规则。由preferred(m,n,d)所表示的首选偏移规则,规定从标记m到标记n的首选偏移为d。通过以下恒等式,可以用最小化距离规则表示首选规则preferred(m,n,d)≡fixed(m,t,d)和minimizedist(t,n),其中t是添加到版面中的额外标记,以便表示相对于m的位置来说n的首选位置。
相反,通过以下恒等式,可以利用首选偏移规则表示最小化距离规则minimizedist(m,n)≡preferred(m,n,0)。
因此,向基础版面模型的扩展添加最小化距离规则或者首选偏移规则,将生成等效的模型。使用首选偏移规则代替最小化距离规则,因为对于通常规定版面关系来说,这种表示通常需要较少的标记和较少的规则。
根据需要,首选偏移规则也可以包括表示规则强度的额外值。可以将此规则表示为preferred(m,n,d,s),其中m和n是与规则相关的标记,d为表示从m到n的首选偏移的数,并且s是表示规则强度的正数。在这种情况下,当一条以上的首选偏移规则影响一个标记的位置时,较强的规则与较弱的规则相比对该位置的影响更大。通过以下恒等式,带有强度的首选偏移规则等效于带有强度的最小化距离规则preferred(m,n,d,s)≡fixed(m,t,d)和minimizedist(t,n,s),其中t为添加到版面中的额外标记,用于表示相对于m的位置来说n的首选位置,并且minimizedist(m,n,s)≡preferred(m,n,0,s)。
16.10首选版面模型一个理想的版面模型包括为添加以下类型的上述规则而扩展的基础版面模型1.用于水平或垂直地固定盒子的中心的规则;2.用于支持包括文本和图像的盒子的形状规则;以及3.首选偏移规则。
该版面模型是足够灵活的,以支持通常所需要的全部版面特征,同时也是足够简单的,以方便用户理解,以具有一个简单的数据表示,并且它还能够支持对版面项的位置和尺寸进行计算的快速方法。
16.11示例版面图37A显示了通过使用盒子、标记和规则,在版面引擎105的一种实现方式中如何对图4所示的示例版面进行表示。通过标记3701、3703、3705和3707对版面区域的边界进行表示。版面区域通常表示模板中一个页面的一部分。通过固定偏移规则3709对版面区域的高度进行表示。通过固定偏移规则3711对版面区域的宽度进行表示。利用图37A所示的两个盒子3702和3704,在版面引擎105中对图4所示的两个容器进行表示。将标记3701和3705指定作为原点标记。
由标记3713、3715、3717和3719对第一个盒子3702的四条边缘进行表示。盒子3702的左上角在页面上有固定位置,其在版面区域的左边缘的右侧150个逻辑单位处,并且在版面区域的顶边之下200个单位处。由两条规则3735和3737对其进行表示。规则3735确保了盒子3702的左边缘在版面区域的左边缘的右侧150个单位处,并且规则3737确保了盒子3702的顶边缘在版面区域的顶边之下的200个单位处。盒子3743的高度和宽度是不固定的,并因此由版面引擎105对其进行计算。最小偏移规则3744指示该盒子的最小宽度为120个逻辑单位。规则3742指示该盒子的最小高度为100个逻辑单位。首选偏移规则3741向版面引擎105指示盒子3702的首选高度为550个逻辑单位。另一个首选偏移规则3743向版面引擎105指示盒子3702的首选宽度也是550个逻辑单位。盒子的首选宽度和高度是根据该盒子所表示的容器的内容来确定的。最小偏移规则3739向版面引擎105告知盒子3702的底边缘不能在由标记3703所表示的版面区域底边的下面。
通过标记3721、3723、3725和3727对第二个盒子3704的四条边缘进行表示。将盒子3704的顶边缘和底边缘的位置相对于版面区域进行固定。通过标记3725表示顶边缘的位置。通过固定偏移规则3731将顶边缘固定在版面区域顶边以下的200个逻辑单位处。同样,通过规则3733将盒子的底边缘固定在版面区域顶边以下的750个逻辑单位处。
利用固定偏移规则3729将盒子3704的宽度固定为550个逻辑单位,但是盒子的左边缘和右边缘的位置是不固定的,并且必须由版面引擎105对其进行计算。最小偏移规则3747向版面引擎指示由标记3723所表示的盒子的右边缘不能超过由标记3707所表示的版面区域的右边缘。
附加的最小偏移规则3748和3749确保可变边缘保留在版面区域内。在本例中,这些规则是冗余的,并且在某些实现方式中,可以在计算版面之前删除冗余规则。可以通过下列方式检测冗余规则临时删除该规则,并且使用推动操作来确定对受影响的标记进行推动是否违反该规则。如果使用推动操作不违反该规则,则该规则是冗余的。
通过固定偏移规则3745对支柱412进行表示。该规则向版面引擎105指示两个盒子3702和3704之间的距离表示是200个逻辑单位。
图37B显示了表示如图37A所示的水平偏移规则的图。可以使用另一个类似的图(未示出)对垂直偏移规则进行表示。顶点3751表示与版面区域的左边缘相对应的标记3705。顶点3761表示与版面区域的右边缘相对应的标记3707。顶点3753表示与盒子3702的左边缘相对应的标记3713。顶点3755表示与盒子3702的右边缘相对应的标记3715。顶点3757表示与盒子3704的左边缘相对应的标记3721。顶点3759表示与盒子3704的右边缘相对应的标记3723。
通过由图的边缘3767和3769表示的一对最小偏移规则,对固定偏移规则3735进行表示。通过图的边缘3771对最小偏移规则3744进行表示,并且通过图的边缘3773对最大偏移规则3746进行表示。通过图的边缘3775和3777对固定偏移规则3745进行表示。通过图的边缘3779和3781对固定偏移规则3729进行表示。通过图的边缘3783对最小偏移规则3747进行表示。
图37C表示用于存储入37B所示的图的存储器结构。通过一个数据结构、例如3791对图的各顶点进行表示,该数据结构至少包括该顶点所表示的标记的位置、以及一个表示离开该顶点的所有边缘的邻接列表。邻接列表由记录组成,每条记录表示一条边,并且包含至少一个指向目的顶点的指针(诸如指针3793)、以及从源顶点到目的顶点的最小允许偏移(例如3794)。由于邻接列表的大小是变化的,所以用链表对其进行存储。图37C没有明确地显示相邻记录之间的链接。
在如图37D所示的单独的图中对首选偏移进行存储。通过该图中的一条边缘,诸如边缘3795,对各首选偏移进行表示。用于存储首选偏移图的数据结构,与用于存储最小偏移规则的数据结构类似。通过指针(未明确示出)链接两个图中的相应顶点。在某些实现方式中,向每个图添加额外边缘,以确保每条边缘都有一条逆向边缘。这使得有可能高效地沿正方向或反方向遍历该图。
17.版面创建和编辑的详细描述17.1创建和编辑版面的基本操作创建和编辑版面的最简单方法是允许对各类的项目进行添加、删除,以及允许对由所支持的版面模型允许的各类规则进行添加、删除。在该方法中,当通过对涉及正在删除的项目的任何规则进行自动删除,而从版面中删除一个项目时,只需要最小一致性检查,就能防止版面数据结构变得矛盾。在该方法中,不保证能够确定满足所有规则的项目的位置和尺度。
避免包含冗余信息的版面也是有用的,因为这能降低版面的复杂度,从而使它更容易而便于用户理解,并且删除冗余信息的过程可以向用户提供反馈,以便使版面对于用户来说更清楚。冗余信息还能够增加表示版面的数据结构的大小,并且通知减缓版面计算。
上述用于表示涉及来自于基础版面模型中的规则的版面的有向图结构(图24),自动地提供了用于禁用某些类型的冗余信息的方法。图中不允许有一条以上具有相同源顶点和目的顶点的有向边缘。这防止将多条最小偏移规则应用于同一偏移。如果在同一对标记之间有一条以上的最小偏移规则(以相同的顺序,即具有相同的第一标记和相同的第二标记),则其中一条规则是冗余的,因为只需要具有最小的负的最小偏移值规则。
更佳地,用于添加最小偏移规则的操作,自动地用新增规则代替已经由相同源顶点和目的顶点表示的任何现有的最小偏移规则。可选地,如果就同一偏移已经存在最小偏移值更小(即更小的负值)的最小偏移规则,则向现有版面中添加最小偏移规则的操作不进行任何处理。
在具体实现方式中,支持用于添加和删除由基础版面模型所支持的所有种类规则的操作。上述规则包括固定偏移规则、非负偏移规则和最小偏移规则,尽管它们都是用最小偏移规则进行表示的。例如,通过添加两条相应的最小偏移规则,实现添加固定偏移规则的操作。提供了用于对任意标记的位置进行固定或解除固定的操作。对标记的位置进行固定,等效于在该标记和同方向的原点标记之间添加一个固定偏移规则。还提供了用于独立地固定任一盒子的中心的水平位置或垂直位置的操作。版面创建和编辑操作的多种组合也是可能的。
由于各种原因,可以对盒子中心的水平位置进行有效地固定。例如,如果盒子的两条垂直边缘的水平位置相对于版面区域是固定的,则盒子的水平位置以及宽度是完全确定的,因此,盒子中心的水平位置也是固定的。在这种情况下,用于使盒子中心的水平位置相对于版面固定的操作(即,添加固定中心规则),可以不进行任何处理,因为该规则是冗余的。这同样适用于对盒子中心的垂直位置进行固定。
在一种实现方式中,也支持用于添加和删除首选偏移规则和最小化距离规则的操作。在该实现方式中,利用等效的首选偏移规则对最小化距离规则进行表示。可以用有向图表示首选偏移规则,在有向图中,一个顶点表示一个标记,并且通过将对应于与首选偏移规则相关的标记的顶点进行连接的一条边缘,对每条首选偏移规则进行表示。由于有向图只允许具有相同源顶点和目的顶点的边缘,所以这看起来好像不适合表示具有一条以上与相同的两个标记有关的首选偏移规则的版面,但其结果是,在其中首选偏移规则包括强度的具体实现方式中,借助于以下恒等式,可以用一条等效的首选偏移规则代替与相同的两个标记有关的任意两条首选偏移规则preferred(m,n,d,s)和preferred(m,n,d’,s’)≡preferred(m,n,D,S),其中D=sd+s′d′s+s′,]]>并且S=s+s′。
在执行首选版面计算时,以上恒等式是有效的。
17.2基于示例的版面创建和编辑在创建和编辑版面时,希望避免创建过约束的版面,因为此类版面不利于生成文档。避免冲突规则的处理可以向用户提供反馈,以便增进用户对正在创建的版面的理解。通过自动地防止错误,在创建版面期间避免矛盾的规则还能减少用户的工作量。
在一些实现方式中,可以使用基于示例的编辑,以避免过约束的版面。基于示例的编辑是,用于创建和编辑版面的操作总是在遵守所有约束的版面示例上进行操作。注意到,最小化偏移规则、最大化偏移规则、最小化距离规则和首选偏移规则不对版面强加约束,并且可以将其忽略以便避免过约束的版面。在可变数据印刷应用程序中,可以通过允许用户构建显示文档预览的示例版面,来完成以上处理。预览可以是通过将实际数据和文档模板进行组合而生成的一篇文档的显示,或者预览可以包含只是与期望插入到文档模板中的数据类似的样本数据,或者可选地,只有项目的大小和位置可能与将从该模板生成的实际文档中的期望尺寸和位置近似相同。
在创建项目时,最好是规定新建项目的位置和尺寸,所以项目的示例位置总是已知的。为了对这些值进行存储,通过相应标记的位置,对用于表示版面的图中的各个顶点进行标记。另外,只有规则与项目的当前位置和尺寸不发生冲突时,才可以对规则进行添加。例如,只有所涉及标记的当前位置服从最小偏移规则时,才可以向版面中添加最小偏移规则。类似地,在添加固定偏移规则时,偏移值必须和与该规则有关的标记之间的偏移相等。当盒子中心的水平或垂直位置是固定的时,根据在执行添加规则的操作时盒子中心的实际位置,盒子的位置和尺寸是已知的,并且水平或垂直中心是固定的。
用户可以经由界面103,指示可能需要向版面中添加规则的、对版面的改变。如果用户所指示的示例版面不满足将要添加的规则,则如果可能的话,就对该版面进行自动调整,以便使新增规则与该版面一致。例如,当用户通过对话框或者通过拖动盒子的一条边缘而改变具有固定宽度的容器的宽度时,对项目的位置进行修改,并且还更新规则。这可能需要若干版面操作,诸如删除某些现有规则、改变所涉及标记的位置、以及添加新规则。例如,当改变标记的位置时,应用程序121首先删除如果对该标记的位置进行改变就会违反的任何规则,更新该标记的位置,并添加与该标记的新位置一致的新规则。
在编辑或创建版面时,有时必须在不违反任何约束的情况下,相对于另一个标记或者相对于版面原点,对一个标记或一个以上的标记进行移动。如果需要移动的标记受到许多约束的影响,则上述处理可能是一项非常复杂的操作。版面引擎105最好是提供一个称为“推动”的操作,该操作在不违反任何约束的情况下,沿水平方向或垂直方向将一组标记移动一个给定距离,并且在必要时还移动不在原始组的其它标记,以实现请求的结果。
17.3推动操作版面引擎105响应于来自用户界面103的输入,实现推动操作,以便在不违反任何约束的情况下,沿水平方向或垂直方向将一组标记移动一个给定距离,并且必要时还移动不在原始组中的其它标记,以实现请求的结果。
推动操作在一组具有相同方向的标记上起作用,并且可以利用称为推动图的图对其进行描述。给定由标记和最小偏移规则的集合定义的示例版面、连同分配给该版面中的每个标记的位置,可以对相应的推动图进行定义。推动图是一个有向图,其中每个顶点相应于版面中的一个标记,并且每一条边缘相应于一条最小偏移规则,其中实际偏移等于最小偏移规则允许的最小值。
版面的推动图是一个有向图,有向图的边缘指示哪些标记可以直接推动构成该版面的其它标记。如果增加第一个标记的坐标值导致违反第一个和第二个标记之间的最小偏移规则,即当它们之间的偏移已经是允许的最小值时,第一个标记能够直接推动第二个标记(沿正方向)。注意到,假定在创建或编辑版面时,已经用等效的最小偏移规则代替了所有基础模型规则。
当沿正方向移动标记时(即,增加其坐标值时),还必须将与推动图中可以从其相应顶点到达的顶点相对应的任何标记移动相同距离,以便避免违反任何最小偏移规则。
当沿负方向移动标记时(即,减小其坐标值时),还必须将与反向推动图中可以从其相应顶点到达的任一标记沿相同方向移动相同距离,以便避免违反任何最小偏移规则。除了边缘的方向相反之外,反向推动图与推动图相同。
可以利用对有向图中的可到达顶点进行确定的各种方法来实现上述处理。
推动操作通过在不违反任何最小偏移规则的情况下移动多组标记来起作用。为了计算一组标记的允许移动范围,为每个最小偏移规则定义一个称为“松弛(slack)”的量。给定任一最小偏移规则min(m,n,d),则该规则的松弛由offset(m,n)-d给出。松弛是在违反该规则前标记m能够移动的最大距离(沿正方向),并且也是在违反该规则前标记n能够沿负方向移动的最大距离(即,坐标能够减少的最大值)。如果在示例版面中不违反该规则,则最小偏移规则的松弛总是一个非负数。推动图中的每条边缘对应于松弛为0的规则。
对于一组标记来说,允许的最大正向移动是所有最小偏移规则min(m,n,d)的松弛值中的最小值,其中m在该组中,而n不在该组中。这是在不移动该组外的任何其它标记并且不违反任何最小偏移规则的情况下,能够沿正方向移动该标记的最大距离。能够沿反方向移动一组标记的最大距离,可以类似地定义为min(n,m,d)形式的所有最小偏移规则的松弛值中的最小值,其中m在该组中,而n不在该组中。如果没有对沿给定方向移动一组标记进行限制的最小偏移规则,则最大距离是无穷大的(即,对标记能够移动多远没有限制)。
推动操作对将要移动的当前一组标记以及一个推动距离进行跟踪,其中推动距离是它必须将当前组内的标记推动的剩余距离。在执行操作步骤时,对该组标记和推动距离进行更新。推动操作在一次或多次增加中对标记进行移动。根据由当前组标记的最大允许移动值,对每次增加中的移动距离进行确定。在每次增加前,将可由该组中的标记推动的附加标记添加到该组中,因此在每次增加时对不同组的标记进行移动。
图25表示在推动操作的第一实现方式中包含的方法2500。推动操作在步骤2501中开始,在该步骤中保存版面的原点。由于推动操作能够改变定义坐标系的标记的位置,所以对该标记及其位置进行记录,以便能够稍后在步骤2513中恢复坐标系。在步骤2501之后,推动操作继续到步骤2502,在该步骤中将剩余推动距离和0进行比较。如果剩余推动距离为0,则不执行任何处理,并且操作进入步骤2513,在该步骤中对坐标系的原点进行恢复。这提高下列方式实现将版面中的所有标记移动一个适当值,以便恢复在步骤2501中所保存的原点标记的原始位置。如果在步骤2502中所测试的推动距离不为0,则操作进入步骤2503,在该步骤中,根据版面中该标记的当前位置更新推动图。接着,操作进入步骤2505。在步骤2505中,通过添加可由当前组中的任意标记沿推动方向推动的任意附加标记,对将要移动的这组标记进行更新。例如,将其相应顶点在推动图(或者如果移动距离是反方向的话,则为反向推动图)中可以从与当前组内的任意标记相对应的顶点到达的标记,添加到当前标记组中。操作继续到步骤2507,在该步骤中,计算当前增加的距离。增加的距离是给定方向上当前组标记的剩余推动距离和最大允许移动距离中的较小者。如果推动距离是正的,则该距离总是正的。在计算出移动距离之后,操作继续到步骤2509,在该步骤中,将当前组内的所有标记移动一个距离,该距离是在步骤2507中所计算的距离。在步骤2509之后,操作进入步骤2511,在该步骤中,通过从中减去移动距离而计算出剩余推动距离。在步骤2511之后,操作返回到步骤2502,在该步骤中,对在步骤2511中所计算的距离进行测试,以便确定是否需要另一次迭代。
图25所描述的推动操作方案从不会失败,但是如果在操作期间移动了原点标记,则操作的行为是不直观的。例如,如果将一组标记向右推动,而不是将该标记向右移动,则其它标记可能会向左移动。该行为是由恢复原点的步骤2513造成的。实际上,该行为有时是有用的。例如,为了使盒子的宽度增加10个距离单位,即使不能将右边缘移动10个单位之多,将盒子的右边缘向右推10个单位,如果可能的话,这也将会使盒子的宽度增加10个单位。在这一点上,如果右边缘只能向右移动3个单位,但是左边缘能够向左移动7个单位,则推动操作将自动地向左移动左边缘。副作用是其它项目可能也会移动。
有另一种形式的、不会移动原点标记的推动操作,也是有用的。通过图26中的方法2600对其进行了说明。推动操作的此种实现方式除了省略了步骤2501和2513之外,按相同的方式进行,省略步骤2501和2513是因为它们是多余的,但是该实现方式包括了附加测试,即,在步骤2505和2507之间所插入的步骤2606。测试步骤2606确定当前标记组是否包括原点标记。假如包括,则操作停止并且失败,因为在不移动原点标记的情况下,不能将该标记推动请求的距离。
图27A和27B、27C和27D、以及27E和27F共同给出了推动操作如何起作用的示例。这些图表示由两个容器构成的版面,这两个版面是最小宽度为15个单位的可变宽度容器2701、以及宽度为20个单位的固定宽度容器2704。通过具有与标记A和B关联的左边缘和右边缘的盒子,对容器2701进行表示。通过具有与标记C和D关联的左边缘和右边缘的盒子,对容器2704进行表示。这些图还显示了由标记E表示的页面边缘2707。
图27A表示在开始推动操作前版面的初始状态。项目2701具有由最小偏移规则2702所表示的15个单位的最小宽度。项目2704具有由固定偏移规则2705所表示的20个单位的固定宽度。通过由固定偏移规则2703所表示的长为6个版面单位的支柱对两个项目2701和2704进行连接。在项目2704和由标记E表示的页面边缘2707之间,有一条附加的最小偏移规则2706,它具有15个单位的最小长度。该规则防止项目2704到页面边缘的距离小于15个单位。在调用推动操作之前,实际距离为20个单位。说明了用于将标记A向右推动15个单位的推动操作的步骤。图27B还显示了该版面的推动图2709。图2709显示了表示标记B和C的顶点,由于固定偏移规则2703,这两个顶点通过两个方向上的边缘相连接。表示B和C的顶点还由于固定偏移规则2705在两个方向上相连接。
图27C表示该循环的第一次迭代的结果。在第一次迭代中,在步骤2503中,对推动图2709进行计算。在步骤2505中,从推动图中确定标记A没有对任何其它标记进行推动,并且可自己移动。在步骤2507中,确定在不违反最小偏移规则2702的情况下标记A可以移动的最大距离为3个单位。由于该距离小于所请求距离,所以在步骤2509中将标记A移动3个单位,从而产生如图27B所示的版面。在步骤2511中所计算的剩余距离现在为12个单位。在该循环的第二次迭代中,在步骤2503中,对图27D所示的推动图2711进行计算。在该图中,标记A现在推动标记B,因为规则2702的松弛现在为零,并且因此标记A也推动标记C和D。
图27E表示该循环的第二次迭代的结果,在该迭代中确定标记B、C和D现在全由标记A进行推动,因此必须一起移动四个标记。在步骤2507中,确定标记A、B、C和D能够移动的最大距离为5个单位,而不违反标记D和由标记E表示的页面边缘2707之间的第二最小偏移规则2706。剩余距离为12个单位,但是标记D只能移动5个单位,所以分别将标记A、B、C和D移动5个单位。在步骤2511中,计算剩余距离为7个单位。在该循环的第三次迭代中,在步骤2503中,计算图27F所示的推动图2713。在该图中,标记A推动所有的标记。
在图26所示的第二种形式的推动操作中,测试2606确定在将要移动的标记组中包含原点标记E,因此停止该操作。在图25所示的第一种形式的推动操作中,循环的第三次迭代使得在步骤2509中将所有标记移动了剩余的7个单位,并且在随后的步骤2511中,计算剩余距离为零,因此,步骤2502中的测试使得该过程转到步骤2513,在该步骤中,通过将所有标记左移7个单位,对原点标记E的位置进行恢复。在该例中,两种形式的推动操作产生了相同结果。在该例中,总共只能将标记A推动8个单位,而不是所请求的15个单位。
17.4带有固定中心的推动操作在包含固定中心规则的版面模型中,需要对推动操作进行修改,以便知道固定中心。如果盒子中心的水平位置是固定的,则必须总是沿相反方向将盒子的左边缘和右边缘移动相同距离,此类标记是彼此“相对的”,或者是“相对”标记。类似地,如果盒子中心的垂直位置是固定的,则必须总是沿相反方向将盒子的顶边缘和底边缘移动相同距离。
为了修改推动操作以包含固定中心,用两组标记代替将要推动的标记组。一组标记、即正向组是沿正方向推动的,另一组标记、即相对组是沿负方向推动的。在步骤2505中,向这两组标记中每一组添加标记如下。如果一个标记与两组之一中包含的标记相对,则向另一个组中添加相对标记、以及由该相对标记推动的任何标记。
图32详细表示了当允许固定中心规则、诸如在步骤2505使用固定中心规则时,如何确定两组标记的方法3200。在图32中,假定要推动的初始组标记是垂直标记,并且正将其向右推动,同时假定坐标系正向右增加。类似地实现沿其它方向和朝向推动标记。在步骤3201中,将由当前组标记所推动的所有标记添加到正向组中(忽略固定中心规则)。通过查找可从表示正向组标记的那组顶点到达的所有顶点,使用推动图计算步骤3201。另外,如果任何两个相对标记被包含在正向组中,则也将原点标记添加到该组中。在步骤3201之后,在步骤3203中,将与当前组内的任一标记相对的所有标记添加到相对标记组中。另外,如果相对组中包含两个相对标记,则将原点标记添加到相对组中。将原点标记添加到任一组中,会有效地使推动操作在步骤2606的测试之后终止。在步骤3203之后,在步骤3205中,把由相对组内的标记向左推动的所有标记添加到相对组中。由于正在沿负方向推动标记(即,正在减小它们的坐标值),所以除了使用反向推动图之外,上述步骤是以与步骤3201中相同的方式来实现的。在步骤3205之后,在步骤3207中,将与相对组中的标记相对的所有标记添加到正向组中。步骤3207与步骤3203相反。在步骤3207之后,在步骤3209中,执行一个测试,以检查在步骤3207中是否将新标记添加到正向组中。假如添加了,则计算返回到步骤3201,以便重复步骤3201、3203、3205和3207,直到不再向两个组的任一组中添加更多的新标记为止。
在步骤2507中,为这两组独立地计算移动距离,并且两个距离中的较小者(即,其数量较小者)变为要移动的距离。在步骤2509中,将标记沿相反方向移动相同距离。沿正方向移动一组中的标记,并且沿负方向移动另一组中的标记。
17.5带有形状规则的推动操作由于形状规则涉及水平和垂直标记,所以为包含带有形状规则的版面模型而修改推动操作,可能是复杂的。问题是在推动标记时,由于形状规则和其它规则的组合,在相同方向的标记之间可能产生复杂的相互作用。特别地,有可能造成没有唯一解答的循环依赖。为避免此问题,对版面模型设置进行限制,只对这样的盒子应用形状规则,在该盒子中在最小偏移规则中出现至多一个与一条垂直边缘相对应的标记、以及至多一个与一条水平边缘相对应的标记。即,形状规则盒子的每一对相对边缘中的至少一条边缘,一定不受最小偏移规则的限制。该限制避免了由形状规则引起的标记之间的复杂关系。利用该限制,可以对推动算法进行修改,从而每当在步骤2509中对涉及形状规则的盒子的边缘进行移动时,就应用形状规则。通过移动盒子的自由边缘,应用形状规则,其中自由边缘是任何最小偏移规则中不涉及的边缘。
17.6使用推动操作编辑文档模板当用户正在对文档模板进行编辑时,GUI301使用推动操作来修改示例版面。图34表示GUI301如何允许用户移动容器的固定边缘的示例方法3400。在步骤3401中,用户指示应当移动边缘,例如通过用鼠标133和指针313对边缘进行选择并拖动来实现。在步骤3401之后,在步骤3402中,应用程序103对与正在移动的边缘相对应的标记的位置解除固定。通常,通过添加固定偏移规则来固定边缘的位置,其中固定偏移规则对表示该边缘的标记和与该边缘相同方向的原点标记之间的偏移进行固定。为了对该边缘解除固定,删除固定偏移规则,以便允许对该边缘的位置进行改变。在步骤3402之后,在步骤3403中,向版面引擎105添加额外约束,以便限制该边缘缘的允许位置。当一条边缘是固定的时,不能移动该边缘,因此不需要对该边缘有任何移动附加约束。然而,当使用版面引擎105对边缘的位置进行改变时,通常对该边缘的移动范围进行限制。例如,可以向版面引擎105告知不能将该边缘移出版面区域的边缘之外。另一个例子是,如果该边缘是容器的左边缘,则可以在表示版面矩形的左边缘的标记和表示容器的该边缘的标记之间,添加非负偏移约束。此外,还应该强制保持容器的最小和最大宽度。可以使用文档模板,以独立于版面引擎105对各个容器的最小和最大宽度、以及最小和最大高度进行存储。当用户正在拖动容器的边缘时,通过在表示容器的左边缘和右边缘的标记之间添加最小偏移约束和最大偏移约束,版面引擎105能够强制保持容器的最小和最大宽度设置。
在步骤3403之后,在步骤3405中,应用程序121调用推动操作以便对该边缘进行移动。推动操作确保该边缘的移动不会违反任何约束,并且将移动限定在版面规则所允许的范围之内。在推动操作之后,在步骤3407中,删除在步骤3403中添加的约束,然后在步骤3411中,将该边缘的位置固定在新位置。在步骤3411之后,应用程序121使用版面引擎105,以在步骤3413中如图28、29、30A和30B所述重新计算版面。步骤3413确保应用所有的最小化距离规则和首选偏移规则。步骤3411是必需的,以便在执行步骤3413时,防止版面引擎105把该边缘移动到其它位置。最后,在步骤3413中已经对版面进行重新计算后,应用程序121更新显示屏144,以便显示改变边缘位置的结果,并且该更新是完全的。当用户用鼠标拖动容器的边缘时,重复图34所示的步骤,以便在拖动时提供即时的反馈。
图35表示如何利用推动操作来编辑文档模板的另一种方法3500。方法3500在步骤3501中开始,在该步骤中,用户请求对固定宽度容器的宽度进行改变。假定容器的位置是可变的,其左边缘和右边缘都是不固定的。通过利用键盘132在GUI301显示的属性对话框中输入一个新的宽度,可以实现上述处理。在一种实现方式中,利用鼠标133的右键点击该容器,将显示一个与调色板311类似的上下文菜单。然后可以从上下文菜单中选择“属性…”图标,以便对属性对话框进行显示。在步骤3501之后,在步骤3503中,计算容器的当前宽度与新宽度的差值。在步骤3503之后,在步骤3505中,将容器的宽度从固定的改变为不固定的。通过在表示容器的左边缘和右边缘的标记之间添加固定偏移规则,使得容器的宽度变成固定的。同样,步骤3505包括删除固定偏移规则。在步骤3505之后,在步骤3507中,向版面中添加约束,以便对容器的边缘的移动进行限制。在文档模板中可以有各容器的最小和最大宽度。通过向版面中添加规则来强制保持上述限制。通过添加与表示该容器的左边缘和右边缘的标记相关的最小偏移规则,强制保持最小值,并且通过添加与表示该容器的左边缘和右边缘的标记相关的最大偏移规则,强制保持最大值。
在步骤3507之后是步骤3509。在步骤3509中,利用推动操作将与该容器的右边缘相对应的标记向右推动一个距离,该距离为宽度的差。如果宽度变化为负,表示用户请求更小的宽度,则将该标记推动一个负距离——因此将其向左推动而不是向右推动。在下一步3511中,对剩余请求宽度变化进行计算。如果步骤3509中的推动操作成功地将右边缘推动了所计算的距离,则容器的宽度将会已经变成正确的尺寸了,并且剩余距离将为零。如果步骤3509中的推动操作不成功,则当前宽度将不等于请求的宽度,并且剩余距离不为零。在步骤3511之后,在步骤3513中,利用推动操作将左边缘向左推动一个距离,该距离是在步骤3511中所计算的剩余变化尺寸。如果剩余宽度变化为负,则将左边缘向左推动一个负距离。即,将该边缘向右推动。
如果在步骤3513中成功地将左边缘推动了在步骤3511中所计算的距离,则当前的宽度将等于所请求的宽度。否则,该宽度将尽可能地接近所请求的宽度。在步骤3513之后,在步骤3515中,删除在步骤3507中所添加的约束,并且在步骤3517中,通过添加与表示该容器的左边缘和右边缘的标记相关的固定偏移约束,将宽度固定为新的宽度。在步骤3517之后,在步骤3519中对版面进行重新计算,并且在步骤3521中更新显示屏,以反映最新计算的版面,从而完成对容器的宽度进行改变的操作。下文详细解释计算版面的过程。在图35所示的示例中,假定使用图26中所概括的第二种形式的推动操作。如果使用图25中所概括的形式,则步骤3511和3513将是不必要的。
18.版面计算的详细描述18.1用单形算法计算版面在一种实现方式中,允许的规则是基础模型中的规则,连同相同偏移规则、幅形规则、最小偏移规则和最大偏移规则。这里,基础模型规则等效于线性不等式约束,并且相同偏移规则是线性约束,并且最小偏移规则和最大偏移规则用于定义线性目标函数。在该模型中,规则定义了线性规划,因此,可以使用单形算法或者求解线性规划的任何其它方法,来执行版面计算。
在该实现方式中,通过将与最小偏移规则相关的一对标记之间的每个偏移相加在一起,然后从这个总和中减去与最大偏移规则相关的一对标记之间的每个偏移,来计算目标函数。如果规则具有强度,则在相加或相减前首先用相应规则的强度乘以偏移值。
可惜的是,在不对单形法进行重大修改的情况下,在使用单形法对其版面进行计算的模型中,不存在包括文本规则的已知方法。
18.2改进的单形法在另一种实现方式中,所允许的规则是基础模型中的规则、以及相同偏移规则、幅形规则、最小距离规则和首选偏移规则。在该实现方式中,将最小偏移规则和相同偏移规则转换为线性约束,并且最小距离规则和首选偏移规则用于定义二次目标函数。在该模型中,约束是线性恒等式或者为线性不等式,并且目标函数是一个二次函数。可以使用二次优化领域中普通技术人员已知的方法,对此类问题进行求解。可以使用改进的单形法来计算该模型中的版面。
正如单形法一样,在不对二次规划进行重大修改的情况下,没有利用二次规划来处理允许具有可变宽度和高度的文本框的模型的已知方法。
18.3基于图的版面计算在另一种实现方式中,所使用的版面模型允许所有基础模型规则、首选偏移规则和形状规则。该模型与首选版面模型相同,只是不允许固定中心规则。在该实现方式中,使用最小偏移规则表示基础模型规则,并且将其存储为有向图。将首选偏移规则存储为单独的有向图。对形状规则进行单独存储。与单形法和二次规划方法相比,该方法的优点是它同时包含幅形规则和文本规则,并且可对该方法进行修改以便包含其它形状规则。
另外,在该实现方式中,每个容器与一个盒子相关联。对于某些容器,可以将另一个单独的盒子与该容器相关联,并且将其用于表示该容器的理想尺寸和/或形状。利用最小偏移规则,告知版面引擎105使表示容器的印刷或显示形状的盒子尽可能地接近表示理想形状的盒子的尺寸和形状。通过对相关联的盒子应用形状规则,定义容器的理想尺寸和形状。版面计算方法使容器的尺寸和形状尽可能地接近理想尺寸和形状。不是总有可能使容器正好具有理想尺寸和形状,因为其在理想尺寸和形状时可能不能与版面中的可用空间相适应。例如,约束可能防止其成为理想尺寸或形状。
使用最小偏移规则定义约束,其中约束对标记的可能位置进行限制,首选偏移规则用于定义目标函数,其中利用版面计算方法对目标函数进行最小化,并且利用形状规则计算方法对该计算方法进行动态控制。为了定义目标函数,将每条首选偏移规则和一个能量值相关联。首选偏移规则的能量是首选偏移和实际偏移间差值平方的一半。称为总能量的目标函数,是所有首选偏移规则的全部能量之和。如果为首选偏移规则指定了强度,则将强度和能量相乘。可以认为首选偏移规则是一个弹簧,该弹簧具有固有长度,并且在压缩或拉伸时受到张力作用。首选偏移规则的张力是规则的强度与实际偏移和首选偏移间差值的乘积。规则的强度类似于弹簧的刚度。版面引擎105通过平衡所有首选偏移规则的张力而使总能量最小化,来计算版面。
图28表示在计算版面时所涉及的主要步骤。版面计算方法2800在不违反任何最小偏移规则的情况下,对标记进行移动(即,改变其位置),直到总能量最小化为止。方法2800在步骤2801中开始,在该步骤中,版面引擎105搜索能够移动的一组标记,以便在不违反任何基础模型规则的情况下减小目标函数的值。在步骤2803中,执行测试,以测试该搜索是否成功,假如成功,则该方法进入步骤2805,否则,版面计算完成,并且方法2800停止。在步骤2805中,将标记沿适当方向移动适当距离,以便降低总能量。在步骤2805之后,方法2800返回到步骤2801,在该步骤中,搜索将要移动的另一组标记。以下将详细说明用于选择要移动的多组标记的方法、和用于计算移动标记的距离的方法。为了确保图28描述的处理可以终止,忽略标记位置的微小变化,和/或引起总能量的微小变化的标记位置变化。在一种实现方式中,将位置变化限制为整数个逻辑单位。
图29表示与图28所示的过程等效的过程2900,只是在移动一组水平标记(步骤2903)之前首先移动垂直标记(步骤2901)。步骤2905中的测试起到与步骤2803中的测试相同的作用。有多种可能的方式用以组织用于降低总能量的方法,而并不背离本公开的范围。
图30A详细地表示了在如步骤2901-A所示的实现方式中可以如何执行步骤2901的方法。在步骤3001中,对垂直标记的推动图进行计算。这用来对可由一个给定标记推动的标记进行确定。在某些实现方式中,该图可以是与表示规则的图相分离的数据结构。在其它实现方式中,可以将两个数据结构进行组合。在步骤3003中,通过从表示垂直标记和水平最小偏移规则的图中检索第一个顶点,检索第一个垂直标记。可以有多种可能的顺序对标记进行检索。在一种实现方式中,可以按照在表示水平最小偏移规则的图中存储相应顶点的顺序,对标记进行检索。在步骤3003之后,该方法进入步骤3005,在该步骤中,计算由在步骤3003中所选择的标记能够向右推动的标记。步骤3005对在不违反最小偏移规则的情况下可向右移动一个非零距离的一组标记进行确定。该组标记包括在步骤3003中所选择的标记,以及可由选定标记推动的所有标记(即,与推动图中可从对应于选定标记的顶点到达的顶点相对应的所有标记)。步骤3007对在不违反最小偏移规则的情况下在步骤3005中所确定的那组能够标记向右移动的最大距离进行确定。步骤3007中的计算与作为推动操作的步骤2507的一部分而执行的计算相同。在步骤3007之后,步骤3009对该组中的各个标记应当移动的距离进行计算,以便降低总能量,该距离不大于在步骤3007中所计算的距离。以下将对步骤3009进行详细描述。可以将移动距离限制为整数个逻辑单位。在步骤3009之后,该方法进入步骤3011,在该步骤中,将所有标记移动在步骤3009中所计算的距离。由于标记可能已经改变位置,所以可能需要更新推动图,以便反映新位置的结果。如果在步骤3009中所计算的距离等于在步骤3007中所计算的最大允许距离,则需要改变推动图。在步骤3011后的步骤3013中执行该处理。向右移动标记没有减少总能量,也是有可能的。在这种情况下,在步骤3009中所计算的距离将为0,并且在步骤3011中该标记将不会实际改变位置。实际上,步骤3011和3013都不进行任何处理,并且在某些实现方式中可以跳过它们。步骤3015、3017、3019、3021和3023分别等效于步骤3005、3007、3009、3011和3013,只是移动方向相反。在上述步骤中,使用反向推动图而不是推动图。软件工程领域的普通技术人员可以理解,有可能设计用于推动图的有向图数据结构,从而能够沿相反方向遍历同一推动图,因此不需要单独的反向推动图。在步骤3023之后,进行测试,以确定在步骤3003中是否访问了所有顶点,如果没有访问,则该方法返回到步骤3003,在该步骤中选择下一个标记。假如访问了所有的顶点,则完成步骤2901,并且计算进入步骤2903。
步骤2903与步骤2901相同,只是它所考虑的是水平标记和垂直最小偏移规则,而不是垂直标记和水平最小偏移规则。
图31表示如何执行步骤3009中的计算的细节。在步骤3101中,相对于当前组内的标记从它们的当前位置起的位置变化,计算总能量的偏导数。总能量的导数等于张力之和。偏导数等于使得当前组内的标记和当前组外的标记相关联的首选偏移规则的张力之和。即,总和是preferred(n,m,d,s)形式的规则上的总和,其中m是当前组内的标记,而n是当前组外的标记。注意到,对于任意标记m和n来说,规则preferred(m,n,d,s)等效于规则preferred(n,m,-d,s)。通过使得张力的和尽可能地接近于零,将使能量最小化。在步骤3103中,通过将标记移动距离δ,来完成上述处理,其中δ由下式给出δ=-D/S,其中D是张力之和,S是将当前组内的标记和当前组外的标记相关联的首选偏移规则的强度之和。在步骤3105中,执行测试,以确定目标函数是否正沿为当前组标记考虑的移动方向降低。这等效于测试δ是否为正。如果通过沿当前方向对标记进行移动不能降低能量,则在步骤3107中将移动距离设置为零。如果通过沿当前方向对标记进行移动能够降低能量,则在步骤3109中计算移动距离。移动距离是δ和在步骤3007中所计算的数值之中的较小者。可以将标记的移动限制为整数个逻辑单位,从而将步骤3007所计算的距离四舍五入为整数个逻辑单位。这确保了版面计算的终止。
如同应用于上述推动操作一样,将同样的与原点标记相关的考虑应用于版面计算。在这一点上,版面计算可以忽略原点标记,其中步骤3005将总是对能够移动的一组标记进行查找,将要被移动的那组标记可以包括对水平坐标系原点进行定义的指定垂直标记。在这种情况下,步骤3007总是生成一个非零的正距离,并且步骤3011可能改变原点标记的位置。在这种情况下,应当在步骤3001之前对原点标记的位置进行存储,并且通过将该版面中的所有垂直标记移动一个距离,该距离是在计算期间原点标记已经移动的距离的负距离,对原点标记的位置进行恢复。在另一种实现方式中,在步骤3007中对原点标记进行考虑。在这一点上,如果在将要移动的那组标记中包括原点标记,则在步骤3007中计算的距离为零。在这种情况下,在执行版面计算时,无须对原点进行保存或恢复。
形状规则只用于具有不固定宽度和不固定高度的容器。对于此类容器,在版面引擎105中用两个盒子对包含内容的容器的部分进行表示。一个盒子表示容器中包含的显示或印刷文本或图像的边界。由版面引擎计算这个盒子的边界。另一个盒子表示盒子的理想形状。该盒子由形状规则进行控制,并且通常不印刷或不向用户显示。这两个盒子共享一个水平标记和一个垂直标记。例如,这两个盒子的左边缘和顶边缘的位置总是相同的。是否共享左边缘或右边缘,或者是否共享顶边缘或底边缘,是没有差别的。通过最小距离规则将剩余的两条垂直边缘联系起来,并且,类似地,通过最小距离规则将剩余的两条水平边缘联系起来。最小距离规则向版面引擎指示两个盒子的尺寸应尽可能地彼此接近。
在对与这样一对相关盒子的任意一个盒子的一条边缘相关联的标记进行移动时,考虑形状规则。在步骤3003中,忽略并且跳过属于具有不共享形状规则的盒子的标记,但是,如果对表示无形状规则的相关联盒子的边缘的任何标记进行了移动,则在步骤3009之前对上述不共享标记进行调整。同样的方法适用于应用于水平标记的等效步骤。根据形状规则对不共享标记进行调整,以便使能量函数最小化。该过程确保在垂直和水平标记之间能量是平衡的。
在形状规则是幅形规则的情况下,直接将能量最小化。如果显示框的宽度和高度是W和H,并且理想盒子的宽度和高度是w和h,则当W+H=w+h时,获得最小能量。如果由幅形规则所定义的高度对宽度之比为r,则可以按以下方式计算理想盒子的宽度和高度w=(1+r)-1(W+H)和h=r(1+r)-1(W+H)。
在形状规则为文本规则的情况下,理想盒子的形状没有简单公式。文本版面引擎执行计算,以便将文本布置到矩形空间内。利用文本版面引擎为理想盒子计算尺寸。文本版面引擎执行计算,以便把文本块布置到具有给定宽度的空间内,并且能够快速计算所布置的文本块的高度。文本版面引擎包括自动换行计算,以便将一长行文本换行成为多行。文本版面引擎根据与该文本相关联的格式化信息,对文本进行布置。格式化信息可以包括段落样式、用于每个字符的字体大小和字型,诸如粗体或加下划线。
在一种实现方式中,将理想宽度设置为最宽的文本行的宽度,将理想高度设置为由文本版面引擎所计算的已布置的文本块的高度,该文本块的宽度等于显示框的宽度。如果宽度小于最长行的宽度,或者显示框的高度不足以包含该文本,则上述处理具有增加能量惩罚的效果。
在另一种实现方式中,利用文本版面引擎按不同的宽度布置文本,以计算每个宽度的高度,直到找到产生最低能量值的宽度为止。如果最宽的文本行不具有与显示框相同的宽度,则可以将理想宽度设置为最宽的文本行的宽度,可以将理想高度设置为在没有换行时文本版面引擎所计算的高度。当文本包含长文本行,并且它必须进行换行,以便适应显示框时,使用搜索策略,以找到导致能量最小的版面的宽度。可以设计许多搜索理想宽度的可能策略,而不背离本公开的范围。特别地,可以使用折半搜索策略。
在另一种实现方式中,如果文本包含长文本行,并且它必须进行换行以适应显示框时,根据能否布置文本以使之与显示框相适应,对理想盒子的尺寸进行计算。如果文本与显示框不相适应,则使理想盒子的宽度和高度大于显示框的宽度和高度。如果文本与显示框相适应,则使理想盒子的宽度和高度小于显示框的宽度和高度。对于其显示框大于或小于包含文本所必需的尺寸的版面来说,该策略具有增加惩罚的效果。可以有多种对理想盒子的准确尺寸进行计算的可能方法,而不背离本公开的范围。可以使用的一种特殊方法是,如果通过与显示框的现有宽度相等的宽度对文本进行布置,则首先计算文本的高度,然后将所布置的文本的高度和显示框的高度的差值的一半加到显示框的宽度和高度之中,以获得理想盒子的尺寸。
18.3.1简单的一维版面示例图39表示在章节18.3和后续章节中描述的版面机制的使用示例。利用A、B和C表示三个盒子3901。通过位于左边缘、顶边缘、右边缘和底边缘的标记3905定义每个盒子3901。将页面的左边缘和右边缘定义为两个垂直标记(3903和3904),其中这些标记之间有固定距离。固定偏移规则3902对容器的某些边缘和页面的边缘之间的距离进行规定。
规则具体为·把页面的宽度固定为50个单位。
· PA、即容器A的首选宽度为22个单位。
· PB、即容器B的首选宽度为16个单位。
· PC、即容器C的首选宽度为13个单位。
·盒子A的左边缘(图39中称为“a”)距离页面的左边缘1个单位。
·盒子A的右边缘(称为“m”)可自由移动。
·盒子B的左边缘(称为“b”)在a的右侧6个单位处。
·盒子B的右边缘在“m”的左侧1个单位处。
·盒子C的左边缘在“m”的右侧2个单位处。
·盒子C的右边缘(称为“c”)在页面右边缘的左侧1个单位处。
分别用WA、WB和WC表示盒子A、B和C的当前宽度。为方便起见,使用这样一个坐标系,该坐标系以页面的左边缘为零点,向页面的右侧增加。同时假定字母“a”、“b”、“c”和“m”表示上述坐标系内相应标记的位置。
首选偏移规则的能量是首选偏移和实际偏移间差值平方的一半。用于该版面的目标函数、即总能量,是所有首选偏移规则的能量之和。因此,目标函数为E(A,B,C)=1/2(WA-PA)2+1/2(WB-PB)2+1/2(WC-PC)2=1/2(WA-22)2+1/2(WB-16)2+1/2(WC-13)2=1/2[(WA-22)2+(WB-16)2+(WC-13)2]=1/2[((m-a)-22)2+((m-b-1)-16)2+((c-m-2)-13)2]=1/2[(m-a-22)2+(m-b-17)2+(c-m-15)2]。
注意到,为了查找每个盒子的宽度,从该盒子的最右标记的位置中减去该盒子的最左标记的位置,以获得一个非负数。因此,WB为(m-b-1),因为m和盒子B的右边缘之间的间隔为1个单位。同样,WC为(c-m-2),因为c在m的右侧,并且盒子C的左边缘和标记m之间的距离为2个单位。
为了使目标函数最小化,注意到,“m”是唯一一个可移动的标记(实际上,“m”以及与其最接近的两个标记可以移动,并且可以将它们看作方程式中的控制变量,因此,为简单起见,使用称为“m”的那个标记)。在这种情况下,简单地找到能量函数相对于变量m的偏导数,并且对导数为零进行求解,就足够了E(A,B,C)=1/2[(m-a-22)2+(m-b-17)2+(c-m-15)2]δE/δm=(m-a-22)+(m-b-17)+(m-c+15)。
注意到第三项(m-c+15)的负号,因为导数是相对于m的,而m在该项中为负。
δE/δm=m-a-22+m-b-17+m-c+15=3m-a-b-c-22-17+15=3m-a-b-c-24。
通过对这个值为零进行求解,有可能找到最小能量。已知a、b和c的值分别为1、7和49。
0=3m-1-7-49-243m=1+7+49+24=81m=27。
由于只有一个变量,因此过程结束。因此,给定配置的最小能量是在标记“m”在页面左边缘的右侧27个单位处时获得的。
18.3.2简单的二维版面示例图40A表示版面机制的另一种使用示例。在这种情况下,由于有可以移动的水平和垂直标记,所以该示例涉及二维方向上的张力。
在由标记4002限定边界的具有已知固定尺寸的矩形页面内,显示了三个标有A、B、C的盒子4001。固定偏移规则4003、4004、4005和4006对A和C的三条边缘的位置进行确定。A的下边缘(水平边缘)可以移动,但是通过固定偏移规则连接到B的上边缘(称为“m”),因此,两个标记只能一起移动,并且移动相同距离。类似地,B的右边缘(称为“n”)和C的左边缘可以移动,但是只能一起移动,并且移动相同距离,因为它们之间有一条固定偏移规则。
由于盒子B的宽度和高度都可以改变,所以可以对盒子B应用形状规则。所选择的规则为纵横比规则,该规则规定盒子B的高宽比应尽可能地接近0.5(在图40A中,用标有RB=0.5的箭头指示)。盒子A的首选高度为22个单位,并且盒子C的首选宽度为36个单位。由于盒子A和C都不能在二维方向上进行改变(由于规则4005、4006),所以都没有形状规则。
规则具体为·把页面的宽度固定为50个单位。
·把页面的高度固定为36个单位。
· PA、即容器A的首选高度为22个单位。
· RB、即容器B的首选高宽比为0.5。
· PC、即容器C的首选宽度为36个单位。
·盒子A的上边缘(称为“a”)距离页面的顶边2个单位。
·盒子A的左边缘在页面左边缘的右侧1个单位处。
·盒子A的右边缘在其左边缘右侧18个单位处。
·盒子B的上边缘(称为“m”)可以移动。
·盒子A的下边缘比m高2个单位。
·盒子B的左边缘(称为“b”)在页面左边缘的右侧1个单位处。
·盒子B的下边缘(称为“d”)比页面的下边缘高3个单位。
·盒子B的右边缘(称为“n”)可以移动。
·盒子C的左边缘在“n”的右侧2个单位处。
·盒子C的下边缘比页面的下边缘高3个单位。
·盒子C的右边缘(称为“c”)在页面右边缘的左侧2个单位处。
·盒子C的上边缘比其下边缘高16个单位。
使HA,WA,HB,WB和HC,WC分别是盒子A的高度和宽度、盒子B的高度和宽度、以及盒子C的高度和宽度。
使PHB和PWB分别是盒子B的首选高度和宽度。盒子B的首选高度和宽度不是版面算法的固定输入;相反,它们是通过使用盒子B的形状规则在某些阶段计算的,其中形状规则是与其宽度和高度有关的纵横比规则。这些值是作为盒子B的高度和宽度的加权平均值计算的PWB=(WB+HB)/(1+RB)= 2/3(WB+HB)PHB=RB(WB+HB)/(1+RB) = 1/3(WB+HB)。
表示上述方法的能量的目标函数,可以是水平和垂直方向上的张力的平方和的一半E(A,B,C)=1/2(HA-PA)2+1/2(HB-PHB)2+1/2(WB-PWB)2+1/2(WC-PC)2=1/2[(HA-PA)2+(HB-PHB)2+(WB-PWB)2+(WC-PC)2]=1/2[(m-2-a-PA)2+(d-m-PHB)2+(n-b-PWB)2+(c-n-2-PC)2]。
为了降低以上能量(在实际不需要计算该能量的情况下),依次减小水平和垂直方向上的目标函数的偏导数,直到再也不能减小两个方向上的张力的绝对值之和为止,就足够了。该处理生成张力最小的方案。使用张力的绝对值,从而能够在停止条件中同样地对正负张力进行处理。偏导数为δE/δm=m-2-a-PA+m-d+PHB=2m-59+PHBδE/δn=n-c+2+PC+n-b-PWB=2n-11-PWR。
通过将其设置为零而使偏导数最小化,从而得到以下关系m=1/2(2+a+PA+d-PHB)=1/2(59-PHB)n=1/2(c-2-PC+b+PWB)=1/2(11+PWB)。
对本例而言,使盒子B的初始宽度和高度分别为15和10个单位,因此,m=d-10=33-10=23,且n=b+15=16。
WB=15HB=10
m=23n=16。
计算盒子B的首选宽度和高度PWB=2/3(WB+HB)=2/3(15+10)=50/3=162/3=16(当被减少到最接近的整数时)。
PHB=1/3(WB+HB)=1/3(15+10)=25/3=81/3=8(当被减少到最接近的整数时)。
计算水平和垂直张力的绝对值之和,以便使版面机制能够确定何时结束。在这种情况下,水平张力Tx是盒子B和C的当前宽度与其首选宽度之间的差值的总和。类似地,垂直张力TY是盒子A和B的当前高度与其首选高度之间的差值的总和。即TX=(WC-PC)+(WB-PWB)=(c-n-2-36)+(n-b-PWB)=c-38-b-PWB(当消去n时)=48-38-1-PWB=9-PWB=9-16=-7。
TY=(HB-PHB)+(HA-PA)=(d-m-PHB)+(m-2-a-22)=d-PHB-2-a-22 (当消去m时)=33-PHB-2-2-22=7-PHB
=7-8=-1。
张力为负,表示标记需要向左或向上移动,以减小这些张力。
总张力是垂直和水平张力的绝对值的总和TTOTAL=|TX|+|TY|=|-7|+|-1|=7+1=8。
版面机制继续依次减小水平和垂直方向上的张力,直至再也不能减小总张力为止。
首先沿水平方向移动垂直标记。尽早将B的首选宽度计算如下PWB=2/3(WB+HB)=16。
唯一能够移动的垂直标记是“n”,以及通过固定偏移规则(距离其右侧2个单位)与其相连的标记。对两个标记进行移动,以使水平张力最小化。由于另一个标记的位置可以被推导为(n+2),所以确定应当将“n”移动到的位置,就足够了。如先前由下列关系式确定的那样,计算n的位置,以便减小目标函数相对于n的偏导数n=1/2(11+PWB)=1/2(11+16)=131/2=13(当被减小为最接近的整数时)。
将标记“n”移动到位置13,以便减小水平张力,还将盒子B的宽度变成12,即WB=12HB=10m=23n=13。
由于形状规则,盒子B的首选宽度和高度变为
PWB=2/3(WB+HB)=2/3(12+10)=44/3=142/3=14(当被减小为最接近的整数时)。
PHB=1/3(WB+HB)=1/3(12+10)=71/3=7 (当被减小为最接近的整数时)。
现在必须对总张力进行重新计算,以便查看总张力是否已减小了,并且如果没有减小,则版面过程停止。新张力为TX=9-PWB=9-14=-5。
TY=7-PHB=7-7=0。
TTOTAL=|TX|+|TY|=|-5|+|0|=5。
由于新张力已经从8降到5,所以该过程将继续。
现在,沿垂直方向移动水平标记。此时,只有“m”以及与其相连的标记可以移动。计算应当将“m”移动到的位置,因为与其相连标记将移动到(m-2)。如早先由下列关系式确定的那样,使目标函数相对于m的偏导数最小化m=1/2(59-PHB)=1/2(59-7)=26。
将标记“m”移动到位置26,以便减小垂直张力,将通过固定偏移规则与其相连的标记移动到位置24。
WB=12HB=7m=26n=13现在重新计算盒子B的首选宽度和高度、以及总张力PWB=2/3(WB+HB)=2/3(12+7)=38/3=122/3=12(当被减小为最接近的整数时)。
PHB=1/3(WB+HB)=1/3(12+7)=61/3=6(当截断为最接近的整数时)。
TX=9-PWB=9-12=-3。
TY=7-PHB=7-6=1。
TTOTAL=|TX|+|TY|=|-3|+|1|=4。
由于总张力已经从5减小到4,所以该过程将继续。再次沿水平方向移动垂直标记,以便减小张力。
n=1/2(11+PWB)=1/2(11+12)=111/2
=11(当被减小为最接近的整数时)。
将标记“n”移动到位置11。盒子B的宽度变成10个单位。
WB=10HB=7m=26n=11重新计算盒子B的首选宽度和高度、以及总张力PWB=2/3(WB+HB)=2/3(10+7)=34/3=111/3=11(当被减小为最接近的整数时)。
PHB=1/3(WB+HB)=1/3(10+7)=52/3=5(当被减小为最接近的整数时)。
TX=9-PWB=9-11=-2。
TY=7-PHB=7-5=2。
TTOTAL=|TX|+|TY|=|-2|+|2|=4。
由于总张力没有减小到4以下,所以该过程停止。可选地,还可以在过程停止前移动水平标记。
本例的最终结果可能如图40B所示的那样。注意到,在这种情况下盒子A和C可以重叠。这可能是所期望的效果。如果不是预期的效果,则为了防止此种情况发生,必须添加其它约束。例如,可以添加最小偏移规则,以便强迫盒子C的左边缘保持在盒子A的右边缘的右侧。
本例仅仅显示了一个形状规则和两个首选偏移规则,但是实际应用程序可以对每个盒子使用形状规则。取决于在盒子内将要显示的内容,形状规则也可能不同。例如,可以使用纵横比规则和文本形状规则。每条规则按其自身的方式对盒子的理想形状进行计算。
18.4带有固定中心的基于图的算法在版面引擎105中,允许使用固定中心规则,因此需要修改版面计算,以正确地处理固定中心规则。在图30B中,如步骤2901-B所示,显示了对步骤2901(图29)中的版面计算的修改,并且其类似于在推动操作中为支持固定中心规则所做的修改。图30B几乎与图30A相同,只是图30B表示了在计算版面时如何对固定中心进行考虑。在图30A和30B中,步骤3001、3003、3005、3009、3013、3015、3019、3023和3025是共同的。
在图30B中,步骤3005和3015必须包括在计算推动标记时的相对标记。计算两组标记,而不是计算沿一个方向移动的单组标记;一组向右移动,另一组向左移动。这一点与推动操作中相同。在图30B中,步骤3008代替步骤3007,在步骤3008中,独立地为两组标记计算最大移动距离(忽略固定中心规则),然后两个值中的较小者(就数量而言)即为标记能够移动的最大距离。用步骤3012代替步骤3011,用步骤3022代替步骤3021,区别在于一起移动两组标记。在步骤3012中,将包含了在步骤3003中所选择的标记的那一组向右移动,并且将包含了与第一组中的标记相对的标记的那一组向左移动。在步骤3022中,将包含了在步骤3003中所选择的标记的那一组向左移动,并且将包含了与第一组中的标记相对的标记的那一组向右移动。相同的考虑适用于为包括固定中心而修改推动操作的情况。在这一点上,如果任意两个相对标记在同一组中,则应将原点标记添加到这两个组中。逻辑上,如果包括了原点标记,则应将具有相同朝向的所有相对标记对添加到两个组中,因为移动原点需要移动所有固定标记,并且因此也必须移动所有带有固定中心的盒子。当然,不必要实际上创建包含原点标记和所有相对标记对的组,因为不应该对它们进行移动。如果任一组中都不包括原点标记,则步骤3008将最大距离设置为零,因此步骤3009、3012和3013不进行任何处理,并且可以将其跳过。步骤3018代替步骤3017,并且和步骤3008一样,为包含了在步骤3003中所选择的标记的那一组计算最大距离,而且还为与包含所选标记的那一组中的标记相对的所有标记计算最大距离。类似地,如果这两个组中的任一组包含原点标记,则步骤3018应将最大距离设置为零。
19.印刷文档图36表示在从文档模板生成并印刷文档的过程中涉及的方法3600的步骤。方法3600在步骤3601中开始,在该步骤中,应用程序121连接到数据库,并且将数据库游标设置在包含了所需源数据的表格的开始位置。用户可以利用图14所示的对话框指定需要连接哪个数据库。在步骤3601之后,在步骤3603中,从数据库表格中读出下一条记录,并且更新游标以指向下一条记录。由于文档集中的每篇文档相应于一条记录,开始一篇新文档,并且将页面计数器重置在文档模板的开始。随后进入步骤3605,在该步骤中应用程序121为正在生成的文档开始一个新页面,并且生成用于该页面的版面并将其应用于该页面。在步骤3607中,使用当前记录中的数据,来计算在当前页面上的版面内的每个容器的理想尺寸。接着,在步骤3609中,使用在步骤3607中所计算的理想尺寸调整版面规则。此类操作可以包括改变首选偏移规则的值,并根据在步骤3607中计算的理想尺寸对幅形规则进行更新。此外,对于文本的宽度和高度均不固定的可变文本容器,协同文本规则一起确定高度和宽度,其中文本规则取决于在步骤3603中所提取的数据库记录的某个字段中的文本。在步骤3609中对此类文本规则进行更新。在步骤3609之后,在步骤3611中计算当前页面的版面。在计算出版面以后,在步骤3613中提交并印刷页面。在已经印刷了页面以后,在步骤3615中执行测试,以便确定是否印刷了当前文档的所有页面。若没有全部印刷,则方法3600返回到步骤3605,以开始计算下一个页面。如果已经为当前文档印刷了文档模板中的所有页面,则方法3600继续到步骤3617,在该步骤中,执行另一个测试,以确定当前记录是否为数据库表格中的最后一条记录。如果已经处理了数据库表格中的所有记录,则方法3600完成,否则该过程返回到步骤3603,在该步骤中,读出数据库表格中的下一条记录,以便印刷下一篇文档。
20.预先计算可能的文本形状用于提高版面机制的速度的一种方法、诸如章节18所描述的基于图的版面方法是,对该版面可能包含的任何文本的所有形状进行预先计算。通过在执行版面计算前计算形状,版面机制可以更快地进行处理,因为已经执行了对文本形状的计算,并且将其结果进行存储以用于随后的快速检索。通过图41A-41K中的例子,来说明对某些文本的可能形状进行计算的方法。
该方法的工作方式如下1.如图41A所示,根据需要在单词之间保持适当的间距,以首尾相连的方式水平地布置文本文字(在外接框4103内显示每个单词4102)。然后将单词的总体配置的宽度和高度确定为包围单词的最小盒子4101。在存储数据结构中对外接框4103的尺寸进行存储。必要时,可使用不同字体测量单词。注意到,为了清楚起见,在外接框4103和文字框4102之间有一个小的间隔,但是在实际实现时该间隔并不存在。
2.获得外接框的宽度,然后将宽度减小所用坐标系的一个单位。接着,使用新宽度作为宽度约束,再次布置文本。按照这个宽度约束和文本语言的文本流动规则的要求,文本将流动到后续的行中。不存在高度约束,因此可以根据需要使用若干行。根据该结果确定新的外接框,如图41B所示,并且在存储数据结构中对这个新的外接框进行存储。字符间距4105遵循文本语言的自然间距规则。例如,在英语中,不把行尾的间隔计算在外接框计算结果内。对于某些语言来说,对于构成单词或词间间距的定义可能与给出的示例不同。
3.重复步骤2直到不能把文本布置在更窄的外接框内为止。图41C-41K举例说明了该过程。注意到,在本例中,诸如单词“Brevity”之类的每个单词可以有可选的连字符断点4104,如图41h-41k所示,断点允许把单词断开。当英语中出现此种情况时,规则将添加连字符4106。虽然该处理取决于文本语言的规则,但是在计算外接框时,通常包含这种动态插入的标点符号的尺寸和位置。
4.计算的文本形状是存储的外接框。当需要知道文本块在给定的宽度约束、高度约束、或者宽度与高度约束下可以有多大时,可以在版面机制中使用以上形状。还可以使用上述形状,来了解在给定的一维方向上的下一个最大或最小形状,以便快速地在文本块的几种可能版面中做出决定。
显然,打算使上述实现方式与使用具有已知最小尺寸的字间间距从左向右书写的语言一起使用。对于不遵循此类规则的语言,可制定另一种替换方案。例如,某些亚洲语言以列的方式从上向下书写字符,然后从右向左书写各列。对于此种语言,需要修改版面过程,以交换垂直和水平尺寸的作用,并且可以将间隔符号的尺寸减小到某个更小的值或零。因此,将会在步骤1中垂直堆叠字符,然后在步骤2中,将高度减少1个单位(其可能是字符的高度),并且重复该过程,以形成越来越宽的外接框。类似地,每种语言的断字规则取决于文本的语言。
21.表格创建示例图42A-42C表示使用如章节18所描述的基于图的版面机制构建表格的一些方法。将表格定义为被划分成单元格的矩形区域,每个单元可选地保存诸如文本或图像之类的某些内容。
图42A表示对表格进行定义的一种方法。使用导向4203对行和列的位置进行定义。将容器4201放置在导向之间,以充当表格中的单元格,并且可以在其中放置内容。在导向4203和容器4201的相应邻接边缘之间附加支柱4202,以便对相邻单元格的内容之间的边距进行定义。如果打算使各单元格彼此对齐,则支柱可以具有任意所需长度,包括零长度。
导向可以是不固定的(它们可以是浮动导向),以便每个单元格的内容可以推动导向,由此允许调整行和列的尺寸以便适应不同尺寸的内容。或者,可以将导向固定到页面上,以便把行和列限制在某个尺寸或位置。通过在导向之间放置支柱,也可以利用浮动导向来控制行和列的尺寸。这允许整个表格在页面上移动(由于没有把导向固定到页面上),但是仍然可以利用该技术控制行和列的尺寸。
注意到,将该表格中的容器的外边固定到页面上。该处理可能是不必要的。另一种替换的更好方法可以是,使用导向定义表格的最外边界,并且在导向和容器的外边缘之间放置支柱,以便允许那些边缘一起进行移动。
图42B表示定义表格的另一种替换方法。在本例中不使用导向。相反,把支柱4205直接附加在相邻容器4204的边缘之间,以便指定行与列的边距尺寸。只有在最上的容器和最左的容器之间才需要这种指定边距的支柱4205。通过使用长度为零的支柱4206,将表格内的其它容器链接到这些约束。
在图42B所示的例子中,通过高度为零的支柱4206链接顶行容器的底边缘,从而将其底边缘彼此准确对齐。类似地,利用高度为零的支柱链接底行容器的顶边缘,以便将它们对齐。同时,这意味着只需一个垂直支柱4205就能定义并控制那两行之间的边距尺寸。实际上,这是非常有用的,因为它意味着对表格边距的更改只涉及改变一个支柱的首选或实际距离,而无不是像图42A中的示例要求的那样对多个支柱进行改变。对于所示的链接最左一列的右边缘并且还链接最右一列的左边缘的零宽度的支柱4206,类似的逻辑关系也成立。
像在图42A中那样,图42B中的例子还将表格的外边缘固定到页面上。就像对齐内边缘那样,有可能使用零长度的支柱来对齐容器的所有外边缘,而不是按上述方式对表格的位置和尺寸进行固定。这允许将表格移动到页面上的任何需要之处,而无需一个接一个地对多条固定外边缘的位置进行改变。可以使用章节18.3中所描述的版面方法实现该方法。
第三种替换方法可以使用导向来定义表格的外边缘,并且使用零长度的支柱来对齐表格的内边缘。有导向和支柱的许多其它可变组合也能够实现相似的效果。
注意到,需要某些对齐表格内边缘的方法,以便形成传统观念的表格。图42C表示在既不使用导向也不使用支柱来对齐内边缘时所出现的情况。将容器4207再次作为表格的单元格,并利用支柱4208对相邻容器之间的距离进行定义。然而,注意到,本例缺少防止对角相对的容器重叠的方法,因为没有使行和列的内边缘分开。
这可能会产生容器和内容的重要并且可变的排列,并且章节18.3以及后续章节中描述的版面方法能够生成此种排列(并非版面方法的所有现有示例均能生成此种排列)。然而,对于传统观念的表格,图42A和42B所示的例子更适于实现完全对齐的行和列。
工业适用性上述方法适用于计算机和数据处理行业,并且特别适用于利用可变数据再现实质上具有相同格式和版面的大量文档的情况。其例子包括为名称、地址和其它个人资料均不同的许多人生成信件。另一个例子是,生成与不同度假目的地有关的广告小册子,其中每个小册子的特征在于包括文本和图像的独特内容,但是所有小册子都是根据通用版面而生成的,其中该版面表示发布广告的组织机构的品牌或者式样。许多其它例子也适用。
上文仅仅描述了本发明的某些实施例,可以对其做出各种修改和/或改变,而并不背离本发明的范围和实质,所述实施方式是说明性的而不是限制性的。
权利要求
1.一种基于模板创建可变数据文档的版面的方法,所述方法包括以下步骤在该模板中设置至少一个容器,以形成所述版面;建立至少一个与该容器的至少一个特征中每个选定特征相关联的约束;使用图形用户界面显示由所述建立步骤建立的、与由所述设置步骤设置的容器相关联的约束;以及修改版面,以便通过把内容放置到多个容器中而生成文档,其中在满足版面内的每个约束的条件下,根据所放置内容的属性,改变所述至少一个容器的至少一维尺寸和所述至少一个容器在所述版面内的位置中的至少一个。
2.根据权利要求1的方法,其中,所述建立包括建立两个所述约束,其中每个所述约束与所述容器的一个相应特征有关。
3.根据权利要求2的方法,其中,所述特征是从包括以下特征的组中选择的所述容器的角、所述容器的边的中点、所述边的非中点、所述容器的中线上的非中点、以及所述容器的中心点。
4.根据权利要求1的方法,其中,所述放置内容的所述属性包括所述放置内容的尺寸。
5.根据权利要求4的方法,其中,所述尺寸包括所述放置内容的宽度。
6.根据权利要求4的方法,其中,所述尺寸包括所述放置内容的高度。
7.根据权利要求1的方法,其中,通过用户操作与由图形用户界面内所述版面的表示描述的所述对应特征一致的指示设备,执行用户发起的选择。
8.根据权利要求1的方法,其中,所述建立包括以下步骤之一对没有预先设置约束的所述对应特征设置一个约束;以及重置所述对应特征,以删除预先设置的约束。
9.根据权利要求8的方法,其中,在具有设定约束的每个所述特征上提供一个约束符号。
10.根据权利要求1的方法,其中,所述容器为矩形,并且所述尺寸包括所述容器的宽度和高度,而且对于每个所述容器来说,所述内容包括文本和/或图像内容。
11.根据权利要求10的方法,其中,所述特征包括所述容器的角,并且具有设定约束的每个所述角在所述版面内保持固定。
12.根据权利要求10的方法,其中,所述特征包括所述容器的边缘的中点,并且在满足下列条件的情况下改变容器的尺寸和/或位置对于具有设定约束的每个所述边缘中点来说,(1)边缘可以对称地扩张或收缩,以及(2)边缘的中点保持固定。
13.根据权利要求10的方法,其中,所述特征包括所述容器的对应边缘上的非中点,并且在满足以下条件的情况下改变容器的尺寸和/或位置对于具有设定约束的每条边缘来说,(1)边缘的长度可以自由地扩张或收缩,以及(2)不沿与该边缘垂直的方向移动该边缘。
14.根据权利要求10的方法,其中,所述特征包括所述容器的水平和垂直中线上的非中点位置,并且在满足以下条件的情况下改变容器的尺寸和位置中的至少一个对于具有设定约束的每条中线来说,(1)中线保持固定,(2)与中线平行的边缘可以对称地扩张或收缩,以及(3)可以独立于固定的中线对与中线垂直的边缘进行定位。
15.根据权利要求10的方法,其中,所述一个特征包括所述容器的中心点,并且在满足以下条件的情况下改变容器的尺寸和/或位置对于具有设定约束的中心点来说,(1)中心点保持固定,以及(2)容器的第一对平行边缘扩张或收缩第一数量,而另一对平行边缘扩张或收缩第二数量。
16.根据权利要求11的方法,还包括以下步骤对所述容器的另一个角设置另一个约束,其中所述另一个约束是根据预定规则设置的。
17.根据权利要求1的方法,其中,所述设置步骤包括在模板内设置第一和第二容器,以形成所述版面;所述建立步骤包括选择第一容器的一条边缘、即第一条边缘,选择第二容器的一条边缘、即第二条边缘,所述选择包括使用所述图形用户界面显示对所述第一条和第二条边缘的选择;以及所述修改包括修改所述版面,以便通过把内容放置到容器中而生成文档,其中在第一条边缘和第二条边缘之间的位置偏移固定的条件下,根据所放置内容的属性,改变第一容器和第二容器的尺寸和位置中的至少一个。
18.根据权利要求17的方法,其中,通过用户操作至少与由图形用户界面内所述版面的表示描述的所述对应边缘一致的指示设备,执行用户发起的选择,所述方法还包括在图形用户界面内显示一个支柱符号,该支柱符号表示第一条边缘和第二条边缘之间的所述位置偏移。
19.根据权利要求18的方法,其中,通过所述指示设备在所述第一容器内的选择性操作,并将所述操作的指示设备移动到所述第二容器内,来执行所述选择,由此跨越所述第一条和第二条边缘,因此所述指示设备的取消选择操作将形成所述边缘之间的所述支柱。
20.根据权利要求18的方法,其中,通过所述指示设备在所述第一容器内的第一操作和所述指示设备在所述第二容器内的第二操作,执行所述选择。
21.根据权利要求1的方法,其中,所述建立包括在该版面内建立一个导向,并且在所述一个容器和该导向之间设置偏移;以及所述修改包括通过把内容放置到所述一个容器内而生成文档来修改版面,其中在保持偏移的条件下,根据所放置内容的属性,改变所述一个容器的尺寸和位置中的至少一个。
22.根据权利要求21的方法,还包括在所述模板内设置另一个容器,以及在所述另一个容器和所述导向之间设置另一个偏移。
23.根据权利要求21的方法,还包括在版面内移动导向的步骤。
24.根据权利要求21的方法,其中,通过用户操作与图形用户界面内所述版面的表示描述的所述导向一致的指示设备,执行对所述偏移的所述设置,所述方法还包括在图形用户界面内显示一个关联符号,关联符号表示所述导向和所述容器之间的关联。
25.根据权利要求1的方法,其中,所述设置包括在模板中设置第一容器和第二容器,以形成所述版面;以及所述修改步骤包括通过把内容放置到第一容器和第二容器中而生成文档来修改版面,其中,在改变第一容器的至少一个属性、并且该至少一个属性与第二容器的对应一个属性同步的条件下,根据内容的属性,改变第一容器和第二容器的尺寸和位置中的至少一个。
26.根据权利要求25的方法,其中,所述内容至少包括文本内容,第一容器的所述一个属性是从包括所述文本内容的文本大小、行间距和字符间距的组中选择的。
27.根据权利要求1的方法,其中,所述建立还包括在该至少一个容器内建立多个栏,并且相邻的栏由分隔线分开;以及所述修改包括通过把文本内容放置到该至少一个容器中,来修改该文档,以便使一个容器和栏的尺寸是可变的,而分隔线的尺寸是固定的。
28.根据权利要求27的方法,其中,所述容器具有可见背景,并且所述设置所述多个栏还包括在所述容器内设置一个边界,并且所述栏位于该边界内。
29.根据权利要求1的方法,其中,所述建立还包括在至少一个所述容器内建立多个栏,并且相邻栏用分隔线分开;以及所述修改包括修改版面,以便通过把至少文本内容放置到所述一个容器中而生成至少一个所述文档,以便使所述一个容器和栏的尺寸是可变的,而分隔线的尺寸是固定的。
30.根据权利要求1的方法,其中,所述建立还包括在所述至少一个容器内建立多个栏,以便由两条边界和位于所述两条边界中心的分隔线构成将在其中放置文本的相邻栏,并且改变所述两条边界中一条边界的位置,以改变相邻所述栏之间的分隔线的尺寸;以及所述修改包括通过把文本内容放置到所述至少一个容器内来修改文档。
31.根据权利要求30的方法,其中,通过用户发起的在沿所述一个边界的一个位置处对所述一个边界的选择,改变所述一个边界的所述位置。
32.根据权利要求31的方法,其中,通过用户操作与图形用户界面内所述版面的表示描述的所述一条边界一致的指示设备,并且将所述选择的边界移动到所述版面内的另一个位置,来执行所述选择。
33.根据权利要求1的方法,其中,所述修改包括通过把内容放置到容器内而生成文档来修改版面,以便在根据容器的背景颜色和模板的背景之间的关系确定容器的内部边距的条件下,改变容器的尺寸和位置中的至少一个。
34.根据权利要求1的方法,其中,所述建立包括建立一个容器区域,所述容器区域具有固定尺寸和与所述容器相关联的可变位置;以及所述修改包括通过把内容放置到容器中而生成文档来修改所述版面,从而在该容器不违反相关联容器区域的条件下,根据所放置内容的属性,改变容器的尺寸和位置中的至少一个。
35.根据权利要求34的方法,其中,所述容器区域为围绕所述容器的最大区域。
36.根据权利要求34的方法,其中,所述容器区域为所述容器内的最小区域。
37.根据权利要求1的方法,其中,所述至少一个容器具有高度和宽度;所述建立包括将所述高度和宽度中的至少一个设置为固定尺寸;以及所述修改包括通过把内容放置到容器中而生成文档来修改所述版面,从而在所述高度和宽度中设置的那一个保持在所述固定尺寸的条件下,根据所放置内容的属性,改变容器的另一个尺寸和位置中的至少一个。
38.根据权利要求37的方法,其中,所述设置包括检测用户发起的、对定义了所述一个高度和宽度的所述容器的边缘的选择。
39.根据权利要求38的方法,其中,通过用户操作与图形用户界面内所述版面的表示描述的所述对应边缘一致的指示设备,来执行用户发起的选择,所述方法还包括在图形用户界面中显示一个符号,该符号表示所述边缘之间的固定尺寸。
40.根据权利要求1的方法,其中,所述设置包括在模板中设置一批容器,以形成所述版面;所述建立包括(i)在该版面内设置多个导向,以将所述一批容器分成行和列,行和列构成由所述容器定义的单元格,以及(ii)在每个所述导向和每个所述容器的一条对应邻边之间建立偏移;以及所述修改包括通过把内容放置到容器中而生成文档来修改版面,从而在保持偏移的条件下,根据放置内容的属性,改变容器的尺寸和位置中的至少一个。
41.根据权利要求1的方法,其中,所述设置包括在模板中的列和行设置一批容器,以形成所述版面;所述建立包括建立相邻容器的边缘之间的偏移,用以规定所述列和行的边距尺寸;以及所述修改包括通过把内容放置到容器中而生成文档来修改版面,从而在保持偏移的条件下,根据所放置内容的属性,改变容器的尺寸和位置中的至少一个。
42.根据权利要求41的方法,其中,在第一容器和相邻列和行中的紧邻容器之间设置所述偏移,所述方法还包括在每行每列中的相邻容器之间设置多个长度为零的偏移。
43.一种其上记录有程序的计算机可读介质,该程序适合于使计算机执行根据模板生成可变数据文档的版面的过程,所述程序包括用于在模板中设置至少一个容器以形成所述版面的代码;用于建立至少一个与该容器的至少一个特征中每个选定特征相关联的约束的代码;用于使用图形用户界面显示与设置的容器相关联的所建立约束的代码;以及用于修改版面以便通过把内容放置到多个容器中而生成文档的代码,其中在满足版面内的每个约束的条件下,根据所放置内容的属性,改变所述至少一个容器的至少一维尺寸和所述至少一个容器在所述版面内的位置中的至少一个。
44.一种用于根据模板创建可变数据文档的版面的计算机装置,所述装置包括用于在模板中设置至少一个容器以形成所述版面的装置;用于建立至少一个与该容器的至少一个特征中每个选定特征相关联的约束的装置;用于通过使用图形用户界面在显示设备上显示与设置的容器相关联的所建立约束的装置;以及用于修改版面以便通过把内容放置到多个容器中而生成文档的装置,其中在满足版面内的每个约束的条件下,根据所放置内容的属性,改变所述至少一个容器的至少一维尺寸和所述至少一个容器在所述版面内的位置中的至少一个。
全文摘要
公开了用于可变文档印刷的方法和装置,其中配置了图形用户界面,以便允许用户操作与用于生成可变文档的模板内的内容容器相关联的版面规则。一种方法包括根据模板创建可变数据文档的版面。该方法首先在模板内设置至少一个容器,以形成版面,然后建立至少一个与该容器的至少一个特征中每个所选特征相关联的约束,其中建立步骤包括对于每个特征,检测用户发起对相应特征的选择。然后修改版面,以便通过把内容放置到容器中而生成文档,其中在满足该版面内的每个约束的条件下,根据所放置内容的一个属性,改变该至少一个容器的至少一维尺寸和/或该至少一个容器在版面内的位置。
文档编号G06T11/60GK1607522SQ200410076909
公开日2005年4月20日 申请日期2004年9月3日 优先权日2003年10月15日
发明者安德鲁·詹姆斯·罗, 劳伦斯·克鲁, 艾伦·韦尔夫·汤尼森, 安德鲁·约翰·惠特菲尔德·金, 拉克伦·詹姆斯·帕特里克 申请人:佳能株式会社
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1