Mathjax: 复杂的文本布局,尤其是 TeX 输入 [原为:MathJax 不支持复杂的文本布局。]

创建于 2013-05-19  ·  23评论  ·  资料来源: mathjax/MathJax

因为 MathJax 查看单个代码点,所以它在处理需要双向性、上下文塑造等的脚本时遇到了麻烦。这在尝试使用希伯来语或阿拉伯语时是可见的。

如果 MathJax 能够识别这些范围并能够将它们保留为块而不是将其划分为单个字符,那就太好了。 至少在 \text 模式下。

http://en.wikipedia.org/wiki/Complex_text_layout

Accepted

最有用的评论

请注意,如果您在配置的HTML-CSSSVG部分中将mtextFontInherit设置为true ,那么 MathJax 会将\text{}作为单个<span> ,因此应该按照您的要求进行。 你是对的,当mtextFontInheritfalse时,MathJax 可以做得更好。 它应该将“未知”字符分组到一个集合中,而不是将每个字符放入单独的<span>中。

所有23条评论

请注意,如果您在配置的HTML-CSSSVG部分中将mtextFontInherit设置为true ,那么 MathJax 会将\text{}作为单个<span> ,因此应该按照您的要求进行。 你是对的,当mtextFontInheritfalse时,MathJax 可以做得更好。 它应该将“未知”字符分组到一个集合中,而不是将每个字符放入单独的<span>中。

PS,我在Wikimedia bugzilla上看到了报告,并计划将其添加到要修复的问题列表中。 感谢您在此处关注问题以进行跟踪。

感谢 mtextFontInherit 提示。 无论如何,我都会启用它,但这是这样做的另一个原因。

v2.3 中添加了对 RTL 的一些支持,但仍然存在将多字符序列视为一个单元的问题。 对于\text{} ,这些字符应该已经组合成一个<span> ,所以这是处理它的一种方法,虽然不是很方便。

理想情况下,MathJax 会将组成一个组的每个序列放入单个<mi><mo>中,就像现在对单个拉丁字母所做的那样。 我在某种程度上对此进行了调查,处理它有一些困难。 可以将组合字符与其前面的字符组合在一起,但我不清楚某些字符是如何工作的。 例如,似乎 virama (U+0D4D) 不仅结合了左侧的字符,还结合了右侧的字符,尽管我可能会误解它。 似乎其中一些分组是由字体中的连字处理的,而不是通过组合字符来处理的。 不幸的是,MathJax 无法访问字体中的连字信息。 虽然可以将连字数据添加到 MathJax 的字体表中,但这可能是大量数据,其中任何一个页面都不会使用这些数据。

我真的对使用这些功能的语言不够熟悉,无法知道我正在尝试的内容是否足够。 我想知道是否有可能从各种语言中获得一些示例,以显示需要适应的情况范围。

一种方法可能是将每种语言脚本所需的数据放入一个单独的扩展中,该扩展为需要它的页面加载(在 MathJax 配置中显式,或通过页面上的数学中的\require{} )。 你认为这可以接受吗?

也许我们 WMF 语言工程的@amire80能够在这里提供一些帮助......

@hartman你觉得你可以戳一下@amire80吗? 我们很乐意改进这一点,特别是如果 Wikipedia 想要更广泛地推出 SVG 输出。

我在这里 :)

我能提供什么帮助?

测试? - 很高兴,请告诉我要准确测试什么。

非拉丁文字如何在公式中工作的示例? - 希伯来语教科书没有使用它,但阿拉伯语和波斯语的教科书使用它。 也许@ebraminio可以在这里插话。

还要别的吗?

感谢您光临@amire80 :-)

我能提供什么帮助?

我希望我们可以改进对非拉丁脚本中组合字符的处理。 这已经反复出现在 WMF bugzilla/phabricator 上。 从https://github.com/mathjax/MathJax/issues/474#issuecomment -38324717 引用 Davide 的话:

理想情况下,MathJax 会将组成一个组的每个序列放入一个要么,就像现在对单个拉丁字母所做的那样。 我在某种程度上对此进行了调查,处理它有一些困难。 可以将组合字符与其前面的字符组合在一起,但我不清楚某些字符是如何工作的。 例如,似乎 virama (U+0D4D) 不仅结合了左侧的字符,还结合了右侧的字符,尽管我可能会误解它。 似乎其中一些分组是由字体中的连字处理的,而不是通过组合字符来处理的。 不幸的是,MathJax 无法访问字体中的连字信息。 虽然可以将连字数据添加到 MathJax 的字体表中,但这可能是大量数据,其中任何一个页面都不会使用这些数据。

我真的对使用这些功能的语言不够熟悉,无法知道我正在尝试的内容是否足够。 我想知道是否有可能从各种语言中获得一些示例,以显示需要适应的情况范围。

所以我们的问题是:是否有人拥有可以与我们分享的专业知识? @hartman很友好地指出了你 ;-)

