从主文档进行交叉引用:“错误:未找到参考源”

从主文档进行交叉引用:“错误:未找到参考源”

当在主文档中创建对子文档中项目的交叉引用(在我的情况下是对编号列表项的引用)时,引用似乎工作正常,但是当主文档更新时,引用更改为Error: Reference source not found。例如:

文档结构:

Master.odt
--> Subdocument.odt

子文档.odt:

1. Clause
2. Clause

更新前的Master.odm:

See clause 2.

更新后的Master.odm:

See clause Error:Reference source not found

在花了几个小时在网上寻找解决方案却无济于事后,我终于做了一些实验,看看能否弄清楚文档文件内部发生了什么。我将其作为自答问答分享,希望它对未来遇到同样问题的用户有用。

答案1

背景(如果对解决方案的工作原理不感兴趣,请跳过)

通常,当您在单个文档中创建交叉引用时,所引用的列表项的内容将放置在<text:bookmark-start/><text:bookmark-end/>标签内,并带有一个text:name包含唯一标识号的属性。然后,交叉引用将使用此属性,以便 Writer 可以搜索文件以找到原始书签并更新交叉引用的内容。例如:

1. List item
Cross-reference to 1

在文件内部实现如下content.xml

<text:list-item>
  <text:p text:style-name="P2">
    <text:bookmark-start text:name="__RefNumPara__6070_2182758442"/>
      List item
    <text:bookmark-end text:name="__RefNumPara__6070_2182758442"/>
  </text:p>
</text:list-item>
<text:p text:style-name="P1">
  Cross-reference to <text:bookmark-ref text:reference-format="number-all-superior" text:ref-name="__RefNumPara__6070_2182758442">1</text:bookmark-ref>
</text:p>

当 Writer 在更新过程中遇到交叉引用时,它将在文件中搜索带有__RefNumPara__6070_2182758442并使用它来更新交叉引用。

回到问题中的例子,子文档内部的情况content.xml 任何交叉引用都是这样的:

<text:list-item>
    <text:p text:style-name="P1">
        Clause
    </text:p>
</text:list-item>
<text:list-item>
    <text:p text:style-name="P1">
        Clause
    </text:p>
</text:list-item>

经过交叉引用后,主文档content.xml包含如下内容:

<text:p text:style-name="P1">
    See clause <text:bookmark-ref text:reference-format="number-all-superior" text:ref-name="__RefNumPara__5977_2182758442">2</text:bookmark-ref>
</text:p>

问题是带有__RefNumPara__5977_2182758442不存在于子文档中。这是因为在主文档中所做的编辑不会保存到子文档中,因此在更新时交叉引用时创建的书签会丢失。

解决方案(手动)

解决方法是首先创建交叉引用在子文档中。因此,在问题的子文档示例中,编辑文件以包含对项目编号 2 的交叉引用,例如:

1. Clause
2. Clause2

其中第二个单词“Clause”后面的数字“2”是项目编号的交叉引用。这会导致 LibreOffice 为其分配一个具有唯一标识符的书签,如本答案中的第一个示例所示。您现在可以删除交叉引用并保存文件。使此解决方法奏效的原因是,即使您删除交叉引用,LibreOffice 也不会删除书签标签。您现在可以继续在主文档中创建交叉引用。更新后引用不会丢失,因为书签存在于子文档中。

解决方案(自动化)

这种解决方法有点烦人,特别是如果你正在尝试起草一份复杂的文档,其中包含数十或数百个对子文档中编号项目的交叉引用(就像我的情况一样)。一个潜在的自动化解决方案是准备子文档中的所有编号项目以供交叉引用,方法是运行一个脚本,该脚本会编辑content.xml并在每个标签内插入书签<text-list-item>,注意以与开放文档标准兼容的方式创建唯一标识符。如果我在某个时候创建​​了这样的脚本,我会编辑这个答案来分享它。

相关内容