Text

Text 使用 cairo 来生成文字的svg, 所以它不需要 LaTeX 环境,而且可以方便地更改字体,但是不能够书写公式。 需要更改字体,而且要使用公式的,可以尝试cigar666编写的 MyText

MK 做了一个关于常用 Text 的视频: 〔manim教程〕第四讲 SVG、图片与文字

由于这个类的作者 XiaoYoung 写了中文的文档,这里就不放出文档字符串了,下方给出原版文档

Text

class manimlib.mobject.svg.text_mobject.Text(text, **kwargs)

文字类

在下方给出原版文档

https://cdn.jsdelivr.net/gh/manim-kindergarten/CDN@master/manim_assets/image/Text/image1.png
TextDemo
from manimlib.imports import *

class Demo(Scene):
    def construct(self):
        text = Text('Hello, world!')
        self.play(Write(text))

MarkupText

class manimlib.mobject.svg.text_mobject.MarkupText(text, **config)

带标记的文本

用于处理带有超文本标记的文字,主要用于代码类的高亮

extract_color_tags(text=None, colormap=None)

用于确定哪一部分的字符串应该被上色

删去 <color> 标签,因为这些标签不是 Pango 的标记,并且会导致错误

注意:不建议使用 <color> 标签。一旦遗留语法消失,这个函数将被删除。

extract_gradient_tags(text=None, gradientmap=None)

用于确定哪一部分的字符串应该被上色

删去 <gradient> 标签,因为这些标签不是 Pango 的标记,并且会导致错误

text2hash()

生成 sha256 作为文件名

text2svg()

使用 Pango 将文本转换为 SVG 文件

Code

class manimlib.mobject.svg.text_mobject.Code(code, **kwargs)

代码类

使用 pygments 模块生成带有颜色、倾斜标签的文本,并进行格式化

  • font : 字体

  • font_size : 字号

  • language : 代码的编程语言

  • code_style : 语法高亮样式,默认为 ‘monokai’,更多样式可以查看 pygments 官网

  • char_width : 字符宽度

以下为 Text 类的说明

  • text:

    • 接收一个str,如'Hello, world!'

    • 不支持LaTex语法

    • 如果只有一行,字符串前后的空格会被忽略(指不会产生长度,但是这些空格会被计算,可以用下标访问)

    • \t默认会被替换为4个空格,可以通过调整tab_width改变这一行为

  • color:

    • 接收一个str,如'#FFFFFF'

    • 或者是定义在constants.py里的颜色常量,如BLUE

    • Demo

      • text = Text('Hello', color=BLUE) color

  • t2c:

    • text2color的缩写

    • 接收一个dict,如{'text': color}

    • 或者切片模式,如{'[1:4]': color}

    • Demo

      • text = Text('Hello, world!', t2c={'world':BLUE}) t2c

  • gradient:

    • 接收一个tuple,如(BLUE, GREEN, '#FFFFFF')

    • Demo

      • text = Text('Hello', gradient=(BLUE, GREEN)) gradient

  • t2g:

    • text2gradient的缩写

    • 接收一个dict,如{'text': (BLUE, GREEN, '#FFFFFF')}

    • 或者切片模式,如{'[1:4]': (BLUE, GREEN, '#FFFFFF')}

    • Demo

      • text = Text('Hello, world!', t2g={'world':(BLUE, GREEN)}) t2g

  • font:

    • 接收一个str,

      'Source Han Sans',请确保字体名正确

    • 不支持直接读取给定的字体文件路径,必须先将字体安装到系统中才能使用

    • Demo

      • text = Text('Hello', font='Source Han Sans') font

  • t2f:

    • text2font的缩写

    • 接收一个dict,如{'text': 'Source Han Sans'}

    • 或者切片模式,如{'[1:4]': 'Source Han Sans'}

    • Demo

      • text = Text('Hello, world!', t2f={'world':'Forte'}) t2f

  • slant:

    • 斜体选项: NORMAL或者ITALIC

    • 其实还有一个OBLIQUE,但是貌似效果跟ITALIC一样

    • Demo

      • text = Text('Hello', slant=ITALIC) slant

  • t2s:

    • text2slant的缩写

    • 接收一个dict,如{'text': ITALIC}

    • 或者切片模式,如{'[1:4]': ITALIC}

    • Demo

      • text = Text('Hello, world!', t2s={'world':ITALIC}) t2s

  • weight:

    • 字重(粗细)选项: NORMAL或者BOLD

    • 目前只支持调用NORMALBOLD是因为底层的包不支持其它选项

    • 如果想用Light、Condensed等选项可以在调用字体的时候声明,如'Open Sans Light'

    • 更多有关Light等选项的问题,可以参考:

      https://github.com/3b1b/manim/issues/884

    • Demo

      • text = Text('Hello', weight=BOLD) weight

  • t2w:

    • text2weight的缩写

    • 接收一个dict,如{'text': BOLD}

    • 或者切片模式,如{'[1:4]': BOLD}

    • Demo

      • text = Text('Hello, world!', t2w={'world':BOLD}) t2w

  • size:

    • 不建议使用

    • 接收一个数且该数要大于0.1

    • 不是线性的,因为SVGMobject的缩放逻辑有点迷

    • 如果小于0.1可能会出现锯齿

    • 目前与MUnit没有关联,所以玄学调参

    • 如果需要精确控制大小,建议使用.scale()

    • Demo

      • text = Text('Hello', size=5) size

  • lsh:

    • line_spacing_height的缩写

    • 不建议使用

    • 默认与size相等

    • 非线性(存疑)

    • 与MUnit没有关联

    • Demo

      • text = Text('Hello\nWorld', lsh=1.5) lsh

  • 其它:

    • 还有一些从Mobject继承来的参数也可以使用

    • 如: fill_colorfill_opacitystroke_colorstroke_width

