X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLaTeX.cpp;h=49968ffdc8a6884995b4f53ff166c66fe09b7b05;hb=27d580b5c057d565b9b4b50c811f6e1fab7f1246;hp=0750a5f568da57b6355e2a0a708fefd2fb06c435;hpb=f1cba8ff64b369792fd49f5ddf90e8126ab476ac;p=lyx.git diff --git a/src/LaTeX.cpp b/src/LaTeX.cpp index 0750a5f568..49968ffdc8 100644 --- a/src/LaTeX.cpp +++ b/src/LaTeX.cpp @@ -50,7 +50,6 @@ namespace os = support::os; // different way. // - the makeindex style files should be taken care of with // the dependency mechanism. -// - makeindex commandline options should be supported // - somewhere support viewing of bibtex and makeindex log files. // - we should perhaps also scan the bibtex log file @@ -75,16 +74,16 @@ void TeXErrors::insertError(int line, docstring const & error_desc, } -bool operator==(Aux_Info const & a, Aux_Info const & o) +bool operator==(AuxInfo const & a, AuxInfo const & o) { - return a.aux_file == o.aux_file && - a.citations == o.citations && - a.databases == o.databases && - a.styles == o.styles; + return a.aux_file == o.aux_file + && a.citations == o.citations + && a.databases == o.databases + && a.styles == o.styles; } -bool operator!=(Aux_Info const & a, Aux_Info const & o) +bool operator!=(AuxInfo const & a, AuxInfo const & o) { return !(a == o); } @@ -216,7 +215,7 @@ int LaTeX::run(TeXErrors & terr) /// We scan the aux file even when had_depfile = false, /// because we can run pdflatex on the file after running latex on it, /// in which case we will not need to run bibtex again. - vector bibtex_info_old; + vector bibtex_info_old; if (!run_bibtex) bibtex_info_old = scanAuxFiles(aux_file); @@ -237,7 +236,7 @@ int LaTeX::run(TeXErrors & terr) return scanres; // return on error } - vector const bibtex_info = scanAuxFiles(aux_file); + vector const bibtex_info = scanAuxFiles(aux_file); if (!run_bibtex && bibtex_info_old != bibtex_info) run_bibtex = true; @@ -245,7 +244,7 @@ int LaTeX::run(TeXErrors & terr) deplog(head); // reads the latex log head.update(); - // 0.5 + // 1 // At this point we must run external programs if needed. // makeindex will be run if a .idx file changed or was generated. // And if there were undefined citations or changes in references @@ -283,7 +282,7 @@ int LaTeX::run(TeXErrors & terr) LYXERR(Debug::LATEX, "Running BibTeX."); message(_("Running BibTeX.")); updateBibtexDependencies(head, bibtex_info); - rerun |= runBibTeX(bibtex_info); + rerun |= runBibTeX(bibtex_info, runparams); } 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 @@ -291,7 +290,7 @@ int LaTeX::run(TeXErrors & terr) updateBibtexDependencies(head, bibtex_info); } - // 1 + // 2 // we know on this point that latex has been run once (or we just // returned) and the question now is to decide if we need to run // it any more. This is done by asking if any of the files in the @@ -301,7 +300,7 @@ int LaTeX::run(TeXErrors & terr) // run latex once more and // update the dependency structure // -> if not changed: - // we does nothing at this point + // we do nothing at this point // if (rerun || head.sumchange()) { rerun = false; @@ -322,9 +321,24 @@ int LaTeX::run(TeXErrors & terr) } else { LYXERR(Debug::DEPEND, "Dep. file has NOT changed"); } + + // 3 + // rerun bibtex? + // Complex bibliography packages such as Biblatex require + // an additional bibtex cycle sometimes. + if (scanres & UNDEF_CIT) { + // Here we must scan the .aux file and look for + // "\bibdata" and/or "\bibstyle". If one of those + // tags is found -> run bibtex and set rerun = true; + // no checks for now + LYXERR(Debug::LATEX, "Running BibTeX."); + message(_("Running BibTeX.")); + updateBibtexDependencies(head, bibtex_info); + rerun |= runBibTeX(bibtex_info, runparams); + } - // 1.5 - // The inclusion of files generated by external programs like + // 4 + // The inclusion of files generated by external programs such as // makeindex or bibtex might have done changes to pagenumbering, // etc. And because of this we must run the external programs // again to make sure everything is redone correctly. @@ -347,7 +361,7 @@ int LaTeX::run(TeXErrors & terr) if (head.haschanged(glofile)) rerun |= runMakeIndexNomencl(file, ".glo", ".gls"); - // 2 + // 5 // we will only run latex more if the log file asks for it. // or if the sumchange() is true. // -> rerun asked for: @@ -397,11 +411,23 @@ int LaTeX::startscript() bool LaTeX::runMakeIndex(string const & f, OutputParams const & runparams, string const & params) { + string tmp = runparams.use_japanese ? + lyxrc.jindex_command : lyxrc.index_command; + + if (!runparams.index_command.empty()) + tmp = runparams.index_command; + LYXERR(Debug::LATEX, - "idx file has been made, running makeindex on file " << f); - string tmp = lyxrc.index_command + ' '; + "idx file has been made, running index processor (" + << tmp << ") on file " << f); tmp = subst(tmp, "$$lang", runparams.document_language); + if (runparams.use_indices) { + tmp = lyxrc.splitindex_command + " -m " + quoteName(tmp); + LYXERR(Debug::LATEX, + "Multiple indices. Using splitindex command: " << tmp); + } + tmp += ' '; tmp += quoteName(f); tmp += params; Systemcall one; @@ -426,10 +452,10 @@ bool LaTeX::runMakeIndexNomencl(FileName const & file, } -vector const +vector const LaTeX::scanAuxFiles(FileName const & file) { - vector result; + vector result; result.push_back(scanAuxFile(file)); @@ -446,16 +472,16 @@ LaTeX::scanAuxFiles(FileName const & file) } -Aux_Info const LaTeX::scanAuxFile(FileName const & file) +AuxInfo const LaTeX::scanAuxFile(FileName const & file) { - Aux_Info result; + AuxInfo result; result.aux_file = file; scanAuxFile(file, result); return result; } -void LaTeX::scanAuxFile(FileName const & file, Aux_Info & aux_info) +void LaTeX::scanAuxFile(FileName const & file, AuxInfo & aux_info) { LYXERR(Debug::LATEX, "Scanning aux file: " << file); @@ -507,7 +533,7 @@ void LaTeX::scanAuxFile(FileName const & file, Aux_Info & aux_info) void LaTeX::updateBibtexDependencies(DepTable & dep, - vector const & bibtex_info) + vector const & bibtex_info) { // Since a run of Bibtex mandates more latex runs it is ok to // remove all ".bib" and ".bst" files. @@ -515,7 +541,7 @@ void LaTeX::updateBibtexDependencies(DepTable & dep, dep.remove_files_with_extension(".bst"); //string aux = OnlyFilename(ChangeExtension(file, ".aux")); - for (vector::const_iterator it = bibtex_info.begin(); + for (vector::const_iterator it = bibtex_info.begin(); it != bibtex_info.end(); ++it) { for (set::const_iterator it2 = it->databases.begin(); it2 != it->databases.end(); ++it2) { @@ -534,16 +560,22 @@ void LaTeX::updateBibtexDependencies(DepTable & dep, } -bool LaTeX::runBibTeX(vector const & bibtex_info) +bool LaTeX::runBibTeX(vector const & bibtex_info, + OutputParams const & runparams) { bool result = false; - for (vector::const_iterator it = bibtex_info.begin(); + for (vector::const_iterator it = bibtex_info.begin(); it != bibtex_info.end(); ++it) { if (it->databases.empty()) continue; result = true; - string tmp = lyxrc.bibtex_command + " "; + string tmp = runparams.use_japanese ? + lyxrc.jbibtex_command : lyxrc.bibtex_command; + + if (!runparams.bibtex_command.empty()) + tmp = runparams.bibtex_command; + tmp += " "; // onlyFilename() is needed for cygwin tmp += quoteName(onlyFilename(removeExtension( it->aux_file.absFilename()))); @@ -625,6 +657,12 @@ int LaTeX::scanLogFile(TeXErrors & terr) LYXERR(Debug::LATEX, "We should rerun."); retval |= RERUN; } + } else if (prefixIs(token, "LETTRE WARNING:")) { + if (contains(token, "veuillez recompiler")) { + // lettre.cls + LYXERR(Debug::LATEX, "We should rerun."); + retval |= RERUN; + } } else if (token[0] == '(') { if (contains(token, "Rerun LaTeX") || contains(token, "Rerun to get")) { @@ -632,8 +670,10 @@ int LaTeX::scanLogFile(TeXErrors & terr) LYXERR(Debug::LATEX, "We should rerun."); retval |= RERUN; } - } else if (prefixIs(token, "! ") || - fle_style && regex_match(token, sub, file_line_error)) { + } else if (prefixIs(token, "! ") + || (fle_style + && regex_match(token, sub, file_line_error) + && !contains(token, "pdfTeX warning"))) { // Ok, we have something that looks like a TeX Error // but what do we really have. @@ -752,12 +792,13 @@ bool handleFoundFile(string const & ff, DepTable & head) // (1) foundfile is an // absolute path and should // be inserted. - FileName absname(foundfile); - if (absname.isAbsolute()) { + FileName absname; + if (FileName::isAbsolute(foundfile)) { LYXERR(Debug::DEPEND, "AbsolutePath file: " << foundfile); // On initial insert we want to do the update at once // since this file cannot be a file generated by // the latex run. + absname.set(foundfile); if (!insertIfExists(absname, head)) { // check for spaces string strippedfile = foundfile; @@ -986,7 +1027,7 @@ void LaTeX::deplog(DepTable & head) // where "File: file.ext" would be skipped if (regex_match(token, sub, reg6)) { // search for strings in (...) - static regex reg6_1("\\(([^()]+)(.).*"); + static regex reg6_1("\\(([^()]+)(.)"); smatch what; string::const_iterator first = token.begin(); string::const_iterator end = token.end();