# latex_formatter.py import re class LatexFormatter: """LaTeX 수식 포맷팅을 위한 클래스""" def __init__(self): # LaTeX 특수 명령어 매핑 self.latex_commands = { r'\left': r'\\left', r'\right': r'\\right', r'\bigcirc': r'\\bigcirc', r'\square': r'\\square', r'\quad': r'\\quad', r'\div': r'\\div', r'\ldots': r'\\ldots', r'\times': r'\\times', r'\pm': r'\\pm', r'\infty': r'\\infty', r'\neq': r'\\neq', r'\leq': r'\\leq', r'\geq': r'\\geq' } # 수학 용어 매핑 self.math_terms = [ 'decimalplaces', 'rounded to', 'What is', 'Calculate', 'Solve', 'Evaluate', 'Simplify' ] def format_expression(self, text: str) -> str: """LaTeX 수식 변환의 메인 함수""" # 1. 기존 LaTeX 수식 보존 latex_parts = [] def save_latex(match): latex_parts.append(match.group(0)) return f"LATEX_{len(latex_parts)-1}_PLACEHOLDER" text = re.sub(r'\$\$.*?\$\$', save_latex, text) # 2. 특수 명령어 처리 for cmd, latex_cmd in self.latex_commands.items(): text = text.replace(cmd, latex_cmd) # 3. 단어 분리 및 텍스트 정리 text = self._clean_text(text) # 4. 수식 처리 text = self._process_math_expressions(text) # 5. LaTeX 수식 복원 for i, latex in enumerate(latex_parts): text = text.replace(f"LATEX_{i}_PLACEHOLDER", latex) # 6. 최종 정리 if not text.startswith('$$') and not text.endswith('$$'): text = f"$${text}$$" return text.replace('\\\\', '\\') def _clean_text(self, text: str) -> str: """텍스트 전처리""" # 붙어있는 단어 분리 text = re.sub(r'([a-z])([A-Z])', r'\1 \2', text) text = re.sub(r'([A-Za-z])(\d)', r'\1 \2', text) text = re.sub(r'(\d)([A-Za-z])', r'\1 \2', text) # 수학 용어를 LaTeX 텍스트로 변환 for term in self.math_terms: text = re.sub( rf'\b{term}\b', f'\\text{{{term}}}', text, flags=re.IGNORECASE ) return text def _process_math_expressions(self, text: str) -> str: """수학 표현식 처리""" # 괄호 안의 수식 처리 def process_math(match): content = match.group(1) # 지수 처리 if '^' in content: base, exp = content.split('^') return f'\\left({base}\\right)^{{{exp}}}' # 분수 처리 if '/' in content and not any(op in content for op in ['×', '÷', '+', '-']): num, den = content.split('/') return f'\\frac{{{num}}}{{{den}}}' return f'\\left({content}\\right)' text = re.sub(r'\((.*?)\)', process_math, text) return text