Ipython: Gleichungsnummern im Notizbuch.

Erstellt am 26. Aug. 2013  ·  45Kommentare  ·  Quelle: ipython/ipython

IPythons Inline-LaTeX enthält keine Gleichungsnummerierung. Es wäre toll, wenn LaTeX-Sequenzen, die normalerweise nummeriert sind (dh \begin{equation} ... \end{equation}-Blöcke), (optional?) Zahlen hätten. Ein Slam Dunk wäre, wenn wir Verweise auf Gleichungen anhängen und sie später im Text irgendwie referenzieren könnten.

notebook

Hilfreichster Kommentar

ist das schon gelöst oder soll ich +1 geben?

Alle 45 Kommentare

+1
Dies ist ein ziemlich wichtiges Merkmal für jede Art von mathematischem Dokument.
Ich glaube, dass MathJax diese Fähigkeit bereits hat:

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

Was die Referenzen angeht, denke ich, dass es entscheidend ist, ein generisches Querverweissystem mit einer einheitlichen Syntax zu entwickeln, und nicht eines, das spezifisch für LaTeX-Gleichungen (und LaTeX-Backends) ist.

Ich stimme zu, dass es ein generisches Querverweissystem geben muss, würde jedoch hinzufügen, dass es auch in der Lage sein sollte, mit dem Python-Code zu kommunizieren. Dies würde Latex im Abschlag auf im Code erzeugte Referenzzahlen ermöglichen.

Dies müsste wahrscheinlich warten, bis ein System für den Zugriff auf Python-Variablen aus Markdown-Zellen verfügbar ist, da es wahrscheinlich ein ähnliches System verwenden würde.

Siehe https://github.com/ipython/ipython/pull/2517#issuecomment -9884544 und bitte kommentieren.

@ahmadia was ist das Problem, warum Gleichungen nicht standardmäßig nummeriert werden können? Nicht in der Lage zu sein, Gleichungen zu nummerieren und zu referenzieren, ist derzeit ziemlich ärgerlich.

+1. Scheint so, als ob die Implementierung von #5921 dies leicht ermöglichen würde.

+1. Hoffe das wird sehr bald umgesetzt

+1

+1.
Ich verwende ipython-Notebooks, um das Kursmaterial für einen Elektromagnetikkurs für Junioren an einer Universität zu ergänzen, und tue dies als Testfall dafür, ob eine breite Implementierung von ipython-Notebooks in unserem gesamten Bachelor-Lehrplan angestrebt wird. Das Fehlen einer einheitlichen Nummerierung von Gleichungen in einem Notizbuch oder innerhalb von Abschnitten eines Notizbuchs ist eine ernsthafte Einschränkung, ebenso wie die Möglichkeit, auf Gleichungsnummern im Text zu verweisen. Ich bin damit einverstanden, dass eine solche Nummerierung spezifisch für LaTeX-Teile eines Notebooks ist, insbesondere wenn der Versuch eines allgemeineren Ansatzes eine längere Wartezeit bedeutet, um diese Funktionalität zu erhalten.

+1.
Genauso schreibe ich hier meine Notizen für einen Kurs in Numerical Calculus mit ipython und die Referenznummerierung fehlt wirklich.

+1

Dies ist das einzige, was mich davon abhält, iPython Notebooks als mein Hauptwerkzeug zum Schreiben von Dokumenten zu verwenden (abgesehen von der fehlenden Zusammenarbeit in Echtzeit, aber das ist nicht so wichtig). Stattdessen muss ich hier grobe Entwürfe erstellen und diese dann in einen LaTeX-Editor portieren.

+1 :+1: Wir halten damit Vorlesungen und diese Funktion ist unbedingt erforderlich!

