<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python 視頻制作神器 -- Manim入門篇

          共 15473字,需瀏覽 31分鐘

           ·

          2022-03-18 10:01

          提前預告,文末有贈書活動~


          今天分享一篇陽哥的文章,是關于如何使用 Manim 這個工具 Python 工具庫來制作視頻的。

          據(jù)我所知,目前應該是沒有專門的書籍和教程來介紹這個工具的。至于教程,不同版本的Manim有一部分文檔,其中 Manim社區(qū)版的文檔相對而言要完善些。

          本次僅介紹 Manim 中?文本?的使用,使用的版本為?Manim Community v0.14.0,本文內(nèi)容主要如下:

          01Manim的安裝與運行

          安裝

          如何安裝社區(qū)版Manim,參見下面的官方鏈接:

          https://docs.manim.community/en/stable/installation.html

          如何運行 Manim

          用?Manim?繪制圖形,首先需要引入?Manim?庫,然后將需要繪制的內(nèi)容封裝到一個 類(class) 里面。

          社區(qū)版的導入代碼如下:

          from?manim?import?*

          對于 編輯好的程序文件(?XXXX.py?文件),需要在同一個文件夾下運行命令來運行程序,命令格式如下:

          manim?-pql?XXXX.py?DemoSquare

          上面的命令行中:

          • manim?是社區(qū)版Manim運行程序的主要標志用語;
          • p?表示程序運行后會進行預覽(圖片或視頻);
          • ql?表示低質(zhì)量(quality low), 其他的選項有?-ql,?-qm,?-qh,?-qk, 分別表示 低質(zhì)量、正常質(zhì)量、高質(zhì)量、4K質(zhì)量;
          • XXXX.py?是py代碼文件;
          • DemoSquare 是 py代碼文件中的一個類;

          演示過程錄屏如下:

          命令行中,還有其他許多參數(shù)可以設置,可以通過社區(qū)版的支持文檔來進一步了解:

          https://docs.manim.community/en/stable/tutorials/configuration.html#command-line-arguments

          02文本使用介紹

          在 Manim社區(qū)版中,文本的使用可以分為幾個大類,分別是:

          • 純文本
          • 標記文本
          • LaTex 文本
          • 代碼文本

          2.1 純文本

          純文本是最常見的一類文字,在視頻中使用的標題、正文等,都可以使用純文本,在Manim 中,純文本可以通過?Text()?對象來實現(xiàn)。

          比如要輸出 文字 “Python數(shù)據(jù)之道”,核心代碼如下:

          Text("Python數(shù)據(jù)之道")

          效果如下:

          設置文本大小

          對于文本而言,設置文本在屏幕中顯示的大小,是經(jīng)常要做的一個事情,Text()?對象可以通過多種方法來實現(xiàn):

          • 設置?scale?屬性值;
          • 設置?set_width?屬性值;
          • 設置?font_size?參數(shù)值;
          #?設置文本大小
          class?Demo2(Scene):
          ????def?construct(self):
          ????????WaterMark.construct(self)
          ????????s?=?"Python數(shù)據(jù)之道"
          ????????t1?=?Text(s)
          ????????t1.to_edge(UP,buff=0.5)
          ????????t2?=?Text(s).scale(2)
          ????????t2.next_to(t1,DOWN)
          ????????t3?=?Text(s).set_width(10)
          ????????t3.next_to(t2,DOWN)
          ????????t4?=?Text(s,font_size=40)
          ????????t4.next_to(t3,DOWN)???????
          ????????self.add(t1)
          ????????self.play(Write(t2))
          ????????self.play(Create(t3))
          ????????self.play(Write(t4))
          ????????self.wait()

          上述代碼的實現(xiàn)效果如下:

          設置文本顏色

          文本顏色設置包括指定某種顏色以及漸變顏色設置,通常情況下,顏色通過?color?參數(shù)來設置,漸變顏色通過?gradient?參數(shù)來設置。

          演示案例的代碼如下:

          #?設置文本顏色
          class?Demo3(Scene):
          ????def?construct(self):
          ????????WaterMark.construct(self)
          ????????s?=?"Python數(shù)據(jù)之道"
          ????????t1?=?Text(s,color=BLUE)
          ????????t1.to_edge(UP,buff=2)
          ????????t2?=?Text("一份價值,一份收獲",gradient=[BLUE,YELLOW,RED]).next_to(t1,DOWN)
          ????????t3?=?Text("Hello?World",gradient=[BLUE,YELLOW,RED]).next_to(t2,DOWN)
          ????????t4?=?Text("@Python數(shù)據(jù)之道",gradient=[BLUE,YELLOW,RED],font_size=30,fill_opacity=0.8)
          ????????t4.next_to(t3,DOWN)
          ????????t5?=?Text("Python數(shù)據(jù)之道",gradient=[BLUE,YELLOW,RED]).next_to(t4,DOWN)
          ????????#?當英文和漢字混合時,?當前的manim社區(qū)版,使用?gradient?時會出現(xiàn)?bug
          ????????self.add(t1)
          ????????self.play(Write(t2))
          ????????self.play(Create(t3))
          ????????self.play(Write(t4))
          ????????self.play(Write(t5))
          ????????self.wait()

          上述代碼的實現(xiàn)效果如下:

          需要注意的是,當英文和漢字混合時, 當前的manim社區(qū)版,使用 gradient 時可能會出現(xiàn) bug,沒有漸變的效果,上述案例中的 變量?t5?實例 就沒有實現(xiàn)漸變效果。

          設置文本樣式

          文本樣式的設置,包括文本加粗、斜體文本、文本字體設置、文本透明度設置、文本換行以及行距設置等。

          演示案例的代碼如下:

          #?設置字體樣式
          class?Demo4(Scene):
          ????def?construct(self):
          ????????WaterMark.construct(self)
          ????????t1?=?Text("Python數(shù)據(jù)之道",font="Alibaba?PuHuiTi")
          ????????t1.to_edge(UP,buff=0.5)
          ????????t2?=?Text("Python數(shù)據(jù)之道",color=BLUE,font="Times")
          ????????t2.next_to(t1,DOWN)
          ????????t3?=?Text("Python數(shù)據(jù)之道",?weight=BOLD)
          ????????t3.next_to(t2,DOWN)
          ????????t4?=?Text("Python數(shù)據(jù)之道",?slant=ITALIC)
          ????????t4.next_to(t3,DOWN)
          ????????t5?=?Text("Python數(shù)據(jù)之道",?fill_opacity=0.5)
          ????????t5.next_to(t4,DOWN)
          ????????t6?=?Text("Hello\nPython",?line_spacing=0.5)
          ????????t6.next_to(t5,DOWN,buff=1).shift(LEFT)
          ????????t7?=?Text("Hello\nPython",?line_spacing=2)
          ????????t7.next_to(t6,RIGHT,buff=1)
          ????????self.add(t1)
          ????????self.play(Write(t2))
          ????????self.play(Write(t3))
          ????????self.play(Write(t4))
          ????????self.play(Write(t5))
          ????????self.add(t6,t7)
          ????????self.wait()

          上述代碼的實現(xiàn)效果如下:

          需要主要的是,在選擇字體設置時,所選擇的字體需要在自己的電腦中已經(jīng)安裝了對應的字體,才會有效果。

          此外,在對于非英文字體的設置時,可能有些樣式設置會不起作用,具體的需要自己去根據(jù)實際情況測試下。

          對于咱們而言,一般就是英文和中文的使用,常用的字體加粗、斜體文字、透明度等,是有效的。對于字體,我一般是使用 "Alibaba PuHuiTi" 字體,這個字體可以免費使用。

          個性化設置部分文本

          在控制顯示過程中,經(jīng)常會遇到只需要顯示一段文本中一部分文本的情況,可以通過以下幾個參數(shù)來進行設置:

          • t2c,全稱為 "text2color",用來設置部分文字的顏色;
          • t2f,全稱為 “text2font”,用來設置部分文字的字體;
          • t2w,全稱為 “text2weight”,用來設置部分文字加粗;
          • t2s,全稱為 “text2slant”,用來設置部分文字為斜體;
          • t2g,全稱為 “text2gradient”,用來設置部分文字的漸變顏色;

          演示案例的代碼如下:

          #?個性化設置部分文本的樣式
          class?Demo5(Scene):
          ????def?construct(self):
          ????????WaterMark.construct(self)
          ????????t1?=?Text("Python數(shù)據(jù)之道",t2c={"Python":RED,'[7:9]':YELLOW})
          ????????t1.to_edge(UP,buff=0.5)
          ????????t2?=?Text("Python數(shù)據(jù)之道",t2s={"Python":ITALIC})
          ????????t2.next_to(t1,DOWN)
          ????????t3?=?Text("Python數(shù)據(jù)之道",?t2w={"Python":BOLD})
          ????????t3.next_to(t2,DOWN)
          ????????t4?=?Text("Python數(shù)據(jù)之道",?t2f={"Python":"Times"})
          ????????t4.next_to(t3,DOWN)
          ????????t5?=?Text(
          ????????????"Hello,PyDataLab",?
          ????????????t2g={
          ????????????????'PyData':[BLUE,YELLOW,RED],
          ????????????????#?'offset':"1",
          ????????????},
          ????????????)
          ????????t5.next_to(t4,DOWN)
          ????????t6?=?Text(
          ????????????"Hello,Python數(shù)據(jù)之道",?
          ????????????t2g={
          ????????????????'Python':[BLUE,YELLOW,RED],
          ????????????},
          ????????????)
          ????????t6.next_to(t5,DOWN)
          ????????t7?=?Text(
          ????????????"一份價值,一份收獲",?
          ????????????t2g={
          ????????????????'一份價值':[BLUE,YELLOW,RED],
          ????????????},
          ????????????)
          ????????t7.next_to(t6,DOWN)
          ????????#?"t2c"、"t2s"、"t2w"、"t2g"、"t2f"?參數(shù)設置,可以直接是?字符串,或者是?字符串的位置切片
          ????????self.add(t1)
          ????????self.play(Write(t2))
          ????????self.play(Write(t3))
          ????????self.play(Write(t4))
          ????????self.play(Write(t5))
          ????????self.play(Write(t6))
          ????????self.play(Write(t7))
          ????????self.wait()

          上述代碼的實現(xiàn)效果如下:

          通過上面的代碼可以看出,"t2c"、"t2s"、"t2w"、"t2g"、"t2f" 參數(shù)設置,可以直接是 字符串,或者是 字符串的位置切片。

          需要注意的是,當英文和漢字混合或者全部是中文時, 當前的manim社區(qū)版,使用?t2g?對部分文字進行漸變設置 時可能會出現(xiàn) bug,會出現(xiàn)部分文字漸變效果不完整,或者全部文字都有漸變效果。

          純文本應用案例

          下面咱們來看一個用純文本實現(xiàn) “Google” 彩色 logo 的案例,如下:

          class?Demo6(Scene):
          ????def?construct(self):
          ????????WaterMark.construct(self)
          ????????text1?=?Text(
          ????????????'Google',
          ????????????t2c={'[:1]':?'#3174f0',?'[1:2]':?'#e53125',
          ?????????????????'[2:3]':?'#fbb003',?'[3:4]':?'#3174f0',
          ?????????????????'[4:5]':?'#269a43',?'[5:]':?'#e53125'},?font_size=58).scale(3)
          ????????self.play(Write(text1),run_time=3)
          ????????self.wait()
          ????????self.play(FadeOut(text1))
          ????????t2?=?Text('Google',font_size=120)
          ????????colors?=?[BLUE,?ORANGE,?PURPLE,?PINK,?TEAL,DARK_BROWN,?RED,LIGHT_BROWN,GOLD,BLUE_L_C,ORANGE_L_A,PURPLE_E]*10
          ????????#?for?i?in?range(len(t2)):
          ????????#?????t2[i].set_color(colors[i])
          ????????for?letter?in?t2:
          ????????????letter.set_color(np.random.choice(colors,size=1))
          ????????self.play(Write(t2),run_time=3)
          ????????self.wait()

          上述代碼的實現(xiàn)效果如下:

          2.2 標記文本

          Manim社區(qū)版使用 Pango 來渲染非 LaTex 文本。

          Pango標記語言是一種類似 html 的標記語言,可以使用一系列的標記符號。

          PangoMarkup is a small markup language like html and it helps you avoid using “range of characters” while coloring or styling a piece a Text. You can use this language with MarkupText.

          標記文本的基礎應用

          一個簡單的應用案例如下:

          class?Markup01(Scene):
          ????def?construct(self):
          ????????WaterMark.construct(self)
          ????????t1?=?MarkupText('Hello,??Welcome?to?ValueLab?!"')
          ????????t1.to_edge(UP,buff=2)
          ????????self.add(t1)
          ????????self.wait()

          ????????t2?=?MarkupText('一份價值,?一份?收獲!"')
          ????????t2.next_to(t1,DOWN,buff=1)
          ????????self.add(t2)
          ????????self.wait()

          上述代碼的實現(xiàn)效果如下:

          可以看到,對于?Markup?標記語言,在應用于英文文字的時候,應用效果是挺好的,但對于中文字體,上面的文字中,斜體效果就沒有體現(xiàn)出來。不知道是?Pango本身渲染的問題還是?Manim社區(qū)版存在一些瑕疵。

          當前,Manim中進行文字渲染,支持以下標簽:

          標記文本的樣式設置

          標記文本的樣式設置包括文字加粗、下劃線、斜體、上標、下表、刪除線等,演示案例的代碼如下:

          #?樣式設置,加粗、下劃線、斜體等
          class?Markup02(Scene):
          ????def?construct(self):
          ????????WaterMark.construct(self)
          ????????text1?=?MarkupText("Hello?welcome?to?ValueLab")
          ????????text2?=?MarkupText("foo?bar?big?small")
          ????????text3?=?MarkupText("H2O?and?H3O+")
          ????????text4?=?MarkupText("type?help?for?help")
          ????????text5?=?MarkupText(
          ????????????'foo?bar'
          ????????)
          ????????group?=?VGroup(text1,?text2,?text3,?text4,?text5).arrange(DOWN)
          ????????self.add(group)

          上述代碼的實現(xiàn)效果如下:

          標記文本的顏色設置

          標記文本的顏色設置,主要是漸變色的設置比較復雜,仔細看下面案例中漸變色設置時的各個參數(shù):

          #?顏色設置,設置不同的顏色、漸變色等
          class?Markup03(Scene):
          ????def?construct(self):
          ????????text1?=?MarkupText(
          ????????????f'all?in?red?{YELLOW}">except?this',?color=RED
          ????????)
          ????????text2?=?MarkupText("nice?gradient",?gradient=(BLUE,?GREEN))
          ????????text3?=?MarkupText(
          ????????????'nice?intermediate?gradient',
          ????????????gradient=(BLUE,?GREEN),
          ????????)
          ????????text4?=?MarkupText(
          ????????????'fl?ligature?causing?trouble?here'
          ????????)
          ????????text5?=?MarkupText(
          ????????????'fl?ligature?defeated?with?offset'
          ????????)
          ????????text6?=?MarkupText(
          ????????????'fl?ligature?floating?inside'
          ????????)
          ????????text7?=?MarkupText(
          ????????????'fl?ligature?floating?inside'
          ????????)
          ????????group?=?VGroup(text1,?text2,?text3,?text4,?text5,?text6,?text7).arrange(DOWN)
          ????????self.add(group)

          上述代碼的實現(xiàn)效果如下:

          文字對齊

          在書寫英文文字時,為了排版效果好看,經(jīng)常需要將文字進行對齊顯示,這個在 Manim中,也可以實現(xiàn)。

          演示案例的代碼如下:

          #?文字對齊
          class?Markup05(Scene):
          ????def?construct(self):
          ????????WaterMark.construct(self)
          ????????ipsum_text?=?(
          ????????????"Lorem?ipsum?dolor?sit?amet,?consectetur?adipiscing?elit."
          ????????????"Praesent?feugiat?metus?sit?amet?iaculis?pulvinar.?Nulla?posuere?"
          ????????????"quam?a?ex?aliquam,?eleifend?consectetur?tellus?viverra.?Aliquam?"
          ????????????"fermentum?interdum?justo,?nec?rutrum?elit?pretium?ac.?Nam?quis?"
          ????????????"leo?pulvinar,?dignissim?est?at,?venenatis?nisi.?Quisque?mattis?"
          ????????????"dolor?ut?euismod?hendrerit.?Nullam?eu?ante?sollicitudin,?commodo?"
          ????????????"risus?a,?vehicula?odio.?Nam?urna?tortor,?aliquam?a?nibh?eu,?commodo?"
          ????????????"imperdiet?arcu.?Donec?tincidunt?commodo?enim?a?tincidunt."
          ????????)
          ????????justified_text?=?MarkupText(ipsum_text,?justify=True).scale(0.4)
          ????????not_justified_text?=?MarkupText(ipsum_text,?justify=False).scale(0.4)
          ????????just_title?=?Title("Justified")
          ????????njust_title?=?Title("Not?Justified")
          ????????self.add(njust_title,?not_justified_text)
          ????????self.play(
          ????????????Transform(
          ????????????????not_justified_text,
          ????????????????justified_text,
          ????????????),
          ????????????Transform(
          ????????????????njust_title,
          ????????????????just_title,
          ????????????),
          ????????????run_time=2,
          ????????)
          ????????self.wait(1)

          上述代碼的實現(xiàn)效果如下:

          2.3 LaTex 文本

          LaTeX(LATEX,音譯“拉泰赫”)是一種基于ΤΕΧ的排版系統(tǒng),由美國計算機學家萊斯利·蘭伯特(Leslie Lamport)在20世紀80年代初期開發(fā),利用這種格式,即使使用者沒有排版和程序設計的知識也可以充分發(fā)揮由TeX所提供的強大功能,能在幾天、甚至幾小時內(nèi)生成很多具有書籍質(zhì)量的印刷品。

          對于生成復雜表格和數(shù)學公式,這一點表現(xiàn)得尤為突出。因此它非常適用于生成高印刷質(zhì)量的科技和數(shù)學類文檔。這個系統(tǒng)同樣適用于生成從簡單的信件到完整書籍的所有其他種類的文檔。

          在 Manim 中使用 latex 文本,需要你的電腦環(huán)境中已經(jīng)安裝了 latex的相關軟件和支持工具。

          在 Manim 中,可以通過以下幾種方法來使用 latex 文本,如下:

          • Tex
          • MathTex
          • Title
          • BulletedList

          文本型的 LaTex 可以通過?Tex、TitleBulletedList?來實現(xiàn),數(shù)學公式類型的文本,可以通過?Tex?或?MathTex?來實現(xiàn)。

          基礎應用

          先來看一個 latex 的基礎應用案例,如下:

          class?DemoTex01(Scene):
          ????def?construct(self):
          ????????WaterMark.construct(self)
          ????????tex1?=?Tex(r"\LaTeX",?font_size=144)
          ????????tex1.to_edge(UP,buff=1)
          ????????self.add(tex1)
          ????????self.wait()

          ????????tex2?=?Tex(r'$x^2?+?y^2?=?z^2$',?font_size=144)
          ????????tex2.next_to(tex1,DOWN,buff=0.5)
          ????????tex3?=?MathTex(r'x^2?+?y^2?=?z^2',?font_size=144,color=BLUE)
          ????????tex3.next_to(tex2,DOWN,buff=0.5)
          ????????self.add(tex2)
          ????????self.wait()
          ????????self.add(tex3)
          ????????self.wait()

          上述代碼的實現(xiàn)效果如下:

          在?Tex?或?MathTex?中使用字符串時,一般會使用?r"..."?的形式,而不是?'...'?的形式,這是因為在 latex文本中,經(jīng)常會涉及到一些特殊的字符,比如?\?。

          在進行數(shù)學公式的表達時,使用?Tex?時需要在字符串前后添加符號?$,形式為?r"$...$",使用?MathTex?時,形式為?r"..."?就可以了。兩者之間的區(qū)別,需要注意下。

          使用 latex 工具包

          在 latex 中輸出特殊符號時,可以通過 latex 工具包來實現(xiàn)。

          當然,需要你的電腦中已經(jīng)安裝了對應的 latex 工具包。對于沒有使用過 latex 的同學來說,這個確實會有些繁瑣。

          演示案例的代碼如下:

          #?使用?latex?工具包
          class?DemoTex02(Scene):
          ????def?construct(self):
          ????????WaterMark.construct(self)
          ????????myTemplate?=?TexTemplate()
          ????????myTemplate.add_to_preamble(r"\usepackage{mathrsfs}")
          ????????tex?=?Tex(r'$\mathscr{H}?\rightarrow?\mathbb{H}$}',?tex_template=myTemplate,?font_size=144)
          ????????self.add(tex)

          上述代碼的實現(xiàn)效果如下:

          數(shù)學公式的顏色設置

          在 Manim 中,對于數(shù)學公式中字符的顏色設置,可以通過參數(shù)?set_color_by_tex?和?substrings_to_isolate?的組合來實現(xiàn)不同的效果。

          演示案例的代碼如下:

          #?數(shù)學公式的顏色設置
          class?DemoTex03(Scene):
          ????def?construct(self):
          ????????WaterMark.construct(self)
          ????????eq1?=?MathTex(
          ????????????r"e^x?=?x^0?+?x^1?+?\frac{1}{2}?x^2?+?\frac{1}{6}?x^3?+?\cdots?+?\frac{1}{n!}?x^n?+?\cdots"
          ????????)
          ????????eq1.scale(1.2)
          ????????eq1.set_color_by_tex("x",?YELLOW)
          ????????eq1.to_edge(UP,buff=2)
          ????????self.add(eq1)
          ????????self.wait()
          ????????#?self.play(FadeOut(eq1))

          ????????eq2?=?MathTex(
          ????????????r"e^x?=?x^0?+?x^1?+?\frac{1}{2}?x^2?+?\frac{1}{6}?x^3?+?\cdots?+?\frac{1}{n!}?x^n?+?\cdots",
          ????????????substrings_to_isolate="x",
          ????????)
          ????????eq2.scale(1.2)
          ????????eq2.set_color_by_tex("x",?RED)
          ????????eq2.next_to(eq1,DOWN,buff=1)
          ????????self.add(eq2)
          ????????self.wait()

          上述代碼的實現(xiàn)效果如下:

          在?eq1?中,僅設置參數(shù)?set_color_by_tex?時,是對于包含 “x” 的整個公式進行顏色設置;而在?eq2?中,同時設置參數(shù)?set_color_by_tex?和?substrings_to_isolate?時,僅僅對公式中的 “x” 字符進行顏色設置;這兩種是不一樣的應用場景,大家選擇合適的去使用。

          我在自己視頻中涉及數(shù)學公式的部分代碼如下:

          class?DemoTex04(Scene):
          ????def?construct(self):
          ????????WaterMark.construct(self)
          ????????equations?=?VGroup(
          ????????????MathTex(
          ????????????????r"1.01^{365}?=?37.8",
          ????????????????#?size=80,
          ????????????),
          ????????????MathTex(
          ????????????????r"1.00^{365}?=?1.00",
          ????????????????#?size=80,
          ????????????),
          ????????????MathTex(
          ????????????????r"0.99^{365}?=?0.03",
          ????????????????#?size=80,
          ????????????),
          ????????)

          ????????#?設置寬度
          ????????#?equations.set_width(FRAME_WIDTH-4)
          ????????equations.set_width(8)

          ????????for?equation?in?equations:
          ????????????equation.set_color_by_tex_to_color_map({
          ????????????????"1.01":?BLUE,
          ????????????????"0.99":?RED,
          ????????????})

          ????????equations.arrange(DOWN,?buff=0.7,?aligned_edge=LEFT)
          ????????self.play(Write(equations[0]))
          ????????self.wait()

          ????????self.play(Write(equations[2]))
          ????????self.wait()

          ????????self.play(Write(equations[1]))
          ????????self.wait()

          ????????self.play(equations[1].animate.set_opacity(0.2))
          ????????self.wait()

          上述代碼的實現(xiàn)效果如下:

          tex 模板應用

          在 LaTex 中,可以通過設置使用的模板,來設置使用的字體。此外,在使用中文字符時,經(jīng)常需要設置中文的模板(一般使用 ctex)。

          演示案例的代碼如下:

          #?tex?模板應用
          class?DemoTex05(Scene):
          ????def?construct(self):
          ????????WaterMark.construct(self)
          ????????tex1?=?Tex(r'$x^2?+?y^2?=?z^2$',?tex_template=TexFontTemplates.french_cursive,?font_size=144)
          ????????tex1.to_edge(UP,buff=1)
          ????????self.add(tex1)
          ????????self.wait()

          ????????tex2?=?Tex(r'Hello?你好?\LaTeX',?tex_template=TexTemplateLibrary.ctex,?font_size=144)
          ????????tex2.next_to(tex1,DOWN,buff=0.5)
          ????????self.add(tex2)
          ????????self.wait()

          上述代碼的實現(xiàn)效果如下:

          對于?TexFontTemplates,可以使用的模板說明如下:

          A collection of TeX templates for the fonts described at http://jf.burnol.free.fr/showcase.html

          公式換行

          在數(shù)學公式中,可以實現(xiàn)換行效果,如下:

          #?公式換行
          class?DemoTex06(Scene):
          ????def?construct(self):
          ????????WaterMark.construct(self)
          ????????tex1?=?MathTex(
          ????????????r'f(x)?&=?3?+?2?+?1\\?&=?5?+?1?\\?&=?6',?
          ????????????font_size=96,
          ????????)
          ????????self.add(tex1)
          ????????self.wait()
          ????????self.play(FadeOut(tex1))

          ????????tex2?=?MathTex(
          ????????????r'f(x)?&=?3?+?2?+?1\\?&=?5?+?1?\\?&=?6',?
          ????????????font_size=96,
          ????????????substrings_to_isolate=['5','3'],
          ????????)
          ????????tex2.set_color_by_tex_to_color_map({
          ????????????????"5":?BLUE,
          ????????????????"3":?RED,
          ????????????})
          ????????self.add(tex2)
          ????????self.wait()

          上述代碼的實現(xiàn)效果如下:

          Title 對象應用

          在視頻中設置文字標題時,可以直接使用?Title?對象,需要說明的是,Title?對象是基于?Tex?來實現(xiàn)的,在涉及中文輸出時,需要設置使用的模板為中文適用的模板。

          演示案例的代碼如下:

          #?Title?對象應用
          class?DemoTex07(Scene):
          ????def?construct(self):
          ????????WaterMark.construct(self)
          ????????title1?=?Title("Hello,title")
          ????????self.add(title1)
          ????????self.wait()
          ????????self.play(FadeOut(title1))

          ????????#?使用?“Title”?對象,當有中文時,需要設置中文字體模板(電腦中需要安裝了?ctex)
          ????????title2?=?Title("你好,title",tex_template=TexTemplateLibrary.ctex)
          ????????self.add(title2)
          ????????self.wait()

          上述代碼的實現(xiàn)效果如下:

          列表類型的文本

          在文本的使用過程中,會時不時涉及到 列表型文本,目前,在 Manim 中,可以直接實現(xiàn)無序號型的列表文本,通過?BulletedList?對象來實現(xiàn)。

          演示案例的代碼如下:

          #?列表類型的文本
          class?DemoTex08(Scene):
          ????def?construct(self):
          ????????blist?=?BulletedList("Python",?"Java",?"C++",?height=2,?width=2)
          ????????blist.set_color_by_tex("Python",?RED)
          ????????blist.set_color_by_tex("Java",?GREEN)
          ????????blist.set_color_by_tex("C++",?BLUE)
          ????????self.add(blist)

          上述代碼的實現(xiàn)效果如下:

          2.4 代碼文本

          在 IT編程領域,代碼的高亮顯示是一個常見的需求,在 Manim 制作的視頻中,也可以實現(xiàn)代碼高亮的效果,主要是通過?Code()?對象來實現(xiàn)。

          下面以快速排序的Python代碼為例,來演示如何在視頻中進行代碼高亮顯示。

          class?Code1(Scene):
          ????def?construct(self):
          ????????WaterMark.construct(self)
          ????????code_str_1?=?"""
          ????????def?quickSort(Array):??
          ????????????n?=?len(Array)
          ????????????if?n?<=?1:
          ????????????????return?Array
          ????????????baseline?=?Array[0]
          ????????????left?=?[Array[i]?for?i?in?range(1,?len(Array))?if?Array[i]?????????????right?=?[Array[i]?for?i?in?range(1,?len(Array))?if?Array[i]?>=?baseline]
          ????????????return?quickSort(left)?+?[baseline]?+?quickSort(right)
          ????????"""

          ????????code1?=?Code(
          ????????????code=code_str_1,
          ????????????tab_width=4,
          ????????????background="window",
          ????????????language="Python",
          ????????????font="Monospace",
          ????????????insert_line_no=False,??#?是否顯示代碼行數(shù)
          ????????????style='monokai',
          ????????)

          ????????code1.scale(0.8).to_edge(UP,buff=1)

          ????????self.play(Write(code1))
          ????????self.wait()

          代碼高亮效果如下:

          上述代碼中,變量?code_str_1?是快速排序算法的Python實現(xiàn)代碼, 變量?code1?是?Code()?對象的實例,?Code()?有許多參數(shù)可以進行設置,這里只對部分參數(shù)進行設置:

          • background?參數(shù),可以選擇 “rectangle” 或 “window”,默認是 “rectangle”,我自己一般喜歡用 “window”;
          • language?參數(shù)是所用的編程語言,支持常用的編程語言;
          • font?參數(shù),代碼字體,默認為 ?"Monospac821 BT",我一般用 “Monospace”;
          • insert_line_no?參數(shù),是否顯示代碼行數(shù),默認是?True;需要注意的是,在顯示代碼行數(shù)時,有時行數(shù)與代碼的對齊效果不一定完美;
          • style?參數(shù),代碼顯示風格,有多種風格可以選擇,其可選代碼樣式來源于 “pygments” (https://pygments.org/docs/styles/)??稍赑ython中運行代碼來獲取支持的樣式。
            from?pygments.styles?import?get_all_styles
            styles?=?list(get_all_styles())
            style支持的樣式如下:
            ['default', 'emacs', 'friendly', 'colorful', 'autumn', 'murphy', 'manni', 'monokai', 'perldoc', 'pastie', 'borland', 'trac', 'native', 'fruity', 'bw', 'vim', 'vs', 'tango', 'rrt', 'xcode', 'igor', 'paraiso-light', 'paraiso-dark', 'lovelace', 'algol', 'algol_nu', 'arduino', 'rainbow_dash', 'abap', 'solarized-dark', 'solarized-light', 'sas', 'stata', 'stata-light', 'stata-dark', 'inkpot'] 默認的樣式為 'vim',我一般喜歡用 'monokai' 樣式。

          再選擇一款淺色的樣式('solarized-light'),并設置不同的參數(shù)值,來對比下效果,如下:

          class?Code1(Scene):
          ????def?construct(self):
          ????????WaterMark.construct(self)
          ????????code_str_1?=?"""
          ????????def?quickSort(Array):??
          ????????????n?=?len(Array)
          ????????????if?n?<=?1:
          ????????????????return?Array
          ????????????baseline?=?Array[0]
          ????????????left?=?[Array[i]?for?i?in?range(1,?len(Array))?if?Array[i]?????????????right?=?[Array[i]?for?i?in?range(1,?len(Array))?if?Array[i]?>=?baseline]
          ????????????return?quickSort(left)?+?[baseline]?+?quickSort(right)
          ????????"""

          ????????code1?=?Code(
          ????????????code=code_str_1,
          ????????????tab_width=4,
          ????????????background="window",
          ????????????language="Python",
          ????????????font="Monospace",
          ????????????insert_line_no=False,??#?是否顯示代碼行數(shù)
          ????????????style='monokai',
          ????????)

          ????????code1.scale(0.8).to_edge(UP,buff=1)

          ????????self.play(Write(code1))
          ????????self.wait()

          ????????code2?=?Code(
          ????????????code=code_str_1,
          ????????????tab_width=4,
          ????????????background="rectangle",?#?rectangle?,?window
          ????????????language="Python",
          ????????????font="Monospace",
          ????????????insert_line_no=True,??#?是否顯示代碼行數(shù)
          ????????????style='solarized-light',
          ????????????#?line_spacing=0.3,
          ????????)

          ????????code2.scale(0.8)
          ????????code2.next_to(code1,DOWN,buff=0.5)

          ????????self.play(Write(code2))
          ????????self.wait()

          代碼高亮效果如下:

          Code()?對象還有更多的參數(shù)可以進行設置,詳細的參數(shù)設置說明,大家可以通過官方文檔來了解。

          官方文檔地址:

          https://docs.manim.community/en/stable/reference/manim.mobject.svg.code_mobject.Code.html#manim.mobject.svg.code_mobject.Code

          03小結

          文本的使用,是咱們最常見的領域,在使用文本時,從頻率來看,純文本 是用的最多的,標記文本是對純文本的進一步拓展,而 latex 文本,則是 針對數(shù)學公式等特殊且頻率較高的場景來使用的,至于 代碼高亮,則是在IT編程特定領域進行應用。

          對于涉及中文的使用,經(jīng)常需要通過 latex 來實現(xiàn)一些效果,因此,對想進一步深入了解中文排版的同學來,可能需要有一些 latex 的基礎知識。

          熟練的使用文本,可以給視頻的排版和外觀帶來不少好處,不要小看這些。

          以上就是我使用 Manim 的一些經(jīng)驗,希望對你有幫助。

          如果你覺得文章還不錯,請大家?點贊、分享、留言?下,因為這將是我持續(xù)輸出更多優(yōu)質(zhì)文章的最強動力!

          老表薦書

          圖書介紹Python Web開發(fā)從入門到精通

          本書分為3部分:第1部分是基礎篇,帶領初學者實踐Python開發(fā)環(huán)境和掌握基本語法,同時對網(wǎng)絡協(xié)議、Web客戶端技術、數(shù)據(jù)庫建模編程等網(wǎng)絡編程基礎深入淺出地進行學習;

          第2部分是框架篇,學習當前*流行的Python Web框架,即Django、Tornado、Flask和Twisted,達到對各種Python網(wǎng)絡技術融會貫通的目的;第3部分是實戰(zhàn)篇,分別對幾種常用WEB框架進行項目實踐,利用其各自的特點開發(fā)適用于不同場景的網(wǎng)絡程序。

          掃碼即可加我微信

          老表朋友圈經(jīng)常有贈書/紅包福利活動

          贈書介紹

          1>?給本文在看+點贊,掃碼加我微信,本文點贊破50后,我將在朋友圈送出1本《Python Web開發(fā)從入門到精通》。

          2>?給本文隨意留言(15字以上)+點贊,第一個留言且關注滿21天的讀者可以獲得贈書一本。


          【注意??】近三個月內(nèi)獲得贈書的讀者將無法再次獲得贈書,想要多次獲得贈書,可以查看下面的投稿規(guī)則及激勵。

          近期閱讀學習推薦

          服務器被黑客攻擊,用來挖礦!怎么辦?

          Python超好用的命令行界面實現(xiàn)工具

          Python自動化處理Excel表格實戰(zhàn)完整代碼分享(課表解析)

          如何找到我

          分享

          收藏

          點贊

          在看

          瀏覽 164
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  久久,久久成人电影 | 黄色视频免费在线观看 | 999精品在线 | 国产高清免费视频在线观看一区 | 小骚逼操死你 |