X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLaTeX.cpp;h=f5b6d20d3029f42add5f1207e9e3f6195c542f9b;hb=89d9334e03c311a4a7585f40ad81880304d174d4;hp=5333c7fbae84a0dd81348a9f787533a0f1aca853;hpb=bb277747d2fc128d65edb55662d075ce44100bc7;p=lyx.git diff --git a/src/LaTeX.cpp b/src/LaTeX.cpp index 5333c7fbae..f5b6d20d30 100644 --- a/src/LaTeX.cpp +++ b/src/LaTeX.cpp @@ -23,6 +23,7 @@ #include "LyX.h" #include "DepTable.h" #include "Encoding.h" +#include "Language.h" #include "support/debug.h" #include "support/convert.h" @@ -238,7 +239,7 @@ int LaTeX::run(TeXErrors & terr) // Also remove all children which are included Buffer const * buf = theBufferList().getBufferFromTmp(file.absFileName()); if (buf && buf->params().maintain_unincluded_children == BufferParams::CM_Mostly) { - for (auto const incfile : buf->params().getIncludedChildren()) { + for (auto const & incfile : buf->params().getIncludedChildren()) { string const incm = DocFileName(changeExtension(makeAbsPath(incfile, path) .absFileName(), ".tex")).mangledFileName(); @@ -281,16 +282,16 @@ int LaTeX::run(TeXErrors & terr) message(runMessage(count)); int exit_code = startscript(); - if (exit_code == Systemcall::KILLED) - return Systemcall::KILLED; + if (exit_code == Systemcall::KILLED || exit_code == Systemcall::TIMEOUT) + return exit_code; scanres = scanLogFile(terr); if (scanres & ERROR_RERUN) { LYXERR(Debug::LATEX, "Rerunning LaTeX"); terr.clearErrors(); exit_code = startscript(); - if (exit_code == Systemcall::KILLED) - return Systemcall::KILLED; + if (exit_code == Systemcall::KILLED || exit_code == Systemcall::TIMEOUT) + return exit_code; scanres = scanLogFile(terr); } @@ -322,8 +323,8 @@ int LaTeX::run(TeXErrors & terr) // onlyFileName() is needed for cygwin int const ret = runMakeIndex(onlyFileName(idxfile.absFileName()), runparams); - if (ret == Systemcall::KILLED) - return Systemcall::KILLED; + if (ret == Systemcall::KILLED || ret == Systemcall::TIMEOUT) + return ret; FileName const ilgfile(changeExtension(file.absFileName(), ".ilg")); if (ilgfile.exists()) iscanres = scanIlgFile(terr); @@ -338,8 +339,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 == Systemcall::KILLED) - return Systemcall::KILLED; + if (ret == Systemcall::KILLED || ret == Systemcall::TIMEOUT) + return ret; rerun = true; } @@ -375,8 +376,8 @@ int LaTeX::run(TeXErrors & terr) updateBibtexDependencies(head, bibtex_info); int exit_code; rerun |= runBibTeX(bibtex_info, runparams, exit_code); - if (exit_code == Systemcall::KILLED) - return Systemcall::KILLED; + if (exit_code == Systemcall::KILLED || exit_code == Systemcall::TIMEOUT) + return exit_code; FileName const blgfile(changeExtension(file.absFileName(), ".blg")); if (blgfile.exists()) bscanres = scanBlgFile(head, terr); @@ -406,8 +407,8 @@ int LaTeX::run(TeXErrors & terr) LYXERR(Debug::LATEX, "Run #" << count); message(runMessage(count)); int exit_code = startscript(); - if (exit_code == Systemcall::KILLED) - return Systemcall::KILLED; + if (exit_code == Systemcall::KILLED || exit_code == Systemcall::TIMEOUT) + return exit_code; scanres = scanLogFile(terr); // update the depedencies @@ -436,8 +437,8 @@ int LaTeX::run(TeXErrors & terr) updateBibtexDependencies(head, bibtex_info); int exit_code; rerun |= runBibTeX(bibtex_info, runparams, exit_code); - if (exit_code == Systemcall::KILLED) - return Systemcall::KILLED; + if (exit_code == Systemcall::KILLED || exit_code == Systemcall::TIMEOUT) + return exit_code; FileName const blgfile(changeExtension(file.absFileName(), ".blg")); if (blgfile.exists()) bscanres = scanBlgFile(head, terr); @@ -459,8 +460,8 @@ int LaTeX::run(TeXErrors & terr) // onlyFileName() is needed for cygwin int const ret = runMakeIndex(onlyFileName(changeExtension( file.absFileName(), ".idx")), runparams); - if (ret == Systemcall::KILLED) - return Systemcall::KILLED; + if (ret == Systemcall::KILLED || ret == Systemcall::TIMEOUT) + return ret; FileName const ilgfile(changeExtension(file.absFileName(), ".ilg")); if (ilgfile.exists()) iscanres = scanIlgFile(terr); @@ -541,13 +542,15 @@ int LaTeX::runMakeIndex(string const & f, OutputParams const & rp, if (!rp.index_command.empty()) tmp = rp.index_command; + + Language const * doc_lang = languages.getLanguage(rp.document_language); if (contains(tmp, "$$x")) { // This adds appropriate [te]xindy options // such as language and codepage (for the // main document language/encoding) as well // as input markup (latex or xelatex) - string xdyopts = rp.xindy_language; + string xdyopts = doc_lang ? doc_lang->xindy() : string(); if (!xdyopts.empty()) xdyopts = "-L " + xdyopts; if (rp.isFullUnicode() && rp.encoding->package() == Encoding::none) { @@ -580,7 +583,10 @@ int LaTeX::runMakeIndex(string const & f, OutputParams const & rp, "idx file has been made, running index processor (" << tmp << ") on file " << f); - tmp = subst(tmp, "$$lang", rp.document_language); + if (doc_lang) { + tmp = subst(tmp, "$$lang", doc_lang->babel()); + tmp = subst(tmp, "$$lcode", doc_lang->code()); + } if (rp.use_indices) { tmp = lyxrc.splitindex_command + " -m " + quoteName(tmp); LYXERR(Debug::LATEX, @@ -1051,10 +1057,15 @@ int LaTeX::scanLogFile(TeXErrors & terr) // get the next line int count = 0; + // We also collect intermediate lines + // This is needed for errors in preamble + string intermediate; do { if (!getline(ifs, tmp)) break; tmp = rtrim(tmp, "\r"); + if (!prefixIs(tmp, "l.")) + intermediate += tmp; // 15 is somewhat arbitrarily chosen, based on practice. // We used 10 for 14 years and increased it to 15 when we // saw one case. @@ -1076,6 +1087,15 @@ int LaTeX::scanLogFile(TeXErrors & terr) sscanf(tmp.c_str(), "l.%d", &line); // get the rest of the message: string errstr(tmp, tmp.find(' ')); + bool preamble_error = false; + if (suffixIs(errstr, "\\begin{document}")) { + // this is an error in preamble + // the real error is in the + // intermediate lines + errstr = intermediate; + tmp = intermediate; + preamble_error = true; + } errstr += '\n'; getline(ifs, tmp); tmp = rtrim(tmp, "\r"); @@ -1088,6 +1108,9 @@ int LaTeX::scanLogFile(TeXErrors & terr) getline(ifs, tmp); tmp = rtrim(tmp, "\r"); } + if (preamble_error) + // Add a note that the error is to be found in preamble + errstr += "\n" + to_utf8(_("(NOTE: The erroneous command is in the preamble)")); LYXERR(Debug::LATEX, "line: " << line << '\n' << "Desc: " << desc << '\n' << "Text: " << errstr); if (line == last_line)