Ok, ich habe endlich die in diesem Beitrag beschriebene "Lösung" ausprobiert, bei der Sie mathjaxutils.js ändern. Solange Sie die Ipython-Notebook-Webseite aktualisieren, nachdem Sie Änderungen an Markdown-Zellen vorgenommen haben, die Latex enthalten, werden die Gleichungsnummern in der richtigen Reihenfolge angezeigt. Durch das Aktualisieren der Seite werden auch Beschriftungen korrigiert, die nicht aufgelöst werden, wenn die Zelle, in der sie definiert sind, erneut ausgeführt wird (dh Umschalt-Eingabe). Wenn das Notebook jedoch in nbviewer.ipython.org gerendert wird, fehlen die Gleichungsnummern vollständig und die Beschriftungen sind nicht aufgelöst, sodass sie durch "???" ersetzt werden. wo sie in Markdown-Textzellen referenziert werden. Das Fazit ist, dass dies für die meisten Anwendungsfälle keine große Lösung ist, obwohl ich froh bin, dass das ursprüngliche Poster die Frage gestellt und so viel herausgefunden hat.

Ich wollte Gleichungen nummerieren, die von Codezellen zurückgegeben werden.
Das habe ich verwendet: http://nbviewer.ipython.org/github/MalteJin/Manual-equation-numbering/blob/branch/Manual%20equation%20numbering.ipynb

^ Ist dies die derzeit empfohlene Lösung?

Stoßen. Ich verwende Jupyter-Notizbücher für meine Kursnotizen und dies ist ein ernstes Problem. Wäre eine bequeme Syntax zum manuellen Nummerieren von Gleichungen ein anständiger Kompromiss?

Wäre eine bequeme Syntax zum manuellen Nummerieren von Gleichungen ein anständiger Kompromiss?

Das ist eine gute Idee @poulson und es gibt die \tag -Syntax in MathJaX, die dies unterstützt.
Manuelle MathJax-Gleichungs-Tags im Jupyter Notebook-Beispiel . Dieselben Einschränkungen (das erneute Ausführen einer Markdown-Zelle führt dazu, dass MathJaX abbricht, wenn Sie den Browser nicht aktualisieren), aber zumindest müssen Sie das Notebook dafür nicht neu konfigurieren.

@ahmadia Danke! Das erneute Ausführen des Brechens der Zelle ist definitiv ein bisschen frustrierend, aber das ist ein riesiger Fortschritt, wenn man \begin{equation} nicht beschriftet!

@ahmadia Wird erwartet, dass die Gleichungsreferenzen in Ihrem Link oder im Live-Notizbuch (auch nach dem Aktualisieren) nicht aufgelöst werden?

Versuchen Sie zu aktualisieren, und führen Sie dann alle Zellen aus. Ich glaube nicht, dass die Links in GitHub funktionieren
weil GH URLs entfernt.

Am Samstag, den 3. Oktober 2015, schrieb Jack Poulson [email protected] :

@ahmadia https://github.com/ahmadia Wird erwartet, dass die Gleichung
Verweise werden in Ihrem Link oder im Live-Notizbuch nicht aufgelöst (auch nicht nach
erfrischend)?


Antworten Sie direkt auf diese E-Mail oder zeigen Sie sie auf GitHub an
https://github.com/ipython/ipython/issues/4113#issuecomment -145305340.

Das hat bei mir nicht funktioniert, aber da alles hartcodiert ist, sehe ich keinen Grund, auf der Verwendung von \ref . Ich habe daher die Gleichungsnummern für die Referenzen hartcodiert und das Endprodukt erstellt, das hier zu sehen ist: http://web.stanford.edu/class/math53/notebooks/Week2.html

Danke @poulson für das Pushen. Ich bin immer wieder davon betroffen, und das Festcodieren von Gleichungsnummern ist ziemlich schlecht, aber was kann man tun ... IPython sollte dafür native Unterstützung haben.

Bisher die beste Lösung, danke Leute!

Wenn Sie den Code einschließen:

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

