]> git.lyx.org Git - lyx.git/blobdiff - src/LaTeX.cpp
Fix bug #6367: Screen jumps around when using undo/redo
[lyx.git] / src / LaTeX.cpp
index abb8885fecf84f0df12c771f277a85670ab1c9ee..035e0f5438cf875efed4ea87038f8782c42ade96 100644 (file)
@@ -93,8 +93,8 @@ bool operator!=(AuxInfo const & a, AuxInfo const & o)
  */
 
 LaTeX::LaTeX(string const & latex, OutputParams const & rp,
-            FileName const & f)
-       : cmd(latex), file(f), runparams(rp)
+            FileName const & f, string const & p)
+       : cmd(latex), file(f), path(p), runparams(rp)
 {
        num_errors = 0;
        if (prefixIs(cmd, "pdf")) { // Do we use pdflatex ?
@@ -279,7 +279,7 @@ int LaTeX::run(TeXErrors & terr)
        // biber writes no info to the aux file, so we just check
        // if a bcf file exists (and if it was updated)
        FileName const bcffile(changeExtension(file.absFileName(), ".bcf"));
-       bool const biber = head.exist(bcffile);
+       biber |= head.exist(bcffile);
 
        // run bibtex
        // if (scanres & UNDEF_CIT || scanres & RERUN || run_bibtex)
@@ -290,8 +290,8 @@ int LaTeX::run(TeXErrors & terr)
                // no checks for now
                LYXERR(Debug::LATEX, "Running BibTeX.");
                message(_("Running BibTeX."));
-               updateBibtexDependencies(head, bibtex_info, biber);
-               rerun |= runBibTeX(bibtex_info, runparams, biber);
+               updateBibtexDependencies(head, bibtex_info);
+               rerun |= runBibTeX(bibtex_info, runparams);
                if (biber) {
                        // since biber writes no info to the aux file, we have
                        // to parse the blg file (which only exists after biber
@@ -304,7 +304,7 @@ int LaTeX::run(TeXErrors & terr)
                /// 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
                /// insert the .bib and .bst files into the .dep-pdf file.
-               updateBibtexDependencies(head, bibtex_info, biber);
+               updateBibtexDependencies(head, bibtex_info);
        }
 
        // 2
@@ -350,8 +350,8 @@ int LaTeX::run(TeXErrors & terr)
                // no checks for now
                LYXERR(Debug::LATEX, "Running BibTeX.");
                message(_("Running BibTeX."));
-               updateBibtexDependencies(head, bibtex_info, biber);
-               rerun |= runBibTeX(bibtex_info, runparams, biber);
+               updateBibtexDependencies(head, bibtex_info);
+               rerun |= runBibTeX(bibtex_info, runparams);
        }
 
        // 4
@@ -421,7 +421,7 @@ int LaTeX::startscript()
                     + quoteName(onlyFileName(file.toFilesystemEncoding()))
                     + " > " + os::nulldev();
        Systemcall one;
-       return one.startscript(Systemcall::Wait, tmp);
+       return one.startscript(Systemcall::Wait, tmp, path);
 }
 
 
@@ -448,7 +448,7 @@ bool LaTeX::runMakeIndex(string const & f, OutputParams const & runparams,
        tmp += quoteName(f);
        tmp += params;
        Systemcall one;
-       one.startscript(Systemcall::Wait, tmp);
+       one.startscript(Systemcall::Wait, tmp, path);
        return true;
 }
 
@@ -464,7 +464,7 @@ bool LaTeX::runMakeIndexNomencl(FileName const & file,
        tmp += " -o "
                + onlyFileName(changeExtension(file.toFilesystemEncoding(), nls));
        Systemcall one;
-       one.startscript(Systemcall::Wait, tmp);
+       one.startscript(Systemcall::Wait, tmp, path);
        return true;
 }
 
