專利名稱:用于最佳段落排版的方法和計算機可讀介質(zhì)的制作方法
背景技術:
當用戶將文本鍵入字處理應用程序或其它類型的頁面排版應用程序時,該程序?qū)⒅鹦械卣故舅I入的文本,并周期性地在適當?shù)狞c上“斷開”文本流以便移到新的行。該斷行處理通常導致一個或多個段落,每個段落由具有標記每一行的起點和終點的斷點的一個或多個行來定義。在字處理應用程序和其它頁面排版程序中產(chǎn)生的一個共同問題是確定每一行應在段落中的何處斷開的問題。
大多數(shù)字處理應用程序逐行地斷開文本,并且不考慮相鄰各行的格式化。例如,大多數(shù)字處理應用程序通過格式化從段落的第一個字符開始的第一行,并尋找該行的最佳斷點來開始。在定位最佳斷點時要考慮的一些因素包括,段落是右對齊還是兩端對齊、該行上是否允許壓縮、是否允許用連字符連接、以及其它因素。在定位第一行的最佳斷點之后,該應用程序繼續(xù)用類似方式格式化從第一行斷點之后的第一個字符開始的第二行。每個后面的行都用相同方法格式化。
最佳段落排版算法由Donald Knuth教授開發(fā)用于TeX程序。由Knuth開發(fā)的該算法考慮了所有可能方法來將段落斷開成行。特別地,該算法計算損失函數(shù)(Penalty Function)來估算每種將段落斷開成行的方法的質(zhì)量?;谶@些結果,該算法選擇最佳方法來斷開該段落。由Knuth陳述的方法通過改進兩端對齊段落和右對齊段落的各行之間空格的均勻分布來改進文本的排版質(zhì)量。為了在線性時間內(nèi)實現(xiàn)這些優(yōu)點,Knuth算法應用了動態(tài)規(guī)劃技術。
盡管由Knuth提供的算法提供了眾多的優(yōu)點,但是它并非沒有缺點。特別地,Knuth算法只能斷開具有預定義幾何關系的頁面的文本。該算法不包括附于字符流中特定點并可置于頁面上任何地方的圖表,它在格式化期間會改變頁面的幾何關系。因為Knuth提供的算法只允許各個字之間的對齊(壓縮或擴展),所以它不用允許字內(nèi)對齊的語言或在字之間不具有空格的語言中的文本來操作。此外,Knuth算法無法在某些較差排版情形中-通常是只有極小對齊機會的狹窄欄中-產(chǎn)生可接受的格式化結果。在這些情形中,Knuth算法僅產(chǎn)生溢出右邊界的行,并且向用戶通知相關錯誤。在字處理應用程序的環(huán)境中,向終端用戶提供這樣的結果是無法接受的。
本發(fā)明的各個實施例就是參照這些和其它考慮而作出的。
發(fā)明內(nèi)容
根據(jù)本發(fā)明,以上和其它問題由最佳段落排版的方法和計算機可讀介質(zhì)來解決。根據(jù)本發(fā)明各實施例,提供了一種段落排版算法,它在利用字內(nèi)對齊的語言或不利用字之間空格的語言中能夠很好地工作,它對可置于頁面上任何地方的圖表也能很好地工作,甚至還提供較差情形中的格式化結果。
根據(jù)本發(fā)明一實施例,提供用于排版文本段落的計算機實現(xiàn)方法和計算機可讀介質(zhì)。根據(jù)該方法,可產(chǎn)生一個或多個版式節(jié)點,表示段落中部分或全部文本的可能版式。版式節(jié)點還包括標識頁面幾何形狀的任何改變的數(shù)據(jù),在該頁面上排版文本作為標識節(jié)點所指定版式的結果。版式節(jié)點通過將節(jié)點池中的版式節(jié)點標識為當前節(jié)點來產(chǎn)生。該池中的第一標識節(jié)點是空節(jié)點。通過將下一文本行的每個可能變體都添加到當前版式節(jié)點,新的版式節(jié)點從當前的版式節(jié)點創(chuàng)建。這樣,新的版式節(jié)點產(chǎn)生為當前節(jié)點加上下一行文本上的每個可能斷點。
還可對每個新生成的版式節(jié)點計算損失。具有比逐行格式化處理期間所計算的最大損失小的損失的每個版式節(jié)點被添加到節(jié)點池中。然后從節(jié)點池中移除當前的版式節(jié)點。在下一輪中,當前的版式節(jié)點是具有最低損失的版式節(jié)點。該過程重復,直到只有表示整個文本段落的單個版式節(jié)點保留在節(jié)點池中。
根據(jù)本發(fā)明一實施例,損失函數(shù)被假設為通過定義“可接受排版限制”開始。必須在該限制之外格式化的行被視為是非常差的行,并根據(jù)一不同規(guī)則集來計算其損失。特別地,如果一行被視為非常差,則其損失基于它引入該頁面的空格數(shù)來計算。結果,非常差的行具有較大的損失,但是它們損失的增長比不被視為非常差的行的損失慢得多。結果是,在嘗試改進其它較差行的質(zhì)量時不將尚可接受的行轉換成非常差的行。這使得該算法能產(chǎn)生甚至在具有狹窄欄的某些較差排版情形中也不溢出右邊界的合理版式。
根據(jù)本發(fā)明另一實施例,通過首先產(chǎn)生文本的逐行段落版式來確定該段落的最大損失,排版過程可得以優(yōu)化。根據(jù)一實施例,通過迭代地逐行處理文本行來定位每一行的最佳可能斷點,可執(zhí)行逐行段落排版。行服務組件可用來提供文本的可能行斷點集。而且,可緩存由行服務組件產(chǎn)生的格式化和可能斷點信息,以改進段落排版過程期間的性能。還可采用其它類型的逐行算法。
在逐行段落排版期間,損失函數(shù)還可用來計算段落中每一行的損失。此外,根據(jù)一實施例,可標識在與遵從逐行版式的段落相同頁面上的任何圖表。該信息可在以后用來確保該段落的另一版式不會使這些圖表被擠到后續(xù)頁面上。
根據(jù)本發(fā)明另一實施例,通過合并在文本中同一點上結束的版式節(jié)點,段落排版過程可得以優(yōu)化。特別地,確定節(jié)點池內(nèi)是否有節(jié)點在文本中的同一點結束。如果版式節(jié)點在同一點上結束,則再確定各版式節(jié)點的幾何關系是否不同于頁面上的對象結果。如果各版式節(jié)點的幾何關系不同于頁面上的對象結果,則從節(jié)點池中刪除在同一點結束的比其它(各)節(jié)點具有更高損失的(各)節(jié)點。這導致較少的計算,因為沒有考慮會導致整個段落的更高最終損失的節(jié)點。
根據(jù)另一實施例,還可從節(jié)點池中移除使得版式的任一圖表在逐行排版期間被擠到后續(xù)頁面的版式節(jié)點。性能優(yōu)化還可通過確定在節(jié)點池中是否存在比預定義閾值數(shù)量更多的節(jié)點來進行。如果在節(jié)點池中存在太多的節(jié)點,則可從節(jié)點池中移除具有最高損失的一些版式節(jié)點。這樣,排版算法的性能可通過較少節(jié)點池的尺寸來改進。
本發(fā)明可被實現(xiàn)為計算機進程、計算系統(tǒng)、或諸如計算機程序產(chǎn)品或計算機可讀介質(zhì)的制造品。計算機程序產(chǎn)品可以是計算機可讀的并編碼用于執(zhí)行計算機進程的指令的計算機程序的計算機存儲介質(zhì)。該計算機程序產(chǎn)品還可以是計算系統(tǒng)可讀的并編碼用于執(zhí)行計算機進程的指令的計算機程序的載波上的傳播信號。
參閱以下詳細說明和附圖,表征本發(fā)明的這些和各個其它特征以及優(yōu)點將變得顯而易見。
圖1是示出本發(fā)明各個實施例利用并提供的計算機系統(tǒng)的計算機系統(tǒng)體系結構圖;圖2是示出本發(fā)明各實施例中利用的若干軟件組件的各方面的軟件體系結構圖;圖3A-3D是示出文本的示例性段落和該段落的若干可能段落版式的各方面的框圖;圖4A-4C和5是示出用于提供根據(jù)本方面一實施例的最優(yōu)段落版式的示例性例程的流程圖;圖6是示出將圖4A-4C和5中所示的例程應用于文本的示例性段落中的框圖。
具體實施例方式
現(xiàn)在參看附圖,其中類似標號表示類似元件,將描述本發(fā)明各方面和示例性操作環(huán)境。圖1和以下討論旨在提供一種本發(fā)明可在其中實現(xiàn)的適當計算環(huán)境的簡要一般說明。盡管本發(fā)明將在結合運行于個人計算機操作系統(tǒng)上的應用程序執(zhí)行的程序模塊的一般上下文中進行說明,本領域技術人員將理解本發(fā)明也可結合其它程序模塊實現(xiàn)。
通常,程序模塊包括執(zhí)行特定任務或?qū)崿F(xiàn)具體抽象數(shù)據(jù)類型的例程、程序、組件、數(shù)據(jù)結構、以及其它類型的結構。此外,本領域技術人員將理解本發(fā)明可在其它計算機系統(tǒng)配置中實踐,包括手持式裝置、多處理器系統(tǒng)、基于微處理器的或可編程的電器消費品、小型計算機、大型計算機等等。本發(fā)明還可在任務由經(jīng)通信網(wǎng)絡鏈接的遠程處理裝置執(zhí)行的分布式計算環(huán)境中實踐。在分布式計算環(huán)境中,程序模塊可被置于本地和遠程存儲器存儲設備中。
現(xiàn)在參看圖1,將描述用于實現(xiàn)本發(fā)明各實施例的計算機2的說明性計算機體系結構。在圖1中所示的計算機體系結構示出常規(guī)桌面或膝上型計算機,包括中央處理單元5(“CPU”)、包括隨機存取存儲器9(“RAM”)和只讀存儲器11(“ROM”)11的系統(tǒng)存儲器7、以及將存儲器耦合到CPU 5的系統(tǒng)總線12。包含有助于如起動時在計算機元件間傳送信息的基本例程的基本輸入/輸出系統(tǒng)(BIOS)存儲在ROM 11中。計算機2還包括用于存儲操作系統(tǒng)16、應用程序和其它程序模塊的大容量存儲裝置14,該大容量存儲裝置14將在下面進行更詳細的描述。
大容量存儲裝置14通過連接到總線12的大容量存儲控制器(未示出)連接到CPU 5。大容量存儲裝置14及其相關聯(lián)計算機可讀介質(zhì)提供計算機2的非易失性存儲。盡管包含在此的計算機可讀介質(zhì)的描述指向諸如硬盤或CD-ROM盤的大容量存儲裝置,本領域技術人員應理解計算機可讀介質(zhì)可以是計算機2能訪問的任何可用介質(zhì)。
作為示例而非限制,計算機可讀介質(zhì)可包括計算機存儲介質(zhì)和通信介質(zhì)。計算機存儲介質(zhì)包括以任何方法或技術實現(xiàn)、用于存儲諸如計算機可讀指令、數(shù)據(jù)結構、程序模塊或其它數(shù)據(jù)等信息的易失性和非易失性介質(zhì)、可移動和不可移動介質(zhì)。計算機存儲介質(zhì)包括但不限于RAM、ROM、EPROM、EEPROM、閃存或其它固態(tài)存儲器技術、CD-ROM、數(shù)字多功能盤(DVD)或其它光學存儲技術、磁盒、磁帶、磁盤存儲器或其它磁性存儲設備、或任何其它可用于存儲所需信息并可由計算機2訪問的介質(zhì)。
根據(jù)本發(fā)明各實施例,計算機2可使用諸如因特網(wǎng)的網(wǎng)絡18與遠程計算機的邏輯連接在網(wǎng)絡化環(huán)境中操作。計算機2可通過與總線12連接的網(wǎng)絡接口單元20與網(wǎng)絡18相連。應理解,網(wǎng)絡接口單元20也可被用于與其它類型的網(wǎng)絡和遠程計算機系統(tǒng)相連。計算機2還可包括輸入/輸出控制器22,用于接收和處理來自包括鍵盤、鼠標或電子筆(未在圖1示出)的眾多裝置的輸入。類似地,輸入/輸出控制器22可提供對顯示屏、打印機、或其它類型的輸出裝置的輸出。
如上簡述,眾多程序模塊和數(shù)據(jù)文件可被存儲于計算機2的大容量存儲裝置14和RAM 9中,包括適于控制網(wǎng)絡化個人計算機的操作的操作系統(tǒng)16,諸如來自華盛頓州Redmond微軟公司的Windows操作系統(tǒng)。大容量存儲裝置14和RAM 9還可存儲一個或多個程序模塊。特別地,大容量存儲裝置14和RAM 9可存儲字處理應用程序10。如本領域技術人員所眾所周知的,字處理應用程序10可操作,來提供用于創(chuàng)建和編輯諸如文檔24的電子文檔的功能。根據(jù)本發(fā)明一實施例,字處理應用程序10包括來自微軟公司的MICROSOFT WORD字處理應用程序。然而,應理解,可利用來自其它制造商的其它字處理應用程序來體現(xiàn)本發(fā)明的各個方面。還應理解,執(zhí)行文檔排版功能的其它類型的應用程序可用于本發(fā)明的各方面。例如,本發(fā)明的各個實施例可用于桌面出版程序、演示程序、web瀏覽器、以及利用文檔中文本段落的任何其它類型程序。
結合字處理文檔的編輯,字處理應用程序10提供用于在文檔24中排版文本段落的功能。字處理應用程序10可與排版管理器26通信,以幫助文檔24的格式化,包括文本段落的排版。如以下要更詳細描述的,排版管理器26向字處理應用程序10和在計算機2上執(zhí)行的任何其它程序提供排版服務。特別地,排版管理器26執(zhí)行以最優(yōu)方法排版文本段落的算法。有關排版管理器26的操作的其它細節(jié)將參照圖2-6提供。
現(xiàn)在參看圖2,將提供有關諸如字處理應用程序10的客戶機應用程序與排版管理器26之間交互的其它細節(jié)。如上簡述,排版管理器26向應用程序10提供文檔排版服務。特別地,應用程序10可與排版管理器26通信,以請求存儲在后備存儲器34中文檔24的各部分的排版。為便于與排版管理器26通信,應用程序10可實現(xiàn)在圖2中被示為回調(diào)代碼32的一個或多個回調(diào)例程。通過使用回調(diào)代碼32,排版管理器26可向應用程序10查詢排版文檔各部分所必須的附加信息。
如以下將要更詳細地描述的,排版管理器26提供用于排版文本段落的實用程序。排版過濾器響應于來自應用程序10的請求提供這些實用程序來排版段落。應用程序10的文檔管理器30可與排版管理器26通信,以請求排版段落。文檔管理器30還可向排版管理器26提供來自文檔的應當排版到段落中的文本和其它內(nèi)容。文檔管理器30開始時可向排版管理器26提供部分內(nèi)容。然后排版管理器26可從回調(diào)代碼32請求排版文本所需的附加內(nèi)容。文檔管理器30還可向排版管理器26指明要排版的文本樣式。例如,文檔管理器30可向排版管理器26指明排版文本所需的字體樣式、尺寸和其它信息。
在排版文本段落的過程期間,排版管理器26可利用行服務組件27的服務。該行服務組件27是語言無關的,并可操作以相對單行文本提供服務。特別地,行服務組件27可產(chǎn)生一段文本的可能斷點集??赡艿臄帱c包括(對西方語言而言)空格字符、連字符、以及在語法上正確的字內(nèi)斷點。行服務組件27還可確定對任何語言而言在哪里可作字符間對齊。根據(jù)本發(fā)明各實施例,由行服務組件27產(chǎn)生的斷行信息可由排版管理器26緩存,以改進段落排版過程期間的性能。
如以下將要更詳細地討論的,由行服務組件27產(chǎn)生的斷點信息可由在排版管理器26內(nèi)執(zhí)行的損失函數(shù)利用,以確定哪些斷點以及因此哪些文本段落優(yōu)于其它。損失函數(shù)通過計算段落中每一行的損失來計算每個段落的“損失”。會影響損失計算的因素是與良好對齊機會的數(shù)量成對比的分布在行上的空格的數(shù)量,或者與壓縮機會的數(shù)量成對比的要壓縮的數(shù)量。其它因素可包括該行是否具有連字符、前一行或后一行是否用連字符連接、以及連續(xù)各行之間的長度差??衫玫牧硪灰蛩厥翘囟ㄟB字符的“質(zhì)量”。例如,像字“automobile”的如“auto-mobile”的連字符連接是比“automo-bile”更好的選擇。可利用字典來確定一個連字符連接比另一個更好。損失函數(shù)還可利用其它因素。
根據(jù)本發(fā)明各實施例,排版管理器26所利用的損失函數(shù)可基于要分析的文本來進行不同的計算。特別地,首先可定義可接受的排版樣式限制。可對位于所定義的可接受排版樣式限制內(nèi)的各行計算第一損失。在這些情形中,由先前的斷行算法利用的損失函數(shù)提供了一個良好的解決方案。然而,對位于合理排版樣式范圍之外各行可利用第二損失。這些行被視為是非常差的行。該第二損失根據(jù)行引入頁面的空格來計算。結果,非常差的行具有較大的損失,但是它們損失的增長比不被視為非常差的行的損失慢得多。結果是,在嘗試改進其它較差行的質(zhì)量時不將尚可接受的行轉換成非常差的行。這使得該算法能產(chǎn)生甚至在不具有足夠?qū)R機會的某些較差排版情形中也不溢出右邊界的合理版式。
一旦排版管理器26以所述方式對文本排版,格式化結果36就被傳遞回文檔管理器30。響應于接受格式化結果36,文檔管理器30可操作來更新由應用程序10保持的顯示樹38?;趯υ擄@示樹38的改變,應用程序10可更新其呈現(xiàn)輸出40,以向用戶顯示格式化結果。有關應用程序10和排版管理器26的操作的附加細節(jié)如下參照圖3-6提供。
現(xiàn)在參看圖3A-3D,將描述示例性段落50的各方面。如圖3A所示,段落50包括一段文本。在所示示例中,文本僅包括一個句子,但是任何長度的文本可以所述方式進行格式化。還可指定在確定段落50的適當版式時相關的頁邊52。特別地,通常需要在一行末端和頁邊52之間留最少量空白的同時避免與頁邊52交叉。
圖3B-3D中所示的段落版式54A-54C示出段落50的許多可能版式中的若干版式。特別地,版式54A和54B是三行版式,而版式54C是兩行版式。版式54C被認為是最合適的,因為與版式54A和54B相比每一行留有最少的空白。應理解,許多其它版式是可能的,并且在從眾多可能版式中選擇最佳版式時可考慮除空白量之外的許多其它因素。
現(xiàn)在參看圖4A-4C,將描述示出由排版管理器26執(zhí)行的用于排版段落的過程的說明性例程400。應理解,盡管在此所述的本發(fā)明各實施例在排版管理器26和字處理應用程序10的環(huán)境中演示,但本發(fā)明可用于其它類型的必須格式化文本行的應用程序。例如,可在電子制表應用程序、演示應用程序、或制圖或計算機輔助設計應用程序內(nèi)利用本發(fā)明各實施例。
當參閱在此所示例程的討論時,應理解本發(fā)明各實施例的邏輯操作被實現(xiàn)為(1)運行于計算系統(tǒng)上的計算機實現(xiàn)動作或程序模塊序列和/或(2)計算系統(tǒng)中相互連接的機器邏輯電路或電路模塊。該實現(xiàn)是取決于實現(xiàn)本發(fā)明的計算系統(tǒng)性能要求所作的選擇。因此,如圖4A-4C所示的以及組成在此所述的本發(fā)明各實施例的邏輯操作可被分別稱為操作、結構化裝置、動作或模塊。本領域技術人員將理解,這些操作、結構化裝置、動作和模塊可用軟件、固件、專用數(shù)字邏輯、及其任意組合來實現(xiàn)而不背離本發(fā)明精神和范圍,如在此陳述的權利要求所述。
例程400從操作402開始,其中排版管理器26從客戶機應用程序(例如字處理應用程序10)中獲得要格式化的文本,包括其屬性。例程400然后繼續(xù)到操作402,其中排版管理器26指導行服務組件27,將整個文本段落格式化為具有無限頁邊的一行,并在該行內(nèi)標識所有的可能斷點。該行服務組件在操作406上執(zhí)行該任務,并將格式化結果返回給排版管理器26。在操作404,排版管理器26緩存與該段落相關聯(lián)的所有格式化信息以及由行服務組件27提供的斷點信息。然后例程400從操作404繼續(xù)到操作408。
在操作408,產(chǎn)生該段落的逐行格式。在逐行段落格式化過程期間,計算該段落的最大損失。此外,可標識包含該段落的頁面上的眾多圖表。如下將要更詳細描述地,該信息被用來優(yōu)化段落排版過程。以下將描述用于執(zhí)行逐行段落排版的說明性例程500。從操作408,例程400繼續(xù)到操作410。
在操作410,創(chuàng)建用于存儲一個或多個版式節(jié)點的節(jié)點池。該節(jié)點池是配置成將表示段落格式的版式節(jié)點存儲到備份存儲器34中特定點的數(shù)據(jù)結構。從操作410中,例程400繼續(xù)到操作412,其中第一版式節(jié)點被添加到節(jié)點池中。該第一版式節(jié)點是空的,并表示零行段落的部分版式。然后例程400繼續(xù)到操作414,其中當前的版式節(jié)點被標識為節(jié)點池中具有最少內(nèi)容的版式節(jié)點。然后例程400從操作414繼續(xù)到操作416。
在操作416,創(chuàng)建新的版式節(jié)點。特別地,創(chuàng)建對應于當前版式節(jié)點加上文本下一行的每個可能變體的眾多新的版式節(jié)點。為了產(chǎn)生這些節(jié)點,行服務組件27在操作418標識遵從當前版式節(jié)點的該文本行的所有可能斷點。然后從操作420計算每個新創(chuàng)建版式節(jié)點的損失。然后例程400從操作420繼續(xù)到操作422。
在操作422,每個新創(chuàng)建的排版節(jié)點都被添加到節(jié)點池中,這些節(jié)點都具有比在逐行排版期間計算的最大損失小的損失。具有較大損失的版式節(jié)點不被添加到節(jié)點池中,因為逐行版式提供比這些節(jié)點好的版式,并已經(jīng)完成了計算。然后例程400從操作422繼續(xù)到操作424中。
在操作424,確定節(jié)點池中的任何節(jié)點是否在文本中的同一位置上結束。如果沒有兩個或多個節(jié)點在同一位置上結束,則該例程400繼續(xù)到操作426。在操作426,確定在同一位置上結束的節(jié)點的幾何關系是否因為呈現(xiàn)在包含這些節(jié)點的頁面上的對象而不同。如果該幾何關系并沒有不同,則可假設有較大損失的節(jié)點將使最后的格式化段落也具有較大損失。因此,在這些情形中,具有較大損失的節(jié)點可從節(jié)點池中移除,并不再作進一步的考慮。
如果在操作428,確定在同一點上結束的節(jié)點的幾何關系因為頁面上的對象而不同,則例程400分支到操作432,如下所述。如果幾何關系并沒有不同,則例程400繼續(xù)到操作430,其中從節(jié)點池移除具有較大損失的一個或多個匹配節(jié)點。然后例程400繼續(xù)到操作432,其中從節(jié)點池移除當前節(jié)點。然后例程400從操作432繼續(xù)到操作434。
在操作434,從節(jié)點池中移除將使得版式的任一圖表在逐行排版期間被擠到后續(xù)頁面的版式節(jié)點。然后例程400繼續(xù)到操作436,其中確定是否已經(jīng)找到了格式化結果。特別地,當在節(jié)點池中僅保留表示整個文本段落的單個版式節(jié)點時,將定位一格式化結果。如果找到了格式化結果,則例程400分支到操作442,如下所述。否則,例程400繼續(xù)到操作438。
在操作438,確定節(jié)點池中版式節(jié)點的數(shù)量是否超過了預定數(shù)量。如果節(jié)點數(shù)量未超過節(jié)點的閾值數(shù)量,則例程400分支回到以上所述的操作414。如果節(jié)點數(shù)量的確超過了閾值,則例程400繼續(xù)到操作440,其中從節(jié)點池中移除具有最大損失的一些版式節(jié)點。這樣,這些節(jié)點將不作考慮,而計算格式化結果所必需的時間量將減少。從操作440,例程400返回到如上所述的操作414。
在操作442,版式管理器26調(diào)用行服務組件27來重建格式化結果中的各行。這在操作444上發(fā)生。然后例程400繼續(xù)到操作446,其中由排版管理器26刪除段落緩沖區(qū)。行服務組件27在操作448上刪除其緩沖區(qū)。然后例程400從操作446繼續(xù)到操作450,在那里例程結束。
現(xiàn)在參看圖5,將描述用于執(zhí)行逐行段落排版的說明性例程500。特別地,例程500在操作502開始,其中段落中的第一行被標識為當前行。然后例程500繼續(xù)到操作504,其中定位當前行的最佳可能斷點。這可通過與行服務組件27通信,并請求該行服務組件27產(chǎn)生該行的所有可能斷點來實現(xiàn)。該過程在操作506上進行。一旦已標識所有的可能斷點,排版管理器26就可計算每一行的損失,并選擇每一行的最佳可能斷點。應理解,該過程相對每一行進行,而不考慮來自其它行的損失。從操作504,例程500繼續(xù)到操作508。
在操作508,確定是否還有其它文本行要處理。如果還有要處理的文本行,則例程500從操作508繼續(xù)到操作510,其中段落中的下一行被標識為當前行。然后例程500從操作510返回到操作504,其中所述處理再次發(fā)生。
如果在操作508確定沒有其它行要處理,則例程500從操作508分支到操作512。在操作512,逐行段落的總損失通過累加該段落中每一行的單行損失來計算。該總損失用來消除對版式節(jié)點的損失大于逐行段落的損失的可能版式節(jié)點加以考慮。
從操作512,例程500繼續(xù)到操作514,其中在標識逐行格式化之后呈現(xiàn)在與段落相同頁面上的任何圖表。如上所述,可從節(jié)點池中移除使任一這些圖表被擠到后續(xù)頁面的節(jié)點。從操作512,例程500繼續(xù)到操作516,其中它返回到操作410,如上參照圖4所述。應理解,圖5所示的方法僅是執(zhí)行逐行排版的一種方法,并且可利用其它方法。
應理解,以上參照圖4A-4C和5所述的處理僅排版一個段落。可另外進行多輪在此所述的各個操作,來處理文檔所有頁面的所有段落。還應理解,圖4A-4C和5中所示的處理僅僅是說明性的,其它處理例程可用來排版段落內(nèi)的各行。
現(xiàn)在參看圖6,將描述以上參照圖4A-4C和5所述的例程在示例性文本段落50中的應用。特別地,圖6示出每一次等待操作后在節(jié)點池60中呈現(xiàn)的標識節(jié)點62A-62G。開始時,節(jié)點池60包括空節(jié)點62A。在第一輪之后,節(jié)點池60包括表示文本第一行的兩種可能格式的版式節(jié)點。特別地,節(jié)點池60包含版式節(jié)點62B和62C。版式節(jié)點62B是第二輪的當前節(jié)點,因為它包含最少的內(nèi)容。
在第二輪期間,第二行的每個可能變體被加入版式節(jié)點62B。結果,版式節(jié)點62D和62E被加入該節(jié)點池。節(jié)點62D因為它具有比節(jié)點62E大的損失而被移除。節(jié)點62B因為它是第二輪的當前節(jié)點而被移除。節(jié)點62E因為它具有比所計算的逐行格式64更大的損失而被從節(jié)點池移除。因此,節(jié)點62C被選為第三輪的當前節(jié)點。
在第三輪期間,第二行的每個可能變體被添加到版式節(jié)點62C。結果,版式節(jié)點62F和62G被加入該節(jié)點池。節(jié)點62C因為它是當前節(jié)點而被移除。節(jié)點62F因為它具有比逐行格式更大的損失而被移除。在第四輪,版式節(jié)點62G是最后剩下的節(jié)點,并且它表示整個段落50。因此,版式節(jié)點62G被選為最優(yōu)的最適合的段落版式。
基于前述內(nèi)容,應當理解本發(fā)明各實施例包括用于最優(yōu)段落排版的方法、系統(tǒng)、裝置和計算機可讀介質(zhì)。以上說明書、示例和數(shù)據(jù)提供了對本發(fā)明組成的制造和使用的完整描述。因為可作出本發(fā)明的許多實施例而不背離本發(fā)明的精神和范圍,本發(fā)明駐留于此后所附的權利要求中。
權利要求
1.一種用于在頁面上排版文本段落的方法,所述方法包括從當前版式節(jié)點產(chǎn)生文本的一個或多個版式節(jié)點,每個版式節(jié)點包括有數(shù)據(jù),所述數(shù)據(jù)將段落的可能版式的表示到備份存儲中的一點,并標識由版式節(jié)點定義的段落排版所引起的頁面幾何形狀的任何改變;產(chǎn)生文本的逐行段落排版以確定段落的最大損失;對每個生成的版式節(jié)點計算損失;將具有比該段落的最大損失小的損失的每個版式節(jié)點添加到節(jié)點池中;從所述節(jié)點池中移除當前版式節(jié)點;以及重復產(chǎn)生、計算、添加和移除操作,直到只有表示整個文本段落的單個節(jié)點保留在節(jié)點池中,其中產(chǎn)生所述段落的逐行版式包括迭代地處理文本來定位每一文本行的最佳可能斷點,通過累加段落中每一文本行的損失來計算逐行段落版式的損失,標識在執(zhí)行該段落的逐行排版之后在包含該段落的頁面上的任何圖表,并從節(jié)點池中移除使在逐行排版期間所標識的任一圖表被擠到下一頁面的所有版式節(jié)點。
2.如權利要求1所述的方法,其特征在于,計算損失包括定義可接受的排版樣式限制;確定行的損失是否超過所述可接受的排版樣式限制;以及響應于確定行的損失超過了所述可接受的排版樣式限制,不基于排版樣式規(guī)則而利用第二損失函數(shù)來計算行的損失。
3.如權利要求2所述的方法,其特征在于,計算損失包括標識所述行上的一組對齊機會;確定在可接受排版樣式的限制內(nèi)每一個對齊機會可擴展或壓縮的量;計算所述行上可能的擴展和壓縮的總量;以及基于所述行的理想寬度、所述行的實際寬度、以及可能的擴展和壓縮量來計算損失。
4.如權利要求3所述的方法,其特征在于,產(chǎn)生一個或多個版式節(jié)點包括將所述節(jié)點池中的版式節(jié)點標識為當前節(jié)點;以及通過將下一文本行的每個可能變體添加到當前版式節(jié)點,來從當前版式節(jié)點創(chuàng)建一個或多個新的版式節(jié)點。
5.如權利要求4所述的方法,其特征在于,所述當前節(jié)點是所述節(jié)點池中具有最少內(nèi)容量的版式節(jié)點。
6.如權利要求5所述的方法,還包括確定所述節(jié)點池內(nèi)是否有任何版式節(jié)點在文本中的同一點處結束;響應于確定所述節(jié)點池內(nèi)的兩個或多個節(jié)點在文本中的同一點處結束,確定各版式節(jié)點的每一個內(nèi)定義的幾何關系是否不同于頁面對象的結果;以及響應于確定所述幾何關系不同于頁面對象的結果,移除在文本的同一點處結束的比在同一點處結束的其它節(jié)點具有更高損失的版式節(jié)點。
7.如權利要求6所述的方法,還包括緩存所述段落的格式化信息,以在排版所述段落期間使用。
8.如權利要求7所述的方法,還包括確定在節(jié)點池中的節(jié)點數(shù)量是否超過節(jié)點的閾值數(shù)量;以及響應于所述節(jié)點池中的節(jié)點數(shù)量超過節(jié)點的閾值數(shù)量,從所述節(jié)點池中移除具有最高損失的一些版式節(jié)點。
9.一種具有存儲其上的計算機可執(zhí)行指令的計算機可讀介質(zhì),所述計算機可執(zhí)行指令在由計算機執(zhí)行時將使計算機從當前版式節(jié)點產(chǎn)生文本的一個或多個版式節(jié)點,每個版式節(jié)點包括有數(shù)據(jù),所述數(shù)據(jù)將段落的可能版式表示到備份存儲中的一點,并標識由版式節(jié)點定義的段落排版所引起的頁面幾何形狀的任何改變;產(chǎn)生文本的逐行段落排版以確定段落的最大損失;標識在執(zhí)行所述段落的逐行排版之后在包含所述段落的頁面上的任何圖表;對每個生成的版式節(jié)點計算損失;將具有比所述段落的最大損失小的損失的每個版式節(jié)點添加到節(jié)點池中;從所述節(jié)點池移除使在逐行排版期間所標識的任一圖表被擠到下一頁面的所有版式節(jié)點;從所述節(jié)點池中移除當前版式節(jié)點;以及重復產(chǎn)生、計算、添加和移除操作,直到只有表示整個文本段落的單個版式節(jié)點保留在節(jié)點池中。
10.如權利要求9所述的計算機可讀介質(zhì)還包括計算機可執(zhí)行指令,所述計算機可執(zhí)行指令在由計算機執(zhí)行時將使計算機定義可接受的排版樣式限制;確定行的損失是否超過所述可接受的排版樣式限制;以及響應于確定行的損失超過了所述可接受的排版樣式限制,基于行引入到頁面的空格量而計算該行的損失。
11.如權利要求10所述的計算機可讀介質(zhì),還包括計算機可執(zhí)行指令,所述計算機可執(zhí)行指令在由計算機執(zhí)行時將使計算機緩存所述段落的格式化信息,以在排版所述段落期間使用。
12.如權利要求11所述的計算機可讀介質(zhì),其特征在于,產(chǎn)生一個或多個版式節(jié)點包括將所述節(jié)點池中的版式節(jié)點標識為當前節(jié)點;以及通過將下一文本行的每個可能變體添加到當前版式節(jié)點,來從當前版式節(jié)點創(chuàng)建一個或多個新的版式節(jié)點。
13.如權利要求12所述的計算機可讀介質(zhì),其特征在于,所述當前節(jié)點是所述節(jié)點池中具有最少內(nèi)容的版式節(jié)點。
14.如權利要求13所述的計算機可讀介質(zhì)還包括計算機可執(zhí)行指令,所述計算機可執(zhí)行指令在由計算機執(zhí)行時將使計算機確定所述節(jié)點池內(nèi)是否有任何版式節(jié)點在文本中的同一點處結束;響應于確定所述節(jié)點池內(nèi)的兩個或多個版式節(jié)點在文本中的同一點處結束,確定各版式節(jié)點的每一個內(nèi)定義的幾何關系是否不同于頁面對象的結果;以及響應于確定所述幾何關系不同于頁面對象的結果,移除在文本中同一點處結束的比在同一點處結束的其它節(jié)點具有更高損失的版式節(jié)點。
15.如權利要求14所述的計算機可讀介質(zhì)還包括計算機可執(zhí)行指令,所述計算機可執(zhí)行指令在由計算機執(zhí)行時將使計算機緩存所述段落的格式化信息,以在排版所述段落期間使用。
全文摘要
提供用于最優(yōu)段落排版的方法和計算機可讀介質(zhì)。根據(jù)該方法,產(chǎn)生逐行段落排版以確定一個段落的最大損失。可產(chǎn)生一個或多個版式節(jié)點,將表示段落的可能版式的數(shù)據(jù)存儲到備份存儲中的一點,該數(shù)據(jù)還標識由版式節(jié)點定義的段落排版所引起的頁面幾何形狀的任何改變。還可對每個新生成的版式節(jié)點計算損失。具有比逐行格式化處理期間所計算的最大損失小的損失的每個版式節(jié)點被添加到節(jié)點池中。該過程重復,直到只有表示整個文本段落的單個版式節(jié)點保留在節(jié)點池中。
文檔編號G06F17/25GK1794222SQ200510126790
公開日2006年6月28日 申請日期2005年11月18日 優(yōu)先權日2004年12月20日
發(fā)明者A·布拉戈, C·E·安曼, S·耿金, E·科亨, V·E·科濟列夫, A·A·蘇哈諾夫, I·茲韋列夫 申請人:微軟公司