使用 LaTeX 在 reStructuredText 中进行数学运算

Posted

技术标签:

【中文标题】使用 LaTeX 在 reStructuredText 中进行数学运算【英文标题】:Math in reStructuredText with LaTeX 【发布时间】:2011-04-06 08:23:38 【问题描述】:

我想在大学课堂上使用轻量级标记语言做笔记。

我选择的编辑器是 gedit,我找到了 reStructuredText Tools for Gedit,它将运行 reStructuredText 处理器并在 gedit 的窗格中呈现 html。这很棒,已经完成了 80%。

但是对于我的许多课程,我需要在笔记中包含数学方程式或希腊字符。虽然我对 LaTeX 不是很熟悉,但我的理解是它具有这些功能。

如何在 reST 文档中使用 LaTeX?是否需要将 reST 文档处理成 LaTeX,然后渲染成 HTML,还是有更好的方法?降价会让这更容易吗?如有必要,我可以修改 gedit 插件。

最后,有人这样做吗?在纯文本编辑器中做课堂笔记还有其他建议吗?

谢谢!

【问题讨论】:

这不是一个答案,只是一个评论:我发现如果数学很复杂,在 LaTeX 中做笔记是非常不可能的。例如,如果您有一个涉及多级有理函数的复杂表达式,您可以使用\frac 或输入一个单行表达式,并希望您不会迷失在括号中。数学家仍然更喜欢纸笔法,因为它是最快的。如果您需要将笔记数字化,请查看以下内容:livescribe.com 或文档扫描仪。数学只是那些不适合快速键盘输入的东西之一。 我的立场是正确的——有些人实际上是在做实时 Texing。 math.berkeley.edu/~anton/index.php?m1=me&m2=TeXadvice 我在 LyX 中做实时笔记(它是一个乳胶前端,基本上可以让你在不写乳胶的情况下编写乳胶 :))。这需要一些练习,但它相当东方。 顺便说一句,原始的 reStPlugin 存储库已死 (404),它已在 github.com/mcepl/reStPlugin 处被抢救(并移植到 Gnome 3) 【参考方案1】:

从 0.8 版开始,它被原生支持:您不应再使用任何解决方法。语法也很简单。它与乳胶数学相同,但没有封闭的$$

所以您可以简单地为数学块编写以下内容

.. math::

   \frac \sum_t=0^Nf(t,k) N

或者如果你想写内联,你可以使用这个:

:math:`\frac \sum_t=0^Nf(t,k) N`

注意那里的定界反引号。


更新:

在较新的版本中,似乎有必要对数学元素使用双反斜杠,所以它是 \\frac 而不是 \frac

【讨论】:

这个答案真的应该排在最前面!其他答案都不错,但也确实过时了。 好吧,也许时间会改变这一点。 :) 很好的答案,尽管使用当前版本你需要:math:`\\frac`。否则它不会占用您的\frac 谢谢,我会更新答案以反映新版本的变化。 使用 Python,\frac 工作正常,如果您使用原始文本:":math:\\fracab"r":math:\fracab@ 987654331@ 应该给出相同的结果。【参考方案2】:

请注意,0.8 版的 docutils(解析 reStructuredText)支持 LaTeX 数学。有关许多示例,请参阅http://article.gmane.org/gmane.text.docutils.user/6255。 “--math-output”选项的选项包括:MathML、HTML、MathJax 和 LaTeX。

【讨论】:

【参考方案3】:

原生支持“数学”角色和指令 (使用 LaTex 输入语法)自 0.8 版 (2011-07-07) 起。

【讨论】:

你说得对,我刚刚在更新日志上找到了:docutils.svn.sourceforge.net/viewvc/docutils/tags/… 谢谢指出! 更好的链接是docutils.sourceforge.net/docs/ref/rst/roles.html#math和docutils.sourceforge.net/docs/ref/rst/directives.html#math【参考方案4】:

为了扩展之前的答案,这就是我如何让 MathJax 使用 ReSTDocutils,而不需要 LaTeX:

    在我的 ReST 源代码中使用 LaTeX 风格的数学,例如:

    The radar backscatter coefficient is $\sigma^0$.
    

    在文件中的某个地方包含这个(我把我的放在底部):

    .. raw:: html
    
    <script type="text/x-mathjax-config">
    MathJax.Hub.Config(
    extensions: ["tex2jax.js"],
    jax: ["input/TeX", "output/HTML-CSS"],
    tex2jax: 
      inlineMath: [ ['$','$'], ["\\(","\\)"] ],
      displayMath: [ ['$$','$$'], ["\\[","\\]"] ],
      processEscapes: true
    ,
    "HTML-CSS":  availableFonts: ["TeX"] 
    );
    </script>
    <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></script>
    

    转换为 HTML:

    rst2html report.rst report.html
    

    在现代浏览器中加载 HTML。 MathJax 脚本会在查看时下载并应用于 HTML。一切对我来说都很棒!

