X-Git-Url: https://git.lyx.org/gitweb/?a=blobdiff_plain;f=src%2FLaTeX.cpp;h=6003772cbb4dd071a81f5bc13fe78e456ea74f9b;hb=2f271f61bcd514da3ab5b44d2b7bf61e12ac0c44;hp=63f808397737b5d6d784523749a62b336b856b6d;hpb=0e08bc5e164bf850c0c3a33d218cccf36711a924;p=lyx.git diff --git a/src/LaTeX.cpp b/src/LaTeX.cpp index 63f8083977..6003772cbb 100644 --- a/src/LaTeX.cpp +++ b/src/LaTeX.cpp @@ -17,20 +17,18 @@ #include "BufferList.h" #include "LaTeX.h" -#include "gettext.h" #include "LyXRC.h" -#include "debug.h" #include "DepTable.h" -#include "support/filetools.h" +#include "support/debug.h" #include "support/convert.h" +#include "support/FileName.h" +#include "support/filetools.h" +#include "support/gettext.h" #include "support/lstrings.h" -#include "support/lyxlib.h" #include "support/Systemcall.h" #include "support/os.h" -#include -#include #include #include @@ -38,43 +36,12 @@ using boost::regex; using boost::smatch; -#ifndef CXX_GLOBAL_CSTD -using std::sscanf; -#endif - -using std::endl; -using std::getline; -using std::string; -using std::ifstream; -using std::set; -using std::vector; - +using namespace std; +using namespace lyx::support; namespace lyx { -using support::absolutePath; -using support::bformat; -using support::changeExtension; -using support::contains; -using support::FileName; -using support::findtexfile; -using support::getcwd; -using support::makeAbsPath; -using support::onlyFilename; -using support::prefixIs; -using support::quoteName; -using support::removeExtension; -using support::rtrim; -using support::rsplit; -using support::split; -using support::subst; -using support::suffixIs; -using support::Systemcall; -using support::unlink; -using support::trim; - namespace os = support::os; -namespace fs = boost::filesystem; // TODO: in no particular order // - get rid of the call to @@ -151,29 +118,29 @@ void LaTeX::deleteFilesOnError() const // What files do we have to delete? // This will at least make latex do all the runs - unlink(depfile); + depfile.removeFile(); // but the reason for the error might be in a generated file... // bibtex file FileName const bbl(changeExtension(file.absFilename(), ".bbl")); - unlink(bbl); + bbl.removeFile(); // makeindex file FileName const ind(changeExtension(file.absFilename(), ".ind")); - unlink(ind); + ind.removeFile(); // nomencl file FileName const nls(changeExtension(file.absFilename(), ".nls")); - unlink(nls); + nls.removeFile(); // nomencl file (old version of the package) FileName const gls(changeExtension(file.absFilename(), ".gls")); - unlink(gls); + gls.removeFile(); // Also remove the aux file FileName const aux(changeExtension(file.absFilename(), ".aux")); - unlink(aux); + aux.removeFile(); } @@ -192,7 +159,7 @@ int LaTeX::run(TeXErrors & terr) bool rerun = false; // rerun requested // The class LaTeX does not know the temp path. - theBufferList().updateIncludedTeXfiles(getcwd().absFilename(), + theBufferList().updateIncludedTeXfiles(FileName::getcwd().absFilename(), runparams); // Never write the depfile if an error was encountered. @@ -218,7 +185,7 @@ int LaTeX::run(TeXErrors & terr) FileName const aux_file(changeExtension(file.absFilename(), "aux")); if (had_depfile) { - LYXERR(Debug::DEPEND) << "Dependency file exists" << endl; + LYXERR(Debug::DEPEND, "Dependency file exists"); // Read the dep file: had_depfile = head.read(depfile); } @@ -231,23 +198,20 @@ int LaTeX::run(TeXErrors & terr) // to re-run latex and collect the error messages // (even if they are the same). if (!output_file.exists()) { - LYXERR(Debug::DEPEND) - << "re-running LaTeX because output file doesn't exist." - << endl; + LYXERR(Debug::DEPEND, + "re-running LaTeX because output file doesn't exist."); } else if (!head.sumchange()) { - LYXERR(Debug::DEPEND) << "return no_change" << endl; + LYXERR(Debug::DEPEND, "return no_change"); return NO_CHANGE; } else { - LYXERR(Debug::DEPEND) - << "Dependency file has changed" << endl; + LYXERR(Debug::DEPEND, "Dependency file has changed"); } if (head.extchanged(".bib") || head.extchanged(".bst")) run_bibtex = true; } else - LYXERR(Debug::DEPEND) - << "Dependency file does not exist, or has wrong format" - << endl; + LYXERR(Debug::DEPEND, + "Dependency file does not exist, or has wrong format"); /// We scan the aux file even when had_depfile = false, /// because we can run pdflatex on the file after running latex on it, @@ -257,13 +221,13 @@ int LaTeX::run(TeXErrors & terr) bibtex_info_old = scanAuxFiles(aux_file); ++count; - LYXERR(Debug::LATEX) << "Run #" << count << endl; + LYXERR(Debug::LATEX, "Run #" << count); message(runMessage(count)); startscript(); scanres = scanLogFile(terr); if (scanres & ERROR_RERUN) { - LYXERR(Debug::LATEX) << "Rerunning LaTeX" << endl; + LYXERR(Debug::LATEX, "Rerunning LaTeX"); startscript(); scanres = scanLogFile(terr); } @@ -291,13 +255,13 @@ 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")); - rerun = idxfile.exists() && fs::is_empty(idxfile.toFilesystemEncoding()); + rerun = idxfile.exists() && idxfile.isFileEmpty(); // run makeindex if (head.haschanged(idxfile)) { // no checks for now - LYXERR(Debug::LATEX) << "Running MakeIndex." << endl; - message(_("Running MakeIndex.")); + LYXERR(Debug::LATEX, "Running MakeIndex."); + message(_("Running Index Processor.")); // onlyFilename() is needed for cygwin rerun |= runMakeIndex(onlyFilename(idxfile.absFilename()), runparams); @@ -316,7 +280,7 @@ int LaTeX::run(TeXErrors & terr) // "\bibdata" and/or "\bibstyle". If one of those // tags is found -> run bibtex and set rerun = true; // no checks for now - LYXERR(Debug::LATEX) << "Running BibTeX." << endl; + LYXERR(Debug::LATEX, "Running BibTeX."); message(_("Running BibTeX.")); updateBibtexDependencies(head, bibtex_info); rerun |= runBibTeX(bibtex_info); @@ -342,11 +306,8 @@ int LaTeX::run(TeXErrors & terr) if (rerun || head.sumchange()) { rerun = false; ++count; - LYXERR(Debug::DEPEND) - << "Dep. file has changed or rerun requested" - << endl; - LYXERR(Debug::LATEX) - << "Run #" << count << endl; + LYXERR(Debug::DEPEND, "Dep. file has changed or rerun requested"); + LYXERR(Debug::LATEX, "Run #" << count); message(runMessage(count)); startscript(); scanres = scanLogFile(terr); @@ -359,9 +320,7 @@ int LaTeX::run(TeXErrors & terr) deplog(head); // reads the latex log head.update(); } else { - LYXERR(Debug::DEPEND) - << "Dep. file has NOT changed" - << endl; + LYXERR(Debug::DEPEND, "Dep. file has NOT changed"); } // 1.5 @@ -375,8 +334,8 @@ int LaTeX::run(TeXErrors & terr) // run makeindex if the .idx has changed or was generated. if (head.haschanged(idxfile)) { // no checks for now - LYXERR(Debug::LATEX) << "Running MakeIndex." << endl; - message(_("Running MakeIndex.")); + LYXERR(Debug::LATEX, "Running MakeIndex."); + message(_("Running Index Processor.")); // onlyFilename() is needed for cygwin rerun = runMakeIndex(onlyFilename(changeExtension( file.absFilename(), ".idx")), runparams); @@ -404,7 +363,7 @@ int LaTeX::run(TeXErrors & terr) // MAX_RUNS are reached. rerun = false; ++count; - LYXERR(Debug::LATEX) << "Run #" << count << endl; + LYXERR(Debug::LATEX, "Run #" << count); message(runMessage(count)); startscript(); scanres = scanLogFile(terr); @@ -419,7 +378,7 @@ int LaTeX::run(TeXErrors & terr) // Write the dependencies to file. head.write(depfile); - LYXERR(Debug::LATEX) << "Done." << endl; + LYXERR(Debug::LATEX, "Done."); return scanres; } @@ -438,9 +397,8 @@ 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 << endl; + LYXERR(Debug::LATEX, + "idx file has been made, running makeindex on file " << f); string tmp = lyxrc.index_command + ' '; tmp = subst(tmp, "$$lang", runparams.document_language); @@ -456,14 +414,16 @@ bool LaTeX::runMakeIndexNomencl(FileName const & file, OutputParams const & runparams, string const & nlo, string const & nls) { - LYXERR(Debug::LATEX) << "Running MakeIndex for nomencl." << endl; + LYXERR(Debug::LATEX, "Running MakeIndex for nomencl."); message(_("Running MakeIndex for nomencl.")); + string tmp = lyxrc.nomencl_command + ' '; // onlyFilename() is needed for cygwin - string const nomenclstr = " -s nomencl.ist -o " + tmp += quoteName(onlyFilename(changeExtension(file.absFilename(), nlo))); + tmp += " -o " + onlyFilename(changeExtension(file.toFilesystemEncoding(), nls)); - return runMakeIndex( - onlyFilename(changeExtension(file.absFilename(), nlo)), - runparams, nomenclstr); + Systemcall one; + one.startscript(Systemcall::Wait, tmp); + return true; } @@ -498,7 +458,7 @@ Aux_Info const LaTeX::scanAuxFile(FileName const & file) void LaTeX::scanAuxFile(FileName const & file, Aux_Info & aux_info) { - LYXERR(Debug::LATEX) << "Scanning aux file: " << file << endl; + LYXERR(Debug::LATEX, "Scanning aux file: " << file); ifstream ifs(file.toFilesystemEncoding().c_str()); string token; @@ -518,8 +478,7 @@ void LaTeX::scanAuxFile(FileName const & file, Aux_Info & aux_info) while (!data.empty()) { string citation; data = split(data, citation, ','); - LYXERR(Debug::LATEX) << "Citation: " - << citation << endl; + LYXERR(Debug::LATEX, "Citation: " << citation); aux_info.citations.insert(citation); } } else if (regex_match(token, sub, reg2)) { @@ -530,8 +489,7 @@ void LaTeX::scanAuxFile(FileName const & file, Aux_Info & aux_info) string database; data = split(data, database, ','); database = changeExtension(database, "bib"); - LYXERR(Debug::LATEX) << "BibTeX database: `" - << database << '\'' << endl; + LYXERR(Debug::LATEX, "BibTeX database: `" << database << '\''); aux_info.databases.insert(database); } } else if (regex_match(token, sub, reg3)) { @@ -539,8 +497,7 @@ void LaTeX::scanAuxFile(FileName const & file, Aux_Info & aux_info) // token is now the style file // pass it to the helper style = changeExtension(style, "bst"); - LYXERR(Debug::LATEX) << "BibTeX style: `" - << style << '\'' << endl; + LYXERR(Debug::LATEX, "BibTeX style: `" << style << '\''); aux_info.styles.insert(style); } else if (regex_match(token, sub, reg4)) { string const file2 = sub.str(1); @@ -606,7 +563,7 @@ int LaTeX::scanLogFile(TeXErrors & terr) int retval = NO_ERRORS; string tmp = onlyFilename(changeExtension(file.absFilename(), ".log")); - LYXERR(Debug::LATEX) << "Log file: " << tmp << endl; + LYXERR(Debug::LATEX, "Log file: " << tmp); FileName const fn = FileName(makeAbsPath(tmp)); ifstream ifs(fn.toFilesystemEncoding().c_str()); bool fle_style = false; @@ -622,7 +579,7 @@ int LaTeX::scanLogFile(TeXErrors & terr) token = subst(token, "\r", ""); smatch sub; - LYXERR(Debug::LATEX) << "Log line: " << token << endl; + LYXERR(Debug::LATEX, "Log line: " << token); if (token.empty()) continue; @@ -635,11 +592,16 @@ int LaTeX::scanLogFile(TeXErrors & terr) // Here shall we handle different // types of warnings retval |= LATEX_WARNING; - LYXERR(Debug::LATEX) << "LaTeX Warning." << endl; + LYXERR(Debug::LATEX, "LaTeX Warning."); if (contains(token, "Rerun to get cross-references")) { retval |= RERUN; - LYXERR(Debug::LATEX) - << "We should rerun." << endl; + LYXERR(Debug::LATEX, "We should rerun."); + // package clefval needs 2 latex runs before bibtex + } else if (contains(token, "Value of") + && contains(token, "on page") + && contains(token, "undefined")) { + retval |= ERROR_RERUN; + LYXERR(Debug::LATEX, "Force rerun."); } else if (contains(token, "Citation") && contains(token, "on page") && contains(token, "undefined")) { @@ -661,16 +623,14 @@ int LaTeX::scanLogFile(TeXErrors & terr) contains(token, "Rerun to get")) { // at least longtable.sty and bibtopic.sty // might use this. - LYXERR(Debug::LATEX) - << "We should rerun." << endl; + LYXERR(Debug::LATEX, "We should rerun."); retval |= RERUN; } } else if (token[0] == '(') { if (contains(token, "Rerun LaTeX") || contains(token, "Rerun to get")) { // Used by natbib - LYXERR(Debug::LATEX) - << "We should rerun." << endl; + LYXERR(Debug::LATEX, "We should rerun."); retval |= RERUN; } } else if (prefixIs(token, "! ") || @@ -718,10 +678,8 @@ int LaTeX::scanLogFile(TeXErrors & terr) errstr += "\n"; getline(ifs, tmp); } - LYXERR(Debug::LATEX) - << "line: " << line << '\n' - << "Desc: " << desc << '\n' - << "Text: " << errstr << endl; + LYXERR(Debug::LATEX, "line: " << line << '\n' + << "Desc: " << desc << '\n' << "Text: " << errstr); if (line == last_line) ++line_count; else { @@ -762,7 +720,7 @@ int LaTeX::scanLogFile(TeXErrors & terr) } } } - LYXERR(Debug::LATEX) << "Log line: " << token << endl; + LYXERR(Debug::LATEX, "Log line: " << token); return retval; } @@ -771,8 +729,7 @@ namespace { bool insertIfExists(FileName const & absname, DepTable & head) { - if (absname.exists() && - !fs::is_directory(absname.toFilesystemEncoding())) { + if (absname.exists() && !absname.isDirectory()) { head.insert(absname, true); return true; } @@ -785,7 +742,7 @@ bool handleFoundFile(string const & ff, DepTable & head) // convert from native os path to unix path string foundfile = os::internal_path(trim(ff)); - LYXERR(Debug::DEPEND) << "Found file: " << foundfile << endl; + LYXERR(Debug::DEPEND, "Found file: " << foundfile); // Ok now we found a file. // Now we should make sure that this is a file that we can @@ -796,13 +753,12 @@ bool handleFoundFile(string const & ff, DepTable & head) // (1) foundfile is an // absolute path and should // be inserted. - if (absolutePath(foundfile)) { - LYXERR(Debug::DEPEND) << "AbsolutePath file: " - << foundfile << endl; + FileName absname(foundfile); + if (absname.isAbsolute()) { + 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. - FileName absname(foundfile); if (!insertIfExists(absname, head)) { // check for spaces string strippedfile = foundfile; @@ -825,7 +781,7 @@ bool handleFoundFile(string const & ff, DepTable & head) } string onlyfile = onlyFilename(foundfile); - FileName absname(makeAbsPath(onlyfile)); + absname = makeAbsPath(onlyfile); // check for spaces while (contains(foundfile, ' ')) { @@ -851,28 +807,26 @@ bool handleFoundFile(string const & ff, DepTable & head) // (2) foundfile is in the tmpdir // insert it into head - if (absname.exists() && - !fs::is_directory(absname.toFilesystemEncoding())) { + if (absname.exists() && !absname.isDirectory()) { // FIXME: This regex contained glo, but glo is used by the old // version of nomencl.sty. Do we need to put it back? static regex const unwanted("^.*\\.(aux|log|dvi|bbl|ind)$"); if (regex_match(onlyfile, unwanted)) { - LYXERR(Debug::DEPEND) << "We don't want " << onlyfile - << " in the dep file" << endl; + LYXERR(Debug::DEPEND, "We don't want " << onlyfile + << " in the dep file"); } else if (suffixIs(onlyfile, ".tex")) { // This is a tex file generated by LyX // and latex is not likely to change this // during its runs. - LYXERR(Debug::DEPEND) << "Tmpdir TeX file: " << onlyfile << endl; + LYXERR(Debug::DEPEND, "Tmpdir TeX file: " << onlyfile); head.insert(absname, true); } else { - LYXERR(Debug::DEPEND) << "In tmpdir file:" << onlyfile << endl; + LYXERR(Debug::DEPEND, "In tmpdir file:" << onlyfile); head.insert(absname); } return true; } else { - LYXERR(Debug::DEPEND) - << "Not a file or we are unable to find it." << endl; + LYXERR(Debug::DEPEND, "Not a file or we are unable to find it."); return false; } } @@ -880,12 +834,11 @@ bool handleFoundFile(string const & ff, DepTable & head) bool checkLineBreak(string const & ff, DepTable & head) { - if (contains(ff, '.')) - // if we have a dot, we let handleFoundFile decide - return handleFoundFile(ff, head); - else - // else, we suspect a line break + if (!contains(ff, '.')) return false; + + // if we have a dot, we let handleFoundFile decide + return handleFoundFile(ff, head); } } // anon namespace