web-dev-qa-db-fra.com

Math dans reStructuredText avec LaTeX

Je voudrais utiliser un langage de balisage léger pour prendre des notes dans mes cours universitaires.

Mon éditeur de choix est gedit, et j'ai trouvé outils reStructuredText pour Gedit , qui exécutera le processeur reStructuredText et affichera le code HTML dans un volet dans gedit. C'est super, et 80% du chemin.

Mais pour beaucoup de mes cours, j'ai besoin d'inclure des équations mathématiques ou des caractères grecs dans mes notes. Bien que je ne sois pas très familier avec LaTeX, je crois comprendre qu'il a ces capacités.

Comment puis-je utiliser LaTeX dans un document reST? Le document reST devrait-il être traité en LaTeX, puis rendu en HTML, ou existe-t-il un meilleur moyen? Le démarque simplifierait-il cela? Je peux modifier le plugin gedit si nécessaire.

Enfin, quelqu'un fait-il cela? Avez-vous d'autres suggestions pour prendre des notes de classe dans un éditeur de texte brut?

Merci!

53
Craig Younkins

Depuis la version 0.8, il est pris en charge nativement: vous ne devriez plus utiliser de solution de contournement. La syntaxe est également très simple. C'est la même chose que pour les mathématiques du latex, mais sans le $$

Vous pouvez donc simplement écrire ce qui suit pour un bloc mathématique

.. math::

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

Ou si vous voulez écrire en ligne, vous pouvez utiliser ceci:

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

notez les délimitations délimitant là.


METTRE À JOUR:

dans les versions plus récentes, il semble nécessaire d'utiliser une double barre oblique inverse pour les éléments mathématiques, c'est donc \\frac et pas \frac

66
devsnd

Il existe un support natif pour un rôle et une directive "mathématiques" (en utilisant la syntaxe d'entrée LaTex) depuis la version 0.8 (2011-07-07).

31
Günter Milde

C'est ce que je fais:

  1. Ajoutez un rôle pour les mathématiques au début de votre document reST:

    .. role:: raw-math(raw)
        :format: latex html
  2. Écrivez vos maths comme

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

    (utilisation $$ ... $$ si vous le souhaitez dans un bloc, ou $ ... $ si vous le souhaitez en ligne.)

  3. Générez une sortie html comme ceci:

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

    Cela génère le html avec rst2html, range avec tidy puis convertit les maths en latex en MathML avec itex2MML, sortie sur un fichier xhtml.

Remarques:

  1. La feuille de style est facultative
  2. Pour itex2MML, allez ici .
  3. L'extension de votre fichier html doit être xhtml ou xml, sinon les mathématiques ne s'afficheront pas dans votre navigateur.
25
gozzilli

LaTeX et ReST sont deux solutions au même problème (balisage de document entier), et je ne suis pas sûr que l'un serait heureux de vivre à l'intérieur de l'autre.

  • LaTeX d'abord, puis ReST: LaTeX doit positionner précisément les éléments typographiques afin de disposer des équations (et tout le reste). ReST ne prendrait pas la sortie LaTeX (PostScript ou similaire) comme entrée.
  • ReST d'abord, puis LaTeX: vous devez écrire un formateur de sortie pour ReST qui génère du code LaTeX, et définir des extensions dans ReST pour éviter qu'il interprète mal vos équations ou tout autre TeX explicite. Votre sortie de LaTeX sera toujours quelque chose de semblable à PostScript ou PDF.

J'ai vu du code pour utiliser un sous-ensemble de TeX pour générer une équation graphique qui est ensuite extraite en HTML ou similaire (par exemple, macro LaTeX Formula de Trac ), qui peut être la meilleure solution disponible.

9
Mike DeSimone

En décomposant un peu votre problème, le premier objectif est d'obtenir la sortie du code latex textuellement (sauf pour les cgi-échappements pour <,>, etch.) Dans le code HTML généré à partir du balisage léger de votre choix: une fois que vous l'avez là, il peut facilement être LaTex'ed par mathJax (hautement recommandé) ou itex comme mentionné par gozzilli.

Tout d'abord, je dois dire que l'utilisation de Markdown au lieu de ReST serait probablement plus facile car ReST utilise\pour s'échapper, donc tout LaTeX doit être protégé. Pour un exemple de la façon dont les choses fonctionnent bien avec markdown et mathJax , allez jouer avec la configuration sur mathoverflow.net .

Néanmoins, je suppose que vous voulez vraiment ReST (et mathJax), auquel cas il y a deux façons d'avancer: utiliser le stock ReST (et un échappement encombrant), ou ajouter des gestionnaires LaTeX aux docutils.

Option 1 - Stock ReST:

Pour les mathématiques en ligne, utilisez simplement verbatim plus tout ce que vous recherchez dans votre postprocesseur: `` $ x <\ pi $ ``. Pour les mathématiques sur plusieurs lignes, vous voulez un bloc littéral, mais vous devez définir un attribut de classe pour, par exemple. MathJaX pour l'analyser, sinon il saute <pre> Mots clés:

.. class:: mathjax_process

::

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

Option 2: étendez votre processeur ReST

Si vous êtes prêt à faire un peu de piratage pour étendre votre processeur ReST, vous pouvez obtenir une notation beaucoup plus agréable pour les littéraux LaTeX, en définissant un texte interprété personnalisé role pour le latex en ligne (par exemple :latex:`x<\pi`) et un directive personnalisé pour les mathématiques sur plusieurs lignes, par exemple.

.. latex::

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

La notation mathématique en ligne peut même être raccourcie en `x<\pi` si vous utilisez default-role .

Il existe plusieurs façons de mettre en œuvre le rôle et la directive. Je suis arrivé (à peu près) à ce qui suit qui a la fonctionnalité Nice qui (contrairement à la plupart des autres hacks que j'ai vus), il se dégrade en code LaTex littéral pour les écrivains sans post-traitement intégré.

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)

Ce qui précède utilisera la classe "latex" pour marquer les éléments à traiter, vous devrez donc configurer mathJax ou équivalent pour rechercher cette classe. Vous pouvez également modifier le code ci-dessus pour définir la classe sur "mathjax_process", qui est la classe de substitution mathJax par défaut.

6
Janus

Le problème est que reST n'a pas vraiment de plugins. Vous pouvez choisir un framework extensible tel que Sphinx ; un plugin pour JSMath est déjà inclus, et un plugin pour MathJax est également possible. De plus, Sphinx utilise LaTeX pour construire directement des documents PDF.

Une autre solution plus légère consiste à modifier le modèle reST pour inclure MathJax afin que vous puissiez simplement utiliser la syntaxe de MathJax (semblable à LaTeX) dans le document.

Mais en général, j'utilise LaTeX directement pour tout problème sérieux - les capacités de personnalisation de ces langages de balisage légers ne sont tout simplement pas assez complètes pour tout.

5
Philipp

Cet élément du Docutils FAQ décrit une façon d'inclure relativement facilement les mathématiques TeX. Vous définissez d'abord un rôle pour le texte interprété qui transmet l'équation directement à LaTeX:

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

Ensuite, vous pouvez utiliser ce rôle dans votre texte

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

L'entrée FAQ mentionne également quelques autres façons de le faire, y compris une approche de préprocesseur qui peut être utilisée pour rendre le calcul sur une image lors de la génération HTML.

5
Geoff Reedy

Notez que la version 0.8 de docutils (qui analyse reStructuredText) prend en charge les mathématiques LaTeX. Voir http://article.gmane.org/gmane.text.docutils.user/6255 pour de nombreux exemples. Les choix pour l'option "--math-output" sont: MathML, HTML, MathJax et LaTeX.

4
Ling

L'extension de démarque de Pandoc permet de calculer en ligne ou d'afficher des mathématiques LaTeX; vous venez de le mettre entre les signes dollar (immédiatement adjacents) comme ceci: $\sqrt {-1} $ et il est traité comme vous vous y attendez. J'utilise cette fonctionnalité tout le temps, et je ne pense pas que ce soit impossible du tout. Voir le manuel http://johnmacfarlane.net/pandoc/README.html#math

Une fois le démarque analysé, pandoc peut écrire du HTML, LaTeX, ReST, RTF, DocBook, ODT, des pages de manuel, etc., etc. s'affiche immédiatement en HTML ou RTF. (Il fournit un certain nombre d'options pour traiter les mathématiques LaTeX dans les documents non LaTeX.)