非常感谢http://www.thales.math.uqam.ca/~labbes/Sage/rst2sws/ 的帮助!

更新:我注意到虽然输出 HTML 在 Firefox 中运行良好,但 MathJax 需要很长时间才能在 Chrome 中运行,然后它给出了错误。我通过从

更改最后一行的脚本源来修复它

src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"

src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML".

我相信原因是虽然 FireFox 支持 MathML,但 Chrome(实际上是 Webkit)还不支持(至少不完全支持;您可以测试浏览器的支持 here)。

因为我不需要 MathML,只需要 TeX,所以我使用了相应的 MathJax 版本,它现在可以在 Chrome 中快速加载,没有任何错误。此外,TeX 风格的数学输入比 MathML 风格的输入要快得多。

【讨论】:

来自未来的注意事项:cdn.mathjax.org 即将结束生命周期,请查看mathjax.org/cdn-shutting-down 以获取迁移提示(也许为未来的读者更新您的帖子)。【参考方案5】:

使用rst2mathml.py代替rst2html。

它使用乳胶数学模式扩展了 docutils。此模式的内容被转换为 MathML。

【讨论】:

【参考方案6】:

稍微分解一下你的问题,第一个目标是将乳胶代码输出逐字(除了 的 cgi-escapes,蚀刻。)到从你选择的轻标记生成的 html 中:一旦你有了它在那里,mathJax(强烈推荐)或 gozzilli 提到的itex 可以轻松地对其进行 LaTex'ed。

首先我应该说,使用 markdown 代替 ReST 可能会更容易,因为 ReST 使用 \ 进行转义,所以所有 LaTeX 都必须受到保护。有关使用 markdown 和 mathJax 的效果如何的示例,请在 mathoverflow.net 上进行设置。

尽管如此,我会假设您真的想要 ReST(和 mathJax),在这种情况下,有两种方法:使用普通的 ReST(和繁琐的转义),或者向 docutils 添加一些 LaTeX 处理程序。

选项 1 - 库存剩余:

对于内联数学,只需逐字加上任何你标记你的后处理器正在寻找:``$x<pre> 标签:

.. class:: mathjax_process

::

  \beginequation
    x<\pi
  \endequation

选项 2:扩展 ReST 处理器

如果你愿意做一些修改来扩展你的 ReST 处理器,你可以通过为内联乳胶定义一个自定义解释文本role(例如:latex:`x&lt;\pi`)来获得更好的 LaTeX 文字表示法和用于多行数学的自定义directive,例如

.. latex::

  \beginequation
    x<\pi
  \endequation

如果您使用default-role,内联数学符号甚至可以缩短为`x&lt;\pi`

有几种方法可以实现角色和指令。我已经(大致)到达了以下内容,它具有很好的功能(与我见过的大多数其他黑客不同)它会退化为没有集成后处理的作家的文字 LaTex 代码。

from docutils import nodes, utils
from docutils.parsers.rst import directives, Directive 

class Latex(Directive):
    """ Latex directive to display LaTeX as escaped literal wrapped in
        <pre class="latex">. 
    """
    required_arguments = 0
    optional_arguments = 0
    has_content = True
    def run(self):
        self.assert_has_content()
        prenode=nodes.literal_block(self.block_text,
                                    '\n'.join(self.content),
                                    classes=['latex'])
        return [prenode]
directives.register_directive('latex', Latex)

def latex_role(role, rawtext, text, lineno, inliner, options=, content=[]):
    node = nodes.literal(rawtext,
                         '\(%s\)'%utils.unescape(text, 1),
                         classes=['latex'])
    return [node],[]
register_local_role('latex', latex_role)

上面将使用“乳胶”类来标记要处理的东西,因此您需要配置mathJax 或等效项来查找此类。或者,更改上面的代码以将类设置为“mathjax_process”,这是默认的mathJax 覆盖类。

【讨论】:

【参考方案7】:

这就是我的工作:

    在你的 reST 文档的开头添加一个数学角色:

    .. role:: raw-math(raw)
        :format: latex html

    把你的数学写成这样

    :raw-math:`$$ \fracs\sqrtN $$`

    (如果你想在一个块中使用$$ ... $$,或者如果你想内联使用$ ... $。)

    像这样生成 html 输出:

    rst2html --stylesheet=/path/to/my_beautiful_stylesheet.css my_file.rst \
    | tidy -q | /path/to/itex2MML > my_file.xhtml

    这会生成带有rst2html 的html,使用tidy 整理,然后使用itex2MML 将乳胶数学转换为MathML,输出到xhtml 文件。

