稍微分解一下您的问题,第一个目标是将乳胶代码逐字输出(<,>,蚀刻的 cgi 转义符除外)到从您选择的轻标记生成的 html 中:一旦有了它,它可以很容易地通过mathJax(强烈推荐)或gozzilli提到的 itex 进行 LaTex'ed。
首先我应该说使用 markdown 代替 ReST 可能会更容易,因为 ReST 使用 \ 进行转义,所以所有 LaTeX 都必须受到保护。有关使用markdown和mathJax 效果如何的示例,请在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覆盖类。