diff --git a/manimlib/__init__.py b/manimlib/__init__.py index 17d3da72..7704b352 100644 --- a/manimlib/__init__.py +++ b/manimlib/__init__.py @@ -46,6 +46,7 @@ from manimlib.mobject.svg.drawings import * from manimlib.mobject.svg.mtex_mobject import * from manimlib.mobject.svg.string_mobject import * from manimlib.mobject.svg.svg_mobject import * +from manimlib.mobject.svg.special_tex import * from manimlib.mobject.svg.tex_mobject import * from manimlib.mobject.svg.text_mobject import * from manimlib.mobject.three_dimensions import * diff --git a/manimlib/mobject/svg/drawings.py b/manimlib/mobject/svg/drawings.py index 8603bfa4..b26179ec 100644 --- a/manimlib/mobject/svg/drawings.py +++ b/manimlib/mobject/svg/drawings.py @@ -45,7 +45,7 @@ from manimlib.mobject.mobject import Mobject from manimlib.mobject.svg.svg_mobject import SVGMobject from manimlib.mobject.svg.tex_mobject import Tex from manimlib.mobject.svg.tex_mobject import TexText -from manimlib.mobject.svg.tex_mobject import TexTextFromPresetString +from manimlib.mobject.svg.special_tex import TexTextFromPresetString from manimlib.mobject.three_dimensions import Prismify from manimlib.mobject.three_dimensions import VCube from manimlib.mobject.types.vectorized_mobject import VGroup diff --git a/manimlib/mobject/svg/special_tex.py b/manimlib/mobject/svg/special_tex.py new file mode 100644 index 00000000..e4a3539f --- /dev/null +++ b/manimlib/mobject/svg/special_tex.py @@ -0,0 +1,94 @@ +from __future__ import annotations + +from manimlib.constants import WHITE, GREY_C +from manimlib.constants import DOWN, LEFT, RIGHT, UP +from manimlib.constants import FRAME_WIDTH +from manimlib.constants import MED_LARGE_BUFF, SMALL_BUFF +from manimlib.mobject.geometry import Line +from manimlib.mobject.svg.tex_mobject import Tex, TexText +from manimlib.mobject.svg.mtex_mobject import MTex, MTexText + + +from typing import TYPE_CHECKING + +if TYPE_CHECKING: + from manimlib.typing import ManimColor + + + +class BulletedList(TexText): + def __init__( + self, + *items: str, + buff: float = MED_LARGE_BUFF, + dot_scale_factor: float = 2.0, + alignment: str = "", + **kwargs + ): + super().__init__( + *(s + R"\\" for s in items), + alignment=alignment, + **kwargs + ) + for part in self: + dot = Tex(R"\cdot").scale(dot_scale_factor) + dot.next_to(part[0], LEFT, SMALL_BUFF) + part.add_to_back(dot) + self.arrange( + DOWN, + aligned_edge=LEFT, + buff=buff + ) + + def fade_all_but(self, index_or_string: int | str, opacity: float = 0.5) -> None: + arg = index_or_string + if isinstance(arg, str): + part = self.get_part_by_tex(arg) + elif isinstance(arg, int): + part = self.submobjects[arg] + else: + raise Exception("Expected int or string, got {0}".format(arg)) + for other_part in self.submobjects: + if other_part is part: + other_part.set_fill(opacity=1) + else: + other_part.set_fill(opacity=opacity) + + +class TexTextFromPresetString(TexText): + tex: str = "" + default_color: ManimColor = WHITE + + def __init__(self, **kwargs): + super().__init__( + self.tex, + color=kwargs.pop("color", self.default_color), + **kwargs + ) + + +class Title(TexText): + def __init__( + self, + *text_parts: str, + scale_factor: float = 1.0, + include_underline: bool = True, + underline_width: float = FRAME_WIDTH - 2, + # This will override underline_width + match_underline_width_to_text: bool = False, + underline_buff: float = SMALL_BUFF, + underline_style: dict = dict(stroke_width=2, stroke_color=GREY_C), + **kwargs + ): + super().__init__(*text_parts, **kwargs) + self.scale(scale_factor) + self.to_edge(UP) + if include_underline: + underline = Line(LEFT, RIGHT, **underline_style) + underline.next_to(self, DOWN, buff=underline_buff) + if match_underline_width_to_text: + underline.match_width(self) + else: + underline.set_width(underline_width) + self.add(underline) + self.underline = underline diff --git a/manimlib/mobject/svg/tex_mobject.py b/manimlib/mobject/svg/tex_mobject.py index 2b5b38bc..cfcd1c7b 100644 --- a/manimlib/mobject/svg/tex_mobject.py +++ b/manimlib/mobject/svg/tex_mobject.py @@ -4,11 +4,7 @@ from functools import reduce import operator as op import re -from manimlib.constants import BLACK, WHITE, GREY_C -from manimlib.constants import DOWN, LEFT, RIGHT, UP -from manimlib.constants import FRAME_WIDTH -from manimlib.constants import MED_LARGE_BUFF, SMALL_BUFF -from manimlib.mobject.geometry import Line +from manimlib.constants import BLACK, WHITE from manimlib.mobject.svg.svg_mobject import SVGMobject from manimlib.mobject.types.vectorized_mobject import VGroup from manimlib.utils.tex_file_writing import tex_content_to_svg_file @@ -341,81 +337,3 @@ class TexText(Tex): arg_separator=arg_separator, **kwargs ) - - -class BulletedList(TexText): - def __init__( - self, - *items: str, - buff: float = MED_LARGE_BUFF, - dot_scale_factor: float = 2.0, - alignment: str = "", - **kwargs - ): - super().__init__( - *(s + R"\\" for s in items), - alignment=alignment, - **kwargs - ) - for part in self: - dot = Tex(R"\cdot").scale(dot_scale_factor) - dot.next_to(part[0], LEFT, SMALL_BUFF) - part.add_to_back(dot) - self.arrange( - DOWN, - aligned_edge=LEFT, - buff=buff - ) - - def fade_all_but(self, index_or_string: int | str, opacity: float = 0.5) -> None: - arg = index_or_string - if isinstance(arg, str): - part = self.get_part_by_tex(arg) - elif isinstance(arg, int): - part = self.submobjects[arg] - else: - raise Exception("Expected int or string, got {0}".format(arg)) - for other_part in self.submobjects: - if other_part is part: - other_part.set_fill(opacity=1) - else: - other_part.set_fill(opacity=opacity) - - -class TexTextFromPresetString(TexText): - tex: str = "" - default_color: ManimColor = WHITE - - def __init__(self, **kwargs): - super().__init__( - self.tex, - color=kwargs.pop("color", self.default_color), - **kwargs - ) - - -class Title(TexText): - def __init__( - self, - *text_parts: str, - scale_factor: float = 1.0, - include_underline: bool = True, - underline_width: float = FRAME_WIDTH - 2, - # This will override underline_width - match_underline_width_to_text: bool = False, - underline_buff: float = SMALL_BUFF, - underline_style: dict = dict(stroke_width=2, stroke_color=GREY_C), - **kwargs - ): - super().__init__(*text_parts, **kwargs) - self.scale(scale_factor) - self.to_edge(UP) - if include_underline: - underline = Line(LEFT, RIGHT, **underline_style) - underline.next_to(self, DOWN, buff=underline_buff) - if match_underline_width_to_text: - underline.match_width(self) - else: - underline.set_width(underline_width) - self.add(underline) - self.underline = underline