• Skip to content
  • Skip to link menu
KDE API Reference
  • KDE API Reference
  • kdeedu API Reference
  • KDE Home
  • Contact Us
 

cantor/src/lib

  • sources
  • kde-4.14
  • kdeedu
  • cantor
  • src
  • lib
latexrenderer.cpp
Go to the documentation of this file.
1 /*
2  This program is free software; you can redistribute it and/or
3  modify it under the terms of the GNU General Public License
4  as published by the Free Software Foundation; either version 2
5  of the License, or (at your option) any later version.
6 
7  This program is distributed in the hope that it will be useful,
8  but WITHOUT ANY WARRANTY; without even the implied warranty of
9  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10  GNU General Public License for more details.
11 
12  You should have received a copy of the GNU General Public License
13  along with this program; if not, write to the Free Software
14  Foundation, Inc., 51 Franklin Street, Fifth Floor,
15  Boston, MA 02110-1301, USA.
16 
17  ---
18  Copyright (C) 2011 Alexander Rieder <alexanderrieder@gmail.com>
19  */
20 
21 #include "latexrenderer.h"
22 using namespace Cantor;
23 
24 #include <kstandarddirs.h>
25 #include <ktemporaryfile.h>
26 #include <kprocess.h>
27 #include <kdebug.h>
28 #include <QFileInfo>
29 #include <QEventLoop>
30 
31 #include <config-cantorlib.h>
32 #include "settings.h"
33 
34 class Cantor::LatexRendererPrivate
35 {
36  public:
37  QString latexCode;
38  QString header;
39  LatexRenderer::Method method;
40  bool isEquationOnly;
41  LatexRenderer::EquationType equationType;
42  QString errorMessage;
43  bool success;
44  QString latexFilename;
45 };
46 
47 static const QString tex="\\documentclass[12pt,fleqn]{article} \n "\
48  "\\usepackage{latexsym,amsfonts,amssymb,ulem} \n "\
49  "\\usepackage[dvips]{graphicx} \n "\
50  "\\usepackage[utf8]{inputenc} \n "\
51  "\\setlength\\textwidth{5in} \n "\
52  "\\setlength{\\parindent}{0pt} \n "\
53  "%1 \n "\
54  "\\pagestyle{empty} \n "\
55  "\\begin{document} \n "\
56  "%2 \n "\
57  "\\end{document}\n";
58 
59 static const QString eqnHeader="\\begin{eqnarray*}%1\\end{eqnarray*} \n ";
60 static const QString inlineEqnHeader="$%1$ \n";
61 
62 LatexRenderer::LatexRenderer(QObject* parent) : QObject(parent),
63  d(new LatexRendererPrivate)
64 {
65  d->method=LatexMethod;
66  d->isEquationOnly=false;
67  d->equationType=InlineEquation;
68  d->success=false;
69 }
70 
71 LatexRenderer::~LatexRenderer()
72 {
73  delete d;
74 }
75 
76 QString LatexRenderer::latexCode() const
77 {
78  return d->latexCode;
79 }
80 
81 void LatexRenderer::setLatexCode(const QString& src)
82 {
83  d->latexCode=src;
84 }
85 
86 QString LatexRenderer::header() const
87 {
88  return d->header;
89 }
90 
91 void LatexRenderer::addHeader(const QString& header)
92 {
93  d->header.append(header);
94 }
95 
96 void LatexRenderer::setHeader(const QString& header)
97 {
98  d->header=header;
99 }
100 
101 LatexRenderer::Method LatexRenderer::method() const
102 {
103  return d->method;
104 }
105 
106 void LatexRenderer::setMethod(LatexRenderer::Method method)
107 {
108  d->method=method;
109 }
110 
111 void LatexRenderer::setEquationType(LatexRenderer::EquationType type)
112 {
113  d->equationType=type;
114 }
115 
116 LatexRenderer::EquationType LatexRenderer::equationType() const
117 {
118  return d->equationType;
119 }
120 
121 
122 void LatexRenderer::setErrorMessage(const QString& msg)
123 {
124  d->errorMessage=msg;
125 }
126 
127 QString LatexRenderer::errorMessage() const
128 {
129  return d->errorMessage;
130 }
131 
132 bool LatexRenderer::renderingSuccessful() const
133 {
134  return d->success;
135 }
136 
137 void LatexRenderer::setEquationOnly(bool isEquationOnly)
138 {
139  d->isEquationOnly=isEquationOnly;
140 }
141 
142 bool LatexRenderer::isEquationOnly() const
143 {
144  return d->isEquationOnly;
145 }
146 
147 
148 QString LatexRenderer::imagePath() const
149 {
150  return d->latexFilename;
151 }
152 
153 void LatexRenderer::render()
154 {
155  switch(d->method)
156  {
157  case LatexRenderer::LatexMethod: renderWithLatex(); break;
158  case LatexRenderer::MmlMethod: renderWithMml(); break;
159  };
160 }
161 
162 void LatexRenderer::renderBlocking()
163 {
164  QEventLoop event;
165  connect(this, SIGNAL(done()), &event, SLOT(quit()));
166  connect(this, SIGNAL(error()), &event, SLOT(quit()));
167 
168  render();
169  event.exec();
170 }
171 
172 void LatexRenderer::renderWithLatex()
173 {
174  kDebug()<<"rendering using latex method";
175  QString dir=KGlobal::dirs()->saveLocation("tmp", "cantor/");
176 
177  //Check if the cantor subdir exists, if not, create it
178  KTemporaryFile *texFile=new KTemporaryFile();
179  texFile->setPrefix( "cantor/" );
180  texFile->setSuffix( ".tex" );
181  texFile->open();
182 
183  QString expressionTex=tex;
184  expressionTex=expressionTex.arg(d->header);
185  if(isEquationOnly())
186  {
187  switch(equationType())
188  {
189  case FullEquation: expressionTex=expressionTex.arg(eqnHeader); break;
190  case InlineEquation: expressionTex=expressionTex.arg(inlineEqnHeader); break;
191  }
192  }
193  expressionTex=expressionTex.arg(d->latexCode);
194 
195  kDebug()<<"full tex: "<<expressionTex;
196 
197  texFile->write(expressionTex.toUtf8());
198  texFile->flush();
199 
200  QString fileName = texFile->fileName();
201  kDebug()<<"fileName: "<<fileName;
202  d->latexFilename=fileName;
203  d->latexFilename.replace(".tex", ".eps");
204  KProcess *p=new KProcess( this );
205  p->setWorkingDirectory(dir);
206 
207  (*p)<<Settings::self()->latexCommand()<<"-interaction=batchmode"<<"-halt-on-error"<<fileName;
208 
209  connect(p, SIGNAL( finished(int, QProcess::ExitStatus) ), this, SLOT( convertToPs() ) );
210  p->start();
211 }
212 
213 void LatexRenderer::convertToPs()
214 {
215  kDebug()<<"converting to ps";
216  QString dviFile=d->latexFilename;
217  dviFile.replace(".eps", ".dvi");
218  KProcess *p=new KProcess( this );
219  kDebug()<<"running: "<<Settings::self()->dvipsCommand()<<"-E"<<"-o"<<d->latexFilename<<dviFile;
220  (*p)<<Settings::self()->dvipsCommand()<<"-E"<<"-o"<<d->latexFilename<<dviFile;
221 
222  connect(p, SIGNAL( finished(int, QProcess::ExitStatus) ), this, SLOT( convertingDone() ) );
223  p->start();
224 }
225 
226 void LatexRenderer::convertingDone()
227 {
228  kDebug()<<"rendered file "<<d->latexFilename;
229  //cleanup the temp directory a bit...
230  QString dir=KGlobal::dirs()->saveLocation("tmp", "cantor/");
231  QStringList unneededExtensions;
232  unneededExtensions<<".log"<<".aux"<<".tex"<<".dvi";
233  foreach(const QString& ext, unneededExtensions)
234  {
235  QString s=d->latexFilename;
236  s.replace(".eps", ext);
237  QFile f(s);
238  //f.remove();
239  }
240 
241  if(QFileInfo(d->latexFilename).exists())
242  {
243  d->success=true;
244  emit done();
245  }else
246  {
247  d->success=false;
248  setErrorMessage("something is wrong");
249  emit error();
250  }
251 }
252 
253 void LatexRenderer::renderWithMml()
254 {
255  kDebug()<<"WARNING: MML rendering not implemented yet!";
256  emit done();
257 }
258 
259 #include "latexrenderer.moc"
QEventLoop
Cantor::LatexRenderer::addHeader
void addHeader(const QString &header)
Definition: latexrenderer.cpp:91
Cantor::LatexRenderer::isEquationOnly
bool isEquationOnly() const
Definition: latexrenderer.cpp:142
Cantor::LatexRenderer::method
Method method() const
Definition: latexrenderer.cpp:101
eqnHeader
static const QString eqnHeader
Definition: latexrenderer.cpp:59
Cantor::LatexRenderer::MmlMethod
Definition: latexrenderer.h:34
Cantor::LatexRenderer::setHeader
void setHeader(const QString &header)
Definition: latexrenderer.cpp:96
Cantor::LatexRenderer::imagePath
QString imagePath() const
Definition: latexrenderer.cpp:148
QFile
QObject::event
virtual bool event(QEvent *e)
Settings::latexCommand
static QString latexCommand()
Get Path to the latex executable.
Definition: settings.h:22
Settings::self
static Settings * self()
Definition: settings.cpp:17
inlineEqnHeader
static const QString inlineEqnHeader
Definition: latexrenderer.cpp:60
QObject
Cantor::LatexRenderer::setEquationType
void setEquationType(EquationType type)
Definition: latexrenderer.cpp:111
tex
static const QString tex
Definition: latexrenderer.cpp:47
Cantor::LatexRenderer::latexCode
QString latexCode() const
Definition: latexrenderer.cpp:76
Cantor::LatexRenderer::setEquationOnly
void setEquationOnly(bool isEquationOnly)
Definition: latexrenderer.cpp:137
Cantor::LatexRenderer::LatexRenderer
LatexRenderer(QObject *parent=0)
Definition: latexrenderer.cpp:62
Cantor::LatexRenderer::errorMessage
QString errorMessage() const
Definition: latexrenderer.cpp:127
QString
QStringList
Cantor::LatexRenderer::Method
Method
Definition: latexrenderer.h:34
QFileInfo
QFileInfo::exists
bool exists() const
Cantor::LatexRenderer::error
void error()
Cantor::LatexRenderer::render
void render()
Definition: latexrenderer.cpp:153
Cantor::LatexRenderer::FullEquation
Definition: latexrenderer.h:35
Cantor::LatexRenderer::InlineEquation
Definition: latexrenderer.h:35
Cantor::LatexRenderer::~LatexRenderer
~LatexRenderer()
Definition: latexrenderer.cpp:71
QString::replace
QString & replace(int position, int n, QChar after)
Cantor::LatexRenderer::done
void done()
settings.h
Cantor::LatexRenderer::renderingSuccessful
bool renderingSuccessful() const
Definition: latexrenderer.cpp:132
Cantor::LatexRenderer::header
QString header() const
Definition: latexrenderer.cpp:86
Cantor::LatexRenderer::renderBlocking
void renderBlocking()
Definition: latexrenderer.cpp:162
latexrenderer.h
Cantor::LatexRenderer::equationType
EquationType equationType() const
Definition: latexrenderer.cpp:116
Cantor::LatexRenderer::EquationType
EquationType
Definition: latexrenderer.h:35
Cantor::LatexRenderer::setMethod
void setMethod(Method method)
Definition: latexrenderer.cpp:106
Cantor::LatexRenderer::LatexMethod
Definition: latexrenderer.h:34
QObject::connect
bool connect(const QObject *sender, const char *signal, const QObject *receiver, const char *method, Qt::ConnectionType type)
Cantor::LatexRenderer::setLatexCode
void setLatexCode(const QString &src)
Definition: latexrenderer.cpp:81
QString::arg
QString arg(qlonglong a, int fieldWidth, int base, const QChar &fillChar) const
Settings::dvipsCommand
static QString dvipsCommand()
Get Path to the dvips executable.
Definition: settings.h:32
QString::toUtf8
QByteArray toUtf8() const
This file is part of the KDE documentation.
Documentation copyright © 1996-2020 The KDE developers.
Generated on Mon Jun 22 2020 13:16:33 by doxygen 1.8.7 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.

cantor/src/lib

Skip menu "cantor/src/lib"
  • Main Page
  • Namespace List
  • Namespace Members
  • Alphabetical List
  • Class List
  • Class Hierarchy
  • Class Members
  • File List
  • File Members

kdeedu API Reference

Skip menu "kdeedu API Reference"
  • Analitza
  •     lib
  • kalgebra
  • kalzium
  •   libscience
  • kanagram
  • kig
  •   lib
  • klettres
  • marble
  • parley
  • rocs
  •   App
  •   RocsCore
  •   VisualEditor
  •   stepcore

Search



Report problems with this website to our bug tracking system.
Contact the specific authors with questions and comments about the page contents.

KDE® and the K Desktop Environment® logo are registered trademarks of KDE e.V. | Legal