OpenXml RTL 布局

问题描述 投票:0回答:1

我有一个 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,我不明白为什么......

ms-word openxml right-to-left
1个回答
0
投票

我无法轻松地将其放入评论中,但是...

处理双向文本相当复杂 - 您只需阅读 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 选择不同的字体来显示奔跑。 (这可能取决于您正在使用的样式的复杂脚本设置的详细信息)。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.