]> git.lyx.org Git - lyx.git/blobdiff - src/LaTeX.cpp
fix a crash when the inset containing the new word at cursor is deleted
[lyx.git] / src / LaTeX.cpp
index ac85b41d00d9055cb38d29a1b5e19a447f1597ca..597efefb7cedecc5aa2d1f2754d76d06a860156f 100644 (file)
 #include "support/Systemcall.h"
 #include "support/os.h"
 
-#include <boost/regex.hpp>
+#include "support/regex.h"
 
 #include <fstream>
 
-using boost::regex;
-using boost::smatch;
 
 using namespace std;
 using namespace lyx::support;
@@ -124,6 +122,10 @@ void LaTeX::deleteFilesOnError() const
        FileName const bbl(changeExtension(file.absFileName(), ".bbl"));
        bbl.removeFile();
 
+       // biber file
+       FileName const bcf(changeExtension(file.absFileName(), ".bcf"));
+       bcf.removeFile();
+
        // makeindex file
        FileName const ind(changeExtension(file.absFileName(), ".ind"));
        ind.removeFile();
@@ -205,7 +207,8 @@ int LaTeX::run(TeXErrors & terr)
                        LYXERR(Debug::DEPEND, "Dependency file has changed");
                }
 
-               if (head.extchanged(".bib") || head.extchanged(".bst"))
+               if (head.extchanged(".bib") || head.extchanged(".bst")
+                   || head.extchanged(".bcf"))
                        run_bibtex = true;
        } else
                LYXERR(Debug::DEPEND,
@@ -260,8 +263,8 @@ int LaTeX::run(TeXErrors & terr)
                // no checks for now
                LYXERR(Debug::LATEX, "Running MakeIndex.");
                message(_("Running Index Processor."));
-               // onlyFilename() is needed for cygwin
-               rerun |= runMakeIndex(onlyFilename(idxfile.absFileName()),
+               // onlyFileName() is needed for cygwin
+               rerun |= runMakeIndex(onlyFileName(idxfile.absFileName()),
                                runparams);
        }
        FileName const nlofile(changeExtension(file.absFileName(), ".nlo"));
@@ -271,6 +274,12 @@ int LaTeX::run(TeXErrors & terr)
        if (head.haschanged(glofile))
                rerun |= runMakeIndexNomencl(file, ".glo", ".gls");
 
+       // check if we're using biber instead of bibtex
+       // biber writes no info to the aux file, so we just check
+       // if a bcf file exists (and, above, if it was updated)
+       FileName const bcffile(changeExtension(file.absFileName(), ".bcf"));
+       bool const biber = bcffile.exists();
+
        // run bibtex
        // if (scanres & UNDEF_CIT || scanres & RERUN || run_bibtex)
        if (scanres & UNDEF_CIT || run_bibtex) {
@@ -281,7 +290,7 @@ int LaTeX::run(TeXErrors & terr)
                LYXERR(Debug::LATEX, "Running BibTeX.");
                message(_("Running BibTeX."));
                updateBibtexDependencies(head, bibtex_info);
-               rerun |= runBibTeX(bibtex_info, runparams);
+               rerun |= runBibTeX(bibtex_info, runparams, biber);
        } 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
@@ -333,7 +342,7 @@ int LaTeX::run(TeXErrors & terr)
                LYXERR(Debug::LATEX, "Running BibTeX.");
                message(_("Running BibTeX."));
                updateBibtexDependencies(head, bibtex_info);
-               rerun |= runBibTeX(bibtex_info, runparams);
+               rerun |= runBibTeX(bibtex_info, runparams, biber);
        }
 
        // 4
@@ -349,8 +358,8 @@ int LaTeX::run(TeXErrors & terr)
                // no checks for now
                LYXERR(Debug::LATEX, "Running MakeIndex.");
                message(_("Running Index Processor."));
