From ef710e618f333c8a8500dffe573b80d02018ad53 Mon Sep 17 00:00:00 2001 From: Enrico Forestieri Date: Tue, 30 Aug 2011 00:13:29 +0000 Subject: [PATCH] Fix bug #6170 (Latex Compiler error when lyx file is located in a path which contains a "#") This removes \input@path handling. git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/branches/BRANCH_2_0_X@39568 a592a061-630c-0410-9148-cb99ea01b6c8 --- src/Buffer.cpp | 61 ++++------------------------------ src/Buffer.h | 2 -- src/BufferList.cpp | 3 +- src/graphics/PreviewLoader.cpp | 2 +- src/insets/InsetInclude.cpp | 10 ++---- status.20x | 3 ++ 6 files changed, 14 insertions(+), 67 deletions(-) diff --git a/src/Buffer.cpp b/src/Buffer.cpp index 8151cc5128..c6a819afce 100644 --- a/src/Buffer.cpp +++ b/src/Buffer.cpp @@ -1239,7 +1239,6 @@ bool Buffer::write(ostream & ofs) const bool Buffer::makeLaTeXFile(FileName const & fname, - string const & original_path, OutputParams const & runparams_in, bool output_preamble, bool output_body) const { @@ -1272,8 +1271,7 @@ bool Buffer::makeLaTeXFile(FileName const & fname, otexstream os(ofs, d->texrow); try { os.texrow().reset(); - writeLaTeXSource(os, original_path, - runparams, output_preamble, output_body); + writeLaTeXSource(os, runparams, output_preamble, output_body); } catch (EncodingException & e) { odocstringstream ods; @@ -1316,7 +1314,6 @@ bool Buffer::makeLaTeXFile(FileName const & fname, void Buffer::writeLaTeXSource(otexstream & os, - string const & original_path, OutputParams const & runparams_in, bool const output_preamble, bool const output_body) const { @@ -1352,57 +1349,12 @@ void Buffer::writeLaTeXSource(otexstream & os, // macros will be put in the prefix anyway. updateMacroInstances(OutputUpdate); - // There are a few differences between nice LaTeX and usual files: - // usual is \batchmode and has a - // special input@path to allow the including of figures - // with either \input or \includegraphics (what figinsets do). - // input@path is set when the actual parameter - // original_path is set. This is done for usual tex-file, but not - // for nice-latex-file. (Matthias 250696) - // Note that input@path is only needed for something the user does - // in the preamble, included .tex files or ERT, files included by - // LyX work without it. + // With respect to nice LaTeX, usual files have \batchmode if (output_preamble) { if (!runparams.nice) { // code for usual, NOT nice-latex-file os << "\\batchmode\n"; // changed from \nonstopmode } - if (!original_path.empty()) { - // FIXME UNICODE - // We don't know the encoding of inputpath - docstring const inputpath = from_utf8(support::latex_path(original_path)); - docstring uncodable_glyphs; - Encoding const * const enc = runparams.encoding; - if (enc) { - for (size_t n = 0; n < inputpath.size(); ++n) { - docstring const glyph = - docstring(1, inputpath[n]); - if (enc->latexChar(inputpath[n], true) != glyph) { - LYXERR0("Uncodable character '" - << glyph - << "' in input path!"); - uncodable_glyphs += glyph; - } - } - } - - // warn user if we found uncodable glyphs. - if (!uncodable_glyphs.empty()) { - frontend::Alert::warning(_("Uncodable character in file path"), - support::bformat(_("The path of your document\n" - "(%1$s)\n" - "contains glyphs that are unknown in the\n" - "current document encoding (namely %2$s).\n" - "This will likely result in incomplete output.\n\n" - "Choose an appropriate document encoding (such as utf8)\n" - "or change the file path name."), inputpath, uncodable_glyphs)); - } else { - os << "\\makeatletter\n" - << "\\def\\input@path{{" - << inputpath << "/}}\n" - << "\\makeatother\n"; - } - } // get parent macros (if this buffer has a parent) which will be // written at the document begin further down. @@ -1646,7 +1598,6 @@ int Buffer::runChktex() // get LaTeX-Filename FileName const path(temppath()); string const name = addName(path.absFileName(), latexName()); - string const org_path = filePath(); PathChanger p(path); // path to LaTeX file message(_("Running chktex...")); @@ -1656,7 +1607,7 @@ int Buffer::runChktex() runparams.flavor = OutputParams::LATEX; runparams.nice = false; runparams.linelen = lyxrc.plaintext_linelen; - makeLaTeXFile(FileName(name), org_path, runparams); + makeLaTeXFile(FileName(name), runparams); TeXErrors terr; Chktex chktex(lyxrc.chktex_command, onlyFileName(name), filePath()); @@ -3071,7 +3022,7 @@ void Buffer::getSourceCode(odocstream & os, string const format, else { // latex or literate otexstream ots(os, d->texrow); - writeLaTeXSource(ots, string(), runparams, true, true); + writeLaTeXSource(ots, runparams, true, true); } } else { runparams.par_begin = par_begin; @@ -3469,7 +3420,7 @@ bool Buffer::doExport(string const & format, bool put_in_tempdir, // LaTeX backend else if (backend_format == format) { runparams.nice = true; - if (!makeLaTeXFile(FileName(filename), string(), runparams)) { + if (!makeLaTeXFile(FileName(filename), runparams)) { if (d->cloned_buffer_) { d->cloned_buffer_->d->errorLists["Export"] = d->errorLists["Export"]; @@ -3483,7 +3434,7 @@ bool Buffer::doExport(string const & format, bool put_in_tempdir, return false; } else { runparams.nice = false; - if (!makeLaTeXFile(FileName(filename), filePath(), runparams)) { + if (!makeLaTeXFile(FileName(filename), runparams)) { if (d->cloned_buffer_) { d->cloned_buffer_->d->errorLists["Export"] = d->errorLists["Export"]; diff --git a/src/Buffer.h b/src/Buffer.h index 0c99e1feb8..5472f741de 100644 --- a/src/Buffer.h +++ b/src/Buffer.h @@ -268,7 +268,6 @@ public: /// Just a wrapper for writeLaTeXSource, first creating the ofstream. bool makeLaTeXFile(support::FileName const & filename, - std::string const & original_path, OutputParams const &, bool output_preamble = true, bool output_body = true) const; @@ -295,7 +294,6 @@ public: \endcode */ void writeLaTeXSource(otexstream & os, - std::string const & original_path, OutputParams const &, bool output_preamble = true, bool output_body = true) const; diff --git a/src/BufferList.cpp b/src/BufferList.cpp index e19c8aa63d..01b344f039 100644 --- a/src/BufferList.cpp +++ b/src/BufferList.cpp @@ -212,8 +212,7 @@ void BufferList::updateIncludedTeXfiles(string const & masterTmpDir, for (; it != end; ++it) { if (!(*it)->isDepClean(masterTmpDir)) { string writefile = addName(masterTmpDir, (*it)->latexName()); - (*it)->makeLaTeXFile(FileName(writefile), masterTmpDir, - runparams, false); + (*it)->makeLaTeXFile(FileName(writefile), runparams, false); (*it)->markDepClean(masterTmpDir); } } diff --git a/src/graphics/PreviewLoader.cpp b/src/graphics/PreviewLoader.cpp index c7c55d2aab..d2b15eb951 100644 --- a/src/graphics/PreviewLoader.cpp +++ b/src/graphics/PreviewLoader.cpp @@ -710,7 +710,7 @@ void PreviewLoader::Impl::dumpPreamble(otexstream & os) const runparams.nice = true; runparams.moving_arg = true; runparams.free_spacing = true; - buffer_.writeLaTeXSource(os, buffer_.filePath(), runparams, true, false); + buffer_.writeLaTeXSource(os, runparams, true, false); // FIXME! This is a HACK! The proper fix is to control the 'true' // passed to WriteStream below: diff --git a/src/insets/InsetInclude.cpp b/src/insets/InsetInclude.cpp index c74ec631aa..e5d01f6848 100644 --- a/src/insets/InsetInclude.cpp +++ b/src/insets/InsetInclude.cpp @@ -605,10 +605,6 @@ void InsetInclude::latex(otexstream & os, OutputParams const & runparams) const formats.extension(inc_format))); // FIXME: handle non existing files - // FIXME: Second argument is irrelevant! - // since only_body is true, makeLaTeXFile will not look at second - // argument. Should we set it to string(), or should makeLaTeXFile - // make use of it somehow? (JMarc 20031002) // The included file might be written in a different encoding // and language. Encoding const * const oldEnc = runparams.encoding; @@ -621,8 +617,7 @@ void InsetInclude::latex(otexstream & os, OutputParams const & runparams) const runparams.master_language = buffer().params().language; runparams.par_begin = 0; runparams.par_end = tmp->paragraphs().size(); - if (!tmp->makeLaTeXFile(tmpwritefile, masterFileName(buffer()). - onlyPath().absFileName(), runparams, false)) { + if (!tmp->makeLaTeXFile(tmpwritefile, runparams, false)) { docstring msg = bformat(_("Included file `%1$s' " "was not exported correctly.\nWarning: " "LaTeX export is probably incomplete."), @@ -661,7 +656,8 @@ void InsetInclude::latex(otexstream & os, OutputParams const & runparams) const // In this case, it's not a LyX file, so we copy the file // to the temp dir, so that .aux files etc. are not created // in the original dir. Files included by this file will be - // found via input@path, see ../Buffer.cpp. + // found via the environment variable TEXINPUTS, which may be + // set in preferences and by default includes the original dir. unsigned long const checksum_in = included_file.checksum(); unsigned long const checksum_out = writefile.checksum(); diff --git a/status.20x b/status.20x index 30892d2532..8394a633cc 100644 --- a/status.20x +++ b/status.20x @@ -41,6 +41,9 @@ What's new - Allow LaTeX import of \uline (bug 7640). +- Fix compilation error occurring when a LyX document resides in a directory + whose name contains characters that are special to LaTeX (bug 6170). + * USER INTERFACE -- 2.39.5