X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLaTeX.cpp;h=10540642b1ac652f487393cac17720e219dfd7cb;hb=7a7c2117bfb2037495f2642555651962851a9bba;hp=67c3457430893d1334b7f5ac925028fc3f879903;hpb=352a8e115fc9e17d7f912e4d495af032d54e29ad;p=lyx.git diff --git a/src/LaTeX.cpp b/src/LaTeX.cpp index 67c3457430..10540642b1 100644 --- a/src/LaTeX.cpp +++ b/src/LaTeX.cpp @@ -18,6 +18,7 @@ #include "BufferList.h" #include "LaTeX.h" #include "LyXRC.h" +#include "LyX.h" #include "DepTable.h" #include "support/debug.h" @@ -57,7 +58,7 @@ docstring runMessage(unsigned int count) return bformat(_("Waiting for LaTeX run number %1$d"), count); } -} // anon namespace +} // namespace /* * CLASS TEXERRORS @@ -236,7 +237,7 @@ int LaTeX::run(TeXErrors & terr) /// in which case we will not need to run bibtex again. vector bibtex_info_old; if (!run_bibtex) - bibtex_info_old = scanAuxFiles(aux_file); + bibtex_info_old = scanAuxFiles(aux_file, runparams.only_childbibs); ++count; LYXERR(Debug::LATEX, "Run #" << count); @@ -252,7 +253,7 @@ int LaTeX::run(TeXErrors & terr) scanres = scanLogFile(terr); } - vector const bibtex_info = scanAuxFiles(aux_file); + vector const bibtex_info = scanAuxFiles(aux_file, runparams.only_childbibs); if (!run_bibtex && bibtex_info_old != bibtex_info) run_bibtex = true; @@ -347,7 +348,7 @@ int LaTeX::run(TeXErrors & terr) } else { LYXERR(Debug::DEPEND, "Dep. file has NOT changed"); } - + // 3 // rerun bibtex? // Complex bibliography packages such as Biblatex require @@ -450,7 +451,7 @@ bool LaTeX::runMakeIndex(string const & f, OutputParams const & runparams, { string tmp = runparams.use_japanese ? lyxrc.jindex_command : lyxrc.index_command; - + if (!runparams.index_command.empty()) tmp = runparams.index_command; @@ -490,12 +491,26 @@ bool LaTeX::runMakeIndexNomencl(FileName const & file, vector const -LaTeX::scanAuxFiles(FileName const & file) +LaTeX::scanAuxFiles(FileName const & file, bool const only_childbibs) { vector result; + // With chapterbib, we have to bibtex all children's aux files + // but _not_ the master's! + if (only_childbibs) { + for (string const &s: children) { + FileName fn = + makeAbsPath(s, file.onlyPath().realPath()); + fn.changeExtension("aux"); + if (fn.exists()) + result.push_back(scanAuxFile(fn)); + } + return result; + } + result.push_back(scanAuxFile(file)); + // This is for bibtopic string const basename = removeExtension(file.absFileName()); for (int i = 1; i < 1000; ++i) { FileName const file2(basename @@ -636,6 +651,9 @@ int LaTeX::scanLogFile(TeXErrors & terr) onlyFileName(changeExtension(file.absFileName(), ".log")); LYXERR(Debug::LATEX, "Log file: " << tmp); FileName const fn = FileName(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. ifstream ifs(fn.toFilesystemEncoding().c_str()); bool fle_style = false; static regex const file_line_error(".+\\.\\D+:[0-9]+: (.+)"); @@ -646,6 +664,7 @@ int LaTeX::scanLogFile(TeXErrors & terr) string child_name; int pnest = 0; stack > child; + children.clear(); string token; while (getline(ifs, token)) { @@ -674,6 +693,7 @@ int LaTeX::scanLogFile(TeXErrors & terr) if (regex_match(substr, sub, child_file)) { string const name = sub.str(1); child.push(make_pair(name, pnest)); + children.push_back(name); i += len; } } else if (token[i] == ')') { @@ -768,7 +788,7 @@ int LaTeX::scanLogFile(TeXErrors & terr) if (contains(token, "LaTeX Error:")) retval |= LATEX_ERROR; - if (prefixIs(token, "! File ended while scanning")){ + if (prefixIs(token, "! File ended while scanning")) { if (prefixIs(token, "! File ended while scanning use of \\Hy@setref@link.")){ // bug 7344. We must rerun LaTeX if hyperref has been toggled. retval |= ERROR_RERUN; @@ -780,6 +800,12 @@ int LaTeX::scanLogFile(TeXErrors & terr) } } + if (prefixIs(token, "! Incomplete \\if")) { + // bug 10666. At this point its not clear we finish with error. + wait_for_error = desc; + continue; + } + if (prefixIs(token, "! Paragraph ended before \\Hy@setref@link was complete.")){ // bug 7344. We must rerun LaTeX if hyperref has been toggled. retval |= ERROR_RERUN; @@ -791,6 +817,7 @@ int LaTeX::scanLogFile(TeXErrors & terr) string errstr; int count = 0; errstr = wait_for_error; + wait_for_error.clear(); do { if (!getline(ifs, tmp)) break; @@ -801,7 +828,7 @@ int LaTeX::scanLogFile(TeXErrors & terr) } while (!contains(tmp, "(job aborted")); terr.insertError(0, - from_local8bit("Emergency stop"), + from_ascii("Emergency stop"), from_local8bit(errstr), child_name); } @@ -884,27 +911,46 @@ int LaTeX::scanLogFile(TeXErrors & terr) || contains(token, "no pages of output")) { // No output file (e.g. the DVI or PDF) was created retval |= NO_OUTPUT; + } else if (contains(token, "Error 256 (driver return code)")) { + // This is a xdvipdfmx driver error reported by XeTeX. + // We have to check whether an output PDF file was created. + FileName pdffile = file; + pdffile.changeExtension("pdf"); + if (!pdffile.exists()) + // No output PDF file was created (see #10076) + retval |= NO_OUTPUT; } else if (contains(token, "That makes 100 errors")) { - // More than 100 errors were reprted + // More than 100 errors were reported retval |= TOO_MANY_ERRORS; } else if (prefixIs(token, "!pdfTeX error:")) { // otherwise we dont catch e.g.: // !pdfTeX error: pdflatex (file feyn10): Font feyn10 at 600 not found retval |= ERRORS; terr.insertError(0, - from_local8bit("pdfTeX Error"), + from_ascii("pdfTeX Error"), from_local8bit(token), child_name); - } else if (prefixIs(token, "Missing character: There is no ") - && !contains(token, "nullfont")) { + } else if (!ignore_missing_glyphs + && prefixIs(token, "Missing character: There is no ") + && !contains(token, "nullfont")) { // Warning about missing glyph in selected font // may be dataloss (bug 9610) // but can be ignored for 'nullfont' (bug 10394). - retval |= LATEX_ERROR; - terr.insertError(0, - from_local8bit("Missing glyphs!"), - from_local8bit(token), - child_name); + // as well as for ZERO WIDTH NON-JOINER (0x200C) which is + // missing in many fonts and output for ligature break (bug 10727). + // Since this error only occurs with utf8 output, we can safely assume + // that the log file is utf8-encoded + docstring const utoken = from_utf8(token); + if (!contains(utoken, 0x200C)) { + retval |= LATEX_ERROR; + terr.insertError(0, + from_ascii("Missing glyphs!"), + utoken, + child_name); + } + } else if (!wait_for_error.empty()) { + // We collect information until we know we have an error. + wait_for_error += token + '\n'; } } } @@ -1093,7 +1139,7 @@ int iterateLine(string const & token, regex const & reg, string const & closing, return result; } -} // anon namespace +} // namespace void LaTeX::deplog(DepTable & head)