这段代码实现了一个基于PyQt5的LaTeX公式编辑器,能够实时预览输入的数学公式。以下是代码的主要功能说明:
1. 界面设计 :
- 使用 QMainWindow 作为主窗口,包含一个文本编辑框 QTextEdit 和一个网页视图 QWebEngineView 。
- 文本编辑框用于输入LaTeX公式,网页视图用于实时显示渲染后的公式。
2. 公式渲染 :
- 使用MathJax库来渲染LaTeX公式。
- 在 update_preview 方法中,将输入的LaTeX内容嵌入到HTML模板中,并通过 QWebEngineView 显示。
3. 实时预览 :
- 通过 textChanged 信号连接 update_preview 方法,实现输入内容变化时自动更新预览。
4. MathJax配置 :
- 配置了行内公式和块级公式的定界符,确保 $...$ 和 \[...\] 等格式的公式能够正确渲染。
- 使用 pageReady 回调确保MathJax完全加载后再渲染公式。
5. 示例公式 :
- 初始化时在文本编辑框中显示示例公式,包括行内公式 $E = mc^2$ 和块级公式 \[ x = \frac{-b \pm \sqrt{b^2 - 4ac}}{2a} \] 。
这段代码非常适合需要实时编辑和预览LaTeX公式的场景,例如数学笔记、科学文档编辑等。
import sysfrom PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QTextEditfrom PyQt5.QtWebEngineWidgets import QWebEngineViewclass MathJaxEditor(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle("MathJax Editor") self.setGeometry(100, 100, 800, 600) layout = QVBoxLayout() self.text_edit = QTextEdit() self.text_edit.setPlainText( "输入 LaTeX 公式,例如:\n\n" "行内公式:$E = mc^2$\n\n" "块级公式:\n" "\\[\n" "x = \\frac{-b \\pm \\sqrt{b^2 - 4ac}}{2a}\n" "\\]" ) self.web_view = QWebEngineView() layout.addWidget(self.text_edit) layout.addWidget(self.web_view) container = QWidget() container.setLayout(layout) self.setCentralWidget(container) self.text_edit.textChanged.connect(self.update_preview) self.update_preview() def update_preview(self): latex_content = self.text_edit.toPlainText() html = f""" <!DOCTYPE html> <html> <head> <script src="https://polyfill.io/v3/polyfill.min.js?features=es6"></script> <script> MathJax = {{ tex: {{ inlineMath: [['$', '$'], ['\\(', '\\)']], displayMath: [['$$', '$$'], ['\\\\[', '\\\\]']], // 注意双反斜杠 processEscapes: true }}, startup: {{ pageReady: () => {{ MathJax.startup.defaultPageReady(); MathJax.typesetPromise(); // 确保在此处触发渲染 }} }} }}; </script> 非常重要 <script src="https://cdnjs.cloudflare.com/ajax/libs/mathjax/3.2.2/es5/tex-mml-chtml.js"></script> </head> <body> <div>{latex_content}</div> </body> </html> """ self.web_view.setHtml(html)if __name__ == "__main__": app = QApplication(sys.argv) window = MathJaxEditor() window.show() sys.exit(app.exec_())