论从MVC模式审视Word文档设计

Word实际上是一个基于MVC模式的文档排版集成环境。
MVC模式可能是贯穿所有程序员职业的一个比较传统的开发模式:将开发分为Model、View、Controller三层。

其中,
Model层为doc文件中的根本,是指文本及其自带的属性(包括其大纲等级、从属于的样式号、各种行内格式(即不从样式集中设置的所有格式))。Model层表示代表着文档的内容和语义化的结构。
View层为doc的具体呈现,包括样式的格式设置(决定了样式的视觉呈现)、自动页码等。一个形象的理解是,相当于网页中的”换肤“功能,改变View层不影响文档内容。View层表示不包含任何文档的内容或语义化的结构。
Controller层可以体现在用户对Model层、View层的操作与控制,包括Word本身对各种(决定引用关系、如序号、题注)的自动化控制。
(以下简称M层、V层、C层。)

MVC的好处是使得用户在更改任意一个层时,不用以及不会影响到其他层的内容。也就是说,要让M层和V层被C层的方便地控制。
举个栗子,修改标题样式的时候,为所有标题制定标题1,这样可以在主体修改的时候改变样式,二不是每次需求发生变化,都要去寻找标题的位置一个个修改。以下是直观地呈现MVC层模式特点的对话:

MVC模式
M层:我是一段作为文档小标题的文本,我的的样式为:标题3,我的大纲级别为三级。
V层:我是标题3样式,我的格式为:黑体,三号,所以M层的这位老兄你的长相就是黑体,三号。
C层:我要改变所有标题3的字号为4,只用选取样式为标题3的就行了。

非MVC模式
M层:我是一段作为文档小标题的文本,我的格式为:黑体,三号,我的大纲级别没有设置,为默认的正文。
V层:我是标题1样式,我的格式为:黑体,三号,但是并没有什么卵用。
C层:M层没有结构信息,我只能手动查找这些小标题的位置。

基于MVC模式的意义,设计Word文档应该遵循以下原则:

  • 不在M层输入任何应该由程序自动生成的非语义文本。如:手动输入的序号、题注、目录等。
  • 不使用V层去侵占M层内容。如使用带有重要文字内容的图片,使用任何格式上的变化去表现内容等。
  • 减少使用M层去实现V层职责内的功能,尽量用样式集去沟通M层与V层。如:不使用空格控制标题文字间距,不为了避免表格截断等视图呈现的需求而使用分页符,不使用行内格式等。(不使用行内格式很重要的一点是这样格式没有语义性,破坏了m层为内容的原则,会影响文档的可维护性和无障碍性)

在我搜集的论文看来,几乎所有递交的论文在MVC上都设计不足。大多数的问题体现在视图使用m层去控制v层。从主观上来说,这样可能是为了一时的方便,或者作者并不愿意投入精力去学习Word文档设计的基本知识。因此出现了以下荒谬的设计弊端:

  • 没有大纲级别或大纲级别混乱(m层结构缺失)
  • 没有多级标题或多级标题没有对应大纲级别(m层结构缺失)
  • 目录手动制成(m层侵占v层、c层)
  • 缺少题注(m层侵占v层、c层)
  • 使用图片表格(v层侵占m层)
  • 使用文字引用而不是域引用(m层侵占c层)
  • ...

任何递交报告的人都应该使用MVC视角重审自己的文档设计。让Word回归原本的面貌

word 自动插入题注

将以下代码插入到vb宏中运行,即可实现自动插入题注。

Sub 题注()
' 题注 宏
Selection.Find.ClearFormatting
With Selection.Find
.Text = "^p图^#"
.Replacement.Text = " "
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchByte = False
.MatchWildcards = False
.MatchSoundsLike = False
.MatchAllWordForms = False
End With
Selection.Find.Execute
Selection.MoveLeft Unit:=wdCharacter, Count:=1
Selection.MoveRight Unit:=wdCharacter, Count:=1
Selection.InsertCaption Label:="图", TitleAutoText:="InsertCaption4", Title _
:="", Position:=wdCaptionPositionBelow, ExcludeLabel:=0
End Sub

如需清理题注内原有的手动标签,请依次替换"图^#^#"和"图^#",同时查找的样式需要设置为"题注"。

word:一键清理已有的标题序号

之前介绍了如何一键设置多级标题

但对于已经手动设置了多级标题的论文,使用结果是如此蛋疼:

运行结果

注:左方是新加的自动多级标题,右方是残留的手动多级标题。

这种情况是很常见的,此时使用手动删除操作是非常麻烦的。因此需要使用模糊查找、替换功能。

首先介绍一下如何通过通配符进行查找、替换的操作。如下图:

选中“使用通配符”之后,就能使用正则表达式来进行模糊匹配了。

表达式:[0-9]表示单个数字,括号表示其内部为一个子表达式,{1,}表示前面的子表达式最少匹配1次,没有指定最多匹配次数。因此“([0-9]){1,}.([0-9]){1,}.([0-9]){1,} ”正好匹配了三级标题。

注:正式的表达式后面加了一个空格,因为word是默认非贪婪匹配的,如果标题后方不是个位数会造成漏掉后面的数字

同时,我们需要筛选格式,选取段落>大纲级别(设置为当前要清理的级别号),避免清理掉正文内容。

为此,我录制了一个一键清理 标题1 标题2 标题3 内的手动标题的宏。仅限修改手动标题为“X.X.X ”的情况,如有不同需要手动更改代码内

.Text = "([0-9]){1,}.([0-9]){1,2}.([0-9]){1,} "

的表达式。

代码如下:

word:一键设置多级标题样式控制论文排版

多级列表能方便作者控制文档的结构(内容和呈现分离)。

你可以直接设置多级列表,但这样做的弊端就是你必须为所有需要设置列表层级的内容分别设置列表级别,也不能很好地控制大纲有序化,同时不能体现多级标题的语义。

那么问题来了,如何将多级列表链接到样式呢?

步骤如下:

  • 开始>多级列表>定义新的多级列表(如下图)
  • 修改列表样式为合适的样式
  • 选择左下角的“更多”,选择“将级别链接到样式”,需将各个级别链接到相同级别的标题上,即级别n对应标题n。
  • 设置成功后,通过开始>样式里面的标题n来为标题设置n级标题。

word多级列表设置

但是这样做还不能满足要求,因为要对每个新的论文重复如上的操作,那么如何一键设置多级标题呢?

我们可以通过录制宏来讲以上的操作进行录制,并将其设置到快捷按钮或者键盘快捷键录制宏的基本操作)。