注意事项:

    样式表是可选的 对于 itex2MML,请转到 here。 您的 html 文件的扩展名应该是 xhtml 或 xml,否则数学将不会显示在您的浏览器中。

【讨论】:

我发现我还必须将文档类型更改为:ttp://www.w3.org/Math/DTD/mathml2/xhtml-math11f.dtd" rel="nofollow" target="_blank">w3.org/Math/DTD/mathml2/xhtml-math11f.dtd">【参考方案8】:

This item 来自 Docutils FAQ 描述了一种相对容易地包含 TeX 数学的方法。您首先为解释文本定义一个角色,将方程直接传递给 LaTeX:

.. role:: raw-latex(raw)
    :format: latex

然后你可以在你的文本中使用这个角色

The area of a circle is :raw-latex:`$\pi r^2$`

FAQ 条目还提到了执行此操作的其他一些方法,包括可用于在生成 HTML 时将数学呈现为图像的预处理器方法。

【讨论】:

原始方法的问题是您不会得到任何 cgi 转义,因此包括例如小于号会导致 html 无效。【参考方案9】:

Pandoc 的降价扩展允许内联或显示 LaTeX 数学;您只需将它放在(紧邻的)美元符号之间,如下所示:$\sqrt-1$'s 并且它被视为您所期望的。我一直都在使用这个功能,完全不认为这是不切实际的。见手册http://johnmacfarlane.net/pandoc/README.html#math

一旦 markdown 被解析,pandoc 可以编写 HTML、LaTeX、ReST、RTF、DocBook、ODT、manpages 等。如果 LaTeX 数学上下文不涉及花哨的 LaTeX 包,它甚至可以将数学解析为 MathML ,因此它会立即以 HTML 或 RTF 呈现。 (它提供了许多选项来处理非 LaTeX 文档中的 LaTeX 数学。)

Pandoc 还解析 ReST(和 HTML,以及不太花哨的 LaTeX)。因此,我希望提供一个涉及 ReSt 阅读器的解决方案,但它似乎没有处理数学的特殊机制;看issue 249的讨论http://code.google.com/p/pandoc/issues/detail?id=249我会再仔细研究看看。

我认为还没有人为 Gedit 制作 pandoc 插件(我知道,emacs 和 TextMate 中都有详尽的支持)——那太棒了!

【讨论】:

【参考方案10】:

问题是 reST 并没有真正的插件。你可以选择一个可扩展的框架,例如Sphinx; JSMath 的插件已经包含在内,MathJax 的插件也是可能的。此外,Sphinx 使用 LaTeX 直接构建 PDF 文档。

另一个更轻量级的解决方案是编辑 reST 模板以包含 MathJax,这样您就可以在文档中使用 MathJax(类似 LaTeX)的语法。

但通常我只是将 LaTeX 直接用于任何严肃的事情——这些轻量级标记语言的自定义功能还不够全面。

【讨论】:

为 rst2html.py 编写自定义指令以包含 Mathjax 块并不难。或者您可以使用 raw 指令将 mathjax 部分直接传递给 html 编写器。【参考方案11】:

LaTeX 和 ReST 是同一问题(整个文档标记)的两种解决方案,我不确定其中一个是否会快乐地生活在另一个中。

首先是 LaTeX,然后是 ReST:LaTeX 需要精确定位印刷元素以布置方程式(以及其他所有内容)。 ReST 不会将 LaTeX 输出(PostScript 或类似的)作为输入。 首先是 ReST,然后是 LaTeX:您必须为 ReST 编写输出 LaTeX 代码的输出格式化程序,并在 ReST 中定义扩展名,以防止它误解您的方程式或其他显式 TeX。您从 LaTeX 输出的内容仍将类似于 PostScript 或 PDF。

我已经看到使用 TeX 子集生成图形方程的代码,然后将其拉入 HTML 或类似内容(例如,Trac's LaTeX Formula macro),这可能是最好的解决方案。

【讨论】:

我想我不想在整个文档中使用 LaTeX,因为它太冗长了。 在很多情况下,你根本不需要 LaTeX:如果你只是想要数学排版,你可以使用 LaTeX 的一个子集。有几个系统可以处理这些子集,尤其是 mathJax 是一个非常令人印象深刻的 javascript 实现。

以上是关于使用 LaTeX 在 reStructuredText 中进行数学运算的主要内容,如果未能解决你的问题,请参考以下文章

华科LaTeX模板使用指北

华科LaTeX模板使用指北

华科LaTeX模板使用指北

华科LaTeX模板使用指北

Latex和 lyx到底区别在哪 ?

Matplotlib 中文用户指南 4.7 使用 LaTeX 渲染文本