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

Cra*_*ins 51 math markdown latex restructuredtext gedit

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

我选择的编辑器是gedit,我找到了Gedit的reStructuredText工具,它将运行reStructuredText处理器并在gedit的窗格中呈现HTML.这很棒,80%的路在那里.

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

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

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

谢谢!

dev*_*snd 71

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

因此,您只需为数学块编写以下内容即可

.. math::

   \frac{ \sum_{t=0}^{N}f(t,k) }{N}
Run Code Online (Sandbox Code Playgroud)

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

:math:`\frac{ \sum_{t=0}^{N}f(t,k) }{N}`
Run Code Online (Sandbox Code Playgroud)

注意那里的划界反击.


更新:

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

  • 使用Python,\ frac工作正常,你使用原始文本:`":math:`\\ frac {a} {b}````和`r":math:`\ frac {a} {b}`" `应该给出相同的结果. (5认同)

小智 31

自Release 0.8(2011-07-07)以来,对"数学"角色和指令(使用LaTex输入语法)有本机支持.


goz*_*lli 25

这就是我做的:

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

    .. role:: raw-math(raw)
        :format: latex html
    Run Code Online (Sandbox Code Playgroud)
  2. 写下你的数学

    :raw-math:`$$ \frac{s}{\sqrt{N}} $$`
    Run Code Online (Sandbox Code Playgroud)

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

  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,否则数学将不会显示在您的浏览器中.


Mik*_*one 9

LaTeX和ReST是同一问题的两个解决方案(全文档标记),我不确定一个人会幸福地生活在另一个内部.

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

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

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

Jan*_*nus 6

稍微分解你的问题,第一个目标是将乳胶代码输出逐字(除了<,>,蚀刻的cgi-escapes除外)到你选择的光标记生成的html中:一旦你有它,它就会很容易被gozzilli提到的mathJax(强烈推荐)或者itex进行LaTex.

首先,我应该说使用markdown而不是ReST可能会更容易,因为ReST使用\进行转义,因此所有LaTeX都必须受到保护.对于事情如何很好地锻炼身体用一个例子降价mathJax,去玩弄在安装mathoverflow.net.

不过,我会假设您真的需要ReST(和mathJax),在这种情况下,有两种方法:使用库存ReST(以及繁琐的转义),或者将一些LaTeX处理程序添加到docutils.

选项1 - 股票ReST:

对于内联数学,只需使用verbatim以及后处理器正在寻找的任何标签:``$ x <\ pi $``.对于多行数学,你需要一个文字块,但你需要设置一个类属性,例如MathJaX来解析它,否则会跳过<pre>标签:

.. class:: mathjax_process

::

  \begin{equation}
    x<\pi
  \end{equation}
Run Code Online (Sandbox Code Playgroud)

选项2:扩展ReST处理器

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

.. latex::

  \begin{equation}
    x<\pi
  \end{equation}
Run Code Online (Sandbox Code Playgroud)

`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)
Run Code Online (Sandbox Code Playgroud)

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


Phi*_*ipp 5

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

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

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


Geo*_*edy 5

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

.. role:: raw-latex(raw)
    :format: latex
Run Code Online (Sandbox Code Playgroud)

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

The area of a circle is :raw-latex:`$\pi r^2$`
Run Code Online (Sandbox Code Playgroud)

FAQ条目还提到了其他几种方法,包括一种预处理器方法,可用于在生成HTML时将数学呈现给图像.