Вложение sagetex в animate для tikz (и asymptote) gif - возможно или невозможно?

Вложение sagetex в animate для tikz (и asymptote) gif - возможно или невозможно?

Я использую Windows 10 или 11 (не знаю), в моей системе запущен WSL2 - дистрибутив Ubuntu, и на моем компьютере загружен SageMath. Я успешно установил связь между всеми тремя программами и смог запустить файлы .tex, содержащие код Sage.

Из терминала Ubuntu я запускаю:

  1. cd /mnt/c/users/myname

  2. pdflatex filename.tex

  3. sage filename.sagetex.sage

  4. pdflatex filename.tex

Я хотел бы сделать анимацию TikZ (или asymptote, но это сложнее, и я считаю, что для этого, вероятно, законно требуется метод python, упомянутый ниже), которая основана на математике, которая выходит за рамки возможностей TeX, с использованием пакета sagetex. У меня возникли проблемы с тем, чтобы это работало, и я хотел бы получить совет. Худшим вариантом было бы создание скрипта 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? Я не думаю, что мне нужно спрашивать, будет ли это работать для asymptote, lol :)

Спасибо!

решение1

Ваш подход в коде выше, с использованием animateпакетав LaTeXне работает, потому что ваш код LaTeX включает код \sage{f(\x)}. Для sagetexработы пакета ваш документ был правильно скомпилирован на шаге 2 ( pdflatex filename.tex). Так как Sageне будет работать до шага 3, и этот отсутствующий контент/вычисления необходимы для построения графика на шаге 2, компиляция LaTeX завершается неудачей. Это основная причина, по которой во многих моих ответах на sagetexпроблемы я создаю строку кода LaTeX, которая затем вставляется в документ LaTeX на шаге 4. Например, см. мой ответ наКак построить график дзета-функции Римана с помощью Tikz/Pgfplot?. Однако я не вижу, как этот подход может работать с animateпакетомв LaTeXЯ думаю, что вы могли бы, затратив много времени и усилий, использовать animateкомандув шалфеедля создания анимированного .gif. Это будет включать создание изображений Tikz с использованием Sage вместе с animateкомандойв шалфее. Ваш список графических объектов в коде Sage animateбудет изображениями Tikz. Я думаю, это значительно увеличит время/сложность создания анимированного gif. Если бы это был я, я бы построил анимацию, используя Sage plotting вместе с Sage `animate'. Чтобы проиллюстрировать этот подход, перейдите наСервер сотовой связи 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 в шалфеесоздать анимацию изображений Tikz, но это гораздо сложнее и требует больше времени.

Связанный контент