Verschachteln von Sagetex in Animate für Tikz- (und Asymptote-)GIF – möglich oder unmöglich?

Verschachteln von Sagetex in Animate für Tikz- (und Asymptote-)GIF – möglich oder unmöglich?

Ich verwende Windows 10 oder 11 (ich weiß es nicht), habe WSL2 auf meinem System laufen – Ubuntu-Distribution – und habe SageMath auf meinen Computer heruntergeladen. Ich habe erfolgreich eine Verbindung zwischen allen drei Softwareprogrammen hergestellt und konnte .tex-Dateien mit Sage-Code ausführen.

Vom Ubuntu-Terminal aus führe ich Folgendes aus:

  1. cd /mnt/c/users/myname

  2. pdflatex filename.tex

  3. sage filename.sagetex.sage

  4. pdflatex filename.tex

Ich möchte eine TikZ-Animation (oder Asymptote, aber das ist komplizierter und ich glaube, es erfordert wahrscheinlich die unten erwähnte Python-Methode) erstellen, die auf Mathematik basiert, die über die Fähigkeiten von TeX hinausgeht, und zwar mit dem Sagetex-Paket. Ich habe Probleme, dies zum Laufen zu bringen, und hätte gerne einen Rat. Im schlimmsten Fall müsste ich ein Python-Skript erstellen, um das gesamte Dokument für jedes Bild neu zu schreiben – ohne das Animate-Paket zu verwenden, und sie dann mit ImageMagick oder etwas Ähnlichem zusammenfügen – was in Ordnung ist, wenn es sein muss. Mir geht es nur um das Produkt; es ist mir egal, wie lange mein Computer braucht, um es zu erstellen.

Hier ist ein minimales, nicht funktionierendes Beispiel:

\documentclass{beamer}
\usepackage{sagetex,animate,tikz}
\begin{document}
\begin{sageblock}
    f(x) = x
\end{sageblock}
\begin{animateinline}[palindrome]{1}
\multiframe{10}{x=0+1}{
\begin{tikzpicture}
\draw (0,0) -- (\sage{f(\x)},0);
\end{tikzpicture}}
\end{animateinline}
\end{document}

Bitte sagen Sie mir, ob ich das für Tikz zum Laufen bringen kann oder ob die Python-Skript-Option die bessere Lösung ist. Ich glaube, ich muss nicht fragen, ob das auch für Asymptote funktioniert, lol :)

Danke!

Antwort1

Ihr Ansatz im obigen Code unter Verwendung des animatePaketsin LaTeXfunktioniert nicht, weil Ihr LaTeX-Code den Code enthält \sage{f(\x)}. Damit das sagetexPaket funktioniert, muss Ihr Dokument in Schritt 2 ( pdflatex filename.tex) ordnungsgemäß kompiliert werden. Da Sagees erst in Schritt 3 ausgeführt wird und der fehlende Inhalt/die fehlende Berechnung erforderlich ist, um das Diagramm in Schritt 2 zu erstellen, schlägt die LaTeX-Kompilierung fehl. Das ist der wesentliche Grund, warum ich in vielen meiner Antworten auf sagetexProbleme eine Zeichenfolge aus LaTeX-Code erstelle, die dann in Schritt 4 in das LaTeX-Dokument eingefügt wird. Siehe beispielsweise meine Antwort aufWie stellt man die Riemannsche Zeta-Funktion mit Tikz/Pgfplot dar?. Ich sehe jedoch nicht, wie dieser Ansatz mit dem animatePaket funktionieren kannin LaTeXIch denke, Sie könnten mit viel Zeit und Mühe den animateBefehl verwendenin Sageum ein animiertes .gif zu erstellen. Dazu müssten die Tikz-Bilder mit Sage und dem animateBefehlin Sage. Ihre Liste der Grafikobjekte im animateCode von Sage wären die Tikz-Bilder. Ich denke, dies würde den Zeitaufwand/die Komplexität bei der Erstellung des animierten GIFs erheblich erhöhen. Wenn ich es wäre, würde ich die Animation mithilfe von Sage-Plotting und Sage `animate' erstellen. Um diesen Ansatz zu veranschaulichen, gehen Sie zuSage Cell Server. Kopieren Sie den untenstehenden Code und fügen Sie ihn in das Feld ein. Klicken Sie dann auf die Schaltfläche „Auswerten“, wie im Bild gezeigt. Sie werden sehen, wie Sage die Animation ausführt.

def Rotate(A,P,degrees):
    A1 = [A[0]-P[0],A[1]-P[1]]
    theta = degrees*pi/180
    R = [A1[0]*cos(theta)-A1[1]*sin(theta), A1[0]*sin(theta)+A1[1]*cos(theta)]
    return [R[0]+P[0],R[1]+P[1]]

L=[]
for j in range(1,15):
    G = Graphics()
    N = j
    Start = [1,0]
    Finish = [0,0]
    Curve = [[1,0], [0,0]]
    n = 1

    while n<N:
        CurveR=[]
        for i in range(0,len(Curve)-1):
            CurveR += [Rotate(Curve[i],Curve[len(Curve)-1],-90)] 
        for i in range(len(CurveR)-1,-1,-1):    
            Curve += [CurveR[i]]
        n += 1
    G += line(Curve)
    L += [G.plot()]
d=animate([L[k]for k in range(1,14)],xmin=-22,xmax=87,ymin=-44,ymax=90,axes=False)

d.show(delay=100)

Das Ergebnis ist die Animation im Bild unten:

Bildbeschreibung hier eingeben

Sie können es herunterladen, gifindem Sie mit der rechten Maustaste auf das Bild klicken. In Bezug auf Ihren obigen Code denke ich, dass dieser Code dem, was Sie geschrieben haben, näher kommt:

f(x)=x
L=[]
for j in range(0,15):
    G = Graphics()
    Curve = line([(0,0), (f(j),0)])

    G += Curve
    L += [G.plot()]
d=animate([L[k]for k in range(1,14)],xmin=0,xmax=15,ymin=0,ymax=2,axes=False)

d.show(delay=100)

Unten können Sie das Ergebnis eines Rechtsklicks sehen:

Bildbeschreibung hier eingeben

Das Erstellen der Animation nur mit Sage sollte relativ schnell und einfach sein. Um eine Animation von Tikz-Bildern zu erhalten, L += [G.plot()]müsste die Zeile geändert werden, um bereits erstellte PNG-/PDF-Tikz-Diagramme einzuschließen (zusätzliche Schritte) oder spontan erstellt werden (viel zusätzliche Codierung). Ich vermute also, Sie könntenanimate in Sageum eine Animation von Tikz-Bildern zu erstellen, aber das ist viel komplizierter und zeitaufwändiger.

verwandte Informationen