]> git.lyx.org Git - lyx.git/blobdiff - src/LaTeX.cpp
Use move when passed by value
[lyx.git] / src / LaTeX.cpp
index ba13b22c22fb006974dbf13e7354bbf0eca6b9d2..cfa6e1d3f96d7daf691f4da19425c140b47550cc 100644 (file)
@@ -92,11 +92,18 @@ bool operator!=(AuxInfo const & a, AuxInfo const & o)
  */
 
 LaTeX::LaTeX(string const & latex, OutputParams const & rp,
-            FileName const & f, string const & p, bool const clean_start)
-       : 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 ?
+       // lualatex can still produce a DVI with --output-format=dvi. However,
+       // we do not use that internally (we use the "dvilualatex" command) so
+       // it would only happen from a custom converter. Thus, it is better to
+       // guess that lualatex produces a PDF than to guess a DVI.
+       // FIXME we should base the extension on the output format, which we should
+       // get in a robust way, e.g. from the converter.
+       if (prefixIs(cmd, "pdf") || prefixIs(cmd, "lualatex") || prefixIs(cmd, "xelatex")) {
                depfile = FileName(file.absFileName() + ".dep-pdf");
                output_file =
                        FileName(changeExtension(file.absFileName(), ".pdf"));
@@ -147,6 +154,10 @@ void LaTeX::removeAuxiliaryFiles() const
        FileName const aux(changeExtension(file.absFileName(), ".aux"));
        aux.removeFile();
 
+       // Also remove the .out file (e.g. hyperref bookmarks) (#9963)
+       FileName const out(changeExtension(file.absFileName(), ".out"));
+       out.removeFile();
+
        // Remove the output file, which is often generated even if error
        output_file.removeFile();
 }
@@ -231,12 +242,13 @@ int LaTeX::run(TeXErrors & terr)
        LYXERR(Debug::LATEX, "Run #" << count);
        message(runMessage(count));
 
-       int const exit_code = startscript();
+       int exit_code = startscript();
 
        scanres = scanLogFile(terr);
        if (scanres & ERROR_RERUN) {
                LYXERR(Debug::LATEX, "Rerunning LaTeX");
-               startscript();
+               terr.clearErrors();
+               exit_code = startscript();
                scanres = scanLogFile(terr);
        }
 
@@ -406,18 +418,12 @@ int LaTeX::run(TeXErrors & terr)
        // Write the dependencies to file.
        head.write(depfile);
 
-       if (scanres & NO_OUTPUT) {
-               // A previous run could have left a PDF and since
-               // no PDF is created if NO_OUTPUT, we remove any
-               // existing PDF and temporary files so that an
-               // incorrect PDF is not displayed, which could otherwise
-               // happen if View is run again because the checksum will
-               // be the same so any lingering PDF will be viewed.
-               removeAuxiliaryFiles();
-       }
-
-       if (exit_code)
+       if (exit_code) {
+               // add flag here, just before return, instead of when exit_code
+               // is defined because scanres is sometimes overwritten above
+               // (e.g. rerun)
                scanres |= NONZERO_ERROR;
+       }
 
        LYXERR(Debug::LATEX, "Done.");
 
@@ -435,7 +441,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);
 }
 
 
@@ -462,7 +468,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;
 }
 
@@ -478,7 +484,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;
 }
 
@@ -618,7 +624,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;
@@ -878,20 +884,29 @@ int LaTeX::scanLogFile(TeXErrors & terr)
                        } else if (contains(token, "Rerun to get citations")) {
                                // Natbib seems to use this.
                                retval |= UNDEF_CIT;
-                       } else if (contains(token, "No pages of output")) {
-                               // A dvi file was not created
+                       } else if (contains(token, "No pages of output")
+                               || contains(token, "no pages of output")) {
+                               // No output file (e.g. the DVI or PDF) was created
                                retval |= NO_OUTPUT;
                        } else if (contains(token, "That makes 100 errors")) {
                                // More than 100 errors were reprted
                                retval |= TOO_MANY_ERRORS;
-                       } else if (prefixIs(token, "!pdfTeX error:")){
+                       } else if (prefixIs(token, "!pdfTeX error:")) {
                                // otherwise we dont catch e.g.:
                                // !pdfTeX error: pdflatex (file feyn10): Font feyn10 at 600 not found
                                retval |= ERRORS;
-                                       terr.insertError(0,
-                                                        from_local8bit("pdfTeX Error"),
-                                                        from_local8bit(token),
-                                                        child_name);
+                               terr.insertError(0,
+                                                from_local8bit("pdfTeX Error"),
+                                                from_local8bit(token),
+                                                child_name);
+                       } else if (prefixIs(token, "Missing character: There is no ")) {
+                               // XeTeX/LuaTeX error about missing glyph in selected font
+                               // (bug 9610)
+                               retval |= LATEX_ERROR;
+                               terr.insertError(0,
+                                                from_local8bit("Missing glyphs!"),
+                                                from_local8bit(token),
+                                                child_name);
                        }
                }
        }
@@ -947,8 +962,7 @@ bool handleFoundFile(string const & ff, DepTable & head)
                                        return true;
                                // strip off part after last space and try again
                                string tmp = strippedfile;
-                               string const stripoff =
-                                       rsplit(tmp, strippedfile, ' ');
+                               rsplit(tmp, strippedfile, ' ');
                                absname.set(strippedfile);
                                if (insertIfExists(absname, head))
                                        return true;
@@ -973,8 +987,7 @@ bool handleFoundFile(string const & ff, DepTable & head)
                                break;
                        // strip off part after last space and try again
                        string strippedfile;
-                       string const stripoff =
-                               rsplit(foundfile, strippedfile, ' ');
+                       rsplit(foundfile, strippedfile, ' ');
                        foundfile = strippedfile;
                        onlyfile = onlyFileName(strippedfile);
                        absname = makeAbsPath(onlyfile);