X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLaTeX.C;h=57256ab10df181f797010dc3c5fe85fbcbc46d18;hb=28168bd4df9a568e79cdc57cb257743b7adb7c2a;hp=03dcc49b9743cb93b0f95a8fcbf77e85e6470cca;hpb=3c15d4e3bd03d26d6e12d643b28212b200060dee;p=lyx.git diff --git a/src/LaTeX.C b/src/LaTeX.C index 03dcc49b97..57256ab10d 100644 --- a/src/LaTeX.C +++ b/src/LaTeX.C @@ -1,14 +1,14 @@ /* This file is part of - * ====================================================== - * - * LyX, The Document Processor + * ====================================================== + * + * LyX, The Document Processor * Copyright 1995 Matthias Ettrich * Copyright 1995-2001 The LyX Team. * * This file is Copyright 1996-2001 * Lars Gullik Bjønnes * - * ====================================================== + * ====================================================== */ #include @@ -19,21 +19,20 @@ #include #include "LaTeX.h" +#include "bufferlist.h" +#include "gettext.h" +#include "lyxfunc.h" +#include "debug.h" #include "support/filetools.h" -#include "support/os.h" #include "support/FileInfo.h" -#include "debug.h" -#include "support/lyxlib.h" -#include "support/syscall.h" -#include "support/syscontr.h" -#include "support/path.h" #include "support/LRegex.h" #include "support/LSubstring.h" #include "support/lstrings.h" -#include "bufferlist.h" -#include "gettext.h" -#include "lyx_gui_misc.h" -#include "lyxfunc.h" +#include "support/lyxlib.h" +#include "support/systemcall.h" +#include "support/os.h" +#include "support/path.h" +#include // sscanf using std::ifstream; using std::getline; @@ -63,7 +62,7 @@ extern BufferList bufferlist; void TeXErrors::insertError(int line, string const & error_desc, string const & error_text) { - Error newerr(line, error_desc, error_text); + Error newerr(line, error_desc, error_text); errors.push_back(newerr); } @@ -76,8 +75,12 @@ LaTeX::LaTeX(string const & latex, string const & f, string const & p) { num_errors = 0; depfile = file + ".dep"; - if (prefixIs(cmd, "pdf")) // Do we use pdflatex ? + if (prefixIs(cmd, "pdf")) { // Do we use pdflatex ? depfile += "-pdf"; + output_file = ChangeExtension(file,".pdf"); + } else { + output_file = ChangeExtension(file,".dvi"); + } } @@ -101,7 +104,7 @@ void LaTeX::deleteFilesOnError() const // makeindex file string ind = ChangeExtension(ofname, ".ind"); lyx::unlink(ind); - + // Also remove the aux file string aux = ChangeExtension(ofname, ".aux"); lyx::unlink(aux); @@ -121,12 +124,12 @@ int LaTeX::run(TeXErrors & terr, LyXFunc * lfun) const unsigned int MAX_RUN = 6; DepTable head; // empty head bool rerun = false; // rerun requested - + // The class LaTeX does not know the temp path. bufferlist.updateIncludedTeXfiles(lyx::getcwd()); //GetCWD()); - + // Never write the depfile if an error was encountered. - + // 0 // first check if the file dependencies exist: // ->If it does exist @@ -154,12 +157,19 @@ int LaTeX::run(TeXErrors & terr, LyXFunc * lfun) head.read(depfile); // Update the checksums head.update(); - if (!head.sumchange()) { + // Can't just check if anything has changed because it might have aborted + // on error last time... in which cas we need to re-run latex + // and collect the error messages (even if they are the same). + if (!FileInfo(output_file).exist()) { + lyxerr[Debug::DEPEND] + << "re-running LaTeX because output file doesn't exist." << endl; + } else if (!head.sumchange()) { lyxerr[Debug::DEPEND] << "return no_change" << endl; return NO_CHANGE; + } else { + lyxerr[Debug::DEPEND] + << "Dependency file has changed" << endl; } - lyxerr[Debug::DEPEND] - << "Dependency file has changed" << endl; if (head.extchanged(".bib") || head.extchanged(".bst")) run_bibtex = true; @@ -181,7 +191,7 @@ int LaTeX::run(TeXErrors & terr, LyXFunc * lfun) str << _("LaTeX run number") << ' ' << count; lfun->dispatch(LFUN_MESSAGE, str.str().c_str()); } - + this->operator()(); scanres = scanLogFile(terr); if (scanres & ERROR_RERUN) { @@ -209,7 +219,7 @@ int LaTeX::run(TeXErrors & terr, LyXFunc * lfun) // And if there were undefined citations or changes in references // the .aux file is checked for signs of bibtex. Bibtex is then run // if needed. - + // run makeindex if (head.haschanged(OnlyFilename(ChangeExtension(file, ".idx")))) { // no checks for now @@ -217,7 +227,7 @@ int LaTeX::run(TeXErrors & terr, LyXFunc * lfun) if (lfun) { lfun->dispatch(LFUN_MESSAGE, _("Running MakeIndex.")); } - + rerun = runMakeIndex(OnlyFilename(ChangeExtension(file, ".idx"))); } @@ -232,7 +242,7 @@ int LaTeX::run(TeXErrors & terr, LyXFunc * lfun) if (lfun) { lfun->dispatch(LFUN_MESSAGE, _("Running BibTeX.")); } - + updateBibtexDependencies(head, bibtex_info); rerun |= runBibTeX(bibtex_info); } else if (!had_depfile) { @@ -241,7 +251,7 @@ int LaTeX::run(TeXErrors & terr, LyXFunc * lfun) /// insert the .bib and .bst files into the .dep-pdf file. updateBibtexDependencies(head, bibtex_info); } - + // 1 // we know on this point that latex has been run once (or we just // returned) and the question now is to decide if we need to run @@ -266,14 +276,14 @@ int LaTeX::run(TeXErrors & terr, LyXFunc * lfun) str << _("LaTeX run number") << ' ' << count; lfun->dispatch(LFUN_MESSAGE, str.str().c_str()); } - + this->operator()(); scanres = scanLogFile(terr); if (scanres & ERRORS) { deleteFilesOnError(); return scanres; // return on error } - + // update the depedencies deplog(head); // reads the latex log head.update(); @@ -288,7 +298,7 @@ int LaTeX::run(TeXErrors & terr, LyXFunc * lfun) // again to make sure everything is redone correctly. // Also there should be no need to run the external programs any // more after this. - + // run makeindex if the .idx has changed or was generated. if (head.haschanged(OnlyFilename(ChangeExtension(file, ".idx")))) { // no checks for now @@ -296,10 +306,10 @@ int LaTeX::run(TeXErrors & terr, LyXFunc * lfun) if (lfun) { lfun->dispatch(LFUN_MESSAGE, _("Running MakeIndex.")); } - + rerun = runMakeIndex(OnlyFilename(ChangeExtension(file, ".idx"))); } - + // 2 // we will only run latex more if the log file asks for it. // or if the sumchange() is true. @@ -310,7 +320,7 @@ int LaTeX::run(TeXErrors & terr, LyXFunc * lfun) // -> rerun not asked for: // just return (fall out of bottom of func) // - while ((head.sumchange() || rerun || (scanres & RERUN)) + while ((head.sumchange() || rerun || (scanres & RERUN)) && count < MAX_RUN) { // Yes rerun until message goes away, or until // MAX_RUNS are reached. @@ -322,14 +332,14 @@ int LaTeX::run(TeXErrors & terr, LyXFunc * lfun) str << _("LaTeX run number") << ' ' << count; lfun->dispatch(LFUN_MESSAGE, str.str().c_str()); } - + this->operator()(); scanres = scanLogFile(terr); if (scanres & ERRORS) { deleteFilesOnError(); return scanres; // return on error } - + // keep this updated head.update(); } @@ -348,8 +358,8 @@ int LaTeX::operator()() #else // cmd.exe (OS/2) causes SYS0003 error at "/dev/null" string tmp = cmd + ' ' + file + " > nul"; #endif - Systemcalls one; - return one.startscript(Systemcalls::System, tmp); + Systemcall one; + return one.startscript(Systemcall::Wait, tmp); } @@ -365,8 +375,8 @@ bool LaTeX::runMakeIndex(string const & f) // to come for a later time. (0.13 perhaps?) string tmp = "makeindex -c -q "; tmp += f; - Systemcalls one; - one.startscript(Systemcalls::System, tmp); + Systemcall one; + one.startscript(Systemcall::Wait, tmp); return true; } @@ -375,7 +385,7 @@ vector const LaTeX::scanAuxFiles(string const & file) { vector result; - + result.push_back(scanAuxFile(file)); for (int i = 1; i < 1000; ++i) { @@ -480,7 +490,7 @@ void LaTeX::updateBibtexDependencies(DepTable & dep, string file = findtexfile(*it2, "bst"); if (!file.empty()) dep.insert(file, true); - } + } } } @@ -496,8 +506,8 @@ bool LaTeX::runBibTeX(vector const & bibtex_info) string tmp = "bibtex "; tmp += OnlyFilename(ChangeExtension(it->aux_file, string())); - Systemcalls one; - one.startscript(Systemcalls::System, tmp); + Systemcall one; + one.startscript(Systemcall::Wait, tmp); } // Return whether bibtex was run return result; @@ -516,7 +526,7 @@ int LaTeX::scanLogFile(TeXErrors & terr) string token; while (getline(ifs, token)) { lyxerr[Debug::LATEX] << "Log line: " << token << endl; - + if (token.empty()) continue; @@ -656,7 +666,7 @@ void LaTeX::deplog(DepTable & head) // Writing index file sample.idx LRegex reg5("Writing index file ([^ ]+).*"); LRegex unwanted("^.*\\.(aux|log|dvi|bbl|ind|glo)$"); - + ifstream ifs(logfile.c_str()); while (ifs) { // Ok, the scanning of files here is not sufficient. @@ -669,7 +679,7 @@ void LaTeX::deplog(DepTable & head) getline(ifs, token); token = strip(token, '\r'); if (token.empty()) continue; - + if (reg1.exact_match(token)) { LRegex::SubMatches const & sub = reg1.exec(token); foundfile = LSubstring(token, sub[1].first, @@ -696,21 +706,21 @@ void LaTeX::deplog(DepTable & head) // convert from native os path to unix path foundfile = os::internal_path(foundfile); - - lyxerr[Debug::DEPEND] << "Found file: " + + lyxerr[Debug::DEPEND] << "Found file: " << foundfile << endl; - + // Ok now we found a file. // Now we should make sure that this is a file that we can // access through the normal paths. // We will not try any fancy search methods to // find the file. - + // (1) foundfile is an // absolute path and should // be inserted. if (AbsolutePath(foundfile)) { - lyxerr[Debug::DEPEND] << "AbsolutePath file: " + lyxerr[Debug::DEPEND] << "AbsolutePath file: " << foundfile << endl; // On initial insert we want to do the update at once // since this file can not be a file generated by