用LaTeX在reStructuredText中进行math运算

我想用一个轻量级的标记语言来logging我的大学课程。

我select的编辑器是gedit,并且我find了用于Gedit的reStructuredText工具 ,它将运行reStructuredText处理器并在gedit中的窗格中呈现HTML。 这很好,还有80%的路程。

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

我怎样才能使用LaTeX的文件? 那么需要将reST文件处理成LaTeX,然后将其渲染为HTML,还是有更好的方法? 降价会使这容易吗? 如有必要,我可以修改gedit插件。

最后,有没有人这样做? 在纯文本编辑器中使用课堂笔记的其他build议?

谢谢!

从0.8版开始,它本身就受到支持:您不应该再使用任何解决方法。 语法也很简单。 这是一样的乳胶math,但没有封闭$$

所以你可以简单地写一个math模块的以下内容

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

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

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

注意那里的分界线。


更新:

在新版本中,似乎有必要对math元素使用双反斜线,所以它是\\frac而不是\frac

从版本0.8(2011-07-07)开始,本地支持“math”angular色和指令(使用LaTexinput语法)。

这就是我所做的:

  1. 在您的reST文档的开头添加一个mathangular色:

     .. role:: raw-math(raw) :format: latex html 
  2. 写你的math就好

     :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 

    这生成与rst2html html,整理tidy ,然后将latexmath转换成MathML与itex2MML ,在一个XHTML文件输出。

笔记:

  1. 样式表是可选的
  2. 对于itex2MML去这里 。
  3. 您的html文件的扩展名应该是xhtml或xml,否则math将不会显示在您的浏览器中。

LaTeX和ReST是解决同一个问题的两个解决scheme(整个文档标记),我不确定一个人会喜欢在另一个内部生活。

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

我已经看到了使用TeX的一个子集生成一个graphics方程的代码,然后将其拉成HTML或类似的(例如, Trac的LaTeX公式macros ),这可能是最好的解决scheme。

问题是,REST并没有真正的插件。 你可以select一个可扩展的框架,比如Sphinx ; JSMath的插件已经包含在内, MathJax的插件也是可以的。 另外Sphinx使用LaTeX直接构buildPDF文档。

另一个更轻量级的解决scheme是编辑reST模板以包含MathJax,以便您可以在文档中使用MathJax(LaTeX-like)语法。

但通常我只是直接使用LaTeX来处理任何事情 – 这些轻量级标记语言的自定义function对于所有事情来说都不够全面。

Docutils FAQ中的这个项目描述了一种比较容易包含TeXmath的方法。 您首先为解释的文本定义一个angular色,将方程直接传递给LaTeX:

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

那么你可以在你的文本中使用这个angular色

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

常见问题解答条目还提到了一些其他的方法来做到这一点,包括一个预处理器的方法,可以用来生成HTML时,将math渲染到图像。

分解你的问题,第一个目标是逐字地获取乳胶代码输出(除了用于<,>,蚀刻的cgi-escapes)到你select的光标记生成的html中:一旦你有它,可以很容易地被gozzilli提到的mathJax (强烈推荐)或者itex。

首先我应该说使用Markdown而不是ReST可能会更容易,因为ReST使用\来转义,所以所有的LaTeX都必须被保护。 有关markdown和mathJax如何很好地工作的示例 ,请参阅mathoverflow.net中的设置。

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

选项1 – 股票重置:

对于内联math,只要使用verbatim加上你的后置处理器查找的任何标签即可:`$ x <\ pi $“。 对于多行math,你需要一个文字块,但是你需要为例如MathJaX设置一个类属性来parsing它,否则就会跳过<pre>标签:

 .. class:: mathjax_process :: \begin{equation} x<\pi \end{equation} 

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

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

 .. latex:: \begin{equation} x<\pi \end{equation} 

如果使用default-role,则内联math符号甚至可以缩写为`x<\pi`

有几种方法来实现angular色和指令。 我已经到了(大致)下面这个有很好的function,(不像大多数其他的黑客我看到)降级到字面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) 

以上将使用类“乳胶”来标记处理的东西,所以你需要configurationmathJax或相当于寻找这个类。 或者,更改上面的代码,将该类设置为默认的mathJax覆盖类“mathjax_process”。

请注意,0.8版本的docutils(parsingreStructuredText)支持LaTeXmath。 有关许多示例,请参阅http://article.gmane.org/gmane.text.docutils.user/6255 。 “–math-output”选项的选项是:MathML,HTML,MathJax和LaTeX。

Pandoc的markdown扩展允许内联或显示LaTeXmath; 你只是把它放在(直接相邻的)美元符号之间,像这样:$ \ sqrt {-1} $'s,它被视为你所期望的。 我一直都在使用这个function,并不认为这是不切实际的。 请参阅手册http://johnmacfarlane.net/pandoc/README.html#math

一旦markdown被parsing,pandoc就可以编写HTML,LaTeX,ReST,RTF,DocBook,ODT,manpages等等。如果一个LaTeXmath上下文不涉及花哨的LaTeX包,它甚至可以把mathparsing成MathML,所以它立即在HTML或RTF中呈现。 (它提供了许多用于处理非LaTeX文档中LaTeXmath的选项。)

Pandoc也分析了ReST(和HTML,而不是太花哨的LaTeX)。 因此,我曾希望给予ReSt读者一个解决scheme,但似乎没有处理math的专门机器; 请参阅讨论问题249 http://code.google.com/p/pandoc/issues/detail?id=249我会再仔细研究一下看看。;

我不认为有人为Gedit制作了一个pandoc插件(在emacs和TextMate中有详细的支持,我知道) – 那太棒了!

为了扩大以前的答案,这就是我如何得到MathJaxReSTDocutils工作 ,而不需要LaTeX:

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

     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="mathjax/latest/MathJax.js"></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="mathjax/latest/MathJax.js"

src="mathjax/latest/MathJax.js"

我相信原因是FireFox支持MathML,Chrome(Webkit,实际上)还没有(至less不完全;你可以在这里testing浏览器的支持)。

因为我不需要MathML,只需要使用TeX,我使用相应的MathJax版本,现在可以在Chrome中快速加载,而不会出现任何错误。 此外,键入mathTeX风格比MathML风格要快得多。

而不是rst2html使用rst2mathml.py 。

它以乳胶math模式扩展docutils。 该模式的内容被转换为MathML。

我build议NoTex :它已经整合了使用LaTex的rST支持,仅用于表示性的东西和math方程式。 例如在NoTex中,你会首先写一个rSTreplace

 .. |E=mc²| replace:: :math:`E = mc ^ 2` 

然后使用|E=mc²| 你需要的地方; NoTex使用LaTex将其翻译为E=mc² (不包含表示rSTreplace的pipe道符号),并使用MathJax以HTML格式进行相似处理。