iT邦幫忙

2025 iThome 鐵人賽

DAY 23
0

LaTeX 數學公式轉換 — 讓 AI 回應支援數學符號顯示 (10)

在前面的文章中,我們探討了內容生成、分析和狀態管理等核心功能,今天我們要深入「數學符號處理引擎」:LaTeX 數學公式轉換系統

這個系統能夠將 AI 生成的 LaTeX 數學公式自動轉換為可讀性更高的 Unicode 數學符號,讓數學專家的分析結果和數學內容在 GUI 界面中能夠正確、美觀地顯示。


功能簡介

LaTeX 數學公式轉換系統提供:

  • 全面的 LaTeX 符號支援:涵蓋集合論、希臘字母、數學運算符、特殊符號等
  • 內聯與顯示公式處理:支援 $...$$$...$$ 兩種數學公式格式
  • 智能符號映射:將 LaTeX 命令轉換為對應的 Unicode 數學符號
  • 結構化數學表達式:處理分數、上下標、矩陣等複雜數學結構
  • 文字流整合:在 Markdown 文字處理流程中無縫整合數學公式轉換

核心轉換引擎

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̄',
    }

符號類別深度解析

1. 集合論符號

# 集合符號
r'\\mathbb\{R\}': 'ℝ',    # 實數集
r'\\mathbb\{C\}': 'ℂ',    # 複數集
r'\\mathbb\{Z\}': 'ℤ',    # 整數集
r'\\mathbb\{N\}': 'ℕ',    # 自然數集
r'\\mathbb\{Q\}': 'ℚ',    # 有理數集

2. 希臘字母系統

# 希臘字母
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': 'ω',    # 歐米伽

3. 數學運算符

# 數學運算符
r'\\exp': 'exp',    # 指數函數
r'\\det': 'det',    # 行列式
r'\\cos': 'cos',    # 餘弦函數
r'\\sin': 'sin',    # 正弦函數
r'\\log': 'log',    # 對數函數
r'\\ln': 'ln',      # 自然對數

4. 特殊數學符號

# 特殊符號
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': '∇',     # 梯度算子

5. 矩陣和向量結構

# 矩陣和向量
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)
  • 可讀性優化:使用括號確保分數的可讀性
  • 結構保持:保持分數的數學邏輯結構

清理機制

  • 命令清理:移除未匹配的 LaTeX 命令
  • 括號清理:移除多餘的大括號
  • 格式標準化:統一輸出格式

顯示數學公式處理

顯示公式轉換函數

# 處理顯示數學公式 $$...$$
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 數學公式轉換系統是智能助手的「數學語言橋樑」,它:

  • 提供全面的 LaTeX 符號支援,涵蓋數學各個領域的常用符號
  • 實現智能的公式結構處理,正確處理分數、上下標、矩陣等複雜結構
  • 建立無縫的系統整合機制,讓數學內容在整個系統中都能正確顯示
  • 確保優秀的用戶體驗,讓數學專家的分析結果更加直觀易讀

上一篇
DAY 22
系列文
我的 AI 助手開發23
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言