Wie Latex in Jupyter Notebook?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Brando
User
Beiträge: 171
Registriert: Donnerstag 28. Januar 2016, 15:36

Hallo, gerne würde ich einen Latex Text in Jupyter Notebook darstellen. Es wäre also sinnvoll ein Tool zu haben, dass den Latex Text so darstellt. Ich denke, da MathJax genutzt wird, dass alle Formeln dann in MathJax Code ausgedrückt werden, und die anderen Sachen, wie centering etc. werden dann mit HTML dargestellt. Gibt es eine Lösung für dieses Problem? Ich selbst habe ein kleines Javaprogramm geschrieben um /centering zu ersetzten durch ein
\begin{bfseries}
Dies ist ein Satz.
\end{bfseries}

Weiß noch nicht, ob das in Jupyter Notebook dargestellt werden kann. Aber das Programm verdeutlicht was ich suche.

Code: Alles auswählen

import java.io.*;
import java.util.ArrayList;
import java.util.Scanner;


public class Transform_bsp1 {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		ArrayList<String> eingabe= new ArrayList<String>();
		File f = new File("Bsp_1_copy.tex");
		Scanner sc = null;
		try {
			sc = new Scanner(f);
		} catch (FileNotFoundException e) {
			System.exit(1);
		}
	
	while (sc.hasNextLine()){
	// System.out.println("Nächste Zeile ist jetzt " + sc.nextLine());	
		eingabe.add(sc.nextLine());
	}
	System.out.println("Der ursprüngliche Text");
	for (int t1=0; t1< eingabe.size(); t1++){
		System.out.println(eingabe.get(t1));
	}
	
	sc.close();
	boolean enthalten=false; 
	for (int i= 0; i< eingabe.size(); i++){
		if (eingabe.get(i).contains("\\centering")){
			enthalten=true;
			eingabe.set(i,"\\begin{bfseries}");
		}
		if (eingabe.get(i).contains("\\end") && enthalten){
			ArrayList<String> append = new ArrayList<String>();
			String last= eingabe.get(i);
			for (int j=i; j<eingabe.size(); j++){
				append.add(eingabe.get(j));
			}
			for (int w=0; w<append.size(); w++){
				eingabe.remove(w+i);
			}
			enthalten=false;
			eingabe.add("\\end{bfseries}");
			for (int h= 0; h< append.size(); h++){
				eingabe.add(append.get(h));
			}
			
		}
		
		
	}
	System.out.println("Der verbesserte Text");
	for (int t=0; t< eingabe.size(); t++){
		System.out.println(eingabe.get(t));
	}
	
	
	}

}

Dadurch wird folgende tex Datei transformiert:

Code: Alles auswählen

% das Papierformat zuerst
\documentclass[a4paper, 11pt]{article}

% hier beginnt das Dokument
\begin{document}
\centering
Dies ist ein Satz.
% das ist wohl jetzt das Ende des Dokumentes
\end{document}
BlackJack

@Brando: Das ist selbst für Java ziemlich umständlich. Je nach Version gibt's da einfachere Möglichkeiten als den `Scanner`. In Java 8 würde man wohl Streams verwenden. In Java 7 wäre `java.nio.file.Files.readAllLines()` eine Möglichkeit um alle Zeilen mit wenig Code in eine Liste zu bekommen.

Ich weiss auch nicht so ganz was Du hier letztendlich fragst. Kann man dieses Java-Programm (schöner und kürzer) in Python ausdrücken? Ja, kann man. Will man das? Ich denke nicht, denn das sieht alles andere als robust aus. Und ich glaube auch nicht das Jupyter Notebook beliebige LaTeX-Dokumente rendern und anzeigen kann. Das will man ja eigentlich nur haben um einzelne Formeln zu setzen. Für Text kann das doch so Sachen wie Markdown.
Brando
User
Beiträge: 171
Registriert: Donnerstag 28. Januar 2016, 15:36

Ja, dann muss ich irgendwie aus dem ursprünglichen Latex Texdokument sowohl etwas machen, was mit MathJax gelesen werden kann, also auch als Markdown, also bspw. HTML. Aber wenn ich eine Datei tex habe, wie in meinem Beispiel, wie rendere ich diese Datei, so dass ein anderes Dokument herauskommt, welches in Jupyter Notebook dargestellt werden kann.
BlackJack

@Brando: Du könntest versuchen das nach HTML zu wandeln, da gibt es diverse Lösungen oder nach Markdown (mit Pandoc), allerdings dürfte bei jedem nicht-trivialen Dokument etwas auf der Strecke bleiben was man dann per Hand anpassen muss. So ein Notebook und die dort verwendeten Auszeichnungssprachen sind doch etwas anderes als ein Textsatzsystem für den Druck.
BlackJack

Das Java-Programm mal in weniger umständlich (für Java-Verhältnisse ;-)):

Code: Alles auswählen

import static java.nio.file.Files.readAllLines;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

public class Main {

    public static void main(String[] args) throws IOException {
        final List<String> lines = readAllLines(new File("test.tex").toPath());

        System.out.println("\nDer ursprüngliche Text:\n");
        lines.forEach(System.out::println);

        final Collection<String> resultLines = new ArrayList<>();
        boolean centered = false;
        for (String line : lines) {
            if (centered) {
                if (line.contains("\\end")) {
                    centered = false;
                    resultLines.add("\\end{bfseries}");
                }
            } else if (line.contains("\\centering")) {
                centered = true;
                line = "\\begin{bfseries}";
            }
            resultLines.add(line);
        }

        System.out.println("\nDer verbesserte Text:\n");
        resultLines.forEach(System.out::println);
    }
}
Antworten