]> git.lyx.org Git - lyx.git/blobdiff - src/LaTeX.cpp
avoid float-conversion warning and simplify size computation
[lyx.git] / src / LaTeX.cpp
index 3436645fec13db6e717d8772bd3b151498d13702..55e31ec1c1a849e2392db45343bdbf3ebf62f7af 100644 (file)
@@ -92,8 +92,9 @@ bool operator!=(AuxInfo const & a, AuxInfo const & o)
  */
 
 LaTeX::LaTeX(string const & latex, OutputParams const & rp,
-            FileName const & f, string const & p)
-       : cmd(latex), file(f), path(p), runparams(rp), biber(false)
+            FileName const & f, string const & p, string const & lp,
+            bool const clean_start)
+       : cmd(latex), file(f), path(p), lpath(lp), runparams(rp), biber(false)
 {
        num_errors = 0;
        if (prefixIs(cmd, "pdf")) { // Do we use pdflatex ?
@@ -105,12 +106,16 @@ LaTeX::LaTeX(string const & latex, OutputParams const & rp,
                output_file =
                        FileName(changeExtension(file.absFileName(), ".dvi"));
        }
+       if (clean_start)
+               removeAuxiliaryFiles();
 }
 
 
-void LaTeX::deleteFilesOnError() const
+void LaTeX::removeAuxiliaryFiles() const
 {
-       // currently just a dummy function.
+       // Note that we do not always call this function when there is an error.
+       // For example, if there is an error but an output file is produced we
+       // still would like to output (export/view) the file.
 
        // What files do we have to delete?
 
@@ -142,6 +147,9 @@ void LaTeX::deleteFilesOnError() const
        // Also remove the aux file
        FileName const aux(changeExtension(file.absFileName(), ".aux"));
        aux.removeFile();
+
+       // Remove the output file, which is often generated even if error
+       output_file.removeFile();
 }
 
 
@@ -153,6 +161,7 @@ int LaTeX::run(TeXErrors & terr)
        // each time the .tex file changes.
 {
        int scanres = NO_ERRORS;
+       int bscanres = NO_ERRORS;
        unsigned int count = 0; // number of times run
        num_errors = 0; // just to make sure.
        unsigned int const MAX_RUN = 6;
@@ -163,8 +172,6 @@ int LaTeX::run(TeXErrors & terr)
        theBufferList().updateIncludedTeXfiles(FileName::getcwd().absFileName(),
                runparams);
 
-       // Never write the depfile if an error was encountered.
-
        // 0
        // first check if the file dependencies exist:
        //     ->If it does exist
@@ -225,7 +232,8 @@ int LaTeX::run(TeXErrors & terr)
        LYXERR(Debug::LATEX, "Run #" << count);
        message(runMessage(count));
 
-       startscript();
+       int const exit_code = startscript();
+
        scanres = scanLogFile(terr);
        if (scanres & ERROR_RERUN) {
                LYXERR(Debug::LATEX, "Rerunning LaTeX");
@@ -233,11 +241,6 @@ int LaTeX::run(TeXErrors & terr)
                scanres = scanLogFile(terr);
        }
 
-       if (scanres & ERRORS) {
-               deleteFilesOnError();
-               return scanres; // return on error
-       }
-
        vector<AuxInfo> const bibtex_info = scanAuxFiles(aux_file);
        if (!run_bibtex && bibtex_info_old != bibtex_info)
                run_bibtex = true;
@@ -297,13 +300,8 @@ int LaTeX::run(TeXErrors & terr)
                updateBibtexDependencies(head, bibtex_info);
                rerun |= runBibTeX(bibtex_info, runparams);
                FileName const blgfile(changeExtension(file.absFileName(), ".blg"));
-               if (blgfile.exists()) {
-                       int bscanres = scanBlgFile(head, terr);
-                       if (bscanres & ERRORS) {
-                               deleteFilesOnError();
-                               return bscanres; // return on error
-                       }
-               }
+               if (blgfile.exists())
+                       bscanres = scanBlgFile(head, terr);
        } else if (!had_depfile) {
                /// If we run pdflatex on the file after running latex on it,
                /// then we do not need to run bibtex, but we do need to
@@ -331,10 +329,6 @@ int LaTeX::run(TeXErrors & terr)
                message(runMessage(count));
                startscript();
                scanres = scanLogFile(terr);
-               if (scanres & ERRORS) {
-                       deleteFilesOnError();
-                       return scanres; // return on error
-               }
 
                // update the depedencies
                deplog(head); // reads the latex log
@@ -357,13 +351,8 @@ int LaTeX::run(TeXErrors & terr)
                updateBibtexDependencies(head, bibtex_info);
                rerun |= runBibTeX(bibtex_info, runparams);
                FileName const blgfile(changeExtension(file.absFileName(), ".blg"));
-               if (blgfile.exists()) {
-                       int bscanres = scanBlgFile(head, terr);
-                       if (bscanres & ERRORS) {
-                               deleteFilesOnError();
-                               return bscanres; // return on error
-                       }
-               }
+               if (blgfile.exists())
+                       bscanres = scanBlgFile(head, terr);
        }
 
        // 4
@@ -410,10 +399,6 @@ int LaTeX::run(TeXErrors & terr)
                message(runMessage(count));
                startscript();
                scanres = scanLogFile(terr);
-               if (scanres & ERRORS) {
-                       deleteFilesOnError();
-                       return scanres; // return on error
-               }
 
                // keep this updated
                head.update();
@@ -421,7 +406,15 @@ int LaTeX::run(TeXErrors & terr)
 
        // Write the dependencies to file.
        head.write(depfile);
+
+       if (exit_code)
+               scanres |= NONZERO_ERROR;
+
        LYXERR(Debug::LATEX, "Done.");
+
+       if (bscanres & ERRORS)
+               return bscanres; // return on error
+
        return scanres;
 }
 
