]> git.lyx.org Git - lyx.git/blobdiff - src/LaTeX.cpp
de.po
[lyx.git] / src / LaTeX.cpp
index f692a2ab5bffc024f8fd9844173ea7bd355e7c43..0144e1cf166cdab2e6890d6ca82652724accf989 100644 (file)
@@ -286,8 +286,8 @@ int LaTeX::run(TeXErrors & terr)
                // onlyFileName() is needed for cygwin
                int const ret = 
                                runMakeIndex(onlyFileName(idxfile.absFileName()), runparams);
-               if (ret)
-                       return ret;
+               if (ret == Systemcall::KILLED)
+                       return Systemcall::KILLED;
                rerun = true;
        }
 
@@ -299,8 +299,8 @@ int LaTeX::run(TeXErrors & terr)
        // FIXME: Sort out the real problem in DepTable.
        if (head.haschanged(nlofile) || (nlofile.exists() && nlofile.isFileEmpty())) {
                int const ret = runMakeIndexNomencl(file, ".nlo", ".nls");
-               if (ret)
-                       return ret;
+               if (ret == Systemcall::KILLED)
+                       return Systemcall::KILLED;
                rerun = true;
        }
 
@@ -329,10 +329,10 @@ int LaTeX::run(TeXErrors & terr)
                LYXERR(Debug::LATEX, "Running BibTeX.");
                message(_("Running BibTeX."));
                updateBibtexDependencies(head, bibtex_info);
-               int exitCode;
-               rerun |= runBibTeX(bibtex_info, runparams, exitCode);
-               if (exitCode)
-                       return exitCode;
+               int exit_code;
+               rerun |= runBibTeX(bibtex_info, runparams, exit_code);
+               if (exit_code == Systemcall::KILLED)
+                       return Systemcall::KILLED;
                FileName const blgfile(changeExtension(file.absFileName(), ".blg"));
                if (blgfile.exists())
                        bscanres = scanBlgFile(head, terr);
@@ -361,8 +361,8 @@ int LaTeX::run(TeXErrors & terr)
                LYXERR(Debug::DEPEND, "Dep. file has changed or rerun requested");
                LYXERR(Debug::LATEX, "Run #" << count);
                message(runMessage(count));
-               int exitCode = startscript();
-               if (exitCode == Systemcall::KILLED)
+               int exit_code = startscript();
+               if (exit_code == Systemcall::KILLED)
                        return Systemcall::KILLED;
                scanres = scanLogFile(terr);
 
@@ -385,10 +385,10 @@ int LaTeX::run(TeXErrors & terr)
                LYXERR(Debug::LATEX, "Running BibTeX.");
                message(_("Running BibTeX."));
                updateBibtexDependencies(head, bibtex_info);
-               int exitCode;
-               rerun |= runBibTeX(bibtex_info, runparams, exitCode);
-               if (exitCode)
-                       return exitCode;
+               int exit_code;
+               rerun |= runBibTeX(bibtex_info, runparams, exit_code);
+               if (exit_code == Systemcall::KILLED)
+                       return Systemcall::KILLED;
                FileName const blgfile(changeExtension(file.absFileName(), ".blg"));
                if (blgfile.exists())
                        bscanres = scanBlgFile(head, terr);
@@ -410,16 +410,16 @@ int LaTeX::run(TeXErrors & terr)
                // onlyFileName() is needed for cygwin
                int const ret = runMakeIndex(onlyFileName(changeExtension(
                                file.absFileName(), ".idx")), runparams);
-               if (ret)
-                       return ret;
+               if (ret == Systemcall::KILLED)
+                       return Systemcall::KILLED;
                rerun = true;
        }
 
-       // I am not pretty sure if need this twice.
+       // MSVC complains that bool |= int is unsafe. Not sure why.
        if (head.haschanged(nlofile))
-               rerun |= runMakeIndexNomencl(file, ".nlo", ".nls");
+               rerun |= (runMakeIndexNomencl(file, ".nlo", ".nls") != 0);
        if (head.haschanged(glofile))
-               rerun |= runMakeIndexNomencl(file, ".glo", ".gls");
+               rerun |= (runMakeIndexNomencl(file, ".glo", ".gls") != 0);
 
        // 5
        // we will only run latex more if the log file asks for it.
@@ -478,21 +478,21 @@ int LaTeX::startscript()
 }
 
 
