]> git.lyx.org Git - lyx.git/blobdiff - src/LaTeX.C
John's Layout Tabular UI improvements and Martins fixes to clearing the
[lyx.git] / src / LaTeX.C
index 5a83f1d9e44dd65aa8c552a6991f1063877de4cf..8c812a389fcb00a2d65ec9e4f3885c6cad2da1e2 100644 (file)
@@ -18,8 +18,9 @@
 #endif
 #include <fstream>
 
-#include "support/filetools.h"
 #include "LaTeX.h"
+#include "support/filetools.h"
+#include "support/os.h"
 #include "support/FileInfo.h"
 #include "debug.h"
 #include "support/lyxlib.h"
@@ -28,6 +29,7 @@
 #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"
@@ -74,8 +76,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");
+       }
 }
 
 
@@ -152,12 +158,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,8 +193,6 @@ int LaTeX::run(TeXErrors & terr, LyXFunc * lfun)
                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) {
@@ -214,8 +225,10 @@ int LaTeX::run(TeXErrors & terr, LyXFunc * lfun)
        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")));
        }
 
@@ -227,15 +240,18 @@ 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
@@ -262,8 +278,6 @@ int LaTeX::run(TeXErrors & terr, LyXFunc * lfun)
                        lfun->dispatch(LFUN_MESSAGE, str.str().c_str());
                }
                
-//             WriteStatus(minib,
-//                         string(_("LaTeX run number ")) + tostr(count));
                this->operator()();
                scanres = scanLogFile(terr);
                if (scanres & ERRORS) {
@@ -290,8 +304,10 @@ int LaTeX::run(TeXErrors & terr, LyXFunc * lfun)
        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")));
        }
        
@@ -318,7 +334,6 @@ int LaTeX::run(TeXErrors & terr, LyXFunc * lfun)
                        lfun->dispatch(LFUN_MESSAGE, str.str().c_str());
                }
                
-//             WriteStatus(minib, string(_("LaTeX run number ")) + tostr(count));
                this->operator()();
                scanres = scanLogFile(terr);
                if (scanres & ERRORS) {
@@ -460,7 +475,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<Aux_Info>::const_iterator it = bibtex_info.begin();
             it != bibtex_info.end(); ++it) {
@@ -646,6 +661,11 @@ 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());
@@ -677,10 +697,17 @@ 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;
                }
 
+               // convert from native os path to unix path
+               foundfile = os::internal_path(foundfile);
+               
                lyxerr[Debug::DEPEND] << "Found file: " 
                                      << foundfile << endl;