使用 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 使用 ReST 和 Docutils,而不需要 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<\pi`
)来获得更好的 LaTeX 文字表示法和用于多行数学的自定义directive,例如
.. latex::
\beginequation
x<\pi
\endequation
如果您使用default-role,内联数学符号甚至可以缩短为`x<\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 中进行数学运算的主要内容,如果未能解决你的问题,请参考以下文章