-int LaTeX::runMakeIndex(string const & f, OutputParams const & runparams,
+int LaTeX::runMakeIndex(string const & f, OutputParams const & rp,
                         string const & params)
 {
-       string tmp = runparams.use_japanese ?
+       string tmp = rp.use_japanese ?
                lyxrc.jindex_command : lyxrc.index_command;
 
-       if (!runparams.index_command.empty())
-               tmp = runparams.index_command;
+       if (!rp.index_command.empty())
+               tmp = rp.index_command;
 
        LYXERR(Debug::LATEX,
                "idx file has been made, running index processor ("
                << tmp << ") on file " << f);
 
-       tmp = subst(tmp, "$$lang", runparams.document_language);
-       if (runparams.use_indices) {
+       tmp = subst(tmp, "$$lang", rp.document_language);
+       if (rp.use_indices) {
                tmp = lyxrc.splitindex_command + " -m " + quoteName(tmp);
                LYXERR(Debug::LATEX,
                "Multiple indices. Using splitindex command: " << tmp);
@@ -507,16 +507,16 @@ int LaTeX::runMakeIndex(string const & f, OutputParams const & runparams,
 }
 
 
-int LaTeX::runMakeIndexNomencl(FileName const & file,
+int LaTeX::runMakeIndexNomencl(FileName const & fname,
                string const & nlo, string const & nls)
 {
        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)));
+       tmp += quoteName(onlyFileName(changeExtension(fname.absFileName(), nlo)));
        tmp += " -o "
-               + onlyFileName(changeExtension(file.toFilesystemEncoding(), nls));
+               + onlyFileName(changeExtension(fname.toFilesystemEncoding(), nls));
        Systemcall one;
        Systemcall::Starttype const starttype = 
                allow_cancel ? Systemcall::WaitLoop : Systemcall::Wait;
@@ -525,7 +525,7 @@ int LaTeX::runMakeIndexNomencl(FileName const & file,
 
 
 vector<AuxInfo> const
-LaTeX::scanAuxFiles(FileName const & file, bool const only_childbibs)
+LaTeX::scanAuxFiles(FileName const & fname, bool const only_childbibs)
 {
        vector<AuxInfo> result;
 
@@ -534,7 +534,7 @@ LaTeX::scanAuxFiles(FileName const & file, bool const only_childbibs)
        if (only_childbibs) {
                for (string const &s: children) {
                        FileName fn =
-                               makeAbsPath(s, file.onlyPath().realPath());
+                               makeAbsPath(s, fname.onlyPath().realPath());
                        fn.changeExtension("aux");
                        if (fn.exists())
                                result.push_back(scanAuxFile(fn));
@@ -542,10 +542,10 @@ LaTeX::scanAuxFiles(FileName const & file, bool const only_childbibs)
                return result;
        }
 
-       result.push_back(scanAuxFile(file));
+       result.push_back(scanAuxFile(fname));
 
        // This is for bibtopic
-       string const basename = removeExtension(file.absFileName());
+       string const basename = removeExtension(fname.absFileName());
        for (int i = 1; i < 1000; ++i) {
                FileName const file2(basename
                        + '.' + convert<string>(i)
@@ -558,20 +558,20 @@ LaTeX::scanAuxFiles(FileName const & file, bool const only_childbibs)
 }
 
 
-AuxInfo const LaTeX::scanAuxFile(FileName const & file)
+AuxInfo const LaTeX::scanAuxFile(FileName const & fname)
 {
        AuxInfo result;
-       result.aux_file = file;
-       scanAuxFile(file, result);
+       result.aux_file = fname;
+       scanAuxFile(fname, result);
        return result;
 }
 
 
-void LaTeX::scanAuxFile(FileName const & file, AuxInfo & aux_info)
+void LaTeX::scanAuxFile(FileName const & fname, AuxInfo & aux_info)
 {
-       LYXERR(Debug::LATEX, "Scanning aux file: " << file);
+       LYXERR(Debug::LATEX, "Scanning aux file: " << fname);
 
-       ifstream ifs(file.toFilesystemEncoding().c_str());
+       ifstream ifs(fname.toFilesystemEncoding().c_str());
        string token;
        static regex const reg1("\\\\citation\\{([^}]+)\\}");
        static regex const reg2("\\\\bibdata\\{([^}]+)\\}");
@@ -654,7 +654,7 @@ void LaTeX::updateBibtexDependencies(DepTable & dep,
 
 
 bool LaTeX::runBibTeX(vector<AuxInfo> const & bibtex_info,
-                     OutputParams const & runparams, int & exit_code)
+                     OutputParams const & rp, int & exit_code)
 {
        bool result = false;
        exit_code = 0;
@@ -664,7 +664,7 @@ bool LaTeX::runBibTeX(vector<AuxInfo> const & bibtex_info,
                        continue;
                result = true;
 
-               string tmp = runparams.bibtex_command;
+               string tmp = rp.bibtex_command;
                tmp += " ";
                // onlyFileName() is needed for cygwin
                tmp += quoteName(onlyFileName(removeExtension(
@@ -697,7 +697,7 @@ int LaTeX::scanLogFile(TeXErrors & terr)
        ifstream ifs(fn.toFilesystemEncoding().c_str());
        bool fle_style = false;
        static regex const file_line_error(".+\\.\\D+:[0-9]+: (.+)");
-       static regex const child_file(".*([0-9]+[A-Za-z]*_.+\\.tex).*");
+       static regex const child_file("[^0-9]*([0-9]+[A-Za-z]*_.+\\.tex).*");
        // Flag for 'File ended while scanning' message.
        // We need to wait for subsequent processing.
        string wait_for_error;
@@ -732,8 +732,12 @@ int LaTeX::scanLogFile(TeXErrors & terr)
                                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));
-                                       children.push_back(name);
+                                       // Sometimes also masters have a name that matches
+                                       // (if their name starts with a number and _)
+                                       if (name != file.onlyFileName()) {
+                                               child.push(make_pair(name, pnest));
+                                               children.push_back(name);
+                                       }
                                        i += len;
                                }
                        } else if (token[i] == ')') {
@@ -874,7 +878,6 @@ int LaTeX::scanLogFile(TeXErrors & terr)
                        }
 
                        // get the next line
-                       string tmp;
                        int count = 0;
                        do {
                                if (!getline(ifs, tmp))
@@ -1117,8 +1120,8 @@ bool completeFilename(string const & ff, DepTable & head)
 }
 
 
-int iterateLine(string const & token, regex const & reg, string const & closing,
-               int fragment_pos, DepTable & head)
+int iterateLine(string const & token, regex const & reg, string const & opening,
+               string const & closing, int fragment_pos, DepTable & head)
 {
        smatch what;
        string::const_iterator first = token.begin();
@@ -1135,6 +1138,15 @@ int iterateLine(string const & token, regex const & reg, string const & closing,
                                // since we had a closing bracket,
                                // do not investigate further
                                fragment = false;
+                       } else if (what.str(2) == opening) {
+                               // if we have another opening bracket,
+                               // we might have a nested file chain
+                               // as is (file.ext (subfile.ext))
+                               fragment = !handleFoundFile(rtrim(what.str(1)), head);
+                               // decrease first position by one in order to
+                               // consider the opening delimiter on next iteration
+                               if (first > token.begin())
+                                       --first;
                        } else
                                // if we have no closing bracket,
                                // try to handle as file nevertheless
@@ -1318,7 +1330,7 @@ void LaTeX::deplog(DepTable & head)
                if (regex_match(token, sub, reg5)) {
                        // search for strings in <...>
                        static regex const reg5_1("<([^>]+)(.)");
-                       fragment_pos = iterateLine(token, reg5_1, ">",
+                       fragment_pos = iterateLine(token, reg5_1, "<", ">",
                                                   fragment_pos, head);
                        fragment = (fragment_pos != -1);
                }
@@ -1331,7 +1343,7 @@ void LaTeX::deplog(DepTable & head)
                if (regex_match(token, sub, reg6)) {
                        // search for strings in (...)
                        static regex const reg6_1("\\(([^()]+)(.)");
-                       fragment_pos = iterateLine(token, reg6_1, ")",
+                       fragment_pos = iterateLine(token, reg6_1, "(", ")",
                                                   fragment_pos, head);
                        fragment = (fragment_pos != -1);
                }
@@ -1386,32 +1398,32 @@ int LaTeX::scanBlgFile(DepTable & dep, TeXErrors & terr)
                         || regex_match(token, sub, bibtexError5)) {
                        retval |= BIBTEX_ERROR;
                        string errstr = N_("BibTeX error: ") + token;
-                       string message;
+                       string msg;
                        if ((prefixIs(token, "while executing---line")
                             || prefixIs(token, "---line ")
                             || prefixIs(token, "*Please notify the BibTeX"))
                            && !prevtoken.empty()) {
                                errstr = N_("BibTeX error: ") + prevtoken;
-                               message = prevtoken + '\n';
+                               msg = prevtoken + '\n';
                        }
-                       message += token;
+                       msg += token;
                        terr.insertError(0,
                                         from_local8bit(errstr),
-                                        from_local8bit(message));
+                                        from_local8bit(msg));
                } else if (regex_match(prevtoken, sub, bibtexError3)) {
                        retval |= BIBTEX_ERROR;
                        string errstr = N_("BibTeX error: ") + prevtoken;
-                       string message = prevtoken + '\n' + token;
+                       string msg = prevtoken + '\n' + token;
                        terr.insertError(0,
                                         from_local8bit(errstr),
-                                        from_local8bit(message));
+                                        from_local8bit(msg));
                } else if (regex_match(token, sub, biberError)) {
                        retval |= BIBTEX_ERROR;
                        string errstr = N_("Biber error: ") + sub.str(2);
-                       string message = token;
+                       string msg = token;
                        terr.insertError(0,
                                         from_local8bit(errstr),
-                                        from_local8bit(message));
+                                        from_local8bit(msg));
                }
                prevtoken = token;
        }