Вопрос или проблема
У меня есть следующий код на Python для отображения матрицы в Manim Community:
from manim import *
class Example(Scene):
def construct(self):
A = MathTex(
r"A="
r"\begin{pmatrix}"
r"a_{11} & a_{12} & \dots & a_{1n}\\"
r"a_{21} & a_{22} & \dots & a_{2n}\\"
r"\vdots & \vdots & \ddots & \vdots\\"
r"a_{n1} & a_{n2} & \dots & a_{nn}"
r"\end{pmatrix}"
).center()
self.play(Write(A))
Я бы хотел, чтобы каждый “a” имел одинаковый цвет (например, красный).
Я знаю, что могу отображать индекс и затем раскрашивать каждую “a” индивидуально по индексу, но это становится все более утомительным для больших уравнений.
Существует ли способ сделать это более умно, например, раскрашивая по тексту или перебирая уравнение?
Существует set_color_by_tex
в MathTex
, но вам нужно внимательно прочитать документацию Подстроки и части, где говорится
Обратите внимание, что set_color_by_tex() раскрашивает всю подстроку, содержащую Tex, а не только конкретный символ или выражение Tex
Таким образом, при применении к MathTex
раскрашивается все уравнение. Поскольку это не то, что вам нужно, вы можете использовать параметр substrings_to_isolate
у MathTex
Пример (почти) работающего кода выглядит следующим образом
class Example(Scene):
def construct(self):
A = MathTex(
r"A=a_{11} & a_{12} & \dots & a_{1n}\\a_{21} & a_{22} & \dots & a_{2n}\\\vdots & \vdots & \ddots & \vdots\\a_{n1} & a_{n2} & \dots & a_{nn}",
substrings_to_isolate="a"
).center()
A.set_color_by_tex("a", RED)
self.play(Write(A))
Как видите, я убрал \begin{pmatrix}
& \end{pmatrix}
, чтобы это заработало. Возможно, вы сможете сделать запрос в их GitHub, чтобы узнать, должно ли работать применение substrings_to_isolate
к матрице MathTex или нет.
Ответ или решение
Для решения задачи окрашивания символа "a" в матрице, отображаемой с помощью Manim, можно воспользоваться функцией set_color_by_tex
в сочетании с параметром substrings_to_isolate
. Эта возможность позволяет вам задать определённые подстроки, которые следует изолировать для изменения их цвета.
Ваша приведённая конструкция кода содержит хороший старт, но необходимо внести некоторые изменения, чтобы ввести матрицу непосредственно с соответствующими данными и не потерять форматирование. Ниже представлена окончательная версия кода, где "a" будет окрашен в красный цвет:
from manim import *
class Example(Scene):
def construct(self):
# Здесь мы создаем объект MathTex, содержащий всю информацию о матрице
A = MathTex(
r"A = \begin{pmatrix}"
r"a_{11} & a_{12} & \dots & a_{1n} \\"
r"a_{21} & a_{22} & \dots & a_{2n} \\"
r"\vdots & \vdots & \ddots & \vdots \\"
r"a_{n1} & a_{n2} & \dots & a_{nn}"
r"\end{pmatrix}",
substrings_to_isolate="a" # Изолируем символы "a"
).center()
# На данной строке мы устанавливаем цвет для каждого "a"
A.set_color_by_tex("a", RED)
# Запускаем анимацию для отображения матрицы
self.play(Write(A))
Объяснение:
-
MathTex
иsubstrings_to_isolate
: Мы используемMathTex
для создания более сложной математической структуры. Используя параметрsubstrings_to_isolate
, мы указываем, что хотим выделить все "a" в наших данных. -
set_color_by_tex
: После того, как мы изолировали символы "a", можно вызватьset_color_by_tex("a", RED)
для окрашивания всех символов "a" в красный цвет. -
Форматирование: В приведённом коде я сохранил форматирование матрицы с помощью \begin{pmatrix} и \end{pmatrix}, чтобы отображение выглядело корректно.
Запустив этот код, вы получите матрицу, в которой все "a" окрашены в красный цвет, что значительно упрощает процесс, особенно для больших уравнений и матриц. Таким образом, вам не придётся вручную окрашивать каждую переменную, и код становится более читабельным и удобным.