X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLaTeX.C;h=57256ab10df181f797010dc3c5fe85fbcbc46d18;hb=28168bd4df9a568e79cdc57cb257743b7adb7c2a;hp=1d236c1ba0849f046b45ce9f2c0d9eeb13968f91;hpb=b8cad4ca9d2fe8379b496b326956ab5d16ddc1eb;p=lyx.git diff --git a/src/LaTeX.C b/src/LaTeX.C index 1d236c1ba0..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 @@ -18,21 +18,21 @@ #endif #include -#include "support/filetools.h" #include "LaTeX.h" -#include "support/FileInfo.h" +#include "bufferlist.h" +#include "gettext.h" +#include "lyxfunc.h" #include "debug.h" -#include "support/lyxlib.h" -#include "support/syscall.h" -#include "support/syscontr.h" -#include "support/path.h" +#include "support/filetools.h" +#include "support/FileInfo.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; @@ -62,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); } @@ -75,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"); + } } @@ -100,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); @@ -120,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 @@ -153,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; @@ -180,9 +191,7 @@ int LaTeX::run(TeXErrors & terr, LyXFunc * lfun) str << _("LaTeX run number") << ' ' << count; lfun->dispatch(LFUN_MESSAGE, str.str().c_str()); } - - - //WriteStatus(lfun, string(_("LaTeX run number ")) + tostr(count)); + this->operator()(); scanres = scanLogFile(terr); if (scanres & ERROR_RERUN) { @@ -210,13 +219,15 @@ 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 lyxerr[Debug::LATEX] << "Running MakeIndex." << endl; - if (lfun) lfun->dispatch(LFUN_MESSAGE, _("Running MakeIndex.")); -// WriteStatus(minib, _("Running MakeIndex.")); + if (lfun) { + lfun->dispatch(LFUN_MESSAGE, _("Running MakeIndex.")); + } + rerun = runMakeIndex(OnlyFilename(ChangeExtension(file, ".idx"))); } @@ -228,16 +239,19 @@ int LaTeX::run(TeXErrors & terr, LyXFunc * lfun) // tags is found -> run bibtex and set rerun = true; // no checks for now lyxerr[Debug::LATEX] << "Running BibTeX." << endl; - if (lfun) lfun->dispatch(LFUN_MESSAGE, _("Running BibTeX.")); - //WriteStatus(minib, _("Running BibTeX.")); + if (lfun) { + lfun->dispatch(LFUN_MESSAGE, _("Running BibTeX.")); + } + updateBibtexDependencies(head, bibtex_info); rerun |= runBibTeX(bibtex_info); - } else if (!had_depfile) + } else if (!had_depfile) { /// If we run pdflatex on the file after running latex on it, /// then we do not need to run bibtex, but we do need to /// 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 @@ -262,16 +276,14 @@ int LaTeX::run(TeXErrors & terr, LyXFunc * lfun) str << _("LaTeX run number") << ' ' << count; lfun->dispatch(LFUN_MESSAGE, str.str().c_str()); } - -// WriteStatus(minib, -// string(_("LaTeX run number ")) + tostr(count)); + 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(); @@ -286,16 +298,18 @@ 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 lyxerr[Debug::LATEX] << "Running MakeIndex." << endl; - if (lfun) lfun->dispatch(LFUN_MESSAGE, _("Running MakeIndex.")); - //WriteStatus(minib, _("Running MakeIndex.")); + 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. @@ -306,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. @@ -318,15 +332,14 @@ int LaTeX::run(TeXErrors & terr, LyXFunc * lfun) str << _("LaTeX run number") << ' ' << count; lfun->dispatch(LFUN_MESSAGE, str.str().c_str()); } - -// WriteStatus(minib, string(_("LaTeX run number ")) + tostr(count)); + this->operator()(); scanres = scanLogFile(terr); if (scanres & ERRORS) { deleteFilesOnError(); return scanres; // return on error } - + // keep this updated head.update(); } @@ -345,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); } @@ -362,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; } @@ -372,7 +385,7 @@ vector const LaTeX::scanAuxFiles(string const & file) { vector result; - + result.push_back(scanAuxFile(file)); for (int i = 1; i < 1000; ++i) { @@ -461,7 +474,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) { @@ -477,7 +490,7 @@ void LaTeX::updateBibtexDependencies(DepTable & dep, string file = findtexfile(*it2, "bst"); if (!file.empty()) dep.insert(file, true); - } + } } } @@ -493,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; @@ -513,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; @@ -647,8 +660,13 @@ void LaTeX::deplog(DepTable & head) LRegex reg2("File: ([^ ]+).*"); LRegex reg3("No file ([^ ]+)\\..*"); LRegex reg4("\\\\openout[0-9]+.*=.*`([^ ]+)'\\..*"); + // If an index should be created, MikTex does not write a line like + // \openout# = 'sample,idx'. + // but intstead only a line like this into the log: + // 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. @@ -661,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, @@ -678,24 +696,31 @@ void LaTeX::deplog(DepTable & head) LRegex::SubMatches const & sub = reg4.exec(token); foundfile = LSubstring(token, sub[1].first, sub[1].second); + } else if (reg5.exact_match(token)) { + LRegex::SubMatches const & sub = reg5.exec(token); + foundfile = LSubstring(token, sub[1].first, + sub[1].second); } else { continue; } - lyxerr[Debug::DEPEND] << "Found file: " + // convert from native os path to unix path + foundfile = os::internal_path(foundfile); + + 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