in einer Javascript-Erweiterung oder sogar in einer Javascript-Ausgabe im Notebook wird die automatische Nummerierung von Gleichungen aktiviert. Es wird alle Probleme haben, die uns daran hindern, dies standardmäßig zu tun, hauptsächlich, dass mathematische Gleichungsnummern nach der Renderzeit und nicht nach der Position auf der Seite geordnet sind, sodass die Nummerierung nur beim Laden der ersten Seite korrekt ist.

Tatsächlich können Sie die Nummerierung der Gleichungen zurücksetzen und die Gleichungen im Notebook neu rendern.

Ich habe eine einfache Notebook-Erweiterung erstellt, die dies tut:
https://github.com/ipython-contrib/IPython-notebook-extensions/pull/335

@juhasch super ! Angesichts der sehr schlechten Erfahrung mit Gleichungszahlen unter den meisten Umständen denke ich, dass es die beste Wahl ist, standardmäßig auf Aus zu setzen. Aber es wäre großartig, dies zu einer Frontend-Konfigurationsoption mit der Aktion zum Neunummerieren zu machen (die Symbolleistenschaltfläche ist wahrscheinlich zu kostbar, um ihr den Platz zu widmen, aber eine Menüaktion wäre in Ordnung).

Ich stelle mir vor, beim Erstellen von Notizbüchern das erneute Rendern/die erneute Nummerierung ziemlich oft zu verwenden, also würde ich für eine Symbolleistenschaltfläche stimmen oder, wenn sie in das Menü geht, zumindest einen Hotkey für den Normalmodus.

@lucasb-eyer Ich denke, das ist eine gute Sache für eine Erweiterung, wie sie @juhasch bereitgestellt hat, aber wir würden dies wahrscheinlich nicht standardmäßig tun, da sowohl Standard-Tastaturkürzel als auch Platz in der Symbolleiste extrem wertvoll sind. Es wäre jedoch möglich, eines oder beide über custom.js oder nbextension hinzuzufügen.

@minrk : Die Erweiterungen können mit der nbextensions-Servererweiterung einfach aktiviert/deaktiviert und das erneute Rendern ein- und ausgeschaltet werden:
clipboard01

Wenn du die drückstbutton Symbolleisten-Schaltfläche wird die Nummerierung der Gleichungen zurückgesetzt/neu gerendert.

@juhasch danke für deine arbeit! Dies ist ein großer Schritt nach vorne.

@minrk , was würden Sie Ihrer Erfahrung nach als die langfristig richtige Lösung für die Nummerierung der Gleichungen vorschlagen? Die Erweiterung von @juhasch ist vorerst nur ein Workaround. Ich bitte Sie nicht, es zu implementieren, sondern skizzieren Sie nur, was die Lösung sein sollte. Ich denke, es gibt viele Leute, die das wirklich stört, und wenn wir wissen, wie der richtige Weg nach vorne ist, können wir versuchen, es auszuprobieren.

Was würden Sie als langfristig richtige Lösung für die Nummerierung der Gleichungen vorschlagen?

Du kannst es nicht haben. MathJax geht davon aus, dass es Zugriff auf die gesamte Seite hat, wenn es die Nummerierung von Gleichungen durchführt, und IPython rendert Markdown auf einer Zelle für Zelle, was für große Notebooks die einzig vernünftige Möglichkeit ist. Es würde Arbeit/Implementierung auf der MathJax-Seite erfordern, nicht auf dem Notebook.

Die meisten Leute (einschließlich mir) wollen nur die Nummerierung der Gleichungen. Ich glaube nicht, dass es uns so wichtig ist, wie es technisch umgesetzt wird. Ich sehe also mehrere mögliche Vorgehensweisen, zum Beispiel das Hinzufügen einiger Patches zu MathJax, die es dem Notebook ermöglichen, ihm die Gleichungsnummer mitzuteilen, ohne dass es Zugriff auf die gesamte Seite hat, oder eine andere Lösung besteht darin, MathJax einfach zu verwenden, um die Gleichung ohne die Zahl zu rendern , und rendern Sie dann die Nummer vom Notebook selbst. Es könnte mehr Optionen geben. Aber ich hätte gerne einen offiziellen Segen, welcher Weg der beste ist, da ich mich mit den Interna nicht auskenne.

