我有一个 OpenXML 文件,但我不完全理解 word 如何在该文档中绘制字母。
<w:p>
<w:pPr>
<w:bidi/>
</w:pPr>
<w:r>
<w:t>W</w:t>
</w:r>
<w:r>
<w:rPr>
<w:rtl/>
</w:rPr>
<w:t>T</w:t>
</w:r>
<w:r>
<w:t>J</w:t>
</w:r>
</w:p>
为什么结果是JTW?
我尝试将布局重写为
<w:p>
<w:pPr>
<w:bidi/>
</w:pPr>
<w:r>
<w:t>W</w:t>
</w:r>
<w:r>
<w:t>T</w:t>
</w:r>
<w:r>
<w:t>J</w:t>
</w:r>
</w:p>
现在单词显示它像 WTJ,我不明白为什么......
我无法轻松地将其放入评论中,但是...
处理双向文本相当复杂 - 您只需阅读 Unicode 算法 即可理解。我不知道Word的算法是否相同,但我认为它可能很复杂。
AIUI 看到这一点的方法是,在对文本进行排序时,Word 不独立处理每个 Run 的文本,而是将具有“相同方向”的 Run 组合成块。在 Bidi 段落中,它将第一个块放在right,下一个块放在其左侧,依此类推。
假设您有一个 RTL 段落,并且您使用 LTR 键盘/输入法在 Word 中输入文本“ABCDEFGHI”。那么文本看起来像
ABCDEFGHI
,并且它可能会在一次运行中以 XML 形式表示,例如
<w:r><w:t>ABCDEFGHI</w:t></w:r>
但是,如果您选择
DEF
并将其设置为粗体,Word 将需要将运行分成三个运行,因此您会得到如下所示的内容:
<w:r><w:t>ABC</w:t></w:r>
<w:r><w:rPr><w:b/></w:rPr><w:t>DEF</w:t></w:r>
<w:r><w:t>GHI</w:t></w:r>
但是您看到的文字仍然显示为
ABCDEFGHI
,而不是 GHIDEFABC
。
现在选择
DEF
并将其设置为RTL,您可以通过选择DEF并使用VB编辑器的立即模式来执行
Selection.RtlRun
现在您看到该段落看起来像
GHIDEFABC
,XML 看起来更像
<w:r><w:t>ABC</w:t></w:r>
<w:r><w:rPr><w:b/><w:rtl/></w:rPr><w:t>DEF</w:t></w:r>
<w:r><w:t>GHI</w:t></w:r>
即与您的第一个示例类似的结构。
你看不到看到的是DEF颠倒过来,即你没有看到
GHIFEDABC
,那是因为拉丁字母A-Z等是“强”LTR,所以Word仍然将用完的部分放在LTR中尽管存在 <w:rtl>
元素,但方向。但 DEF 的外观确实发生了变化,因为 Word 还使用(在本例中) <w:bCs/>
标记其运行,即粗体复杂脚本,并且与 <w:rtl/>
元素结合使用,导致 Word 选择不同的字体来显示奔跑。 (这可能取决于您正在使用的样式的复杂脚本设置的详细信息)。