it-swarm.dev

Matemáticas en reStructuredText con LaTeX

Me gustaría usar un lenguaje de marcado ligero para tomar notas en mis clases universitarias.

Mi editor de elección es gedit, y encontré reStructuredText Tools for Gedit , que ejecutará el procesador reStructuredText y renderizará el HTML en un panel en gedit. Esto es genial, y el 80% del camino hasta allí.

Pero para muchas de mis clases necesito incluir ecuaciones matemáticas o caracteres griegos en mis notas. Aunque no estoy muy familiarizado con LaTeX, entiendo que tiene estas capacidades.

¿Cómo puedo usar LaTeX en un documento reST? ¿Debería procesarse el documento reST en LaTeX, y luego representarse en HTML, o hay una mejor manera? ¿Markdown haría esto más fácil? Puedo modificar el complemento gedit si es necesario.

Por último, ¿alguien hace esto? ¿Alguna otra sugerencia para tomar notas de clase en un editor de texto plano?

¡Gracias!

49
Craig Younkins

Desde la versión 0.8 es compatible de forma nativa: ya no debería usar ninguna solución alternativa. La sintaxis también es muy simple. Es lo mismo que las matemáticas de látex, pero sin el cierre $$

Entonces puedes simplemente escribir lo siguiente para un bloque matemático

.. math::

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

O si quieres escribir en línea puedes usar esto:

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

observe los delimitadores de backticks allí.


ACTUALIZAR:

en las versiones más nuevas parece ser necesario usar una barra invertida doble para los elementos matemáticos, por lo que es \\frac y no \frac

66
devsnd

Existe soporte nativo para un rol y directiva "matemática" (usando la sintaxis de entrada LaTex) desde la Versión 0.8 (2011-07-07).

31
Günter Milde

Esto es lo que hago:

  1. Agregue un rol para las matemáticas al comienzo de su documento reST:

    .. role:: raw-math(raw)
        :format: latex html
  2. Escribe tus matemáticas como

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

    (utilizar $$ ... $$ si lo quieres en un bloque, o $ ... $ si lo quieres en línea.)

  3. Genere una salida html como esta:

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

    Esto genera el html con rst2html, ordena con tidy y luego convierte las matemáticas de látex en MathML con itex2MML, que sale en un archivo xhtml.

Notas:

  1. La hoja de estilo es opcional.
  2. Para itex2MML vaya aquí .
  3. La extensión de su archivo html debe ser xhtml o xml, de lo contrario, las matemáticas no se mostrarán en su navegador.
25
gozzilli

LaTeX y ReST son dos soluciones al mismo problema (marcado de todo el documento), y no estoy seguro de que una sea feliz viviendo dentro de la otra.

  • LaTeX primero, luego ReST: LaTeX necesita posicionar con precisión los elementos tipográficos para diseñar ecuaciones (y todo lo demás). ReST no tomaría la salida de LaTeX (PostScript o similar) como entrada.
  • ReST primero, luego LaTeX: Tendría que escribir un formateador de salida para ReST que genere código LaTeX, y definir extensiones en ReST para evitar que malinterprete sus ecuaciones u otro TeX explícito. Su salida de LaTeX seguirá siendo algo similar a PostScript o PDF.

He visto código para usar un subconjunto de TeX para generar una ecuación gráfica que luego se extrae en HTML o similar (por ejemplo, Macro de fórmula LaTeX de Trac ), que puede ser la mejor solución disponible.

9
Mike DeSimone

Desglosando un poco su problema, el primer objetivo es obtener la salida del código de látex textualmente (a excepción de cgi-escapes para <,>, etch.) En el html generado por su marcado ligero de elección: una vez que lo tenga allí, puede ser fácilmente LaTex'ed por mathJax (altamente recomendado) o itex como lo menciona gozzilli.

Primero, debo decir que usar Markdown en lugar de ReST probablemente sería más fácil porque ReST usa\para escapar, por lo que todo LaTeX debe estar protegido. Para ver un ejemplo de lo bien que funcionan las cosas con markdown y mathJax , juegue con la configuración en mathoverflow.net .

Sin embargo, supondré que realmente desea ReST (y mathJax), en cuyo caso hay dos formas: use ReST de stock (y escapes engorrosos), o agregue algunos controladores LaTeX a docutils.

Opción 1 - Stock ReST:

Para las matemáticas en línea, simplemente use textualmente más lo que etiqueta que busca su postprocesador: `` $ x <\ pi $ ``. Para las matemáticas de varias líneas, desea un bloque literal, pero necesita establecer un atributo de clase para, p. MathJaX para analizarlo, ya que de lo contrario se salta <pre> etiquetas:

.. class:: mathjax_process

::

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

Opción 2: Extienda su procesador ReST

Si está dispuesto a hacer un poco de pirateo para extender su procesador ReST, puede obtener una notación mucho más agradable para los literales de LaTeX, definiendo un texto interpretado personalizado rol para látex en línea (por ejemplo, :latex:`x<\pi`) y una costumbre directiva para matemática de varias líneas, p.

.. latex::

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

La notación matemática en línea incluso se puede acortar a `x<\pi` si usa default-role .

Hay varias formas de implementar el rol y la directiva. Llegué a (aproximadamente) lo siguiente que tiene la función Nice que (a diferencia de la mayoría de los otros hacks que he visto) se degrada a código LaTex literal para escritores sin postprocesamiento integrado.

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)

