在前面的文章中,我們探討了內容生成、分析和狀態管理等核心功能,今天我們要深入「數學符號處理引擎」:LaTeX 數學公式轉換系統。
這個系統能夠將 AI 生成的 LaTeX 數學公式自動轉換為可讀性更高的 Unicode 數學符號,讓數學專家的分析結果和數學內容在 GUI 界面中能夠正確、美觀地顯示。
LaTeX 數學公式轉換系統提供:
$...$
和 $$...$$
兩種數學公式格式def _convert_latex_to_text(self, text):
"""將LaTeX數學公式轉換為易讀的純文字"""
import re
# LaTeX符號替換映射
latex_replacements = {
# 集合符號
r'\\mathbb\{R\}': 'ℝ',
r'\\mathbb\{C\}': 'ℂ',
r'\\mathbb\{Z\}': 'ℤ',
r'\\mathbb\{N\}': 'ℕ',
r'\\mathbb\{Q\}': 'ℚ',
# 希臘字母
r'\\lambda': 'λ',
r'\\Lambda': 'Λ',
r'\\pi': 'π',
r'\\Pi': 'Π',
r'\\alpha': 'α',
r'\\beta': 'β',
r'\\gamma': 'γ',
r'\\delta': 'δ',
r'\\theta': 'θ',
r'\\mu': 'μ',
r'\\sigma': 'σ',
r'\\phi': 'φ',
r'\\psi': 'ψ',
r'\\omega': 'ω',
# 數學運算符
r'\\exp': 'exp',
r'\\det': 'det',
r'\\cos': 'cos',
r'\\sin': 'sin',
r'\\log': 'log',
r'\\ln': 'ln',
# 特殊符號
r'\\in': '∈',
r'\\notin': '∉',
r'\\subset': '⊂',
r'\\supset': '⊃',
r'\\cap': '∩',
r'\\cup': '∪',
r'\\implies': '⟹',
r'\\iff': '⟺',
r'\\pm': '±',
r'\\times': '×',
r'\\cdot': '·',
r'\\le': '≤',
r'\\leq': '≤',
r'\\ge': '≥',
r'\\geq': '≥',
r'\\ne': '≠',
r'\\neq': '≠',
r'\\approx': '≈',
r'\\infty': '∞',
r'\\partial': '∂',
r'\\nabla': '∇',
# 矩陣和向量
r'\\begin\{pmatrix\}': '(',
r'\\end\{pmatrix\}': ')',
r'\\begin\{vmatrix\}': '|',
r'\\end\{vmatrix\}': '|',
r'\\begin\{bmatrix\}': '[',
r'\\end\{bmatrix\}': ']',
# 其他
r'\\bar\{([^}]+)\}': r'\1̄', # 上橫線
r'\\overline\{([^}]+)\}': r'\1̄',
}
# 集合符號
r'\\mathbb\{R\}': 'ℝ', # 實數集
r'\\mathbb\{C\}': 'ℂ', # 複數集
r'\\mathbb\{Z\}': 'ℤ', # 整數集
r'\\mathbb\{N\}': 'ℕ', # 自然數集
r'\\mathbb\{Q\}': 'ℚ', # 有理數集
# 希臘字母
r'\\lambda': 'λ', # 拉姆達(小寫)
r'\\Lambda': 'Λ', # 拉姆達(大寫)
r'\\pi': 'π', # 圓周率
r'\\Pi': 'Π', # Pi(大寫)
r'\\alpha': 'α', # 阿爾法
r'\\beta': 'β', # 貝塔
r'\\gamma': 'γ', # 伽馬
r'\\delta': 'δ', # 德爾塔
r'\\theta': 'θ', # 西塔
r'\\mu': 'μ', # 繆
r'\\sigma': 'σ', # 西格馬
r'\\phi': 'φ', # 斐
r'\\psi': 'ψ', # 普西
r'\\omega': 'ω', # 歐米伽
# 數學運算符
r'\\exp': 'exp', # 指數函數
r'\\det': 'det', # 行列式
r'\\cos': 'cos', # 餘弦函數
r'\\sin': 'sin', # 正弦函數
r'\\log': 'log', # 對數函數
r'\\ln': 'ln', # 自然對數
# 特殊符號
r'\\in': '∈', # 屬於
r'\\notin': '∉', # 不屬於
r'\\subset': '⊂', # 子集
r'\\supset': '⊃', # 超集
r'\\cap': '∩', # 交集
r'\\cup': '∪', # 聯集
r'\\implies': '⟹', # 蘊含
r'\\iff': '⟺', # 當且僅當
r'\\pm': '±', # 正負號
r'\\times': '×', # 乘號
r'\\cdot': '·', # 點乘
r'\\le': '≤', # 小於等於
r'\\leq': '≤', # 小於等於(另一寫法)
r'\\ge': '≥', # 大於等於
r'\\geq': '≥', # 大於等於(另一寫法)
r'\\ne': '≠', # 不等於
r'\\neq': '≠', # 不等於(另一寫法)
r'\\approx': '≈', # 約等於
r'\\infty': '∞', # 無窮大
r'\\partial': '∂', # 偏微分
r'\\nabla': '∇', # 梯度算子
# 矩陣和向量
r'\\begin\{pmatrix\}': '(', # 圓括號矩陣開始
r'\\end\{pmatrix\}': ')', # 圓括號矩陣結束
r'\\begin\{vmatrix\}': '|', # 行列式矩陣開始
r'\\end\{vmatrix\}': '|', # 行列式矩陣結束
r'\\begin\{bmatrix\}': '[', # 方括號矩陣開始
r'\\end\{bmatrix\}': ']', # 方括號矩陣結束
# 首先處理簡單的內聯數學公式 $...$
def replace_inline_math(match):
math_content = match.group(1)
# 應用LaTeX替換
for latex, replacement in latex_replacements.items():
math_content = re.sub(latex, replacement, math_content)
# 處理下標和上標
math_content = re.sub(r'\^(\w)', r'^\1', math_content) # 上標
math_content = re.sub(r'_(\w)', r'_\1', math_content) # 下標
math_content = re.sub(r'\^{([^}]+)}', r'^(\1)', math_content) # 多字符上標
math_content = re.sub(r'_{([^}]+)}', r'_(\1)', math_content) # 多字符下標
# 處理分數 \frac{a}{b}
math_content = re.sub(r'\\frac\{([^}]+)\}\{([^}]+)\}', r'(\1)/(\2)', math_content)
# 清理剩餘的LaTeX命令
math_content = re.sub(r'\\[a-zA-Z]+', '', math_content)
math_content = re.sub(r'[{}]', '', math_content)
return math_content
# 替換內聯數學公式
text = re.sub(r'\$([^$]+)\$', replace_inline_math, text)
$...$
格式識別內聯公式$
符號間的數學內容進行處理^x
和 _x
格式的簡單上下標^{abc}
和 _{abc}
格式的複雜上下標\frac{a}{b}
轉換為 (a)/(b)
# 處理顯示數學公式 $$...$$
def replace_display_math(match):
math_content = match.group(1)
# 應用相同的替換
for latex, replacement in latex_replacements.items():
math_content = re.sub(latex, replacement, math_content)
math_content = re.sub(r'\^(\w)', r'^\1', math_content)
math_content = re.sub(r'_(\w)', r'_\1', math_content)
math_content = re.sub(r'\^{([^}]+)}', r'^(\1)', math_content)
math_content = re.sub(r'_{([^}]+)}', r'_(\1)', math_content)
math_content = re.sub(r'\\frac\{([^}]+)\}\{([^}]+)\}', r'(\1)/(\2)', math_content)
math_content = re.sub(r'\\[a-zA-Z]+', '', math_content)
math_content = re.sub(r'[{}]', '', math_content)
return f'\n {math_content}\n' # 顯示公式用縮排
text = re.sub(r'\$\$([^$]+)\$\$', replace_display_math, text)
LaTeX 數學公式轉換系統是智能助手的「數學語言橋樑」,它: