X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLaTeX.cpp;h=ce3d73eef2171ade4a6208e7ec64f3f7c2d00526;hb=110445e3e2fe9beab1c38d2806cfd126dae967a9;hp=5333c7fbae84a0dd81348a9f787533a0f1aca853;hpb=bb277747d2fc128d65edb55662d075ce44100bc7;p=lyx.git diff --git a/src/LaTeX.cpp b/src/LaTeX.cpp index 5333c7fbae..ce3d73eef2 100644 --- a/src/LaTeX.cpp +++ b/src/LaTeX.cpp @@ -15,16 +15,19 @@ #include +#include "LaTeX.h" + #include "Buffer.h" #include "BufferList.h" #include "BufferParams.h" -#include "LaTeX.h" #include "LyXRC.h" #include "LyX.h" #include "DepTable.h" #include "Encoding.h" +#include "Language.h" #include "support/debug.h" +#include "support/docstring.h" #include "support/convert.h" #include "support/FileName.h" #include "support/filetools.h" @@ -33,9 +36,8 @@ #include "support/Systemcall.h" #include "support/os.h" -#include "support/regex.h" - #include +#include #include @@ -133,6 +135,7 @@ LaTeX::LaTeX(string const & latex, OutputParams const & rp, void LaTeX::removeAuxiliaryFiles() const { + LYXERR(Debug::LATEX, "Removing auxiliary files"); // Note that we do not always call this function when there is an error. // For example, if there is an error but an output file is produced we // still would like to output (export/view) the file. @@ -238,7 +241,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 +284,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 +325,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 +341,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 +378,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 +409,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 +439,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 +462,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 +544,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 +585,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, @@ -760,7 +768,7 @@ bool LaTeX::runBibTeX(vector const & bibtex_info, it->aux_file.absFileName()))); Systemcall one; Systemcall::Starttype const starttype = - allow_cancel ? Systemcall::WaitLoop : Systemcall::Wait; + allow_cancel ? Systemcall::WaitLoop : Systemcall::Wait; exit_code = one.startscript(starttype, tmp, path, lpath, true); if (exit_code) { return result; @@ -787,7 +795,7 @@ int LaTeX::scanLogFile(TeXErrors & terr) string tmp = onlyFileName(changeExtension(file.absFileName(), ".log")); LYXERR(Debug::LATEX, "Log file: " << tmp); - FileName const fn = FileName(makeAbsPath(tmp)); + FileName const fn = makeAbsPath(tmp); // FIXME we should use an ifdocstream here and a docstring for token // below. The encoding of the log file depends on the _output_ (font) // encoding of the TeX file (T1, TU etc.). See #10728. @@ -1051,10 +1059,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 +1089,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 +1110,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) @@ -1602,10 +1627,9 @@ int LaTeX::scanBlgFile(DepTable & dep, TeXErrors & terr) } else if (regex_match(token, sub, biberError)) { retval |= BIBTEX_ERROR; string errstr = N_("Biber error: ") + sub.str(2); - string msg = token; terr.insertError(0, from_local8bit(errstr), - from_local8bit(msg)); + from_local8bit(token)); } prevtoken = token; } @@ -1625,7 +1649,6 @@ int LaTeX::scanIlgFile(TeXErrors & terr) string prevtoken; while (getline(ifs, token)) { token = rtrim(token, "\r"); - smatch sub; if (prefixIs(token, "!! ")) prevtoken = token; else if (!prevtoken.empty()) { @@ -1640,10 +1663,9 @@ int LaTeX::scanIlgFile(TeXErrors & terr) } else if (prefixIs(token, "ERROR: ")) { retval |= BIBTEX_ERROR; string errstr = N_("Xindy error: ") + token.substr(6); - string msg = token; terr.insertError(0, from_local8bit(errstr), - from_local8bit(msg)); + from_local8bit(token)); } } return retval;