/*
TikZiT - a GUI diagram editor for TikZ
Copyright (C) 2018 Aleks Kissinger
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see .
*/
#include "latexprocess.h"
#include "tikzit.h"
#include
#include
#include
#include
#include
LatexProcess::LatexProcess(PreviewWindow *preview, QObject *parent) : QObject(parent)
{
_preview = preview;
_output = preview->outputTextEdit();
_proc = new QProcess(this);
_proc->setProcessChannelMode(QProcess::MergedChannels);
_proc->setWorkingDirectory(_workingDir.path());
connect(_proc, SIGNAL(readyReadStandardOutput()), this, SLOT(readyReadStandardOutput()));
connect(_proc, SIGNAL(finished(int)), this, SLOT(finished(int)));
// for debug purposes
//_workingDir.setAutoRemove(false);
}
void LatexProcess::makePreview(QString tikz)
{
QSettings settings("tikzit", "tikzit");
_preview->setStatus(PreviewWindow::Running);
_output->clear();
if (!_workingDir.isValid()) {
_output->appendPlainText("COULD NOT WRITE TO TEMP DIR: " + _workingDir.path() + "\n");
return;
}
_output->appendPlainText("USING TEMP DIR: " + _workingDir.path() + "\n");
QString pdflatex;
if (settings.value("auto-detect-pdflatex", true).toBool()) {
_output->appendPlainText("SEARCHING FOR pdflatex IN:");
_output->appendPlainText(qgetenv("PATH"));
_output->appendPlainText("\n");
pdflatex = QStandardPaths::findExecutable("pdflatex");
if (pdflatex.isEmpty()) {
// if pdflatex is not in PATH, we are probably on mac or windows, so try common
// install directories.
_output->appendPlainText("NOT FOUND IN PATH, TRYING:");
QStringList texDirs;
// common macOS tex directories:
texDirs << "/Library/TeX/texbin";
texDirs << "/usr/texbin";
texDirs << "/usr/local/bin";
texDirs << "/sw/bin";
// common windows tex directories
texDirs << "C:\\Program Files\\MiKTeX 2.9\\miktex\\bin";
texDirs << "C:\\Program Files\\MiKTeX 2.9\\miktex\\bin\\x64";
texDirs << "C:\\Program Files\\MiKTeX 2.8\\miktex\\bin";
texDirs << "C:\\Program Files\\MiKTeX 2.8\\miktex\\bin\\x64";
texDirs << "C:\\Program Files\\MiKTeX 2.7\\miktex\\bin";
texDirs << "C:\\Program Files\\MiKTeX 2.7\\miktex\\bin\\x64";
_output->appendPlainText(texDirs.join(":"));
pdflatex = QStandardPaths::findExecutable("pdflatex", texDirs);
}
if (pdflatex.isEmpty()) {
_output->appendPlainText("pdflatex NOT FOUND, ABORTING.\n");
_preview->setStatus(PreviewWindow::Failed);
return;
} else {
_output->appendPlainText("FOUND: " + pdflatex + "\n");
}
} else {
_output->appendPlainText("USING pdflatex:\n");
pdflatex = settings.value("pdflatex-path", "/usr/bin/pdflatex").toString();
_output->appendPlainText(pdflatex + "\n");
}
// copy tikzit.sty to preview dir
QFile::copy(":/tex/sample/tikzit.sty", _workingDir.path() + "/tikzit.sty");
// write out the file containing the tikz picture
QFile f(_workingDir.path() + "/preview.tex");
f.open(QIODevice::WriteOnly);
QTextStream tex(&f);
tex << "\\documentclass{article}\n";
tex << "\\usepackage{tikzit}\n";
tex << "\\tikzstyle{every picture}=[tikzfig]\n";
tex << "\\usepackage[graphics,active,tightpage]{preview}\n";
tex << "\\PreviewEnvironment{tikzpicture}\n";
// copy active *.tikzstyles file to preview dir
if (!tikzit->styleFile().isEmpty() && QFile::exists(tikzit->styleFilePath())) {
QFile::copy(tikzit->styleFilePath(), _workingDir.path() + "/" + tikzit->styleFile());
tex << "\\input{" + tikzit->styleFile() + "}\n";
// if there is a *.tikzdefs file with the same basename, copy and include it as well
QFileInfo fi(tikzit->styleFilePath());
QString defFile = fi.baseName() + ".tikzdefs";
QString defFilePath = fi.absolutePath() + "/" + defFile;
if (QFile::exists(defFilePath)) {
QFile::copy(defFilePath, _workingDir.path() + "/" + defFile);
tex << "\\input{" + defFile + "}\n";
}
}
tex << "\\begin{document}\n\n";
tex << tikz;
tex << "\n\n\\end{document}\n";
f.close();
_proc->start(pdflatex,
QStringList()
<< "-interaction=nonstopmode"
<< "-halt-on-error"
<< "preview.tex");
}
void LatexProcess::kill()
{
if (_proc->state() == QProcess::Running) _proc->kill();
}
void LatexProcess::readyReadStandardOutput()
{
QByteArray s = _proc->readAllStandardOutput();
_output->appendPlainText(s);
}
void LatexProcess::finished(int exitCode)
{
QByteArray s = _proc->readAllStandardOutput();
_output->appendPlainText(s);
if (exitCode == 0) {
QString pdf = _workingDir.path() + "/preview.pdf";
_output->appendPlainText("\n\nSUCCESSFULLY GENERATED: " + pdf + "\n");
_preview->setPdf(pdf);
_preview->setStatus(PreviewWindow::Success);
emit previewFinished();
} else {
_output->appendPlainText("\n\npdflatex RETURNED AN ERROR\n");
_preview->setStatus(PreviewWindow::Failed);
emit previewFinished();
}
}