在动画中嵌套 sagetex 以用于 tikz(和渐近线)gif - 可能还是不可能?

在动画中嵌套 sagetex 以用于 tikz(和渐近线)gif - 可能还是不可能?

我运行的是 Windows 10 或 11(我不知道),系统上运行着 WSL2 - Ubuntu 发行版,电脑上下载了 SageMath。我已成功建立这三个软件之间的联系,并且能够运行包含 Sage 代码的 .tex 文件。

从 Ubuntu 终端运行:

  1. cd /mnt/c/users/myname

  2. pdflatex filename.tex

  3. sage filename.sagetex.sage

  4. pdflatex filename.tex

我想使用 sagetex 包制作一个 TikZ(或 asymptote,但这更复杂,我相信它可能确实需要下面提到的 python 方法)动画,该动画基于超出 TeX 能力的数学。我无法让它工作,想要一些建议。最坏的情况是制作一个 Python 脚本来重写每个帧的整个文档 - 不使用 animate 包,然后使用 ImageMagick 或类似的东西将它们附加在一起 ​​- 如果需要的话,这是可以的。我只关心产品;我不在乎我的电脑要花多长时间才能制作出来。

这是一个最小的非工作示例:

\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}

请告诉我;我可以让这个适用于 tikz 吗,或者 Python 脚本选项是更好的选择?我不认为我需要询问这是否适用于渐近线,哈哈 :)

谢谢!

答案1

上面的代码中,使用animate包的方法在 LaTeX 中不起作用,因为您的 LaTeX 代码包含代码\sage{f(\x)}。要使sagetex软件包正常工作,您的文档必须在步骤 2 中正确编译(pdflatex filename.tex)。由于Sage直到步骤 3 才会运行,并且缺少的内容/计算对于在步骤 2 中构建绘图是必需的,因此 LaTeX 编译失败。这就是为什么在我的许多sagetex问题的答案中,我创建了一串 LaTeX 代码,然后在您的步骤 4 中将其插入到 LaTeX 文档中。例如,请参阅我对如何使用 Tikz/Pgfplot 绘制黎曼 Zeta 函数?。但是,我不明白这种方法如何与animate软件包一起工作在 LaTeX 中。我认为你可以花很多时间和精力使用animate命令在 Sage 中创建动画 .gif。这将涉及使用 Sage 以及命令创建 Tikzanimate图像在 Sage 中。Sage 代码中的图形对象列表将animate是 Tikz 图像。我认为这会显著增加创建动画 gif 的时间/复杂性。如果是我,我会使用 Sage 绘图和 Sage“动画”来构建动画。为了说明这种方法,请转到Sage 单元服务器。将下面的代码复制/粘贴到框中。然后按下图中所示的“评估”按钮。您将看到 Sage 运行动画。

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)

最终结果就是下图中的动画:

在此处输入图片描述

您可以gif通过右键单击图像来下载。关于上面的代码,我认为此代码更接近您所写的内容:

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)

您可以在下面看到右键单击的结果:

在此处输入图片描述

仅使用 Sage 创建动画应该相对快速和容易。要制作 Tikz 图像的动画,L += [G.plot()]必须修改该行以包含已经创建的 png/pdf Tikz 图(额外步骤)或动态创建的(大量额外编码)。所以我怀疑你可以适应animate 在 Sage 中创建 Tikz 图片的动画,但是这会更加复杂并且耗时。

相关内容