Математика в реструктурированном тексте с помощью LaTeX - PullRequest
48 голосов
/ 31 августа 2010

Я бы хотел использовать легкий язык разметки, чтобы делать заметки на занятиях в колледже.

Мой предпочтительный редактор - gedit, и я нашел reStructuredText Tools для Gedit , который запустит процессор reStructuredText и отобразит HTML на панели в gedit. Это здорово, и 80% пути туда.

Но для многих моих занятий мне нужно включать математические уравнения или греческие символы в свои заметки. Хотя я не очень знаком с LaTeX, я понимаю, что у него есть эти возможности.

Как я могу использовать LaTeX в документе reST? Нужно ли обрабатывать документ reST в LaTeX, затем переводить в HTML, или есть лучший способ? Будет ли уценка сделать это проще? При необходимости я могу изменить плагин gedit.

Наконец, кто-нибудь делает это? Любые другие предложения для того, чтобы делать заметки класса в текстовом редакторе?

Спасибо!

Ответы [ 12 ]

62 голосов
/ 27 июня 2012

Начиная с версии 0.8 она изначально поддерживается: вам больше не нужно использовать обходной путь. Синтаксис также очень прост. Это то же самое, что латексная математика, но без вложения $$

Таким образом, вы можете просто написать следующее для математического блока

.. math::

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

Или, если вы хотите написать inline, вы можете использовать это:

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

обратите внимание на разделительные метки там.


UPDATE:

в более новых версиях, кажется, необходимо использовать двойной обратный слеш для математических элементов, поэтому \\frac, а не \frac

31 голосов
/ 06 сентября 2011

Существует встроенная поддержка "математической" роли и директивы (с использованием входного синтаксиса LaTex) начиная с версии 0.8 (2011-07-07).

25 голосов
/ 24 октября 2010

Вот что я делаю:

  1. Добавьте роль по математике в начале вашего документа reST:

    .. role:: raw-math(raw)
        :format: latex html
  2. Напишите математику как

    :raw-math:`$$ \frac{s}{\sqrt{N}} $$`

    (используйте $$ ... $$, если хотите, чтобы он был в блоке, или $ ... $, если хотите, чтобы он был встроен.)

  3. Создать вывод html следующим образом:

    <code>rst2html --stylesheet=/path/to/my_beautiful_stylesheet.css my_file.rst \
    | tidy -q | /path/to/itex2MML > my_file.xhtml

    Это генерирует html с rst2html, приводит в порядок tidy и затем преобразовывает латексную математику в MathML с itex2MML, выводя в файл xhtml.

Примечания:

  1. Таблица стилей необязательна
  2. Для itex2MML перейдите здесь .
  3. Расширение вашего html-файла должно быть xhtml или xml, иначе математика не будет отображаться в вашем браузере.
9 голосов
/ 31 августа 2010

LaTeX и ReST - это два решения одной и той же проблемы (разметка всего документа), и я не уверен, что одному будет приятно жить внутри другого.

  • Сначала LaTeX, затем ReST: LaTeX необходимо точно позиционировать типографские элементы, чтобы выложить уравнения (и все остальное). ReST не будет принимать вывод LaTeX (PostScript или аналогичный) в качестве ввода.
  • Сначала ReST, затем LaTeX: вам нужно написать выходной форматер для ReST, который выводит код LaTeX, и определить расширения в ReST, чтобы предотвратить неправильное толкование ваших уравнений или другого явного TeX. Ваш вывод из LaTeX все равно будет похож на PostScript или PDF.

Я видел код для использования подмножества TeX для генерации графического уравнения, которое затем перетаскивается в HTML или аналогичный (например, Макрос формулы LaTeX Trac ), который может быть лучшим доступным решением. .

6 голосов
/ 01 ноября 2010

Немного разбирая вашу проблему, первая цель - получить дословный вывод латексного кода (кроме 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:&#x60;x<\pi&#x60;) и пользовательская директива для многострочной математики, например,

.. latex::

  \begin{equation}
    x<\pi
  \end{equation}

Встроенная математическая запись может быть даже сокращена до &#x60;x<\pi&#x60; если вы используете 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 по умолчанию.

5 голосов
/ 20 сентября 2010

Этот пункт из часто задаваемых вопросов по Docutils описывает один способ относительно простого включения математики TeX.Сначала вы определяете роль для интерпретируемого текста, который передает уравнение непосредственно в LaTeX:

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

Затем вы можете использовать эту роль в вашем тексте

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

В записи FAQ также упоминаетсянесколько других способов сделать это, включая подход препроцессора, который может использоваться, чтобы представить математику к изображению, генерируя HTML.

5 голосов
/ 31 августа 2010

Проблема в том, что у reST действительно нет плагинов.Вы можете выбрать расширяемый фреймворк, такой как Sphinx ;плагин для JSMath уже включен, и плагин для MathJax также возможен.Кроме того, Sphinx использует LaTeX для непосредственного создания документов PDF.

Еще одно более легкое решение состоит в редактировании шаблона reST для включения MathJax, чтобы вы могли просто использовать синтаксис MathJax (LaTeX-like) в документе.*

Но обычно я просто использую LaTeX напрямую для чего-то серьезного - возможности настройки этих облегченных языков разметки просто не являются исчерпывающими для всего.

4 голосов
/ 30 мая 2011

Обратите внимание, что версия 0.8 документации (которая анализирует reStructuredText) имеет поддержку математики LaTeX. См. http://article.gmane.org/gmane.text.docutils.user/6255 для многих примеров. Для параметра «--math-output» доступны следующие варианты: MathML, HTML, MathJax и LaTeX.

3 голосов
/ 30 июня 2011

Чтобы расширить предыдущие ответы, вот как я получил MathJax , работающий с ReST и Docutils , без необходимости LaTeX:

  1. Использовать математику в стиле LaTeX в моем источнике ReST, например:

    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="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"></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="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) еще нет (по крайней мере, не полностью; вы можете проверить поддержку вашего браузера здесь ).

Поскольку мне не нужен MathML, только TeX, я использую соответствующую версию MathJax, и теперь она быстро загружается в Chrome без каких-либо ошибок. Кроме того, для вас будет гораздо быстрее печатать в стиле TeX, чем в стиле MathML.

3 голосов
/ 02 сентября 2010

Расширение уценки Pandoc позволяет использовать встроенную или отображать математику LaTeX; вы просто помещаете его между (непосредственно примыкающими) знаками доллара, например, так: $ \ sqrt {-1} $, и это обрабатывается так, как вы ожидаете. Я использую эту функцию все время, и не думаю, что она вообще нецелесообразна. См. Руководство http://johnmacfarlane.net/pandoc/README.html#math

После анализа уценки pandoc может писать HTML, LaTeX, ReST, RTF, DocBook, ODT, manpages и т. Д. И т. Д. Если математический контекст LaTeX не включает в себя причудливые пакеты LaTeX, он может даже анализировать математику в MathML , так что он отображает сразу в HTML или RTF. (Он предоставляет несколько вариантов работы с математикой LaTeX в документах, не относящихся к LaTeX.)

Pandoc также анализирует ReST (и HTML, и не слишком сложный LaTeX). Таким образом, я надеялся дать решение с участием читателя ReSt, но, похоже, у него нет специального механизма для работы с математикой; см. обсуждение вопроса 249 http://code.google.com/p/pandoc/issues/detail?id=249 Я буду изучать еще более внимательно, чтобы увидеть.

Я не думаю, что кто-то уже подготовил пандок-плагин для Gedit (в emacs и TextMate есть развитая поддержка, я знаю) - это было бы здорово!

...