总结:对标题样式段落的标题文本的交叉引用极其脆弱,在用户编辑文本的现实世界中无法生存。糟糕的解决方法:对标题样式段落中的非最后一个单词进行所有编辑。在用户不是 Word 专家的环境中,我们如何简单可靠地交叉引用标题文本?
你好。从用户体验的角度来看,这是一个难题,因为很难证明这种行为的合理性。此模板的用户必须能够在文档中创建对程序标题的交叉引用。程序标题是标题 7。此模板中的标题没有(也不会)编号。
任务列将为代表操作顺序的数字。程序列将包含程序标题。您可以猜猜页面列是做什么用的。
预期工作流程:用户将光标放在“程序”行 >“参考”>“交叉引用”>“参考类型=标题”>“标题=程序标题”>“插入参考=标题文本”;重复插入参考=页码。
这就是问题所在。然后,用户更改了程序标题的文本(段落标记未发生改变)并更新了交叉引用:
我们收到错误!未找到参考源。啊。
通过将交叉引用设置为“引用类型=编号项/插入引用=段落文本”,可以解决类似问题。但是,这些标题不会编号,因此无法选择此选项。
反复试验和 XML 揭示了一种意外行为。对标题文本的交叉引用似乎不是对标题文本的引用,而是对书签最初创建时存在的标题文本范围的引用。如果它以任何方式发生变化,而不是对现实世界进行极其具体的更改,则范围不会更新,书签将失败。
下面是交叉引用目标的 XML,用 bookmarkStart 和 bookmarkEnd 包裹:
一切都很美好。
现在我们将程序标题更新为新文本并更新参考文献。(为了减少屏幕截图量,我只更新并截取了对标题文本的引用。但对于页码的引用,存在同样的基本问题,尽管错误文本现在莫名其妙地被表述为错误!书签未定义。)
这太愚蠢了。所有将此范围标识为书签的内容都消失了。用户希望能够更新文本,并且对文本的引用不应被破坏——或者在这种情况下,引用锚点不应被破坏。这些 bookmarkStart 和 bookmarkEnd 标签围绕着该范围,但对范围文本级别的编辑会破坏其周围环境。无论对此有何技术理由,都无关紧要*,因为用户体验非常糟糕。
*示例:编辑现有文本时,会创建一个新范围来保存编辑内容,rsidR 会标识单个编辑范围,以便进行更改跟踪和文档合并。但 bookmarkStart 和 bookmarkEnd 标签不会围绕网络范围,这正是用户所期望的 - 它们仍然静态地包裹原始范围的剩余部分。
我发现了一种情况,在这种情况下,这种方法可以像人们所期望的那样工作!(一个小时前我提到的“非常具体”)。如果用户编辑或替换现有的非最后一个单词,这种方法就可以工作。当编辑内容添加到最后一个单词之前时,这种方法也可以工作。(参见绿色突出显示。)但是!如果更改内容添加到最后一个单词,最后一个单词被替换,或者在最后一个单词之后添加了新文本,这种方法就会超出范围并失败。如果文本被完全替换(如上所述),则整个范围都会被替换。bookmarkStart 和 bookmarkEnd 对现实世界用法的变化的反应并不像普通人所期望的那样好。
那么……对于交叉引用标题文本,有什么简单可靠的答案吗?我是否应该告诉用户每次更新标题文本时都要重新创建交叉引用?那么他们(几乎)最好不要进行交叉引用。
顺便说一句,谢谢你听我的咆哮。:-)
附言:目录并不是答案。文档中列出的每个程序标题的顺序不一定是它们在表格中列出的顺序。更换汽车轮胎所涉及的任务是相同的;任务的顺序决定了您是卸下轮胎还是装上轮胎。
答案1
在这里回复,因为如果您搜索某些书签和交叉引用问题,特别是“编辑书签时最后一个字符丢失”问题,这个页面似乎会出现在谷歌中。我发现了一个略显丑陋但可用的解决方法,可能在某些项目中有效。
就我的情况而言,项目是:我在标签上有用户可编辑的文本,一个 8 位数字。无论他们输入什么数字,我都希望将其复制为数字下方的条形码。
为了实现这一点,我突出显示了用户可编辑的文本,插入了一个书签……然后输入了条形码(使用 Free3of9 之类的字体),突出显示它,并创建了对 8 位数字的交叉引用。因此,条形码编号现在应该与用户输入的任何内容相匹配。
(附言:为了保留条形码字体,您可以右键单击交叉引用,编辑字段,转到左下角的字段代码,然后添加开关 \h * charformat)
无论如何,要解决主要问题:如果用户突出显示数字的最后一位数字并重新输入,则书签会缩短 1 位数字,因为您并没有真正“替换”该数字,而是从技术上讲将其删除一瞬间,然后添加一个新数字,该新数字始终在书签结束后插入。
为了防止这种情况,我在数字末尾添加了一个特殊字符。特殊字符包含在书签中。我认为它是unicode 200B,零宽度空格。您可以在emptycharacter.com上复制它,然后将其粘贴到word中。它是不可见的,但您可能会看到一些东西在垂直方向上略微移动。这个特殊字符之所以有效,是因为它满足了几个需求:
• 它是不可见的且宽度为零,因此即使条形码文本重复了它,条形码仍然可以扫描。
• 如果其他条形码内容需要在可编辑数字后显示,则不会受到影响。
• 如果双击该数字,则不会自动包含空字符,因此您可以替换该数字而不会弄乱书签。
• 如果您只需要更新最后一位或两位数字并突出显示它们,则隐藏的字符不会自动突出显示,(如果您设置了该单词选项,则可能会自动突出显示,部分选择单词会自动抓取整个单词。但我禁用了该选项)
无论如何,它为我解决了这个问题,我可以编辑书签而不会丢失最后一个字符,并且对于最终用户来说,修复是不可见的。
答案2
Doug Robbins 和 Jay Freedman 回答在我的转帖中并且双方都确认没有用户友好的解决方案。有两种选择:
- 编辑标题文本后重新创建交叉引用。
- 编辑标题文本直至最后一个字符(但不包括最后一个字符)。确认交叉引用,然后使用 Delete 键(而不是 Backspace 键)删除最后一个字符,以保留分配给该范围的 bookmarkStart 和 bookmarkEnd。
哎呀……