恢复 Latex 编译错误

恢复 Latex 编译错误

我有一个编写文本的程序,当我单击“编译”按钮时,它会编译为 latex,转换为 pdf 并将其显示在我的应用程序上。问题是,当我遇到编译错误时,应用程序就会出错,仅此而已。我想知道是否有可能在应用程序不崩溃的情况下恢复编译错误。我尝试使用 try/expect,但这不是 python 错误,所以它不起作用。

您需要 PDF.js 来查看 pdfhttps://mozilla.github.io/pdf.js/getting_started/#download

用户界面:


from PyQt5 import QtCore, QtGui, QtWidgets


class Ui_Dialog(object):
    def setupUi(self, Dialog):
        Dialog.setObjectName("Dialog")
        Dialog.resize(841, 481)
        self.horizontalLayout = QtWidgets.QHBoxLayout(Dialog)
        self.horizontalLayout.setObjectName("horizontalLayout")
        self.gridLayout = QtWidgets.QGridLayout()
        self.gridLayout.setObjectName("gridLayout")
        self.textEdit = QtWidgets.QTextEdit(Dialog)
        self.textEdit.setMinimumSize(QtCore.QSize(0, 200))
        self.textEdit.setObjectName("textEdit")
        self.gridLayout.addWidget(self.textEdit, 0, 0, 1, 1)
        self.buttonBox = QtWidgets.QDialogButtonBox(Dialog)
        self.buttonBox.setOrientation(QtCore.Qt.Vertical)
        self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok)
        self.buttonBox.setObjectName("buttonBox")
        self.gridLayout.addWidget(self.buttonBox, 0, 1, 1, 1)
        #self.textEdit_2 = QtWidgets.QTextEdit(Dialog)
        #self.textEdit_2.setObjectName("textEdit_2")
        #self.gridLayout.addWidget(self.textEdit_2, 1, 0, 1, 1)
        self.horizontalLayout.addLayout(self.gridLayout)

        self.retranslateUi(Dialog)
        self.buttonBox.accepted.connect(Dialog.accept)
        self.buttonBox.rejected.connect(Dialog.reject)
        QtCore.QMetaObject.connectSlotsByName(Dialog)

    def retranslateUi(self, Dialog):
        _translate = QtCore.QCoreApplication.translate
        Dialog.setWindowTitle(_translate("Dialog", "Dialog"))

应用程序:

import os
import sys
from PyQt5.QtWidgets import QDialog, QPushButton, QWidget, QApplication
from PyQt5 import QtCore, QtWidgets, QtWebEngineWidgets
from sympy import Symbol
import untitled

x=Symbol('x')
class Test(QDialog, untitled.Ui_Dialog):
    def __init__(self):
        super(Test, self).__init__()
        self.setupUi(self)

        self.bouton= QPushButton('compile',self)
        self.horizontalLayout.addWidget(self.bouton)
        self.bouton.clicked.connect(self.crertest)

        self.widget = QWidget(self)
        self.gridLayout.addWidget(self.widget, 1, 0, 1, 1)
        self.t = Window()
        lay = QtWidgets.QVBoxLayout(self.widget)
        lay.addWidget(self.t)

    def crertest(self):
        try :
            def preambule(*packages):
                p = ""
                for i in packages:
                    p = p + "\\usepackage{" + i + "}\n"
                return p
            start = "\\documentclass[12pt,a4paper,french]{article}\n\\usepackage[utf8]{inputenc}\n"
            start = start + preambule('amsmath','graphicx')
            start = start + "\\begin{document}\n"
            end = "\\end{document}"
            body = self.textEdit.toPlainText()

            container = start + body + end
            file = "mypdf.tex"
            if os.path.exists(file):
                os.remove(file)
            fichier = open("mypdf.tex", "x")  #
            fichier.write(container)
            fichier.close()

            instructions = "pdflatex " + file
            os.system(instructions)
            readpdf = "START " + file[:-4] + ".pdf"
            self.t.loadd()
        except:
            print('Fail')

PDFJS = 'file:///C:/Users/pdf_js/web/viewer.html' #Path too viewer.htlm in your pddf_js folder
PDF = 'file:///C:/Users/mypdf.pdf' #Path to your pdf


class Window(QtWebEngineWidgets.QWebEngineView):
    def __init__(self):
        super(Window, self).__init__()
        self.loadd()
    try:
        def loadd(self):
            self.load(QtCore.QUrl.fromUserInput('%s?file=%s' % (PDFJS, PDF)))
    except:
        print ('Fail 2')
if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = Test()
    main.show()
    app.exec_()

我使用取自这篇文章的代码来进行 pdf 显示:https://stackoverflow.com/questions/23389001/how-to-render-pdf-using-pdf-js-viewer-in-pyqt

instructions = "pdflatex " + file 

此行编译,但我无法捕获错误

答案1

好吧,这个问题可能有点跑题,而且我的评论作为评论也很难让人接受。所以,请认真考虑我的回答。

我想知道是否有可能在应用程序不崩溃的情况下恢复编译错误。

新语言提供的常见方法是使用try-catch机制,即抛出异常,尝试修复或处理错误。有关 Phyton 的基本入门,请参见此处:https://www.w3schools.com/python/python_try_except.asp

当你说它不是 时Phyton error,它肯定会在命令行上显示错误消息。因此,应该做的是将编译命令提交到 shell(即提交系统调用、DOS、bash 等等),读回并将这些结果置于 try-catch 机制之下。

当我点击“编译”按钮时,它会编译为 latex,转换为 pdf 并将其显示在我的应用程序上。问题是,当我遇到编译错误时,应用程序就会出现错误,仅此而已。

这通常是您在进行直接编程时获得的指纹或模式。放慢速度将恢复速度……当您应用时test-driven-design paradigm。即对于您可能想要使用的任何功能,您在实施之前已经对其进行了测试;-)

实际上,你可以这样做unit testing。例如参见此处:https://docs.python.org/3/library/unittest.html。您的回报将是,例如,优美的代码、将焦点从代码转移到测试本身、可重用性等等。

测试 (G)UI 可能很痛苦。你越能根据概念将表示(GUI、处理输入和输出的 UI)与功能(它实际做什么)区分开来,你就越能走上正轨。

相关内容