#include "BufferList.h"
#include "LaTeX.h"
#include "LyXRC.h"
+#include "LyX.h"
#include "DepTable.h"
#include "support/debug.h"
: cmd(latex), file(f), path(p), lpath(lp), runparams(rp), biber(false)
{
num_errors = 0;
- if (prefixIs(cmd, "pdf")) { // Do we use pdflatex ?
+ // 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 =
FileName(changeExtension(file.absFileName(), ".pdf"));
FileName const aux(changeExtension(file.absFileName(), ".aux"));
aux.removeFile();
+ // Also remove the .out file (e.g. hyperref bookmarks) (#9963)
+ FileName const out(changeExtension(file.absFileName(), ".out"));
+ out.removeFile();
+
// Remove the output file, which is often generated even if error
output_file.removeFile();
}
/// in which case we will not need to run bibtex again.
vector<AuxInfo> 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);
scanres = scanLogFile(terr);
if (scanres & ERROR_RERUN) {
LYXERR(Debug::LATEX, "Rerunning LaTeX");
+ terr.clearErrors();
exit_code = startscript();
scanres = scanLogFile(terr);
}
- vector<AuxInfo> const bibtex_info = scanAuxFiles(aux_file);
+ vector<AuxInfo> const bibtex_info = scanAuxFiles(aux_file, runparams.only_childbibs);
if (!run_bibtex && bibtex_info_old != bibtex_info)
run_bibtex = true;
vector<AuxInfo> const
-LaTeX::scanAuxFiles(FileName const & file)
+LaTeX::scanAuxFiles(FileName const & file, bool const only_childbibs)
{
vector<AuxInfo> 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
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(
string child_name;
int pnest = 0;
stack <pair<string, int> > child;
+ children.clear();
string token;
while (getline(ifs, token)) {
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] == ')') {
} else if (contains(token, "Rerun to get citations")) {
// Natbib seems to use this.
retval |= UNDEF_CIT;
- } else if (contains(token, "No pages of output")) {
- // A dvi file was not created
+ } else if (contains(token, "No pages of output")
+ || contains(token, "no pages of output")) {
+ // No output file (e.g. the DVI or PDF) was created
retval |= NO_OUTPUT;
} else if (contains(token, "That makes 100 errors")) {
// More than 100 errors were reprted
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!"),
return true;
// strip off part after last space and try again
string tmp = strippedfile;
- string const stripoff =
- rsplit(tmp, strippedfile, ' ');
+ rsplit(tmp, strippedfile, ' ');
absname.set(strippedfile);
if (insertIfExists(absname, head))
return true;
break;
// strip off part after last space and try again
string strippedfile;
- string const stripoff =
- rsplit(foundfile, strippedfile, ' ');
+ rsplit(foundfile, strippedfile, ' ');
foundfile = strippedfile;
onlyfile = onlyFileName(strippedfile);
absname = makeAbsPath(onlyfile);