Implementación de un método para generar contenido LaTeX completo en el panel, mejorando la representación de resultados y asignaciones. Se optimiza el manejo de expresiones y se añaden mejoras en el parseo de ecuaciones. Se actualiza el historial de cálculos eliminando contenido obsoleto.
This commit is contained in:
parent
68bed8937a
commit
4010de2c12
|
@ -69,7 +69,7 @@ class Class_LaTeX(SympyClassBase):
|
|||
Class_LaTeX: Nueva instancia con la expresión parseada
|
||||
|
||||
Examples:
|
||||
LaTeX.parse_latex(r"$$Brix_{Bev} = \frac{Brix_{syr} + Brix_{H_2O} \cdot R_M}{R_M + 1}$$")
|
||||
LaTeX.parse_latex(r"$$Brix_{Bev} = \\frac{Brix_{syr} + Brix_{H_2O} \\cdot R_M}{R_M + 1}$$")
|
||||
"""
|
||||
# Primero intentar conversión manual mejorada (más confiable para subíndices)
|
||||
try:
|
||||
|
@ -234,6 +234,7 @@ class Class_LaTeX(SympyClassBase):
|
|||
(r'\\cdot', '*'), # multiplicación
|
||||
(r'\\times', '*'), # multiplicación
|
||||
(r'\\div', '/'), # división
|
||||
(r'\\([a-zA-Z]+)', r'\1'), # convertir \delta a delta, \alpha a alpha, etc.
|
||||
(r'\{([^}]*)\}', r'\1'), # eliminar llaves restantes
|
||||
]
|
||||
|
||||
|
@ -276,19 +277,26 @@ class Class_LaTeX(SympyClassBase):
|
|||
symbols_dict[name] = sympy.Symbol(name)
|
||||
|
||||
if symbols_dict:
|
||||
# Si es una ecuación, intentar crearla manualmente
|
||||
# Si es una ecuación, intentar parsearlo lado por lado
|
||||
if is_equation and '=' in result:
|
||||
left, right = result.split('=', 1)
|
||||
# Crear una ecuación simple usando el primer símbolo encontrado
|
||||
first_symbol = list(symbols_dict.values())[0]
|
||||
return sympy.Eq(first_symbol, sum(list(symbols_dict.values())[1:], 0))
|
||||
try:
|
||||
# Intentar parsear cada lado individualmente
|
||||
left_expr = sympy.sympify(left.strip(), locals=symbols_dict)
|
||||
right_expr = sympy.sympify(right.strip(), locals=symbols_dict)
|
||||
return sympy.Eq(left_expr, right_expr)
|
||||
except Exception as e2:
|
||||
print(f"Debug: Error parseando lados de ecuación: {e2}")
|
||||
# Como último recurso, devolver un símbolo con la expresión completa
|
||||
return sympy.Symbol(f"LaTeX_parse_error_{len(symbols_dict)}_symbols")
|
||||
else:
|
||||
# Para expresiones, devolver el primer símbolo o una suma
|
||||
symbols_list = list(symbols_dict.values())
|
||||
if len(symbols_list) == 1:
|
||||
return symbols_list[0]
|
||||
else:
|
||||
return sum(symbols_list[1:], symbols_list[0])
|
||||
# Para expresiones, intentar parsear con el contexto de símbolos
|
||||
try:
|
||||
return sympy.sympify(result, locals=symbols_dict)
|
||||
except Exception as e2:
|
||||
print(f"Debug: Error parseando expresión: {e2}")
|
||||
# Si todo falla, devolver el primer símbolo
|
||||
return list(symbols_dict.values())[0] if symbols_dict else sympy.Symbol('LaTeX_parse_error')
|
||||
else:
|
||||
return sympy.Symbol('LaTeX_parse_error')
|
||||
|
||||
|
|
|
@ -1,20 +1,4 @@
|
|||
|
||||
x=t**2+5/m
|
||||
m=3
|
||||
x=4
|
||||
t=?
|
||||
solve(t)
|
||||
form=solve(t)
|
||||
|
||||
|
||||
ip=IP4(10.1.1.1,20)
|
||||
ip.BroadcastAddress()
|
||||
|
||||
# Test LATEX
|
||||
$$Brix = \frac{Brix_{syrup} \cdot \delta_{syrup} + (Brix_{water} \cdot \delta_{water} \cdot Rateo)}{\delta_{syrup} + \delta_{water} \cdot Rateo}$$
|
||||
$$Brix = \frac{Solid_Weight}{Total_Weight}$$
|
||||
$$\delta = \frac{W}{V} \Rightarrow W = \delta \cdot V$$
|
||||
$$Brix_{Bev} = \frac{Brix_{syr} + Brix_{H_2O} \cdot R_M}{R_M + 1}$$
|
||||
|
||||
|
||||
|
||||
|
|
|
@ -1133,21 +1133,98 @@ class HybridCalculatorPySide6(QMainWindow):
|
|||
equation_type = "symbolic"
|
||||
|
||||
if should_add_to_latex:
|
||||
latex_content = ""
|
||||
|
||||
if result.actual_result_object is not None:
|
||||
try:
|
||||
latex_content = sympy.latex(result.actual_result_object)
|
||||
except:
|
||||
latex_content = result.output if result.output else str(result.actual_result_object)
|
||||
else:
|
||||
latex_content = result.output if result.output else ""
|
||||
|
||||
# Generar contenido LaTeX que incluya toda la información del output
|
||||
latex_content = self._generate_complete_latex_content(result)
|
||||
self._add_to_latex_panel(equation_type, latex_content)
|
||||
|
||||
except Exception as e:
|
||||
self.logger.error(f"Error procesando para panel LaTeX: {e}")
|
||||
|
||||
def _generate_complete_latex_content(self, result: EvaluationResult) -> str:
|
||||
"""Genera contenido LaTeX completo incluyendo toda la información del output"""
|
||||
try:
|
||||
# Para comentarios, usar el texto directamente
|
||||
if result.result_type == "comment":
|
||||
return result.output or ""
|
||||
|
||||
latex_parts = []
|
||||
|
||||
# PARTE 1: Contenido principal (con LaTeX de SymPy si es posible)
|
||||
main_content = ""
|
||||
if result.actual_result_object is not None:
|
||||
try:
|
||||
# Intentar generar LaTeX de SymPy para el objeto matemático
|
||||
import sympy
|
||||
main_content = sympy.latex(result.actual_result_object)
|
||||
|
||||
# Para asignaciones, necesitamos agregar el lado izquierdo
|
||||
if result.is_assignment and result.input_line:
|
||||
# Extraer la variable del lado izquierdo
|
||||
if '=' in result.input_line:
|
||||
left_side = result.input_line.split('=')[0].strip()
|
||||
# Limpiar posibles símbolos LaTeX del lado izquierdo
|
||||
left_side = left_side.replace('$$', '').strip()
|
||||
main_content = f"{left_side} = {main_content}"
|
||||
|
||||
except Exception:
|
||||
# Si falla el LaTeX de SymPy, usar el output textual
|
||||
main_content = result.output or ""
|
||||
else:
|
||||
main_content = result.output or ""
|
||||
|
||||
latex_parts.append(main_content)
|
||||
|
||||
# PARTE 2: Aproximación numérica (si está disponible en el output)
|
||||
if result.output and "≈" in result.output:
|
||||
approx_parts = result.output.split("≈", 1)
|
||||
if len(approx_parts) == 2:
|
||||
approx_value = approx_parts[1].strip()
|
||||
# Extraer solo la parte numérica antes del indicador de tipo
|
||||
if ";" in approx_value:
|
||||
approx_value = approx_value.split(";")[0].strip()
|
||||
|
||||
# Intentar convertir la aproximación a LaTeX si es una ecuación
|
||||
try:
|
||||
import sympy
|
||||
if "Eq(" in approx_value:
|
||||
# Es una ecuación, intentar parserarla para LaTeX
|
||||
approx_obj = eval(approx_value, {'Eq': sympy.Eq, 'sqrt': sympy.sqrt})
|
||||
approx_latex = sympy.latex(approx_obj)
|
||||
latex_parts.append(f"\\approx {approx_latex}")
|
||||
else:
|
||||
# Es un valor numérico simple
|
||||
latex_parts.append(f"\\approx {approx_value}")
|
||||
except:
|
||||
# Si falla, usar la aproximación como texto
|
||||
latex_parts.append(f"\\approx {approx_value}")
|
||||
|
||||
# PARTE 3: Indicador de tipo (si está en el output)
|
||||
if result.output and "[" in result.output and "]" in result.output:
|
||||
# Extraer el indicador de tipo (ej: [=], [Equality], etc.)
|
||||
parts = result.output.split("[")
|
||||
if len(parts) >= 2:
|
||||
type_part = "[" + parts[-1] # Tomar el último indicador
|
||||
if "]" in type_part:
|
||||
type_indicator = type_part.split("]")[0] + "]"
|
||||
latex_parts.append(f"\\quad \\text{{{type_indicator}}}")
|
||||
|
||||
# Combinar todas las partes
|
||||
complete_latex = " ".join(latex_parts)
|
||||
|
||||
# Limpiar caracteres problemáticos para MathJax
|
||||
complete_latex = complete_latex.replace("__", "_{").replace("**", "^")
|
||||
|
||||
# Agregar llaves de cierre para subíndices
|
||||
import re
|
||||
complete_latex = re.sub(r'_\{(\w+)', r'_{\1}', complete_latex)
|
||||
|
||||
return complete_latex
|
||||
|
||||
except Exception as e:
|
||||
self.logger.error(f"Error generando LaTeX completo: {e}")
|
||||
# Fallback al output original
|
||||
return result.output or ""
|
||||
|
||||
def _add_to_latex_panel(self, equation_type: str, latex_content: str):
|
||||
"""Añade una ecuación al panel LaTeX"""
|
||||
if not hasattr(self, '_latex_equations'):
|
||||
|
|
Loading…
Reference in New Issue