(也许我们应该把它分成一个单独的问题。)

virama 的(非常)基本思想是辅音 + virama + 辅音的序列具有三个 Unicode 字符,它们看起来占据了一个字形的空间(但它可以变得更加复杂)。

更一般地说,我很想了解 MathJax 目前的情况。 我应该怎么做才能测试当前的渲染? 安装我自己的实例? 或者是否有可以测试当前版本的在线实例?

辅音 + virama + 辅音有 3 个 Unicode 字符,它们看起来占据了一个字形的空间

正确的。 组合字符在数学布局中很常见,因此我们大致了解这种情况。

(但它可能会变得更加复杂)。

那是我们的问题。 我们缺乏大多数自然语言、非拉丁文字的细节。

或者是否有可以测试当前版本的在线实例?

您可以在 MediaWiki(使用数学扩展的 MathML/SVG 模式)、浏览器(此示例此 codepen )中执行此操作,或使用 MathJax 的本地副本——无论您喜欢哪个。

一个基本示例: ത്ര将转换为&#xD24;&#xD4D;&#xD30; ,由于我们没有任何例程来识别这些类型的组合字符,因此 TeX 输入在内部将其转换为 MathML

<math xmlns="http://www.w3.org/1998/Math/MathML">
  <mrow class="MJX-TeXAtom-ORD">
    <mo>&#xD24;</mo>
  </mrow>
  <mrow class="MJX-TeXAtom-ORD">
    <mo>&#xD4D;</mo>
  </mrow>
  <mrow class="MJX-TeXAtom-ORD">
    <mo>&#xD30;</mo>
  </mrow>
</math>

MathJax 输出将依次拆分为三个跨度(在 HTML 输出中)或三个 g(在 SVG 输出中)——当然这会破坏组合字符的呈现。

(我只是注意到 Firefox 有时会在 HTML 输出中组合跨度,例如ത്ര但不是കു_ശ中的下标。Chrome 更“一致”,因为没有任何组合)

所以对我们来说,问题是:是否有一组简洁的数据(或一些有效的启发式方法)可以用来识别我们需要在 MathML 中重新组合成一个 mi/mo 元素的所有相关情况? 一旦我们有了它,渲染也将起作用。

所以对我们来说,问题是:是否有一组简洁的数据(或一些有效的启发式方法)我们可以用来 > 识别我们需要在 MathML 中重新组合成一个 mi/mo 元素的所有相关情况?

很抱歉这么长的评论,将一些场外讨论带回问题跟踪器。

制作 Unicode UCD 数据库的可行性/昂贵程度
为每个字符组合可用于 mathjax 的类? 基本上(或
至少作为一个很好的第一近似值)任何非零字符
组合类(UnicodeData.txt 中的字段 4)需要与
前一个,此外,如果它是第 9 类 (virama),则以下
性格也需要保持在一起。

可能还值得注意的是tex,甚至像xetex这样的unicode tex
或 luatex 几乎可以肯定_不会_在没有
标记
那就是你需要 \text{abc} 或 \mathit{abc} 或其他一些这样的
命令强制将字符串排版为带有
单一字体,而不是 TeX 的正常拆分习惯
一个字一个字。 即使构造_看起来_像一个单一的
作者的性格。

在经典 tex 中,这不是问题,因为字体只能有 256 个字符
虽然可以通过各种宏重新映射技巧来支持组合字符
即使是简单的,也基本上不支持在基础之后的组合字符
组成像急性的口音。

对 unicode tex 变体(如 xetex 和 luatex)的支持似乎有点变数。 在文本中,xetex
把东西交给 HarfBuzz 库,所以做得很好。 luatex 在内部处理它,目前在 virama 上做得不太好。 在数学中,两者都需要一个带有 opentype MATH 表的字体来做任何非常有用的事情,我找不到这种有 virama 的字体。

以下乳胶文档在文本中使用kartika,在数学中使用拉丁现代数学,您会注意到
即使是欧洲口音通常在数学上也会失败,但是如果您在此处添加一些标记\mboxmimtext在 MathML 中等效地添加一些标记,则即使是 virama 示例也有效

图像在顶部显示 xetex,在底部显示 luatex。

因此,虽然不需要像 \text{..} 或 \mbox{...} 这样的字符串是可取的,但它会使您的 unicode 支持远远领先于 TeX 目前可以实现的
所以这有点取决于“类tex语法”的规范是什么,TeX可以做多远才合理推动它?

\documentclass{article}

\usepackage{fontspec}
\usepackage{unicode-math}
\setmainfont{kartika.ttf}


\begin{document}

U+0d24 U+0d4d U+0d30 outputs e.g., ത്ര but 

abc $abc \mbox{ത്ര} $  U+0063

abç $abç \mbox{ത്ര} $ U+00e7

abç $abç \mbox{ത്ര} $  U+0063 U+0327

\end{document}

virama

