Ipython: Les nombres d'équations dans le cahier.

Créé le 26 août 2013  ·  45Commentaires  ·  Source: ipython/ipython

Le LaTeX en ligne d'IPython n'inclut pas la numérotation des équations. Ce serait formidable si les séquences LaTeX qui sont normalement numérotées (c'est-à-dire les blocs \begin{equation} ... \end{equation}) obtenaient des nombres (facultatifs ?). Un slam dunk serait si nous pouvions attacher des références aux équations et les référencer d'une manière ou d'une autre plus tard dans le texte.

notebook

Commentaire le plus utile

est-ce déjà résolu ou dois-je lui attribuer +1 ?

Tous les 45 commentaires

+1
C'est une caractéristique assez importante pour tout type de document mathématique.
Je pense que MathJax a déjà cette capacité :

http://docs.mathjax.org/en/latest/tex.html#automatic -equation-numbering

En ce qui concerne les références, je pense qu'il est crucial de développer un système de références croisées générique avec une syntaxe unifiée, et non un système spécifique aux équations LaTeX (et aux backends LaTeX).

Je suis d'accord qu'il doit y avoir un système de référencement croisé générique, mais j'ajouterais qu'il devrait également pouvoir s'interfacer avec le code python. Cela permettrait au latex dans la démarque de référencer les chiffres produits dans le code.

Cela devrait probablement attendre qu'un système d'accès aux variables python à partir des cellules de démarque soit disponible, car il utiliserait probablement un système similaire.

Voir https://github.com/ipython/ipython/pull/2517#issuecomment -9884544 et veuillez commenter.

Cela semble également résoudre le problème plus complètement http://stackoverflow.com/questions/18823779/ipython-notebook-and-mathjax-labeled-equations

@ahmadia quel est le problème pour lequel les équations ne peuvent pas être numérotées par défaut ? Ne pas pouvoir numéroter et référencer des équations est quelque chose d'assez ennuyeux actuellement.

+1. On dirait que la mise en œuvre de #5921 permettrait cela facilement.

+1. J'espère que cela sera mis en œuvre très bientôt

+1

+1.
J'utilise des cahiers ipython pour compléter le matériel de cours d'un cours universitaire d'électromagnétisme de niveau junior, et je le fais comme cas de test pour savoir s'il faut pousser à la mise en œuvre large des cahiers ipython tout au long de notre programme de premier cycle. Le manque de numérotation cohérente des équations dans un cahier, ou dans les sections d'un cahier, est une limitation sérieuse, ainsi que la capacité de référencer des numéros d'équation dans le texte. Je suis d'accord avec une telle numérotation étant spécifique aux parties LaTeX d'un cahier, surtout si essayer une approche plus générale signifie une attente plus longue pour obtenir cette fonctionnalité.

+1.
Idem ici, j'écris mes notes pour un cours de calcul numérique en utilisant ipython et la numérotation des références est vraiment manquante.

+1

C'est la seule chose qui m'empêche d'utiliser iPython Notebooks comme principal outil de rédaction de documents (à l'exception du manque de collaboration en temps réel, mais ce n'est pas aussi important). Au lieu de cela, je dois faire des brouillons ici, puis les transférer vers un éditeur LaTeX.

+1 :+1 : Nous l'utilisons pour donner des conférences et cette fonctionnalité est absolument nécessaire !

Ok, j'ai finalement essayé la "solution" décrite dans ce post où vous modifiez mathjaxutils.js. Tant que vous actualisez la page Web du bloc-notes ipython après avoir modifié les cellules de démarques contenant du latex, les numéros d'équation s'affichent et le font dans le bon ordre. L'actualisation de la page corrige également les étiquettes, qui deviennent irrésolues lorsque la cellule dans laquelle elles sont définies est réexécutée (c'est-à-dire, shift-enter). Cependant, lorsque le bloc-notes est rendu dans nbviewer.ipython.org, les numéros d'équation sont complètement manquants et les étiquettes ne sont pas résolues, elles sont donc remplacées par "???" où ils sont référencés dans les cellules de texte Markdown. L'essentiel est que ce n'est pas vraiment une solution pour la plupart des cas d'utilisation, même si je suis heureux que l'affiche originale ait posé la question et compris cela.

Je voulais numéroter les équations renvoyées par les cellules de code.
C'est ce que j'ai utilisé : http://nbviewer.ipython.org/github/MalteJin/Manual-equation-numbering/blob/branch/Manual%20equation%20numbering.ipynb

^ Est-ce la solution actuellement recommandée ?

Cogner. J'utilise des cahiers Jupyter pour mes notes de cours et c'est un problème sérieux. Une syntaxe pratique pour numéroter manuellement les équations serait-elle un compromis décent ?

Une syntaxe pratique pour numéroter manuellement les équations serait-elle un compromis décent ?

C'est une bonne idée @poulson et il y a la syntaxe \tag dans MathJaX qui prend en charge cela.
Balises d'équation MathJax manuelles dans l'exemple Jupyter Notebook . Mêmes limitations (la réexécution d'une cellule Markdown provoquera l'arrêt de MathJaX si vous ne rafraîchissez pas le navigateur), mais au moins vous n'avez pas à reconfigurer le bloc-notes pour le faire.

@ahmadia Merci ! Réexécuter la rupture de la cellule est certainement un peu frustrant, mais c'est un énorme progrès par rapport à \begin{equation} sans étiquetage !

@ahmadia Est-il prévu que les références d'équation ne se résolvent pas dans votre lien ou dans le cahier en direct (même après actualisation) ?

Essayez d'actualiser puis exécutez toutes les cellules. Je ne pense pas que les liens fonctionnent dans GitHub
car GH supprime les URL.

Le samedi 3 octobre 2015, Jack Poulson [email protected] a écrit :

@ahmadia https://github.com/ahmadia Est-il prévu que l'équation
les références ne se résolvent pas dans votre lien ou dans le carnet en direct (même après
rafraîchissant)?

-
Répondez directement à cet e-mail ou consultez-le sur GitHub
https://github.com/ipython/ipython/issues/4113#issuecomment -145305340.

Cela n'a pas fonctionné pour moi, mais comme tout est codé en dur, je ne vois aucune raison d'insister pour utiliser \ref . J'ai donc codé en dur les numéros d'équation pour les références et j'ai produit le produit final que l'on peut voir ici : http://web.stanford.edu/class/math53/notebooks/Week2.html

Merci @pouson d'avoir poussé ça. Je suis touché encore et encore, et le codage en dur des nombres d'équations est assez mauvais, mais que peut-on faire... IPython devrait avoir un support natif pour cela.

Meilleure solution de contournement jusqu'à présent, merci les gars!

Si vous incluez le code :

MathJax.Hub.Config({
  TeX: { equationNumbers: { autoNumber: "AMS" } }
});

dans une extension javascript, ou même dans une sortie javascript dans le cahier, la numérotation automatique des équations sera activée. Il aura tous les problèmes qui nous empêchent de le faire par défaut, principalement que les numéros d'équation mathjax sont classés par temps de rendu, pas par emplacement sur la page, donc la numérotation ne sera correcte que lors du chargement de la première page.

En fait, vous pouvez réinitialiser la numérotation des équations et restituer les équations dans le cahier.

J'ai fait une simple extension de notebook qui fait ceci :
https://github.com/ipython-contrib/IPython-notebook-extensions/pull/335

@juhasch super ! Compte tenu de la très mauvaise expérience des nombres d'équations dans la plupart des circonstances, je pense que désactiver par défaut est le meilleur choix. Mais en faire une option de configuration frontale avec l'action de renuméroter serait génial (le bouton de la barre d'outils est probablement un espace trop précieux pour lui consacrer, mais une action de menu serait bien).

J'imagine utiliser le re-rendu/re-numéroter assez souvent lors de la création de cahiers, donc je voterais pour un bouton de barre d'outils ou, s'il entre dans le menu, au moins un raccourci clavier en mode normal.

@lucasb-eyer Je pense que c'est une bonne chose à faire pour une extension comme celle fournie par @juhasch , mais nous ne le ferions probablement pas par défaut, car les raccourcis clavier par défaut et l'espace de la barre d'outils sont extrêmement précieux. Mais il serait possible d'ajouter l'un ou les deux via custom.js ou nbextension.

@minrk : Les extensions peuvent être facilement activées/désactivées et le rendu activé/désactivé à l'aide de l'extension de serveur nbextensions :
clipboard01

Si vous appuyez sur lebutton bouton de la barre d'outils, la numérotation des équations est réinitialisée/rendu à nouveau.

@juhasch merci pour votre travail ! C'est un grand pas en avant.

@minrk d'après votre expérience, que proposeriez-vous comme solution appropriée à long terme à la numérotation de l'équation ? L'extension de @juhasch n'est qu'une solution de contournement pour le moment. Je ne vous demande pas de le mettre en œuvre, juste de décrire quelle devrait être la solution. Je pense que beaucoup de gens sont vraiment dérangés par cela, et si nous savons quelle est la bonne voie à suivre, nous pouvons essayer de tenter le coup.

que proposeriez-vous comme solution appropriée à long terme à la numérotation de l'équation ?

Vous ne pouvez pas l'avoir. MathJax suppose qu'il a accès à la page entière lorsqu'il effectue la numérotation des équations, et IPython rend Markdown cellule par cellule, ce qui est le seul moyen sensé de le faire pour les gros blocs-notes. Cela nécessiterait un travail/une mise en œuvre du côté MathJax, pas du cahier.

La plupart des gens (y compris moi) veulent juste la numérotation des équations. Je ne pense pas que nous nous soucions tellement de la façon dont il est techniquement mis en œuvre. Je peux donc voir plusieurs manières d'avancer, par exemple en ajoutant des correctifs à MathJax qui permettent au cahier de lui indiquer le numéro de l'équation sans qu'il ait accès à toute la page, ou une autre solution consiste simplement à utiliser MathJax pour rendre l'équation sans le numéro , puis restituer le nombre par le bloc-notes lui-même. Il pourrait y avoir plus d'options. Mais j'aimerais avoir une bénédiction officielle sur la meilleure façon de procéder, car je ne connais pas bien les internes.

que proposeriez-vous comme solution appropriée à long terme à la numérotation de l'équation ?

Pour l'instant, je ferais essentiellement ce que @juhasch a fait avec son extension, avec les modifications suivantes en cas de fusion dans master :

  1. le désactiver par défaut
  2. store toggle dans frontend-config, vous n'avez donc besoin de l'activer qu'une seule fois
  3. ajouter une action de renumérotation, afin qu'elle puisse être liée à un raccourci clavier
  4. mettre l'interface utilisateur par défaut pour la renumérotation dans le menu au lieu de la barre d'outils

Fondamentalement, je le ferais légèrement pire que l'extension pour ceux pour qui c'est une priorité, car cela n'a pas de sens par défaut. Une fois que l'action est disponible, cependant, l'ajout d'éléments tels que des raccourcis et des boutons de barre d'outils devient une simple personnalisation pour ceux qui ont des priorités différentes.

Je ne sais pas dans quelle mesure une numérotation toujours correcte est faisable, car cela signifierait que sur _n'importe quel_ rendu d'une cellule de démarque ou d'une sortie HTML, la numérotation devrait être réinitialisée, et _toutes_ les cellules de démarque et les sorties HTML devraient être à nouveau rendues, A chaque fois.

Compte tenu de la documentation, cela semble être un plan raisonnable pour moi en tant qu'utilisateur. :+1:

@minrk : en tant qu'utilisateur, je trouverais moi aussi cette solution utilisable. À quel point serait-il onéreux de restituer toutes les sorties de démarques et HTML ?

@gregnordin qui va dépendre de la taille du cahier, et croître sans limite avec la taille du cahier. Cela signifierait que chaque fois que vous modifiez une cellule de démarque, le rendu peut prendre le même temps que le chargement de l'intégralité du bloc-notes lorsque vous l'ouvrez pour la première fois. Certainement pas d'accord pour un comportement par défaut, mais si une extension voulait essayer de s'y essayer, elle serait la bienvenue pour essayer.

+1

+1 pour cette fonctionnalité. Je prépare des cours de physique pour les étudiants et la numérotation des équations est indispensable.

Une autre option, qui permet de mettre à jour les numéros d'équation, sans tout restituer, est un javascript qui recherche dans la sortie HTML des éléments avec des équations ou des références, et remplace leur texte par la valeur appropriée.

Pour que cela soit pleinement fonctionnel, il faudrait quelques modifications dans MathJax, en définissant des attributs supplémentaires pour les éléments qui doivent être mis à jour, afin que le script puisse les reconnaître.

Pour le moment, ce support n'est pas là, mais les solutions de contournement suivantes feront l'affaire

  • utilisez \tag{labelname} pour créer un numéro d'équation. Notez qu'ici la balise est l'étiquette
  • référencez-le dans Markdown avec le code html brut <span class=reference data-target=labelname></span> Ceci est nécessaire car la sortie HTML de \ref ou \eqref n'inclut pas le nom de l'étiquette.

par example

$$
\begin{equation}
  A = 1 \tag{eq:sample}
\end{equation}
$$

The amazing result in <span class=reference data-target="eq:sample"></span> can ...blah..blah

Le script suivant met à jour les numéros d'équation. Il doit être exécuté une fois que de nouveaux numéros d'équation ou références ont été rendus. Pour l'instant, vous pouvez placer le script dans une cellule séparée et l'exécuter manuellement si nécessaire. Une solution complète a besoin d'un mécanisme pour déclencher une réexécution aux moments appropriés.

%%javascript

// find all equation numbers (tags) that have no data-label attribute and set
// it to the tag text
$("span.mtd[id|='mjx-eqn']").not("[data-label]").each(
    function (index)
    {
        $(this).attr("data-label", $(this).text().slice(1,-1));
    }
);

// loop over all equation numbers and set the text 
$("span.mtd[id|='mjx-eqn']").each(
    function (index)
    {
        $(this).text("(" + (index+1) + ")");
    }
);

// loop over all references and resolve them by finding the
// equation number with a matching data-label attribute
$("span.reference").each(
    function (index)
    {
        var target = $(this).attr("data-target");
        var eqn = $("span.mtd[id|='mjx-eqn'][data-label='" + target + "']").text()
        $(this).text(eqn)
    }
);

Notez que le script ne met à jour que les nombres, laissant toute la mise en page telle quelle. Cela devrait être beaucoup plus efficace que de laisser MathJax tout restituer.

@basvandertol Merci pour l'échantillon, mais je ne vois pas en quoi cela est utile car les résultats ne sont visibles que sur l'écran actuel : ils ne sont pas enregistrés, ne peuvent pas être imprimés, ne peuvent pas être consultés dans nbviewer, ni vus dans n'importe quelle sortie (PDF, HTML, etc.) Je ne vois pas qu'il s'agisse d'une solution de contournement. Vous ai-je mal compris ? Ou est-ce juste une partie d'une solution ?

Merci pour le retour @dsblank. Il ne s'agit en effet que d'une solution partielle, notamment au problème de la mise à jour des numéros d'équation lors de l'édition du cahier sans tout restituer. J'expérimentais les attributs de données HTML pour y parvenir. J'ai découvert plus tard que nbconvert utilise une approche similaire pour traiter les citations Latex. http://nbconvert.readthedocs.io/en/latest/latex_citations.html

Pour le moment, MathJax n'ajoute pas suffisamment d'attributs à la sortie HTML pour résoudre les références après le rendu. C'est pourquoi j'utilise ces étiquettes et références hackish pour obtenir la sortie HTML dont j'ai besoin. Avec ces étiquettes, la conversion normale en Latex ->pdf est interrompue.

Je me familiarise maintenant avec le code source de MathJax pour voir s'il existe un moyen simple d'ajouter les attributs HTML aux étiquettes et références normales.

La prochaine étape serait d'ajouter un support dans nbconvert pour reconnaître ces attributs HTML, comme c'est déjà le cas avec les citations. Si nbconvert peut également analyser la sortie des sections de code pour le HTML avec ces attributs, alors une légende/étiquette HTML peut être ajoutée aux figures générées par le code, et nbconvert
peut générer la sortie Latex correcte. Les chiffres peuvent ensuite être référencés dans les cellules de balisage.

Ce n'est qu'un aperçu d'une approche de prise en charge complète des références dans les cahiers ipython. Cela me semble faisable, mais si quelqu'un voit déjà un showhopper maintenant, faites-le moi savoir. Je sais très peu de choses sur les éléments internes du cahier ipython. Cela semble être un projet amusant pour en savoir plus, mais pour le moment, je ne peux pas superviser toutes les implications.

Je viens de trouver ce (long) fil...

Peut-être que cela pourrait être intéressant : j'ai essayé quelque chose pour prendre en charge le rendu des environnements LaTeX, y compris la _numérotation automatique et la mise à jour_ des équations et des environnements, à l'échelle du document.
Il utilisait un bouton pour rafraîchir mais utilise maintenant une idée similaire à celle mentionnée par @basvandertol ci-dessus.

Bien sûr tout cela ajoute une certaine surcharge, mais cela est largement acceptable pour moi, même pour des documents assez longs. L'exportation du bloc-notes vers des documents html et LaTeX est disponible ;

Vous pouvez consulter l'extension ici ou sur Pypi . Meilleur.

+1 pour l'intégration d'une version des solutions proposées dans le master.

est-ce déjà résolu ou dois-je lui attribuer +1 ?

Cette page vous a été utile?
0 / 5 - 0 notes