Lo anterior usará la clase "latex" para marcar cosas para el procesamiento, por lo que deberá configurar mathJax o equivalente para buscar esta clase. Alternativamente, cambie el código anterior para establecer la clase en "mathjax_process", que es la clase de anulación predeterminada mathJax .

6
Janus

El problema es que reST realmente no tiene complementos. Puede elegir un marco extensible como Sphinx ; ya se incluye un complemento para JSMath , y también es posible un complemento para MathJax . Además, Sphinx utiliza LaTeX para construir directamente PDF documentos.

Otra solución más ligera consiste en editar la plantilla reST para incluir MathJax para que pueda usar la sintaxis de MathJax (tipo LaTeX) en el documento.

Pero generalmente solo uso LaTeX directamente para cualquier cosa seria: las capacidades de personalización de estos lenguajes de marcado livianos simplemente no son lo suficientemente integrales para todo.

5
Philipp

Este elemento de Docutils FAQ describe una forma de incluir matemática TeX de manera relativamente fácil. Primero define un rol para el texto interpretado que pasa la ecuación directamente a LaTeX:

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

Entonces puedes usar ese rol en tu texto

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

La entrada FAQ) también menciona algunas otras formas de hacerlo, incluido un enfoque de preprocesador que se puede utilizar para representar las matemáticas en una imagen al generar HTML.

5
Geoff Reedy

Tenga en cuenta que la versión 0.8 de docutils (que analiza reStructuredText) tiene soporte para matemáticas LaTeX. Ver http://article.gmane.org/gmane.text.docutils.user/6255 para muchos ejemplos. Las opciones para la opción "--math-output" son: MathML, HTML, MathJax y LaTeX.

4
Ling

La extensión de descuento de Pandoc permite en línea o mostrar matemáticas de LaTeX; simplemente lo coloca entre signos de dólar (inmediatamente contiguos) de esta manera: $\sqrt {-1} $ 's y se trata como es de esperar. Uso esta función todo el tiempo y no creo que sea poco práctica. Vea el manual http://johnmacfarlane.net/pandoc/README.html#math

Una vez que se analiza el descuento, Pandoc puede escribir HTML, LaTeX, ReST, RTF, DocBook, ODT, páginas de manual, etc., etc. Si un contexto matemático LaTeX no involucra paquetes sofisticados de LaTeX, incluso puede analizar las matemáticas en MathML, por lo que se procesa inmediatamente en HTML o RTF. (Proporciona una serie de opciones para manejar las matemáticas de LaTeX en documentos que no son de LaTeX).

Pandoc también analiza ReST (y HTML, y LaTeX no demasiado elegante). Por lo tanto, esperaba dar una solución que involucrara al lector ReSt, pero parece no tener una maquinaria especial para tratar las matemáticas; vea la discusión del problema 249 http://code.google.com/p/pandoc/issues/detail?id=249 Volveré a estudiar más de cerca para ver.

No creo que nadie haya preparado aún un complemento de Pandoc para Gedit (lo sé, existe un soporte complejo en emacs y en TextMate), ¡eso sería increíble!

3
applicative

Para ampliar las respuestas anteriores, así es como obtuve MathJax trabajando con ReST y Docutils , sin necesidad de LaTeX:

  1. Usar matemática estilo LaTeX dentro de mi fuente ReST, como:

    The radar backscatter coefficient is $\sigma^0$.
    
  2. Incluya esto en algún lugar dentro del archivo (pongo el mío en la parte inferior):

    .. 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. Convierte a HTML:

    rst2html report.rst report.html
    
  4. Cargue el HTML en un navegador moderno. El script MathJax se descarga y se aplica al HTML al visualizarlo. ¡Todo se ve genial para mí!

Muchas gracias a http://www.thales.math.uqam.ca/~labbes/Sage/rst2sws/ por la ayuda!

ACTUALIZACIÓN: Me di cuenta de que, aunque el HTML de salida funciona bien en Firefox, MathJax tarda mucho tiempo en funcionar en Chrome, y luego da un error. Lo arreglé cambiando la fuente del script en la última línea de

src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS-MML_HTMLorMML"

a

src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=TeX-AMS_HTML".

Creo que la razón es que mientras FireFox admite MathML, Chrome (Webkit, realmente) todavía no lo hace (al menos no completamente; puede probar la compatibilidad de su navegador aquí ) .

Debido a que no necesito MathML, solo TeX, utilizo la versión correspondiente de MathJax y ahora se carga rápidamente en Chrome sin ningún error. Además, sería mucho más rápido que escriba Math TeX -style que MathML-style.

3
Rich Li

En lugar de rst2html, use rst2mathml.py .

Extiende docutils con un modo latex-math. El contenido de este modo se convierte a MathML.

2
Ben Reynwar

Sugeriría NoTex : Tiene soporte integrado rST usando LaTex solo para material de presentación y ecuaciones matemáticas. Por ejemplo, en NoTex escribirías primero una sustitución rST como

.. |E=mc²| replace:: :math:`E = mc ^ 2`

y luego solo use |E=mc²| donde lo necesitas; NoTex usa LaTex para traducirlo a algo que se parece a E=mc² (sin los símbolos de tubería que indican sustituciones rST) y se representa de manera similar en HTML usando MathJax.

1
hsk81