Was würden Sie als langfristig richtige Lösung für die Nummerierung der Gleichungen vorschlagen?

Im Moment würde ich im Grunde das tun, was @juhasch mit seiner Erweiterung getan hat, mit den folgenden Änderungen, wenn sie in den Master eingebunden werden:

  1. mach es standardmäßig aus
  2. Speichere Toggle in der Frontend-Config, du musst es also nur einmal einschalten
  3. Neunummerierungsaktion hinzufügen, damit sie an eine Tastenkombination gebunden werden kann
  4. füge die Standard-UI zum Umnummerieren in das Menü statt in die Symbolleiste ein

Grundsätzlich würde ich es für diejenigen, für die dies Priorität hat, etwas schlechter machen als die Erweiterung, da das als Standard keinen Sinn macht. Sobald die Aktion jedoch verfügbar ist, wird das Hinzufügen von Dingen wie Verknüpfungen und Symbolleistenschaltflächen zu einer einfachen Anpassung für diejenigen, die andere Prioritäten haben.

Ich weiß nicht, wie machbar eine immer korrekte Nummerierung ist, da dies bedeuten würde, dass bei _jedem_ Rendern einer Markdown-Zelle oder HTML-Ausgabe die Nummerierung zurückgesetzt werden müsste und _alle_ Markdown-Zellen und HTML-Ausgaben neu gerendert werden müssten. jedes Mal.

Angesichts der Dokumentation klingt das für mich als Benutzer nach einem vernünftigen Plan. :+1:

@minrk : Auch ich als Benutzer fände dies eine brauchbare Lösung. Wie mühsam wäre es, alle Markdown- und HTML-Ausgaben neu zu rendern?

@gregnordin Das hängt von der Größe des Notebooks ab und wächst mit der Größe des Notebooks unbegrenzt. Dies würde bedeuten, dass jedes Mal, wenn Sie eine Markdown-Zelle bearbeiten, das Rendern ähnlich lange dauern kann wie das Laden des gesamten Notebooks beim ersten Öffnen. Definitiv nicht in Ordnung für ein Standardverhalten, aber wenn eine Erweiterung versuchen wollte, es zu versuchen, würde sie es gerne versuchen.

+1

+1 für diese Funktion. Ich bereite Vorlesungen über Physik für Studenten vor und die Nummerierung von Gleichungen ist unerlässlich.

Eine weitere Option, die es ermöglicht, die Gleichungsnummern zu aktualisieren, ohne alles neu zu rendern, ist ein Javascript, das die HTML-Ausgabe nach Elementen mit Gleichungen oder Referenzen durchsucht und deren Text durch den entsprechenden Wert ersetzt.

Um dies voll funktionsfähig zu machen, wären einige Änderungen in MathJax erforderlich, das Setzen zusätzlicher Attribute für die Elemente, die aktualisiert werden müssen, damit das Skript sie erkennen kann.

Im Moment ist dieser Support nicht da, aber die folgenden Workarounds werden den Zweck erfüllen

  • Verwenden \tag{labelname} , um eine Gleichungsnummer zu erstellen. Beachten Sie, dass hier das Tag das Etikett ist
  • referenziere es im Markdown mit rohem HTML-Code <span class=reference data-target=labelname></span> Dies ist notwendig, da die HTML-Ausgabe von \ref oder \eqref den Labelnamen nicht enthält.

zum Beispiel

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

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

Das folgende Skript aktualisiert die Gleichungsnummern. Es muss ausgeführt werden, nachdem neue Gleichungsnummern oder Referenzen gerendert wurden. Im Moment können Sie das Skript in eine separate Zelle legen und bei Bedarf manuell ausführen. Eine vollständige Lösung erfordert einen Mechanismus, um zu geeigneten Zeiten eine Wiederholung auszulösen.

