MS-Word:对自定义引用类型的交叉引用

时间:2018-10-08 14:50:56

标签: ms-word word-vba

我正在尝试将交叉引用添加到SEQ字段中。
我的文档包含“点标题”,这意味着用户可以在两个标题元素之间添加扩展名(1.1和1.2之间可以是1.1A,1.1B等)

以下是点标题代码的样子:
{STYLEREF "HEADING 2" \N}{SEQ "HEADING 2 POINT" \* ALPHABETIC \S 2}
结果为:1.1A

我希望能够对点标题进行交叉引用。
虽然我可以将引用类型设置为“标题”,但是我无法找到如何将其引用到自定义元素。

在网络上搜索并没有发现任何解决方案,但提供了一些可能的线索:

  • This website解释了交叉引用的格式,其中包含具有自定义类型(“我的新标题”)的图像。
  • ReferenceType
  • Microsoft DOC's描述是:The type of item for which a cross-reference is to be inserted. Can be any WdReferenceType or WdCaptionLabelID constant 或用户定义的标题标签

我的客户习惯于使用交叉引用对话框,因此我更喜欢这种方法,但是VBA脚本也将受到赞赏。

谢谢!

更新:

我将尝试描述我的约束条件和环境。
标题1-9用于多级列表项中,因此具有自定义样式。
它们无法更改。

对于描述并回答here的特定任务,我创建了所谓的“指针”。
基本上,“点标题”是用户可以在带有VBA宏的多级编号之间添加的扩展。
假设我有两个标题2项(1.1、1.2),用户可以添加1.1A,然后添加1.1B,依此类推。
用户可以从2级到5级添加点标题。
它们的样式为“标题2点”,“标题3点”等,并且每个样式均基于其相关标题。

如上所述,最终在文档中,单词字段具有以下结构:{STYLEREF "HEADING 2" \N}{SEQ "HEADING 2 POINT" \* ALPHABETIC \S 2}

我的目标是能够交叉引用这些项目,但是它们不会出现在“标题”类型中,因为它们不是“标题”样式。

我希望能够创建一个自定义引用类型,以显示这些项目。

3 个答案:

答案 0 :(得分:1)

经过研究,这是我的答案。希望它将对将来的观众有所帮助。

Private Sub createPointHeader(pointLevel As Integer, Optional appendixPrefix As String = "")
Dim sQuote As String, referencedStyle As String, captionName As String
sQuote = Chr(34)
referencedStyle = appendixPrefix & "Heading " & pointLevel
captionName = referencedStyle & " Point"
With Selection
    .Fields.Add .Range, wdFieldEmpty, "StyleRef " & sQuote & referencedStyle & sQuote & " \n", False
    .Collapse wdCollapseEnd
    CaptionLabels.Add (captionName)
    .InsertCaption Label:=captionName, ExcludeLabel:=True
    ' Select the created field
    .MoveLeft Count:=1, Extend:=True
    ' Replace the syntax from Arabic to Alphabetic
    .Fields.ToggleShowCodes
    With .find
        .Text = "ARABIC"
        .Forward = False
        .Wrap = wdFindStop
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchKashida = False
        .MatchDiacritics = False
        .MatchAlefHamza = False
        .MatchControl = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
        .Execute
        If .Found = True Then
            Selection.Range.Text = "ALPHABETIC \s " & pointLevel
        End If
    End With

    .Fields.ToggleShowCodes
    .Fields.Update
    .MoveRight Count:=1
    .InsertAfter vbTab
    .Collapse wdCollapseEnd
    ' Apply style after .InsertCaption, because it changes the style to Caption
    .Style = ActiveDocument.Styles(referencedStyle & " Point")
    End With
End Sub

少量评论

  • 我有两种样式可依:标题(2-5)和附录标题(2-5)。这就是可选的appendixPrefix作为子变量的原因。
  • 我检查过的
  • CaptionLabels.Add可以得到相同的值。无需事先检查它是否已经存在。
  • Selection.InsertCaption自动将样式更改为标题。这就是为什么我在最后应用样式更改的原因。

结果

  • 指向标题2 的外观如下:
    {STYLEREF "HEADING 2" \N"}{SEQ HEADING_2_POINT \* ALPHABETIC \S 2}

  • 带有标题的文档快照 Point Headings example

  • 最后,根据要求,从“交叉引用”框中交叉引用“点”标题 Cross reference dialog box

答案 1 :(得分:0)

问题询问如何创建对自定义引用类型的交叉引用。我怀疑这个答案可能实际上是对原始申请者的反应。

想法是使用自定义标题标签。自定义标题标签会(理想情况下)出现在“插入/交叉参考”对话框中。

当您说“插入/标题”,然后要求添加新的自定义标签时,会创建一个自定义标题标签。

如果您自己在给定文档中添加了自定义标题标签,那么当您说插入/交叉引用...时,它会自动显示为选择...

但是,当给您一个文档,而其他人已经添加了交叉引用类型并且您想要编辑它时(通过向给定的字幕类型添加其他交叉引用),就会出现困难。这里的秘密是通过使用自定义标签类型创建一个新的临时标题来自己添加自定义标题标签(即使它已经存在)。然后,您可以继续删除临时字幕,但是从那时起,您将能够为该字幕类型添加交叉引用。

当我要引用“代码段”或“框”或“算法”时,使用此代码。

答案 2 :(得分:-1)

我希望能以答复而不是评论的方式答复,因为答复虽然冗长,但希望能使您朝正确的方向前进。

我认为您所引用的要点页面文章已误导了您。

我假设我们无法将样式“标题1”修改为“标题9”。如果可以的话,您将可以修改以下建议,以仅将“标题1”样式转换为“标题9”样式。

您将需要创建一些新样式。我使用了以下样式

Name                   Based on Style  Outline level

Heading Point 1        Heading 1          1  
Heading Point 2        Heading 2          2  
Heading Point 2 Ext    Heading 2          3
Heading Point 3        Heading 3          4
Heading Point 3 Ext    Heading 3          5
Heading Point 4        Heading 4          6
Heading Point 4 Ext    Heading 4          7
Heading Point 5        Heading 5          8
Heading Point 5 Ext    Heading 5          9

请注意正确设置大纲级别对于标题编号很重要。

接下来创建一个新的多级列表。将列表称为“ PointNumbering”(因为这样做,您可以在VBA中通过名称标识列表,如果需要此功能)。将样式'Heading Point 1'到'Heading Point 5 Ext'链接到编号序列的级别1到9(例如,大纲级别1匹配编号序列中的级别1等)。

关闭每个级别的法律样式编号,否则我们将无法使用字母编号。按如下所示设置编号方案。

Level Number style    format levels*   Final Appearance
1     1,2,3,             1                 1
2     1,2,3              1.2               1.1
3     A,B,C              1.23              1.1A
4     1,2,3              1.2.4             1.1.1
5     A,B,C              1.2.45            1.1.1A
6     1,2,3              1.2.4.6           1.1.1.1
7     A,B,C              1.2.4.67          1.1.1.1A
8     1,2,3              1.2.4.6.8         1.1.1.1.1
9     A,B,C              1.2.3.6.89        1.1.1.1.1A
  • 实际级别是从下拉列表中选取的,并在数字格式框中显示为“ 1”。这使得弄错编号非常容易,所以要小心。通过在“此级别的数字样式”框中选择数字格式,可以获取每个级别的最后一个数字。

设置样式并确保将其链接到上述编号方案后,您需要调整当前文档中标题所使用的样式。

进行搜索并替换以进行以下样式替换

Current Style        New Style
Heading 1            Heading Point 1
Heading 2            Heading Point 2 
Heading 3            Heading Point 3
Heading 4            Heading Point 4 
Heading 5            Heading Point 5 

然后对于当前正在使用样式ref和seq字段创建编号的每个扩展标题,删除这些字段并应用相关的Ext标题。

因此,对于“航向点2”之后的A,B,C编号,请应用“航向点2外部”样式。

这现在意味着可以通过交叉引用对话框访问所有标题样式。

如果在“标题6”级别6以及“标题Point 5 Ext”之后的标题下记录标题,则可以照常使用标题样式(标题6至标题9)。但是,每次使用标题6时,您都需要手动重置数字。我认为这比要求用户插入多个styleref和seq字段更容易,因为您只需选择然后右键单击标题编号,然后勾选按钮以启用“高级值(跳过编号)”,即可在其中重置任何级别您当前的标题编号。

如果随后需要为文档创建TOC字段,则现在必须使用\ t开关,并在TOC中提供样式列表以及用于样式的级别编号。例如{toc \ t“航向点1,1,航向点2,2,航向点2 Ext,2,航向点3,3,航向点3 Ext,3 .....等}。

我已经在Word文档中创建并测试了以上所有内容。

enter image description here