Pandoc analyse également ReST (et HTML, et LaTeX pas trop sophistiqué). J'avais donc espéré donner une solution impliquant le lecteur ReSt, mais il ne semble pas avoir de mécanisme spécial pour traiter les mathématiques; voir la discussion du problème 249 http://code.google.com/p/pandoc/issues/detail?id=249 Je vais étudier de plus près pour voir.

Je ne pense pas que quiconque ait encore créé un plugin pandoc pour Gedit (il existe un support élaboré dans emacs et dans TextMate, je sais) - ce serait génial!

3
applicative

Pour développer les réponses précédentes, voici comment j'ai fait MathJax travailler avec ReST et Docutils , sans avoir besoin de LaTeX:

  1. Utilisez des mathématiques de style LaTeX dans ma source ReST, telles que:

    The radar backscatter coefficient is $\sigma^0$.
    
  2. Inclure cela quelque part dans le fichier (je mets le mien en bas):

    .. 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. Convertir en HTML:

    rst2html report.rst report.html
    
  4. Chargez le HTML dans un navigateur moderne. Le script MathJax est téléchargé et appliqué au HTML lors de la visualisation. Tout me va bien!

Un grand merci à http://www.thales.math.uqam.ca/~labbes/Sage/rst2sws/ pour l'aide!

MISE À JOUR: J'ai remarqué que, bien que le code HTML de sortie fonctionne correctement dans Firefox, MathJax met longtemps à fonctionner dans Chrome, puis il donne une erreur. Je l'ai corrigé en changeant la source du script dans la dernière ligne de

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".

Je crois que la raison en est que FireFox prend en charge MathML, Chrome (Webkit, vraiment) ne le fait pas encore (du moins pas complètement; vous pouvez tester le support de votre navigateur ici ) .

Parce que je n'ai pas besoin de MathML, juste de TeX, j'utilise la version correspondante de MathJax et elle se charge maintenant rapidement en Chrome sans aucune erreur. De plus, il serait beaucoup plus rapide pour vous de taper mathématique TeX -style que MathML-style.

3
Rich Li

Au lieu de rst2html, utilisez rst2mathml.py .

Il étend les docutils avec un mode latex-math. Le contenu de ce mode est converti en MathML.

2
Ben Reynwar

Je suggère ( NoTex : Il a un support rST intégré utilisant LaTex uniquement pour les trucs de présentation et les équations mathématiques. Par exemple, dans NoTex vous écririez d'abord une substitution rST comme

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

puis utilisez simplement |E=mc²| où vous en avez besoin; NoTex utilise LaTex pour le traduire en quelque chose qui ressemble à E=mc² (sans les symboles de tuyau qui indiquent les substitutions rST) et il est rendu de la même manière en HTML en utilisant MathJax.

1
hsk81