微软Word:更改默认字体中缺失字符的字体

4

我正在尝试使用Microsoft Word中的VBA自动化大型文档上高度重复的操作。

情况是这样的:我有一个包含许多特殊字符(例如❨(U+2768)和❩(U+2769))的技术文本。该文本主要采用Cambria字体排版,但某些特殊字符在此字体中找不到。但是,我确实知道文档中使用的所有字符都存在于DejaVu Sans Mono中。因此,除了无法在此字体中显示的字符外,我希望所有字符都采用Cambria字体,而这些字符应该采用DejaVu Sans Mono字体显示。

在Microsoft Word 2007中,我可以轻松地通过Ctrl+A,将字体设置为DejaVu Sans Mono,再将字体设置为Cambria来实现这一点。第二次更改字体只会更改那些可以在Cambria中显示的字符的字体。

然而,在Microsoft Word 2010中,这显然不起作用。每个字符都获得了Cambria字体,并且显示了未在Cambria中找到的字符的方框问号符号。

为了克服这个问题,我转向了VBA。更改给定字符的字体非常容易,例如:

Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
Selection.Find.Text = ChrW(10088)
Selection.Find.Replacement.Text = ChrW(10088)
Selection.Find.Replacement.Font.Name = "DejaVu Sans Mono"
Selection.Find.Execute Replace:=wdReplaceAll

然而,为(C(DejaVu) ∖ C(Cambria)) ∩ C(Doc)中的每个字符编写上述代码并不是非常有趣。其中,C(DejaVu), C(Cambria)和C(Doc)分别是DejaVu Sans Mono、Cambria和我的文档中所有字符的集合。
是否有任何(相对简单)的方法可以自动完成这个过程?毕竟,Microsoft Word知道哪些字符在Cambria中找到,哪些没有。我希望所有那些在Cambria中找不到的字符都能使用DejaVu Sans Mono字体。

肯定会更容易编写代码,将所有特殊字符放在第二个字体(DejaVu)中。您不希望这样做的原因是什么? - Fionnuala
@Remou:一般来说,Cambria 和 DejaVu Sans Mono 这两种字体搭配起来不太好看。但像 U+2768 这样的字符非常特别,所以这不重要。此外,大多数“特殊字符”实际上在 Cambria 中都是可用的。另外,你如何定义特殊字符?希腊字母算不算特殊字符? - Andreas Rejbrand
Word 不知道哪些字符存在于哪种字体中。这留给终端用户使用具有所需字形的字体。 - Todd Main
1个回答

0

那会如何帮助OP的问题呢?链接的答案只是提供了一种用另一种字体替换的方法,不是吗? - Pekka
我猜因为我的答案被引用了,所以我会说只有在循环中识别并替换字符时才会有帮助。递归肯定比使用Selection.Find更快,后者使用了某种正则表达式引擎,这会使字符检测通过至少多一次。但是上面的代码也可以修改为使用数组和像Select Case Case Array(ChrW(10088), ChrW(10087)) Case Else 'Do nothing End Select这样简单的东西来完成任务。 - Todd Main
我只是想帮忙。对我造成的所有麻烦表示抱歉 :| - Meihua

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接