• 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.12
  • 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  "\\setlength\\textwidth{5in} \n "\
51  "\\setlength{\\parindent}{0pt} \n "\
52  "%1 \n "\
53  "\\pagestyle{empty} \n "\
54  "\\begin{document} \n "\
55  "%2 \n "\
56  "\\end{document}\n";
57 
58 static const QString eqnHeader="\\begin{eqnarray*}%1\\end{eqnarray*} \n ";
59 static const QString inlineEqnHeader="$%1$ \n";
60 
61 LatexRenderer::LatexRenderer(QObject* parent) : QObject(parent),
62  d(new LatexRendererPrivate)
63 {
64  d->method=LatexMethod;
65  d->isEquationOnly=false;
66  d->equationType=InlineEquation;
67  d->success=false;
68 }
69 
70 LatexRenderer::~LatexRenderer()
71 {
72  delete d;
73 }
74 
75 QString LatexRenderer::latexCode() const
76 {
77  return d->latexCode;
78 }
79 
80 void LatexRenderer::setLatexCode(const QString& src)
81 {
82  d->latexCode=src;
83 }
84 
85 QString LatexRenderer::header() const
86 {
87  return d->header;
88 }
89 
90 void LatexRenderer::addHeader(const QString& header)
91 {
92  d->header.append(header);
93 }
94 
95 void LatexRenderer::setHeader(const QString& header)
96 {
97  d->header=header;
98 }
99 
100 LatexRenderer::Method LatexRenderer::method() const
101 {
102  return d->method;
103 }
104 
105 void LatexRenderer::setMethod(LatexRenderer::Method method)
106 {
107  d->method=method;
108 }
109 
110 void LatexRenderer::setEquationType(LatexRenderer::EquationType type)
111 {
112  d->equationType=type;
113 }
114 
115 LatexRenderer::EquationType LatexRenderer::equationType() const
116 {
117  return d->equationType;
118 }
119 
120 
121 void LatexRenderer::setErrorMessage(const QString& msg)
122 {
123  d->errorMessage=msg;
124 }
125 
126 QString LatexRenderer::errorMessage() const
127 {
128  return d->errorMessage;
129 }
130 
131 bool LatexRenderer::renderingSuccessful() const
132 {
133  return d->success;
134 }
135 
136 void LatexRenderer::setEquationOnly(bool isEquationOnly)
137 {
138  d->isEquationOnly=isEquationOnly;
139 }
140 
141 bool LatexRenderer::isEquationOnly() const
142 {
143  return d->isEquationOnly;
144 }
145 
146 
147 QString LatexRenderer::imagePath() const
148 {
149  return d->latexFilename;
150 }
151 
152 void LatexRenderer::render()
153 {
154  switch(d->method)
155  {
156  case LatexRenderer::LatexMethod: renderWithLatex(); break;
157  case LatexRenderer::MmlMethod: renderWithMml(); break;
158  };
159 }
160 
161 void LatexRenderer::renderBlocking()
162 {
163  QEventLoop event;
164  connect(this, SIGNAL(done()), &event, SLOT(quit()));
165  connect(this, SIGNAL(error()), &event, SLOT(quit()));
166 
167  render();
168  event.exec();
169 }
170 
171 void LatexRenderer::renderWithLatex()
172 {
173  kDebug()<<"rendering using latex method";
174  QString dir=KGlobal::dirs()->saveLocation("tmp", "cantor/");
175 
176  //Check if the cantor subdir exists, if not, create it
177  KTemporaryFile *texFile=new KTemporaryFile();
178  texFile->setPrefix( "cantor/" );
179  texFile->setSuffix( ".tex" );
180  texFile->open();
181 
182  QString expressionTex=tex;
183  expressionTex=expressionTex.arg(d->header);
184  if(isEquationOnly())
185  {
186  switch(equationType())
187  {
188  case FullEquation: expressionTex=expressionTex.arg(eqnHeader); break;
189  case InlineEquation: expressionTex=expressionTex.arg(inlineEqnHeader); break;
190  }
191  }
192  expressionTex=expressionTex.arg(d->latexCode);
193 
194  kDebug()<<"full tex: "<<expressionTex;
195 
196  texFile->write(expressionTex.toUtf8());
197  texFile->flush();
198 
199  QString fileName = texFile->fileName();
200  kDebug()<<"fileName: "<<fileName;
201  d->latexFilename=fileName;
202  d->latexFilename.replace(".tex", ".eps");
203  KProcess *p=new KProcess( this );
204  p->setWorkingDirectory(dir);
205 
206  (*p)<<Settings::self()->latexCommand()<<"-interaction=batchmode"<<"-halt-on-error"<<fileName;
207 
208  connect(p, SIGNAL( finished(int, QProcess::ExitStatus) ), this, SLOT( convertToPs() ) );
209  p->start();
210 }
211 
212 void LatexRenderer::convertToPs()
213 {
214  kDebug()<<"converting to ps";
215  QString dviFile=d->latexFilename;
216  dviFile.replace(".eps", ".dvi");
217  KProcess *p=new KProcess( this );
218  kDebug()<<"running: "<<Settings::self()->dvipsCommand()<<"-E"<<"-o"<<d->latexFilename<<dviFile;
219  (*p)<<Settings::self()->dvipsCommand()<<"-E"<<"-o"<<d->latexFilename<<dviFile;
220 
221  connect(p, SIGNAL( finished(int, QProcess::ExitStatus) ), this, SLOT( convertingDone() ) );
222  p->start();
223 }
224 
225 void LatexRenderer::convertingDone()
226 {
227  kDebug()<<"rendered file "<<d->latexFilename;
228  //cleanup the temp directory a bit...
229  QString dir=KGlobal::dirs()->saveLocation("tmp", "cantor/");
230  QStringList unneededExtensions;
231  unneededExtensions<<".log"<<".aux"<<".tex"<<".dvi";
232  foreach(const QString& ext, unneededExtensions)
233  {
234  QString s=d->latexFilename;
235  s.replace(".eps", ext);
236  QFile f(s);
237  //f.remove();
238  }
239 
240  if(QFileInfo(d->latexFilename).exists())
241  {
242  d->success=true;
243  emit done();
244  }else
245  {
246  d->success=false;
247  setErrorMessage("something is wrong");
248  emit error();
249  }
250 }
251 
252 void LatexRenderer::renderWithMml()
253 {
254  kDebug()<<"WARNING: MML rendering not implemented yet!";
255  emit done();
256 }
257 
258 #include "latexrenderer.moc"
Cantor::LatexRenderer::addHeader
void addHeader(const QString &header)
Definition: latexrenderer.cpp:90
Cantor::LatexRenderer::isEquationOnly
bool isEquationOnly() const
Definition: latexrenderer.cpp:141
Cantor::LatexRenderer::method
Method method() const
Definition: latexrenderer.cpp:100
eqnHeader
static const QString eqnHeader
Definition: latexrenderer.cpp:58
Cantor::LatexRenderer::MmlMethod
Definition: latexrenderer.h:34
Cantor::LatexRenderer::setHeader
void setHeader(const QString &header)
Definition: latexrenderer.cpp:95
Cantor::LatexRenderer::imagePath
QString imagePath() const
Definition: latexrenderer.cpp:147
QObject
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:59
Cantor::LatexRenderer::setEquationType
void setEquationType(EquationType type)
Definition: latexrenderer.cpp:110
tex
static const QString tex
Definition: latexrenderer.cpp:47
Cantor::LatexRenderer::latexCode
QString latexCode() const
Definition: latexrenderer.cpp:75
Cantor::LatexRenderer::setEquationOnly
void setEquationOnly(bool isEquationOnly)
Definition: latexrenderer.cpp:136
Cantor::LatexRenderer::LatexRenderer
LatexRenderer(QObject *parent=0)
Definition: latexrenderer.cpp:61
Cantor::LatexRenderer::errorMessage
QString errorMessage() const
Definition: latexrenderer.cpp:126
Cantor::LatexRenderer::Method
Method
Definition: latexrenderer.h:34
Cantor::LatexRenderer::error
void error()
Cantor::LatexRenderer::render
void render()
Definition: latexrenderer.cpp:152
Cantor::LatexRenderer::FullEquation
Definition: latexrenderer.h:35
Cantor::LatexRenderer::InlineEquation
Definition: latexrenderer.h:35
Cantor::LatexRenderer::~LatexRenderer
~LatexRenderer()
Definition: latexrenderer.cpp:70
Cantor::LatexRenderer::done
void done()
settings.h
Cantor::LatexRenderer::renderingSuccessful
bool renderingSuccessful() const
Definition: latexrenderer.cpp:131
Cantor::LatexRenderer::header
QString header() const
Definition: latexrenderer.cpp:85
Cantor::LatexRenderer::renderBlocking
void renderBlocking()
Definition: latexrenderer.cpp:161
latexrenderer.h
Cantor::LatexRenderer::equationType
EquationType equationType() const
Definition: latexrenderer.cpp:115
Cantor::LatexRenderer::EquationType
EquationType
Definition: latexrenderer.h:35
Cantor::LatexRenderer::setMethod
void setMethod(Method method)
Definition: latexrenderer.cpp:105
Cantor::LatexRenderer::LatexMethod
Definition: latexrenderer.h:34
Cantor::LatexRenderer::setLatexCode
void setLatexCode(const QString &src)
Definition: latexrenderer.cpp:80
Settings::dvipsCommand
static QString dvipsCommand()
Get Path to the dvips executable.
Definition: settings.h:32
This file is part of the KDE documentation.
Documentation copyright © 1996-2014 The KDE developers.
Generated on Tue Oct 14 2014 22:42:50 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
  • kstars
  • libkdeedu
  •   keduvocdocument
  • 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