75

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

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

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

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

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

谢谢!

4

11 回答 11

122

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

因此,您可以简单地为数学块编写以下内容

.. math::

   \frac{ \sum_{t=0}^{N}f(t,k) }{N}

或者,如果您想内联编写,可以使用:

:math:`\frac{ \sum_{t=0}^{N}f(t,k) }{N}`

注意那里的定界反引号。


更新:

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

于 2012-06-27T12:37:34.010 回答
31

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

于 2011-09-06T11:04:53.877 回答
25

这就是我所做的:

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

    .. role:: raw-math(raw)
        :format: latex html
  2. 把你的数学写成

    :raw-math:`$$ \frac{s}{\sqrt{N}} $$`

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

  3. 像这样生成html输出:

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

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

笔记:

  1. 样式表是可选的
  2. 对于 itex2MML 去这里
  3. 您的 html 文件的扩展名应该是 xhtml 或 xml,否则数学将不会显示在您的浏览器中。
于 2010-10-24T11:26:49.740 回答
9

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

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

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

于 2010-08-31T15:39:40.950 回答
6

稍微分解一下您的问题,第一个目标是将乳胶代码逐字输出(<,>,蚀刻的 cgi 转义符除外)到从您选择的轻标记生成的 html 中:一旦有了它,它可以很容易地通过mathJax(强烈推荐)或gozzilli提到的 itex 进行 LaTex'ed。

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

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

选项 1 - 库存剩余:

对于内联数学,只需逐字加上任何你标记你的后处理器正在寻找的东西:``$x<\pi$``。对于多行数学,您需要一个文字块,但您需要为例如 MathJaX 设置一个类属性来解析它,否则它会跳过<pre>标签:

.. class:: mathjax_process

::

  \begin{equation}
    x<\pi
  \end{equation}

选项 2:扩展您的 ReST 处理器

如果你愿意做一些修改来扩展你的 ReST 处理器,你可以获得一个更好的 LaTeX 文字符号,通过为内联乳胶定义一个自定义解释文本角色(例如:latex:`x<\pi`)和一个用于多行数学的自定义指令,例如

.. latex::

  \begin{equation}
    x<\pi
  \end{equation}

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

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

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

于 2010-11-01T05:32:15.627 回答
5

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

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

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

于 2010-08-31T15:45:31.717 回答
5

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

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

然后您可以在文本中使用该角色

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

FAQ 条目还提到了一些其他方法来做到这一点,包括一种预处理器方法,可用于在生成 HTML 时将数学呈现为图像。

于 2010-09-20T14:16:45.153 回答
4

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 阅读器的解决方案,但它似乎没有处理数学的特殊机制;请参阅第 249 期的讨论http://code.google.com/p/pandoc/issues/detail?id=249 我会再仔细研究一下。

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

于 2010-09-02T19:11:12.927 回答
4

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

于 2011-05-30T14:22:27.577 回答
3

为了扩展之前的答案,这就是我如何让MathJaxReSTDocutils一起工作,而不需要 LaTeX:

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

    The radar backscatter coefficient is $\sigma^0$.
    
  2. 将其包含在文件中的某个位置(我把我的放在底部):

    .. 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>
    
  3. 转换为 HTML:

    rst2html report.rst report.html
    
  4. 在现代浏览器中加载 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)还没有(至少不完全;你可以在这里测试你的浏览器的支持)。

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

于 2011-06-30T01:31:08.850 回答
2

而不是 rst2html 使用rst2mathml.py

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

于 2011-03-25T21:36:24.880 回答