文字处理器:连续部分的逻辑

时间:2020-03-12 17:13:24

标签: vba architecture rendering application-design wordprocessingml

我今天要写一些离题的东西,因为我喜欢了解它的工作原理,这是在Word处理程序中组成连续部分的过程,正如您从Microsoft Word,Libre Office或Apple Pages知道的那样。

我当前正在编写自己的文字处理器控件。这应该是非常广泛的。我有两个模块。一个负责数据,另一个负责数据的表示。所以第二个是数据类的渲染器。

带有格式化文本的数据文档的结构可以大致描述如下:

Document
  + Section (2 Columns)
    + Paragraph
      + Text
      + Tabstop
      + Text
      + Picture
    + Paragraph
      + Text
  + Section
    ...

因此,我们有一个只有一部分的数据结构,该数据结构又包含两个具有不同内容的段落。 渲染引擎当前将整个内容翻译如下:

Document
  + Page
    + PageColumn (1. Column)
      + Blocks
        + Paragraph
          + Line
            + Text
            + Tabstop
            + Text
            + Picture
          ...
        + Paragraph
          + Line
            + Text
          ...
    + PageColumn (2. Column)
      + Blocks
        ...

渲染器计算数据结构生成的多少行适合一个段落。然后,它再次查看一列中可以容纳多少个块(段落或表格)。如果超过了高度,它将在下一列继续,并在必要时添加新页面。

这意味着目前,我可以显示结构的“固定”部分,即从偶数/奇数/下一页开始的部分。对于绘制控件,这仅意味着,对于每一页,我从左至右输出所有列,其中包含列的内容,然后从上至下绘制块。

但是,在Word,Pages等中,可以在页面上显示连续的部分。示例:

Page
  Section (1 Column)
  Section (2 Columns)
  Section (1 Column)

您如何更改结构才能实现此目的?在具有不止一列的连续部分中,您必须以某种方式预先计算每列中将容纳多少块和行才能获得平衡的显示结果。

有人有建议吗?

非常感谢。 enter image description here

1 个答案:

答案 0 :(得分:1)

具有两列的部分可以使两列之间的文本保持平衡,因为实际上它是跨整个页面的一列。该部分将扩展以容纳文本的总量。输入一些文本似乎在光标移至第2列之前第1列将占用两行文本。当两列保持平衡时,向第2列添加更多文本将使文本跨两列重排,通常在末尾保留两行空白第2列与第1列进行比较。