@@ -550,8 +550,7 @@ void LaTeX::scanAuxFile(FileName const & file, AuxInfo & aux_info)
 
 
 void LaTeX::updateBibtexDependencies(DepTable & dep,
-                                    vector<AuxInfo> const & bibtex_info,
-                                    bool biber)
+                                    vector<AuxInfo> const & bibtex_info)
 {
        // Since a run of Bibtex mandates more latex runs it is ok to
        // remove all ".bib" and ".bst" files.
@@ -585,7 +584,7 @@ void LaTeX::updateBibtexDependencies(DepTable & dep,
 
 
 bool LaTeX::runBibTeX(vector<AuxInfo> const & bibtex_info,
-                     OutputParams const & runparams, bool biber)
+                     OutputParams const & runparams)
 {
        bool result = false;
        for (vector<AuxInfo>::const_iterator it = bibtex_info.begin();
@@ -604,7 +603,7 @@ bool LaTeX::runBibTeX(vector<AuxInfo> const & bibtex_info,
                tmp += quoteName(onlyFileName(removeExtension(
                                it->aux_file.absFileName())));
                Systemcall one;
-               one.startscript(Systemcall::Wait, tmp);
+               one.startscript(Systemcall::Wait, tmp, path);
        }
        // Return whether bibtex was run
        return result;
@@ -708,6 +707,9 @@ int LaTeX::scanLogFile(TeXErrors & terr)
                                }
                        } else if (contains(token, "run BibTeX")) {
                                retval |= UNDEF_CIT;
+                       } else if (contains(token, "run Biber")) {
+                               retval |= UNDEF_CIT;
+                               biber = true;
                        } else if (contains(token, "Rerun LaTeX") ||
                                   contains(token, "Please rerun LaTeX") ||
                                   contains(token, "Rerun to get")) {
@@ -745,11 +747,24 @@ int LaTeX::scanLogFile(TeXErrors & terr)
                        if (contains(token, "LaTeX Error:"))
                                retval |= LATEX_ERROR;
 
-                       // bug 6445. At this point its not clear we finish with error.
                        if (prefixIs(token, "! File ended while scanning")){
-                               wait_for_error = desc;
-                               continue;
+                               if (prefixIs(token, "! File ended while scanning use of \\Hy@setref@link.")){
+                                       // bug 7344. We must rerun LaTeX if hyperref has been toggled.
+                                       retval |= ERROR_RERUN;
+                                       LYXERR(Debug::LATEX, "Force rerun.");
+                               } else {
+                                       // bug 6445. At this point its not clear we finish with error.
+                                       wait_for_error = desc;
+                                       continue;
+                               }
                        }
+
+                       if (prefixIs(token, "! Paragraph ended before \\Hy@setref@link was complete.")){
+                                       // bug 7344. We must rerun LaTeX if hyperref has been toggled.
+                                       retval |= ERROR_RERUN;
+                                       LYXERR(Debug::LATEX, "Force rerun.");
+                       }
+
                        if (!wait_for_error.empty() && prefixIs(token, "! Emergency stop.")){
                                retval |= LATEX_ERROR;
                                string errstr;
@@ -1033,6 +1048,10 @@ void LaTeX::deplog(DepTable & head)
                        continue;
                }
 
+               // FIXME UNICODE: We assume that the file names in the log
+               // file are in the file system encoding.
+               token = to_utf8(from_filesystem8bit(token));
+
                // Sometimes, filenames are broken across lines.
                // We care for that and save suspicious lines.
                // Here we exclude some cases where we are sure
@@ -1062,10 +1081,6 @@ void LaTeX::deplog(DepTable & head)
 
                smatch sub;
 
-               // FIXME UNICODE: We assume that the file names in the log
-               // file are in the file system encoding.
-               token = to_utf8(from_filesystem8bit(token));
-
                // (1) "File: file.ext"
                if (regex_match(token, sub, reg1)) {
                        // check for dot
@@ -1181,7 +1196,7 @@ void LaTeX::scanBlgFile(DepTable & dep)
 
        ifstream ifs(blg_file.toFilesystemEncoding().c_str());
        string token;
-       static regex const reg1(".*Found bibtex data file '([^']+).*");
+       static regex const reg1(".*Found (bibtex|BibTeX) data (file|source) '([^']+).*");
 
        while (getline(ifs, token)) {
                token = rtrim(token, "\r");
@@ -1190,7 +1205,7 @@ void LaTeX::scanBlgFile(DepTable & dep)
                // in the aux file are in the file system encoding.
                token = to_utf8(from_filesystem8bit(token));
                if (regex_match(token, sub, reg1)) {
-                       string data = sub.str(1);
+                       string data = sub.str(3);
                        if (!data.empty()) {
                                LYXERR(Debug::LATEX, "Found bib file: " << data);
                                handleFoundFile(data, dep);