我不确定我是否理解讨论的内容,但如果这个想法是确定哪些字符序列构成一个单元,那么Unicode 字形聚类应该提供所需的信息。

是的 - @khaledhosny所说的对我来说听起来是正确的,尽管我并不是每个人都对此有经验。 也许@santhoshtr可以提供更多细节。

Santhosh,我认为@pkra上面写的三条评论最好地解释了这个问题。

2015 年 3 月 3 日 12:05,Khaled Hosny [email protected]写道:

我不确定我是否理解讨论的内容,但如果
这个想法是确定哪些字符序列构成一个
单元,然后是 Unicode Grapheme 聚类
http://unicode.org/reports/tr29/#Grapheme_Cluster_Boundaries应该
提供所需的信息..

是的,但我想问题是它对 javascript 的意义有多大
图书馆这样做
如果底层平台没有创建 unicode 属性,则手动
可用的
如果它正在模拟 tex 语法,那么 tex 会走多远? 你知道的一样多
关于 tex 支持任何人。 在 xetex 中到什么程度才合理
让这样的集群在_math_中做任何有意义的事情而不转义为文本
使用\text{..}或一些这样的命令,因为你不能分配
\mathclass 到这样一个集群?

我找到了一个用于字形的 CoffeeScript 实现。
https://github.com/devongovett/grapheme-breaker

可能有用。

感谢所有有用的评论。 总结一下,

  • xetex/luatex 不按本期要求的方式处理输入,即没有额外的标记,例如\text
  • 目前尚不清楚(至少对我而言)是否有计划以这种方式处理它
  • 解决方案可以从 David C 概述的简单方法开始,或者可能建立在 grapheme-breaker 上(感谢@hartman!)

除此之外,

  • 另一方面,对 LaTeXML 和 pandoc 的快速测试表明,它们确实可以处理此处要求的字符,即,不像 xetex/luatex。

所以在我看来,解决方案不能在核心 TeX 输入中,但需要作为扩展。 当然,这不是问题,因为无论如何它可能最终都会延长。

如果 MediaWiki/WMF 社区真的想从这里的 TeX 引擎中描绘出来,那将是很好的选择。

再次获得更多反馈会很好。

  • 在 TeX 的人们,在没有额外标记的情况下以数学模式处理字符是 xetex/luatex/etc 的未来方向吗?
  • 在 MediaWiki / WMF 的人们:相关社区真的需要非标准的 TeX 行为吗?

如果没有更多的反馈,我认为我们应该在此/将其移出 2.6 里程碑。

让我理解这里的问题,人们想做像$x+y=<complex character>$这样的事情,其中<complex character>可能是一个多代码点字素,并且将<complex character>视为数学标识符,对吧? 如果是这样,那么我认为这是一个合理的期望,并且如果当前的 Unicode TeX 引擎不能正确处理它(他们可能没有),这可能是一个错误或缺失的功能,而不是设计使然。

还是人们想做类似$<complex text string>$之类的事情,其中<complex text string>是一个多字符的文本字符串,可能需要复杂的文本布局,并获得正确的文本布局(bidi、shape 等) ? 我不认为这是一个合理的期望,这里需要某种标记来表明这是一个需要这样处理的常规文本字符串。

谢谢,@khaledhosny!

[...] 人们想做像 $x+y= 这样的事情$哪里可能是一个多码点字素,并且有被视为数学标识符,对吗?

是的,我也是这么理解的。 (这有点难说,因为这最初是来自维基百科端的请求)。

我认为这是一个合理的期望

谢谢!

如果当前的 Unicode TeX 引擎不能正确处理它(他们可能没有),它可能是一个错误或缺失的功能,而不是设计使然。

也谢谢你。 “他们可能不会”部分让我有点担心,但如果你和@davidcarlisle同意这是 Unicode TeX 引擎中所需的行为,那么我认为这对我们来说就足够了。


仍然希望 MediaWiki/WMF/Wikipedia 方面能够加入进来。

根据 F2F,我们将从 v2.6 里程碑(即即将发布的版本)中删除它。

目前尚不清楚正确的方法是什么,特别是在与 TeX/LaTeX(或者更确切地说是 XeTeX/LuaTeX)的兼容性方面。 也不清楚 WMF 和维基百科社区在这里真正想要什么。

需要明确的是,我们并没有结束这个问题,我们仍然有兴趣弄清楚在 TeX 输入中复杂的布局可能如何工作。

来自未来的爆炸:有一个 TC39 提案“Unicode 分段”允许(除其他外)通过字形拆分字符串https://github.com/tc39/proposal-intl-segmenter。 该存储库包含一个指向 polyfill 的链接(显然还有一个非标准的 Chrome 功能)。

凉爽的。 谢谢,@pkra。

没问题。 不幸的是,polyfill 没用——它只涵盖英语。 但对于那些想尝试的人来说,chrome 内置可能会很有用。

此页面是否有帮助?
0 / 5 - 0 等级