CONFIG中属性

  • Mobjcet:

    • color: 默认为WHITE

    • heigth: 默认为None

  • Text:

    • font: 默认为''

    • gradient: 默认为None

    • lsh: 默认为-1

    • size: 默认为1

    • slant: 默认为NORMAL

    • weight: 默认为NORMAL

    • t2c: 默认为{}

    • t2f: 默认为{}

    • t2g: 默认为{}

    • t2s: 默认为{}

    • t2w: 默认为{}

    • tab_width: 默认为4

方法

  • Mobject:

    • set_color(self, color):

      • text.set_color(BLUE)

      • text[7:12].set_color(BLUE)

    • set_color_by_gradient(self, gradient):

      • text.set_color_by_gradient(BLUE, GREEN)

      • text[7:12].set_color_by_gradient(BLUE, GREEN)

  • Text:

    • set_color_by_t2c(self, t2c):

      • text.set_color_by_t2c({'world':BLUE})

    • set_color_by_t2g(self, t2g):

      • text.set_color_by_t2g({'world':(BLUE, GREEN)})

其它

  • 切片模式:

    https://cdn.jsdelivr.net/gh/manim-kindergarten/CDN@master/manim_assets/image/Text/image14.png
    TextSlice
    text = Text(
        'Google',
        t2c={
            '[:1]':'#3174f0', '[1:2]':'#e53125',
            '[2:3]':'#fbb003', '[3:4]':'#3174f0',
            '[4:5]':'#269a43', '[5:]':'#e53125',
        }
    )
    
  • UTF-8:

    https://cdn.jsdelivr.net/gh/manim-kindergarten/CDN@master/manim_assets/image/Text/image15.png
    TextUTF8
    from manimlib.imports import *
    
    script = '''
    Hello
    你好
    こんにちは
    안녕하세요
    '''
    
    class Demo(Scene):
        def construct(self):
            text = Text(script, font='Source Han Sans')
            self.play(Write(text))
    
  • 目前对GBK(中日韩)文字的支持没有太大问题

  • 但是对于其它文字,如印度语、阿拉伯语的显示有很大问题