X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLaTeX.cpp;h=df20f7b285bb999fc579674b6c03390ee3ea4cce;hb=05282ceeec5fc9872f73f7de93136fc218f8ecb4;hp=cfc95bb51e756f3cc00748d8e403c2b9d069d263;hpb=75bfed55079cab6b73fbea6ce4ae3f10d1af3b91;p=lyx.git diff --git a/src/LaTeX.cpp b/src/LaTeX.cpp index cfc95bb51e..df20f7b285 100644 --- a/src/LaTeX.cpp +++ b/src/LaTeX.cpp @@ -58,7 +58,7 @@ docstring runMessage(unsigned int count) return bformat(_("Waiting for LaTeX run number %1$d"), count); } -} // anon namespace +} // namespace /* * CLASS TEXERRORS @@ -651,10 +651,13 @@ 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; @@ -689,8 +692,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)); - children.push_back(name); + // 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] == ')') { @@ -825,7 +832,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); } @@ -924,7 +931,7 @@ int LaTeX::scanLogFile(TeXErrors & terr) // !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 (!ignore_missing_glyphs @@ -933,11 +940,18 @@ int LaTeX::scanLogFile(TeXErrors & terr) // 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'; @@ -1067,8 +1081,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(); @@ -1085,6 +1099,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 @@ -1129,7 +1152,7 @@ int iterateLine(string const & token, regex const & reg, string const & closing, return result; } -} // anon namespace +} // namespace void LaTeX::deplog(DepTable & head) @@ -1268,7 +1291,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); } @@ -1281,7 +1304,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); }