@@ -433,7 +426,7 @@ int LaTeX::startscript()
                     + quoteName(onlyFileName(file.toFilesystemEncoding()))
                     + " > " + os::nulldev();
        Systemcall one;
-       return one.startscript(Systemcall::Wait, tmp, path);
+       return one.startscript(Systemcall::Wait, tmp, path, lpath);
 }
 
 
@@ -460,7 +453,7 @@ bool LaTeX::runMakeIndex(string const & f, OutputParams const & runparams,
        tmp += quoteName(f);
        tmp += params;
        Systemcall one;
-       one.startscript(Systemcall::Wait, tmp, path);
+       one.startscript(Systemcall::Wait, tmp, path, lpath);
        return true;
 }
 
@@ -476,7 +469,7 @@ bool LaTeX::runMakeIndexNomencl(FileName const & file,
        tmp += " -o "
                + onlyFileName(changeExtension(file.toFilesystemEncoding(), nls));
        Systemcall one;
-       one.startscript(Systemcall::Wait, tmp, path);
+       one.startscript(Systemcall::Wait, tmp, path, lpath);
        return true;
 }
 
@@ -616,7 +609,7 @@ bool LaTeX::runBibTeX(vector<AuxInfo> const & bibtex_info,
                tmp += quoteName(onlyFileName(removeExtension(
                                it->aux_file.absFileName())));
                Systemcall one;
-               one.startscript(Systemcall::Wait, tmp, path);
+               one.startscript(Systemcall::Wait, tmp, path, lpath);
        }
        // Return whether bibtex was run
        return result;
@@ -666,8 +659,8 @@ int LaTeX::scanLogFile(TeXErrors & terr)
                                size_t len = j == string::npos
                                                ? token.substr(i + 1).length()
                                                : j - i - 1;
-                               if (regex_match(token.substr(i + 1, len),
-                                                       sub, child_file)) {
+                               string const substr = token.substr(i + 1, len);
+                               if (regex_match(substr, sub, child_file)) {
                                        string const name = sub.str(1);
                                        child.push(make_pair(name, pnest));
                                        i += len;
@@ -809,7 +802,10 @@ int LaTeX::scanLogFile(TeXErrors & terr)
                                if (!getline(ifs, tmp))
                                        break;
                                tmp = rtrim(tmp, "\r");
-                               if (++count > 10)
+                               // 15 is somewhat arbitrarily chosen, based on practice.
+                               // We used 10 for 14 years and increased it to 15 when we
+                               // saw one case.
+                               if (++count > 15)
                                        break;
                        } while (!prefixIs(tmp, "l."));
                        if (prefixIs(tmp, "l.")) {