X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLaTeX.cpp;h=9d796ef5732d577e3d6ca5f4ee328ea8d920eddf;hb=2a0e4c199c4f18d80ec5a2ab452f3cf18eafc56c;hp=e8a6f9f80c3b3149347d0198e4fce08eaae15c76;hpb=6a2219bc6fa1f935c94fa18ab428690f1871dc3c;p=lyx.git diff --git a/src/LaTeX.cpp b/src/LaTeX.cpp index e8a6f9f80c..9d796ef573 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" @@ -97,6 +98,12 @@ LaTeX::LaTeX(string const & latex, OutputParams const & rp, : cmd(latex), file(f), path(p), lpath(lp), runparams(rp), biber(false) { num_errors = 0; + // lualatex can still produce a DVI with --output-format=dvi. However, + // we do not use that internally (we use the "dvilualatex" command) so + // it would only happen from a custom converter. Thus, it is better to + // guess that lualatex produces a PDF than to guess a DVI. + // FIXME we should base the extension on the output format, which we should + // get in a robust way, e.g. from the converter. if (prefixIs(cmd, "pdf") || prefixIs(cmd, "lualatex") || prefixIs(cmd, "xelatex")) { depfile = FileName(file.absFileName() + ".dep-pdf"); output_file = @@ -230,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); @@ -246,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; @@ -484,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 @@ -608,11 +629,7 @@ bool LaTeX::runBibTeX(vector const & bibtex_info, continue; result = true; - string tmp = runparams.use_japanese ? - lyxrc.jbibtex_command : lyxrc.bibtex_command; - - if (!runparams.bibtex_command.empty()) - tmp = runparams.bibtex_command; + string tmp = runparams.bibtex_command; tmp += " "; // onlyFileName() is needed for cygwin tmp += quoteName(onlyFileName(removeExtension( @@ -644,6 +661,7 @@ int LaTeX::scanLogFile(TeXErrors & terr) string child_name; int pnest = 0; stack > child; + children.clear(); string token; while (getline(ifs, token)) { @@ -672,6 +690,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] == ')') { @@ -893,9 +912,12 @@ int LaTeX::scanLogFile(TeXErrors & terr) from_local8bit("pdfTeX Error"), from_local8bit(token), child_name); - } else if (prefixIs(token, "Missing character: There is no ")) { - // XeTeX/LuaTeX error about missing glyph in selected font - // (bug 9610) + } 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!"),