-               // onlyFilename() is needed for cygwin
-               rerun = runMakeIndex(onlyFilename(changeExtension(
+               // onlyFileName() is needed for cygwin
+               rerun = runMakeIndex(onlyFileName(changeExtension(
                                file.absFileName(), ".idx")), runparams);
        }
 
@@ -398,9 +407,9 @@ int LaTeX::run(TeXErrors & terr)
 
 int LaTeX::startscript()
 {
-       // onlyFilename() is needed for cygwin
+       // onlyFileName() is needed for cygwin
        string tmp = cmd + ' '
-                    + quoteName(onlyFilename(file.toFilesystemEncoding()))
+                    + quoteName(onlyFileName(file.toFilesystemEncoding()))
                     + " > " + os::nulldev();
        Systemcall one;
        return one.startscript(Systemcall::Wait, tmp);
@@ -441,10 +450,10 @@ bool LaTeX::runMakeIndexNomencl(FileName const & file,
        LYXERR(Debug::LATEX, "Running MakeIndex for nomencl.");
        message(_("Running MakeIndex for nomencl."));
        string tmp = lyxrc.nomencl_command + ' ';
-       // onlyFilename() is needed for cygwin
-       tmp += quoteName(onlyFilename(changeExtension(file.absFileName(), nlo)));
+       // onlyFileName() is needed for cygwin
+       tmp += quoteName(onlyFileName(changeExtension(file.absFileName(), nlo)));
        tmp += " -o "
-               + onlyFilename(changeExtension(file.toFilesystemEncoding(), nls));
+               + onlyFileName(changeExtension(file.toFilesystemEncoding(), nls));
        Systemcall one;
        one.startscript(Systemcall::Wait, tmp);
        return true;
@@ -538,7 +547,7 @@ void LaTeX::updateBibtexDependencies(DepTable & dep,
        // remove all ".bib" and ".bst" files.
        dep.remove_files_with_extension(".bib");
        dep.remove_files_with_extension(".bst");
-       //string aux = OnlyFilename(ChangeExtension(file, ".aux"));
+       //string aux = OnlyFileName(ChangeExtension(file, ".aux"));
 
        for (vector<AuxInfo>::const_iterator it = bibtex_info.begin();
             it != bibtex_info.end(); ++it) {
@@ -560,12 +569,12 @@ void LaTeX::updateBibtexDependencies(DepTable & dep,
 
 
 bool LaTeX::runBibTeX(vector<AuxInfo> const & bibtex_info,
-                     OutputParams const & runparams)
+                     OutputParams const & runparams, bool biber)
 {
        bool result = false;
        for (vector<AuxInfo>::const_iterator it = bibtex_info.begin();
             it != bibtex_info.end(); ++it) {
-               if (it->databases.empty())
+               if (!biber && it->databases.empty())
                        continue;
                result = true;
 
@@ -575,8 +584,8 @@ bool LaTeX::runBibTeX(vector<AuxInfo> const & bibtex_info,
                if (!runparams.bibtex_command.empty())
                        tmp = runparams.bibtex_command;
                tmp += " ";
-               // onlyFilename() is needed for cygwin
-               tmp += quoteName(onlyFilename(removeExtension(
+               // onlyFileName() is needed for cygwin
+               tmp += quoteName(onlyFileName(removeExtension(
                                it->aux_file.absFileName())));
                Systemcall one;
                one.startscript(Systemcall::Wait, tmp);
@@ -592,7 +601,7 @@ int LaTeX::scanLogFile(TeXErrors & terr)
        int line_count = 1;
        int retval = NO_ERRORS;
        string tmp =
-               onlyFilename(changeExtension(file.absFileName(), ".log"));
+               onlyFileName(changeExtension(file.absFileName(), ".log"));
        LYXERR(Debug::LATEX, "Log file: " << tmp);
        FileName const fn = FileName(makeAbsPath(tmp));
        ifstream ifs(fn.toFilesystemEncoding().c_str());
@@ -635,6 +644,10 @@ int LaTeX::scanLogFile(TeXErrors & terr)
                                   && contains(token, "undefined")) {
                                retval |= ERROR_RERUN;
                                LYXERR(Debug::LATEX, "Force rerun.");
+                       // package etaremune
+                       } else if (contains(token, "Etaremune labels have changed")) {
+                               retval |= ERROR_RERUN;
+                               LYXERR(Debug::LATEX, "Force rerun.");
                        } else if (contains(token, "Citation")
                                   && contains(token, "on page")
                                   && contains(token, "undefined")) {
@@ -653,6 +666,7 @@ int LaTeX::scanLogFile(TeXErrors & terr)
                        } else if (contains(token, "run BibTeX")) {
                                retval |= UNDEF_CIT;
                        } else if (contains(token, "Rerun LaTeX") ||
+                                  contains(token, "Please rerun LaTeX") ||
                                   contains(token, "Rerun to get")) {
                                // at least longtable.sty and bibtopic.sty
                                // might use this.
@@ -853,7 +867,7 @@ bool handleFoundFile(string const & ff, DepTable & head)
                }
        }
 
-       string onlyfile = onlyFilename(foundfile);
+       string onlyfile = onlyFileName(foundfile);
        absname = makeAbsPath(onlyfile);
 
        // check for spaces
@@ -873,7 +887,7 @@ bool handleFoundFile(string const & ff, DepTable & head)
                        string const stripoff =
                                rsplit(foundfile, strippedfile, ' ');
                        foundfile = strippedfile;
-                       onlyfile = onlyFilename(strippedfile);
+                       onlyfile = onlyFileName(strippedfile);
                        absname = makeAbsPath(onlyfile);
                }
        }
@@ -924,7 +938,7 @@ void LaTeX::deplog(DepTable & head)
        // entered into the dependency file.
 
        string const logfile =
-               onlyFilename(changeExtension(file.absFileName(), ".log"));
+               onlyFileName(changeExtension(file.absFileName(), ".log"));
 
        static regex const reg1("File: (.+).*");
        static regex const reg2("No file (.+)(.).*");
@@ -952,7 +966,7 @@ void LaTeX::deplog(DepTable & head)
        string lastline;
        while (ifs) {
                // Ok, the scanning of files here is not sufficient.
-               // Sometimes files are named by "File: xxx" only
+               // Sometimes files are named by "File:� xxx" only
                // So I think we should use some regexps to find files instead.
                // Note: all file names and paths might contains spaces.
                bool found_file = false;
@@ -1009,7 +1023,7 @@ void LaTeX::deplog(DepTable & head)
                        // However, ...
                        if (suffixIs(token, ")"))
                                // no line break for sure
-                               // pretend we've been succesfully searching
+                               // pretend we've been successfully searching
                                found_file = true;
                // (2) "No file file.ext"
                } else if (regex_match(token, sub, reg2)) {
@@ -1046,11 +1060,11 @@ void LaTeX::deplog(DepTable & head)
                        found_file = checkLineBreak(sub.str(1), head);
                // (7) "\tf@toc=\write<nr>" (for MikTeX)
                else if (regex_match(token, sub, miktexTocReg))
-                       found_file = handleFoundFile(onlyFilename(changeExtension(
+                       found_file = handleFoundFile(onlyFileName(changeExtension(
                                                file.absFileName(), ".toc")), head);
                else
                        // not found, but we won't check further
-                       // pretend we've been succesfully searching
+                       // pretend we've been successfully searching
                        found_file = true;
 
                // (8) "(file.ext"
@@ -1089,7 +1103,7 @@ void LaTeX::deplog(DepTable & head)
                                        // we have a closing bracket, so the content
                                        // is not a file name.
                                        // no need to investigate further
-                                       // pretend we've been succesfully searching
+                                       // pretend we've been successfully searching
                                        first = what[0].second;
                                        found_file = true;
                                }