X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLaTeX.cpp;h=cae5967c311b7b0c13571ce93be6e6598719b4e3;hb=9234516731fac37651f5dacfc0942dc40775b96e;hp=67c3457430893d1334b7f5ac925028fc3f879903;hpb=23c231c761dda80d220927c15e15c14493a57bc2;p=lyx.git diff --git a/src/LaTeX.cpp b/src/LaTeX.cpp index 67c3457430..cae5967c31 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 @@ -72,6 +73,15 @@ void TeXErrors::insertError(int line, docstring const & error_desc, } +void TeXErrors::insertRef(int line, docstring const & error_desc, + docstring const & error_text, + string const & child_name) +{ + Error newerr(line, error_desc, error_text, child_name); + undef_ref.push_back(newerr); +} + + bool operator==(AuxInfo const & a, AuxInfo const & o) { return a.aux_file == o.aux_file @@ -92,9 +102,10 @@ bool operator!=(AuxInfo const & a, AuxInfo const & o) */ LaTeX::LaTeX(string const & latex, OutputParams const & rp, - FileName const & f, string const & p, string const & lp, - bool const clean_start) - : cmd(latex), file(f), path(p), lpath(lp), runparams(rp), biber(false) + FileName const & f, string const & p, string const & lp, + bool allow_cancellation, bool const clean_start) + : cmd(latex), file(f), path(p), lpath(lp), runparams(rp), biber(false), + allow_cancel(allow_cancellation) { num_errors = 0; // lualatex can still produce a DVI with --output-format=dvi. However, @@ -236,23 +247,27 @@ 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); message(runMessage(count)); int exit_code = startscript(); + if (exit_code == Systemcall::KILLED) + return Systemcall::KILLED; 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; 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; @@ -278,20 +293,34 @@ int LaTeX::run(TeXErrors & terr) LYXERR(Debug::LATEX, "Running MakeIndex."); message(_("Running Index Processor.")); // onlyFileName() is needed for cygwin - rerun |= runMakeIndex(onlyFileName(idxfile.absFileName()), - runparams); + int const ret = + runMakeIndex(onlyFileName(idxfile.absFileName()), runparams); + if (ret == Systemcall::KILLED) + return Systemcall::KILLED; + rerun = true; } + FileName const nlofile(changeExtension(file.absFileName(), ".nlo")); // If all nomencl entries are removed, nomencl writes an empty nlo file. // DepTable::hasChanged() returns false in this case, since it does not // distinguish empty files from non-existing files. This is why we need // the extra checks here (to trigger a rerun). Cf. discussions in #8905. // FIXME: Sort out the real problem in DepTable. - if (head.haschanged(nlofile) || (nlofile.exists() && nlofile.isFileEmpty())) - rerun |= runMakeIndexNomencl(file, ".nlo", ".nls"); + if (head.haschanged(nlofile) || (nlofile.exists() && nlofile.isFileEmpty())) { + int const ret = runMakeIndexNomencl(file, ".nlo", ".nls"); + if (ret == Systemcall::KILLED) + return Systemcall::KILLED; + rerun = true; + } + FileName const glofile(changeExtension(file.absFileName(), ".glo")); - if (head.haschanged(glofile)) - rerun |= runMakeIndexNomencl(file, ".glo", ".gls"); + if (head.haschanged(glofile)) { + int const ret = runMakeIndexNomencl(file, ".glo", ".gls"); + if (ret) + return ret; + rerun = true; + } + // check if we're using biber instead of bibtex // biber writes no info to the aux file, so we just check @@ -309,7 +338,10 @@ int LaTeX::run(TeXErrors & terr) LYXERR(Debug::LATEX, "Running BibTeX."); message(_("Running BibTeX.")); updateBibtexDependencies(head, bibtex_info); - rerun |= runBibTeX(bibtex_info, runparams); + 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); @@ -338,7 +370,9 @@ int LaTeX::run(TeXErrors & terr) LYXERR(Debug::DEPEND, "Dep. file has changed or rerun requested"); LYXERR(Debug::LATEX, "Run #" << count); message(runMessage(count)); - startscript(); + int exit_code = startscript(); + if (exit_code == Systemcall::KILLED) + return Systemcall::KILLED; scanres = scanLogFile(terr); // update the depedencies @@ -347,7 +381,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 @@ -360,7 +394,10 @@ int LaTeX::run(TeXErrors & terr) LYXERR(Debug::LATEX, "Running BibTeX."); message(_("Running BibTeX.")); updateBibtexDependencies(head, bibtex_info); - rerun |= runBibTeX(bibtex_info, runparams); + 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); @@ -380,15 +417,18 @@ int LaTeX::run(TeXErrors & terr) LYXERR(Debug::LATEX, "Running MakeIndex."); message(_("Running Index Processor.")); // onlyFileName() is needed for cygwin - rerun = runMakeIndex(onlyFileName(changeExtension( + int const ret = runMakeIndex(onlyFileName(changeExtension( file.absFileName(), ".idx")), runparams); + 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. @@ -441,25 +481,27 @@ int LaTeX::startscript() + quoteName(onlyFileName(file.toFilesystemEncoding())) + " > " + os::nulldev(); Systemcall one; - return one.startscript(Systemcall::Wait, tmp, path, lpath); + Systemcall::Starttype const starttype = + allow_cancel ? Systemcall::WaitLoop : Systemcall::Wait; + return one.startscript(starttype, tmp, path, lpath, true); } -bool 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); @@ -468,35 +510,51 @@ bool LaTeX::runMakeIndex(string const & f, OutputParams const & runparams, tmp += quoteName(f); tmp += params; Systemcall one; - one.startscript(Systemcall::Wait, tmp, path, lpath); - return true; + Systemcall::Starttype const starttype = + allow_cancel ? Systemcall::WaitLoop : Systemcall::Wait; + return one.startscript(starttype, tmp, path, lpath, true); } -bool 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; - one.startscript(Systemcall::Wait, tmp, path, lpath); - return true; + Systemcall::Starttype const starttype = + allow_cancel ? Systemcall::WaitLoop : Systemcall::Wait; + return one.startscript(starttype, tmp, path, lpath, true); } vector const -LaTeX::scanAuxFiles(FileName const & file) +LaTeX::scanAuxFiles(FileName const & fname, bool const only_childbibs) { vector result; - result.push_back(scanAuxFile(file)); + // 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, fname.onlyPath().realPath()); + fn.changeExtension("aux"); + if (fn.exists()) + result.push_back(scanAuxFile(fn)); + } + return result; + } + + result.push_back(scanAuxFile(fname)); - string const basename = removeExtension(file.absFileName()); + // This is for bibtopic + string const basename = removeExtension(fname.absFileName()); for (int i = 1; i < 1000; ++i) { FileName const file2(basename + '.' + convert(i) @@ -509,20 +567,20 @@ LaTeX::scanAuxFiles(FileName const & file) } -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\\{([^}]+)\\}"); @@ -605,28 +663,42 @@ void LaTeX::updateBibtexDependencies(DepTable & dep, bool LaTeX::runBibTeX(vector const & bibtex_info, - OutputParams const & runparams) + OutputParams const & rp, int & exit_code) { bool result = false; + exit_code = 0; for (vector::const_iterator it = bibtex_info.begin(); it != bibtex_info.end(); ++it) { if (!biber && it->databases.empty()) continue; result = true; - string tmp = runparams.bibtex_command; + string tmp = rp.bibtex_command; tmp += " "; // onlyFileName() is needed for cygwin tmp += quoteName(onlyFileName(removeExtension( it->aux_file.absFileName()))); Systemcall one; - one.startscript(Systemcall::Wait, tmp, path, lpath); + Systemcall::Starttype const starttype = + allow_cancel ? Systemcall::WaitLoop : Systemcall::Wait; + exit_code = one.startscript(starttype, tmp, path, lpath, true); + if (exit_code) { + return result; + } } // Return whether bibtex was run return result; } +//helper func for scanLogFile; gets line number X from strings "... on input line X ..." +//returns 0 if none is found +int getLineNumber(const string &token){ + string l = support::token(token, ' ', tokenPos(token,' ',"line") + 1); + return l.empty() ? 0 : convert(l); +} + + int LaTeX::scanLogFile(TeXErrors & terr) { int last_line = -1; @@ -636,16 +708,22 @@ 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]+: (.+)"); - 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; string child_name; int pnest = 0; stack > child; + children.clear(); + + terr.clearRefs(); string token; while (getline(ifs, token)) { @@ -673,7 +751,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)); + // 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] == ')') { @@ -688,6 +771,12 @@ int LaTeX::scanLogFile(TeXErrors & terr) if (contains(token, "file:line:error style messages enabled")) fle_style = true; + //Handles both "LaTeX Warning:" & "Package natbib Warning:" + //Various handlers for missing citations below won't catch the problem if citation + //key is long (>~25chars), because pdflatex splits output at line length 80. + if (contains(token, "There were undefined citations.")) + retval |= UNDEF_CIT; + if (prefixIs(token, "LaTeX Warning:") || prefixIs(token, "! pdfTeX warning")) { // Here shall we handle different @@ -707,15 +796,28 @@ int LaTeX::scanLogFile(TeXErrors & terr) } else if (contains(token, "Etaremune labels have changed")) { retval |= ERROR_RERUN; LYXERR(Debug::LATEX, "Force rerun."); + //"Citation `cit' on page X undefined on input line X." } else if (contains(token, "Citation") - && contains(token, "on page") + //&& contains(token, "on input line") //often split to newline && contains(token, "undefined")) { retval |= UNDEF_CIT; - } else if (contains(token, "Citation") - && contains(token, "on input line") + terr.insertRef(getLineNumber(token), from_ascii("Citation undefined"), + from_utf8(token), child_name); + //"Reference `X' on page Y undefined on input line Z." + } else if (contains(token, "Reference") + //&& contains(token, "on input line")) //often split to new line && contains(token, "undefined")) { - retval |= UNDEF_CIT; + retval |= UNDEF_REF; + terr.insertRef(getLineNumber(token), from_ascii("Reference undefined"), + from_utf8(token), child_name); + + //If label is too long pdlaftex log line splitting will make the above fail + //so we catch at least this generic statement occuring for both CIT & REF. + } else if (contains(token, "There were undefined references.")) { + if (!(retval & UNDEF_CIT)) //if not handled already + retval |= UNDEF_REF; } + } else if (prefixIs(token, "Package")) { // Package warnings retval |= PACKAGE_WARNING; @@ -725,6 +827,9 @@ int LaTeX::scanLogFile(TeXErrors & terr) && contains(token, "on page") && contains(token, "undefined")) { retval |= UNDEF_CIT; + //Unf only keys up to ~6 chars will make it due to line splits + terr.insertRef(getLineNumber(token), from_ascii("Citation undefined"), + from_utf8(token), child_name); } } else if (contains(token, "run BibTeX")) { retval |= UNDEF_CIT; @@ -768,7 +873,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 +885,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 +902,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,13 +913,12 @@ 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); } // get the next line - string tmp; int count = 0; do { if (!getline(ifs, tmp)) @@ -884,27 +995,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'; } } } @@ -1031,8 +1161,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(); @@ -1049,6 +1179,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 @@ -1093,7 +1232,7 @@ int iterateLine(string const & token, regex const & reg, string const & closing, return result; } -} // anon namespace +} // namespace void LaTeX::deplog(DepTable & head) @@ -1107,14 +1246,16 @@ void LaTeX::deplog(DepTable & head) static regex const reg1("File: (.+).*"); static regex const reg2("No file (.+)(.).*"); - static regex const reg3("\\\\openout[0-9]+.*=.*`(.+)(..).*"); + static regex const reg3a("\\\\openout[0-9]+.*=.*`(.+)(..).*"); + // LuaTeX has a slightly different output + static regex const reg3b("\\\\openout[0-9]+.*=\\s*(.+)"); // If an index should be created, MikTex does not write a line like // \openout# = 'sample.idx'. // but instead only a line like this into the log: // Writing index file sample.idx static regex const reg4("Writing index file (.+).*"); static regex const regoldnomencl("Writing glossary file (.+).*"); - static regex const regnomencl("Writing nomenclature file (.+).*"); + static regex const regnomencl(".*Writing nomenclature file (.+).*"); // If a toc should be created, MikTex does not write a line like // \openout# = `sample.toc'. // but only a line like this into the log: @@ -1200,14 +1341,22 @@ void LaTeX::deplog(DepTable & head) else // we suspect a line break fragment = true; - // (3) "\openout = `file.ext'." - } else if (regex_match(token, sub, reg3)) { + // (3)(a) "\openout = `file.ext'." + } else if (regex_match(token, sub, reg3a)) { // search for closing '. at the end of the line if (sub.str(2) == "\'.") fragment = !handleFoundFile(sub.str(1), head); else // potential fragment fragment = true; + // (3)(b) "\openout = file.ext" (LuaTeX) + } else if (regex_match(token, sub, reg3b)) { + // file names must contains a dot + if (contains(sub.str(1), '.')) + fragment = !handleFoundFile(sub.str(1), head); + else + // potential fragment + fragment = true; // (4) "Writing index file file.ext" } else if (regex_match(token, sub, reg4)) // fragmential file name? @@ -1232,7 +1381,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); } @@ -1245,7 +1394,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); } @@ -1300,32 +1449,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; }