%%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)
    }
);

Beachten Sie, dass das Skript nur die Zahlen aktualisiert und das gesamte Layout unverändert lässt. Es sollte weitaus effizienter sein, als MathJax alles neu rendern zu lassen.

@basvandertol Danke für das Beispiel, aber ich sehe nicht, wie nützlich dies ist, da die Ergebnisse nur auf dem aktuellen Bildschirm sichtbar sind: Sie werden nicht gespeichert, können nicht gedruckt werden, können nicht in nbviewer angezeigt oder gesehen werden in jeder Ausgabe (PDF, HTML usw.) sehe ich nicht, dass dies eine Problemumgehung ist. Habe ich dich falsch verstanden? Oder ist das nur ein Teil einer Lösung?

Danke für das Feedback @dsblank. Es ist in der Tat nur eine Teillösung, insbesondere für das Problem, die Gleichungsnummern während der Bearbeitung des Notebooks zu aktualisieren, ohne alles neu zu rendern. Ich habe mit HTML-Datenattributen experimentiert, um dies zu erreichen. Später entdeckte ich, dass nbconvert einen ähnlichen Ansatz verwendet, um mit Latex-Zitaten umzugehen. http://nbconvert.readthedocs.io/en/latest/latex_citations.html

Im Moment fügt MathJax der HTML-Ausgabe nicht genügend Attribute hinzu, um Referenzen nach dem Rendern aufzulösen. Aus diesem Grund verwende ich diese hackigen Labels und Referenzen, um die HTML-Ausgabe zu erhalten, die ich brauche. Bei diesen Labels wird die normale Konvertierung nach Latex ->pdf unterbrochen.

Ich mache mich jetzt mit dem MathJax-Quellcode vertraut, um zu sehen, ob es eine einfache Möglichkeit gibt, die HTML-Attribute zu den normalen Labels und Referenzen hinzuzufügen.

Der nächste Schritt wäre, in nbconvert Unterstützung hinzuzufügen, um diese HTML-Attribute zu erkennen, so wie es bereits bei Zitaten der Fall ist. Wenn nbconvert mit diesen Attributen auch die Ausgabe von Codeabschnitten nach HTML scannen könnte, dann kann eine HTML-Beschriftung/-Beschriftung zu Code-generierten Abbildungen hinzugefügt werden, und nbconvert
kann die korrekte Latex-Ausgabe generieren. Abbildungen können dann in Markup-Zellen referenziert werden.

Es ist nur ein Umriss eines Ansatzes zur vollständigen Unterstützung von Referenzen in ipython-Notebooks. Es scheint mir machbar, aber wenn jemand jetzt schon einen Showhopper sieht, lassen Sie es mich bitte wissen. Ich weiß sehr wenig über die Interna des Ipython-Notebooks. Dies scheint ein lustiges Projekt zu sein, um mehr zu erfahren, aber im Moment kann ich nicht alle Auswirkungen überblicken.

Habe gerade diesen (langen) Thread gefunden...

Vielleicht könnte dies von Interesse sein: Ich habe versucht, das Rendern von LaTeX-Umgebungen zu unterstützen, einschließlich der _automatischen Nummerierung und Aktualisierung_ von Gleichungen und Umgebungen, dokumentweit.
Es verwendete eine Schaltfläche zum Aktualisieren, verwendet jetzt jedoch eine ähnliche Idee wie die oben von @basvandertol erwähnte.

All dies führt natürlich zu einer gewissen Überlastung, aber das ist für mich selbst bei recht langen Dokumenten weitgehend akzeptabel. Der Export von Notebooks in HTML- und LaTeX-Dokumente ist verfügbar;

Sie können sich die Erweiterung hier oder auf Pypi ansehen . Am besten.

+1 für die Integration einiger Versionen der vorgeschlagenen Lösungen in den Master.

ist das schon gelöst oder soll ich +1 geben?

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen