X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLaTeX.cpp;h=f4d98155aad65f0bbcbbe0c628aa26f01e6e36f1;hb=e1cabbf70e34a3d969327eaf5a9cbc4f8ee3e854;hp=d7fe03f770a8833156eb5956de7d3950785752b2;hpb=26b361417d9bbc08df944d150086618d06559117;p=lyx.git diff --git a/src/LaTeX.cpp b/src/LaTeX.cpp index d7fe03f770..f4d98155aa 100644 --- a/src/LaTeX.cpp +++ b/src/LaTeX.cpp @@ -50,8 +50,6 @@ namespace os = support::os; // different way. // - the makeindex style files should be taken care of with // the dependency mechanism. -// - makeindex commandline options should be supported -// - somewhere support viewing of bibtex and makeindex log files. // - we should perhaps also scan the bibtex log file namespace { @@ -100,13 +98,13 @@ LaTeX::LaTeX(string const & latex, OutputParams const & rp, { num_errors = 0; if (prefixIs(cmd, "pdf")) { // Do we use pdflatex ? - depfile = FileName(file.absFilename() + ".dep-pdf"); + depfile = FileName(file.absFileName() + ".dep-pdf"); output_file = - FileName(changeExtension(file.absFilename(), ".pdf")); + FileName(changeExtension(file.absFileName(), ".pdf")); } else { - depfile = FileName(file.absFilename() + ".dep"); + depfile = FileName(file.absFileName() + ".dep"); output_file = - FileName(changeExtension(file.absFilename(), ".dvi")); + FileName(changeExtension(file.absFileName(), ".dvi")); } } @@ -123,23 +121,23 @@ void LaTeX::deleteFilesOnError() const // but the reason for the error might be in a generated file... // bibtex file - FileName const bbl(changeExtension(file.absFilename(), ".bbl")); + FileName const bbl(changeExtension(file.absFileName(), ".bbl")); bbl.removeFile(); // makeindex file - FileName const ind(changeExtension(file.absFilename(), ".ind")); + FileName const ind(changeExtension(file.absFileName(), ".ind")); ind.removeFile(); // nomencl file - FileName const nls(changeExtension(file.absFilename(), ".nls")); + FileName const nls(changeExtension(file.absFileName(), ".nls")); nls.removeFile(); // nomencl file (old version of the package) - FileName const gls(changeExtension(file.absFilename(), ".gls")); + FileName const gls(changeExtension(file.absFileName(), ".gls")); gls.removeFile(); // Also remove the aux file - FileName const aux(changeExtension(file.absFilename(), ".aux")); + FileName const aux(changeExtension(file.absFileName(), ".aux")); aux.removeFile(); } @@ -148,7 +146,7 @@ int LaTeX::run(TeXErrors & terr) // We know that this function will only be run if the lyx buffer // has been changed. We also know that a newly written .tex file // is always different from the previous one because of the date - // in it. However it seems safe to run latex (at least) on time + // in it. However it seems safe to run latex (at least) one time // each time the .tex file changes. { int scanres = NO_ERRORS; @@ -159,7 +157,7 @@ int LaTeX::run(TeXErrors & terr) bool rerun = false; // rerun requested // The class LaTeX does not know the temp path. - theBufferList().updateIncludedTeXfiles(FileName::getcwd().absFilename(), + theBufferList().updateIncludedTeXfiles(FileName::getcwd().absFileName(), runparams); // Never write the depfile if an error was encountered. @@ -182,7 +180,7 @@ int LaTeX::run(TeXErrors & terr) bool had_depfile = depfile.exists(); bool run_bibtex = false; - FileName const aux_file(changeExtension(file.absFilename(), "aux")); + FileName const aux_file(changeExtension(file.absFileName(), "aux")); if (had_depfile) { LYXERR(Debug::DEPEND, "Dependency file exists"); @@ -254,7 +252,7 @@ int LaTeX::run(TeXErrors & terr) // memoir (at least) writes an empty *idx file in the first place. // A second latex run is needed. - FileName const idxfile(changeExtension(file.absFilename(), ".idx")); + FileName const idxfile(changeExtension(file.absFileName(), ".idx")); rerun = idxfile.exists() && idxfile.isFileEmpty(); // run makeindex @@ -262,14 +260,14 @@ int LaTeX::run(TeXErrors & terr) // no checks for now LYXERR(Debug::LATEX, "Running MakeIndex."); message(_("Running Index Processor.")); - // onlyFilename() is needed for cygwin - rerun |= runMakeIndex(onlyFilename(idxfile.absFilename()), + // onlyFileName() is needed for cygwin + rerun |= runMakeIndex(onlyFileName(idxfile.absFileName()), runparams); } - FileName const nlofile(changeExtension(file.absFilename(), ".nlo")); + FileName const nlofile(changeExtension(file.absFileName(), ".nlo")); if (head.haschanged(nlofile)) rerun |= runMakeIndexNomencl(file, ".nlo", ".nls"); - FileName const glofile(changeExtension(file.absFilename(), ".glo")); + FileName const glofile(changeExtension(file.absFileName(), ".glo")); if (head.haschanged(glofile)) rerun |= runMakeIndexNomencl(file, ".glo", ".gls"); @@ -351,9 +349,9 @@ int LaTeX::run(TeXErrors & terr) // no checks for now LYXERR(Debug::LATEX, "Running MakeIndex."); message(_("Running Index Processor.")); - // onlyFilename() is needed for cygwin - rerun = runMakeIndex(onlyFilename(changeExtension( - file.absFilename(), ".idx")), runparams); + // onlyFileName() is needed for cygwin + rerun = runMakeIndex(onlyFileName(changeExtension( + file.absFileName(), ".idx")), runparams); } // I am not pretty sure if need this twice. @@ -400,9 +398,9 @@ int LaTeX::run(TeXErrors & terr) int LaTeX::startscript() { - // onlyFilename() is needed for cygwin + // onlyFileName() is needed for cygwin string tmp = cmd + ' ' - + quoteName(onlyFilename(file.toFilesystemEncoding())) + + quoteName(onlyFileName(file.toFilesystemEncoding())) + " > " + os::nulldev(); Systemcall one; return one.startscript(Systemcall::Wait, tmp); @@ -412,13 +410,23 @@ int LaTeX::startscript() bool LaTeX::runMakeIndex(string const & f, OutputParams const & runparams, string const & params) { - LYXERR(Debug::LATEX, - "idx file has been made, running makeindex on file " << f); string tmp = runparams.use_japanese ? lyxrc.jindex_command : lyxrc.index_command; - tmp += ' '; + + if (!runparams.index_command.empty()) + tmp = runparams.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 = lyxrc.splitindex_command + " -m " + quoteName(tmp); + LYXERR(Debug::LATEX, + "Multiple indices. Using splitindex command: " << tmp); + } + tmp += ' '; tmp += quoteName(f); tmp += params; Systemcall one; @@ -433,10 +441,10 @@ bool LaTeX::runMakeIndexNomencl(FileName const & file, 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))); + // onlyFileName() is needed for cygwin + tmp += quoteName(onlyFileName(changeExtension(file.absFileName(), nlo))); tmp += " -o " - + onlyFilename(changeExtension(file.toFilesystemEncoding(), nls)); + + onlyFileName(changeExtension(file.toFilesystemEncoding(), nls)); Systemcall one; one.startscript(Systemcall::Wait, tmp); return true; @@ -450,7 +458,7 @@ LaTeX::scanAuxFiles(FileName const & file) result.push_back(scanAuxFile(file)); - string const basename = removeExtension(file.absFilename()); + string const basename = removeExtension(file.absFileName()); for (int i = 1; i < 1000; ++i) { FileName const file2(basename + '.' + convert(i) @@ -530,7 +538,7 @@ void LaTeX::updateBibtexDependencies(DepTable & dep, // remove all ".bib" and ".bst" files. dep.remove_files_with_extension(".bib"); dep.remove_files_with_extension(".bst"); - //string aux = OnlyFilename(ChangeExtension(file, ".aux")); + //string aux = OnlyFileName(ChangeExtension(file, ".aux")); for (vector::const_iterator it = bibtex_info.begin(); it != bibtex_info.end(); ++it) { @@ -563,10 +571,13 @@ bool LaTeX::runBibTeX(vector const & bibtex_info, string tmp = runparams.use_japanese ? lyxrc.jbibtex_command : lyxrc.bibtex_command; + + if (!runparams.bibtex_command.empty()) + tmp = runparams.bibtex_command; tmp += " "; - // onlyFilename() is needed for cygwin - tmp += quoteName(onlyFilename(removeExtension( - it->aux_file.absFilename()))); + // onlyFileName() is needed for cygwin + tmp += quoteName(onlyFileName(removeExtension( + it->aux_file.absFileName()))); Systemcall one; one.startscript(Systemcall::Wait, tmp); } @@ -581,12 +592,15 @@ int LaTeX::scanLogFile(TeXErrors & terr) int line_count = 1; int retval = NO_ERRORS; string tmp = - onlyFilename(changeExtension(file.absFilename(), ".log")); + onlyFileName(changeExtension(file.absFileName(), ".log")); LYXERR(Debug::LATEX, "Log file: " << tmp); FileName const fn = FileName(makeAbsPath(tmp)); ifstream ifs(fn.toFilesystemEncoding().c_str()); bool fle_style = false; static regex file_line_error(".+\\.\\D+:[0-9]+: (.+)"); + // Flag for 'File ended while scanning' message. + // We need to wait for subsequent processing. + string wait_for_error; string token; while (getline(ifs, token)) { @@ -659,7 +673,9 @@ int LaTeX::scanLogFile(TeXErrors & terr) retval |= RERUN; } } else if (prefixIs(token, "! ") - || (fle_style && regex_match(token, sub, file_line_error))) { + || (fle_style + && regex_match(token, sub, file_line_error) + && !contains(token, "pdfTeX warning"))) { // Ok, we have something that looks like a TeX Error // but what do we really have. @@ -671,6 +687,30 @@ int LaTeX::scanLogFile(TeXErrors & terr) desc = sub.str(); if (contains(token, "LaTeX Error:")) retval |= LATEX_ERROR; + + // bug 6445. At this point its not clear we finish with error. + if (prefixIs(token, "! File ended while scanning")){ + wait_for_error = desc; + continue; + } + if (!wait_for_error.empty() && prefixIs(token, "! Emergency stop.")){ + retval |= LATEX_ERROR; + string errstr; + int count = 0; + errstr = wait_for_error; + do { + if (!getline(ifs, tmp)) + break; + errstr += "\n" + tmp; + if (++count > 5) + break; + } while (!contains(tmp, "(job aborted")); + + terr.insertError(0, + from_local8bit("Emergency stop"), + from_local8bit(errstr)); + } + // get the next line string tmp; int count = 0; @@ -742,6 +782,13 @@ int LaTeX::scanLogFile(TeXErrors & terr) } else if (contains(token, "That makes 100 errors")) { // More than 100 errors were reprted 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_local8bit(token)); } } } @@ -778,12 +825,13 @@ bool handleFoundFile(string const & ff, DepTable & head) // (1) foundfile is an // absolute path and should // be inserted. - FileName absname(foundfile); - if (absname.isAbsolute()) { + FileName absname; + if (FileName::isAbsolute(foundfile)) { LYXERR(Debug::DEPEND, "AbsolutePath file: " << foundfile); // On initial insert we want to do the update at once // since this file cannot be a file generated by // the latex run. + absname.set(foundfile); if (!insertIfExists(absname, head)) { // check for spaces string strippedfile = foundfile; @@ -805,7 +853,7 @@ bool handleFoundFile(string const & ff, DepTable & head) } } - string onlyfile = onlyFilename(foundfile); + string onlyfile = onlyFileName(foundfile); absname = makeAbsPath(onlyfile); // check for spaces @@ -825,7 +873,7 @@ bool handleFoundFile(string const & ff, DepTable & head) string const stripoff = rsplit(foundfile, strippedfile, ' '); foundfile = strippedfile; - onlyfile = onlyFilename(strippedfile); + onlyfile = onlyFileName(strippedfile); absname = makeAbsPath(onlyfile); } } @@ -876,7 +924,7 @@ void LaTeX::deplog(DepTable & head) // entered into the dependency file. string const logfile = - onlyFilename(changeExtension(file.absFilename(), ".log")); + onlyFileName(changeExtension(file.absFileName(), ".log")); static regex const reg1("File: (.+).*"); static regex const reg2("No file (.+)(.).*"); @@ -998,8 +1046,8 @@ void LaTeX::deplog(DepTable & head) found_file = checkLineBreak(sub.str(1), head); // (7) "\tf@toc=\write" (for MikTeX) else if (regex_match(token, sub, miktexTocReg)) - found_file = handleFoundFile(onlyFilename(changeExtension( - file.absFilename(), ".toc")), head); + found_file = handleFoundFile(onlyFileName(changeExtension( + file.absFileName(), ".toc")), head); else // not found, but we won't check further // pretend we've been succesfully searching @@ -1012,7 +1060,7 @@ void LaTeX::deplog(DepTable & head) // where "File: file.ext" would be skipped if (regex_match(token, sub, reg6)) { // search for strings in (...) - static regex reg6_1("\\(([^()]+)(.).*"); + static regex reg6_1("\\(([^()]+)(.)"); smatch what; string::const_iterator first = token.begin(); string::const_iterator end = token.end();