mirror of
https://github.com/3b1b/manim.git
synced 2025-04-13 09:47:07 +00:00

* Comment tweak * Directly print traceback Since the shell.showtraceback is giving some issues * Make InteracrtiveSceneEmbed into a class This way it can keep track of it's internal shell; use of get_ipython has a finicky relationship with reloading. * Move remaining checkpoint_paste logic into scene_embed.py This involved making a few context managers for Scene: temp_record, temp_skip, temp_progress_bar, which seem useful in and of themselves. * Change null key to be the empty string * Ensure temporary svg paths for Text are deleted * Remove unused dict_ops.py functions * Remove break_into_partial_movies from file_writer configuration * Rewrite guarantee_existence using Path * Clean up SceneFileWriter It had a number of vestigial functions no longer used, and some setup that could be made more organized. * Remove --save_pngs CLI arg (which did nothing) * Add --subdivide CLI arg * Remove add_extension_if_not_present * Remove get_sorted_integer_files * Have find_file return Path * Minor clean up * Clean up num_tex_symbols * Fix find_file * Minor cleanup for extract_scene.py * Add preview_frame_while_skipping option to scene config * Use shell.showtraceback function * Move keybindings to config, instead of in-place constants * Replace DEGREES -> DEG
38 lines
1.2 KiB
Python
38 lines
1.2 KiB
Python
from __future__ import annotations
|
|
|
|
import re
|
|
from functools import lru_cache
|
|
|
|
from manimlib.utils.tex_to_symbol_count import TEX_TO_SYMBOL_COUNT
|
|
|
|
|
|
@lru_cache
|
|
def num_tex_symbols(tex: str) -> int:
|
|
tex = remove_tex_environments(tex)
|
|
commands_pattern = r"""
|
|
(?P<sqrt>\\sqrt\[[0-9]+\])| # Special sqrt with number
|
|
(?P<cmd>\\[a-zA-Z!,-/:;<>]+) # Regular commands
|
|
"""
|
|
total = 0
|
|
pos = 0
|
|
for match in re.finditer(commands_pattern, tex, re.VERBOSE):
|
|
# Count normal characters up to this command
|
|
total += sum(1 for c in tex[pos:match.start()] if c not in "^{} \n\t_$\\&")
|
|
|
|
if match.group("sqrt"):
|
|
total += len(match.group()) - 5
|
|
else:
|
|
total += TEX_TO_SYMBOL_COUNT.get(match.group(), 1)
|
|
pos = match.end()
|
|
|
|
# Count remaining characters
|
|
total += sum(1 for c in tex[pos:] if c not in "^{} \n\t_$\\&")
|
|
return total
|
|
|
|
|
|
def remove_tex_environments(tex: str) -> str:
|
|
# Handle \phantom{...} with any content
|
|
tex = re.sub(r"\\phantom\{[^}]*\}", "", tex)
|
|
# Handle other environment commands
|
|
tex = re.sub(r"\\(begin|end)(\{\w+\})?(\{\w+\})?(\[\w+\])?", "", tex)
|
|
return tex
|