Немного разбирая вашу проблему, первая цель - получить дословный вывод латексного кода (кроме cgi-escapes для <,>, etch.) В html, сгенерированный из выбранной вами легкой разметки: как только она у вас естьтам он может легко быть LaTex'ed с помощью mathJax (настоятельно рекомендуется) или itex , как упомянуто gozzilli.
Сначала я должен сказать, что используя уценку вместо ReSTбыло бы проще, потому что ReST использует \ для выхода, поэтому весь LaTeX должен быть защищен.Для примера того, как хорошо работают вещи с markdown и mathJax , попробуйте поиграть с настройкой на mathoverflow.net .
Тем не менее, Я предполагаю, что вы действительно хотите ReST (и mathJax), и в этом случае есть два пути впереди: использовать стандартный ReST (и громоздкое экранирование), или добавить некоторые обработчики LaTeX к документам.
Option1 - Stock ReST:
Для встроенной математики просто используйте дословно плюс любые теги, которые ищет ваш постпроцессор: `` $ x <\ pi $ ``.Для многострочной математики вам нужен литеральный блок, но вам нужно установить атрибут класса, например, для MathJaX, чтобы проанализировать его, так как в противном случае он пропускает теги <code><pre>:
.. class:: mathjax_process
::
\begin{equation}
x<\pi
\end{equation}
Option 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 по умолчанию.