#include "support/convert.h"
#include "support/lstrings.h"
#include "support/lyxlib.h"
-#include "support/systemcall.h"
+#include "support/Systemcall.h"
#include "support/os.h"
#include <boost/filesystem/operations.hpp>
#include <fstream>
+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;
+
namespace lyx {
namespace os = support::os;
namespace fs = boost::filesystem;
-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;
-
// TODO: in no particular order
// - get rid of the call to
// BufferList::updateIncludedTeXfiles, this should either
head.update();
// 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
+ // to re-run latex and collect the error messages
// (even if they are the same).
if (!fs::exists(output_file.toFilesystemEncoding())) {
LYXERR(Debug::DEPEND)
// A second latex run is needed.
FileName const idxfile(changeExtension(file.absFilename(), ".idx"));
rerun = fs::exists(idxfile.toFilesystemEncoding()) &&
- fs::is_empty(idxfile.toFilesystemEncoding());
+ fs::is_empty(idxfile.toFilesystemEncoding());
// run makeindex
if (head.haschanged(idxfile)) {
bool LaTeX::runMakeIndex(string const & f, OutputParams const & runparams,
- string const & params)
+ string const & params)
{
LYXERR(Debug::LATEX)
<< "idx file has been made, running makeindex on file "
<< f << endl;
string tmp = lyxrc.index_command + ' ';
-
+
tmp = subst(tmp, "$$lang", runparams.document_language);
tmp += quoteName(f);
tmp += params;
LYXERR(Debug::LATEX) << "Log file: " << tmp << endl;
FileName const fn = FileName(makeAbsPath(tmp));
ifstream ifs(fn.toFilesystemEncoding().c_str());
+ bool fle_style = false;
+ static regex file_line_error(".+\\.\\D+:[0-9]+: (.+)");
string token;
while (getline(ifs, token)) {
// \r's afterwards, since we need to remove them anyway.
token = subst(token, '\0', '\r');
token = subst(token, "\r", "");
+ smatch sub;
LYXERR(Debug::LATEX) << "Log line: " << token << endl;
if (token.empty())
continue;
+ if (contains(token, "file:line:error style messages enabled"))
+ fle_style = true;
+
if (prefixIs(token, "LaTeX Warning:") ||
prefixIs(token, "! pdfTeX warning")) {
// Here shall we handle different
<< "We should rerun." << endl;
retval |= RERUN;
}
- } else if (prefixIs(token, "! ")) {
- // Ok, we have something that looks like a TeX Error
- // but what do we really have.
+ } else if (prefixIs(token, "! ") ||
+ fle_style && regex_match(token, sub, file_line_error)) {
+ // Ok, we have something that looks like a TeX Error
+ // but what do we really have.
// Just get the error description:
- string desc(token, 2);
+ string desc;
+ if (prefixIs(token, "! "))
+ desc = string(token, 2);
+ else if (fle_style)
+ desc = sub.str();
if (contains(token, "LaTeX Error:"))
retval |= LATEX_ERROR;
// get the next line
// we have a latex error
retval |= TEX_ERROR;
if (contains(desc,
- "Package babel Error: You haven't defined the language"))
+ "Package babel Error: You haven't defined the language") ||
+ contains(desc,
+ "Package babel Error: You haven't loaded the option"))
retval |= ERROR_RERUN;
// get the line number:
int line = 0;
// Sometimes, filenames are broken across lines.
// We care for that and save suspicious lines.
- // Here we exclude some cases where we are sure
+ // Here we exclude some cases where we are sure
// that there is no continued filename
if (!lastline.empty()) {
static regex package_info("Package \\w+ Info: .*");
found_file = false;
// (6) "Writing nomenclature file file.ext"
} else if (regex_match(token, sub, regnomencl) ||
- regex_match(token, sub, regoldnomencl))
+ regex_match(token, sub, regoldnomencl))
// check for dot
found_file = checkLineBreak(sub.str(1), head);
// (7) "\tf@toc=\write<nr>" (for MikTeX)