問題を少し分解すると、最初の目標は、選択したライト マークアップから生成された html にラテックス コード出力を逐語的に取得することです (<、>、etch の cgi エスケープを除く)。mathJax (強く推奨) またはgozzilliで言及されているitex で簡単に LaTex 化できます。
最初に、ReST ではエスケープに \ を使用するため、ReST の代わりにマークダウンを使用する方がおそらく簡単であると言わなければなりません。そのため、すべての LaTeX を保護する必要があります。markdownとmathJaxがうまく機能する例については、mathoverflow.netのセットアップを試してみてください。
それにもかかわらず、私はあなたが本当に ReST (および mathJax) を必要としていると仮定します。その場合、2 つの方法があります: ストック ReST (および面倒なエスケープ) を使用するか、いくつかの LaTeX ハンドラーを docutils に追加します。
オプション 1 - ストックレスト:
インライン計算の場合は、単に verbatim に加えて、ポストプロセッサが探しているタグを付けるだけです: ``$x<\pi$``。複数行の数学の場合、リテラル ブロックが必要ですが、MathJaX などのクラス属性を設定して解析する必要があります。それ以外の場合は<pre>
タグをスキップするためです。
.. class:: mathjax_process
::
\begin{equation}
x<\pi
\end{equation}
オプション 2: ReST プロセッサを拡張する
ReST プロセッサを拡張するためにちょっとしたハッキングを行う場合は、インライン ラテックス用のカスタムの解釈されたテキストロール(例: ) と複数行の数学用:latex:`x<\pi`
のカスタムディレクティブを定義することで、LaTeX リテラルのより優れた表記法を取得できます。例えば
.. latex::
\begin{equation}
x<\pi
\end{equation}
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)
上記では、クラス「latex」を使用して処理対象をマークするため、このクラスを探すにはmathJaxまたは同等のものを構成する必要があります。または、上記のコードを変更して、クラスをデフォルトのmathJaxオーバーライド クラスである「mathjax_process」に設定します。