mirror of
https://git.lyx.org/repos/lyx.git
synced 2024-11-10 20:04:46 +00:00
Fix bug #7835 (Relative paths are not supported by the TEXINPUTS prefix)
This restores \input@path handling, which turns out to be necessary, as the TEXINPUTS mechanism is not used with relative paths. It turns out that both methods must be used, because \input@path does not work in all cases (most notably with tikz). git-svn-id: svn://svn.lyx.org/lyx/lyx-devel/trunk@39918 a592a061-630c-0410-9148-cb99ea01b6c8
This commit is contained in:
parent
997ca078bf
commit
d703d90574
@ -1300,6 +1300,7 @@ bool Buffer::write(ostream & ofs) const
|
|||||||
|
|
||||||
|
|
||||||
bool Buffer::makeLaTeXFile(FileName const & fname,
|
bool Buffer::makeLaTeXFile(FileName const & fname,
|
||||||
|
string const & original_path,
|
||||||
OutputParams const & runparams_in,
|
OutputParams const & runparams_in,
|
||||||
bool output_preamble, bool output_body) const
|
bool output_preamble, bool output_body) const
|
||||||
{
|
{
|
||||||
@ -1340,7 +1341,8 @@ bool Buffer::makeLaTeXFile(FileName const & fname,
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
os.texrow().reset();
|
os.texrow().reset();
|
||||||
writeLaTeXSource(os, runparams, output_preamble, output_body);
|
writeLaTeXSource(os, original_path,
|
||||||
|
runparams, output_preamble, output_body);
|
||||||
}
|
}
|
||||||
catch (EncodingException & e) {
|
catch (EncodingException & e) {
|
||||||
odocstringstream ods;
|
odocstringstream ods;
|
||||||
@ -1383,6 +1385,7 @@ bool Buffer::makeLaTeXFile(FileName const & fname,
|
|||||||
|
|
||||||
|
|
||||||
void Buffer::writeLaTeXSource(otexstream & os,
|
void Buffer::writeLaTeXSource(otexstream & os,
|
||||||
|
string const & original_path,
|
||||||
OutputParams const & runparams_in,
|
OutputParams const & runparams_in,
|
||||||
bool const output_preamble, bool const output_body) const
|
bool const output_preamble, bool const output_body) const
|
||||||
{
|
{
|
||||||
@ -1409,12 +1412,81 @@ void Buffer::writeLaTeXSource(otexstream & os,
|
|||||||
}
|
}
|
||||||
LYXERR(Debug::INFO, "lyx document header finished");
|
LYXERR(Debug::INFO, "lyx document header finished");
|
||||||
|
|
||||||
// With respect to nice LaTeX, usual files have \batchmode
|
// There are a few differences between nice LaTeX and usual files:
|
||||||
|
// usual files have \batchmode and special input@path to allow
|
||||||
|
// inclusion of figures specified by an explicitly relative path
|
||||||
|
// (i.e., a path starting with './' or '../') with either \input or
|
||||||
|
// \includegraphics, as the TEXINPUTS method doesn't work in this case.
|
||||||
|
// 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.
|
||||||
if (output_preamble) {
|
if (output_preamble) {
|
||||||
if (!runparams.nice) {
|
if (!runparams.nice) {
|
||||||
// code for usual, NOT nice-latex-file
|
// code for usual, NOT nice-latex-file
|
||||||
os << "\\batchmode\n"; // changed from \nonstopmode
|
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(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 current document encoding "
|
||||||
|
"(namely %2$s). This may result in "
|
||||||
|
"incomplete output, unless "
|
||||||
|
"TEXINPUTS contains the document "
|
||||||
|
"directory and you don't use "
|
||||||
|
"explicitly relative paths (i.e., "
|
||||||
|
"paths starting with './' or "
|
||||||
|
"'../') in the preamble or in ERT."
|
||||||
|
"\n\nIn case of problems, choose "
|
||||||
|
"an appropriate document encoding\n"
|
||||||
|
"(such as utf8) or change the "
|
||||||
|
"file path name."),
|
||||||
|
inputpath, uncodable_glyphs));
|
||||||
|
} else {
|
||||||
|
string docdir =
|
||||||
|
support::latex_path(original_path);
|
||||||
|
if (contains(docdir, '#')) {
|
||||||
|
docdir = subst(docdir, "#", "\\#");
|
||||||
|
os << "\\catcode`\\#=11"
|
||||||
|
"\\def\\#{#}\\catcode`\\#=6\n";
|
||||||
|
}
|
||||||
|
if (contains(docdir, '%')) {
|
||||||
|
docdir = subst(docdir, "%", "\\%");
|
||||||
|
os << "\\catcode`\\%=11"
|
||||||
|
"\\def\\%{%}\\catcode`\\%=14\n";
|
||||||
|
}
|
||||||
|
os << "\\makeatletter\n"
|
||||||
|
<< "\\def\\input@path{{"
|
||||||
|
<< docdir << "/}}\n"
|
||||||
|
<< "\\makeatother\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// get parent macros (if this buffer has a parent) which will be
|
// get parent macros (if this buffer has a parent) which will be
|
||||||
// written at the document begin further down.
|
// written at the document begin further down.
|
||||||
@ -1677,6 +1749,7 @@ int Buffer::runChktex()
|
|||||||
// get LaTeX-Filename
|
// get LaTeX-Filename
|
||||||
FileName const path(temppath());
|
FileName const path(temppath());
|
||||||
string const name = addName(path.absFileName(), latexName());
|
string const name = addName(path.absFileName(), latexName());
|
||||||
|
string const org_path = filePath();
|
||||||
|
|
||||||
PathChanger p(path); // path to LaTeX file
|
PathChanger p(path); // path to LaTeX file
|
||||||
message(_("Running chktex..."));
|
message(_("Running chktex..."));
|
||||||
@ -1686,7 +1759,7 @@ int Buffer::runChktex()
|
|||||||
runparams.flavor = OutputParams::LATEX;
|
runparams.flavor = OutputParams::LATEX;
|
||||||
runparams.nice = false;
|
runparams.nice = false;
|
||||||
runparams.linelen = lyxrc.plaintext_linelen;
|
runparams.linelen = lyxrc.plaintext_linelen;
|
||||||
makeLaTeXFile(FileName(name), runparams);
|
makeLaTeXFile(FileName(name), org_path, runparams);
|
||||||
|
|
||||||
TeXErrors terr;
|
TeXErrors terr;
|
||||||
Chktex chktex(lyxrc.chktex_command, onlyFileName(name), filePath());
|
Chktex chktex(lyxrc.chktex_command, onlyFileName(name), filePath());
|
||||||
@ -3117,7 +3190,7 @@ void Buffer::getSourceCode(odocstream & os, string const format,
|
|||||||
else {
|
else {
|
||||||
// latex or literate
|
// latex or literate
|
||||||
otexstream ots(os, d->texrow);
|
otexstream ots(os, d->texrow);
|
||||||
writeLaTeXSource(ots, runparams, true, true);
|
writeLaTeXSource(ots, string(), runparams, true, true);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
runparams.par_begin = par_begin;
|
runparams.par_begin = par_begin;
|
||||||
@ -3513,7 +3586,7 @@ bool Buffer::doExport(string const & target, bool put_in_tempdir,
|
|||||||
// LaTeX backend
|
// LaTeX backend
|
||||||
else if (backend_format == format) {
|
else if (backend_format == format) {
|
||||||
runparams.nice = true;
|
runparams.nice = true;
|
||||||
if (!makeLaTeXFile(FileName(filename), runparams)) {
|
if (!makeLaTeXFile(FileName(filename), string(), runparams)) {
|
||||||
if (d->cloned_buffer_) {
|
if (d->cloned_buffer_) {
|
||||||
d->cloned_buffer_->d->errorLists["Export"] =
|
d->cloned_buffer_->d->errorLists["Export"] =
|
||||||
d->errorLists["Export"];
|
d->errorLists["Export"];
|
||||||
@ -3527,7 +3600,7 @@ bool Buffer::doExport(string const & target, bool put_in_tempdir,
|
|||||||
return false;
|
return false;
|
||||||
} else {
|
} else {
|
||||||
runparams.nice = false;
|
runparams.nice = false;
|
||||||
if (!makeLaTeXFile(FileName(filename), runparams)) {
|
if (!makeLaTeXFile(FileName(filename), filePath(), runparams)) {
|
||||||
if (d->cloned_buffer_) {
|
if (d->cloned_buffer_) {
|
||||||
d->cloned_buffer_->d->errorLists["Export"] =
|
d->cloned_buffer_->d->errorLists["Export"] =
|
||||||
d->errorLists["Export"];
|
d->errorLists["Export"];
|
||||||
|
@ -276,6 +276,7 @@ public:
|
|||||||
|
|
||||||
/// Just a wrapper for writeLaTeXSource, first creating the ofstream.
|
/// Just a wrapper for writeLaTeXSource, first creating the ofstream.
|
||||||
bool makeLaTeXFile(support::FileName const & filename,
|
bool makeLaTeXFile(support::FileName const & filename,
|
||||||
|
std::string const & original_path,
|
||||||
OutputParams const &,
|
OutputParams const &,
|
||||||
bool output_preamble = true,
|
bool output_preamble = true,
|
||||||
bool output_body = true) const;
|
bool output_body = true) const;
|
||||||
@ -302,6 +303,7 @@ public:
|
|||||||
\endcode
|
\endcode
|
||||||
*/
|
*/
|
||||||
void writeLaTeXSource(otexstream & os,
|
void writeLaTeXSource(otexstream & os,
|
||||||
|
std::string const & original_path,
|
||||||
OutputParams const &,
|
OutputParams const &,
|
||||||
bool output_preamble = true,
|
bool output_preamble = true,
|
||||||
bool output_body = true) const;
|
bool output_body = true) const;
|
||||||
|
@ -212,7 +212,8 @@ void BufferList::updateIncludedTeXfiles(string const & masterTmpDir,
|
|||||||
for (; it != end; ++it) {
|
for (; it != end; ++it) {
|
||||||
if (!(*it)->isDepClean(masterTmpDir)) {
|
if (!(*it)->isDepClean(masterTmpDir)) {
|
||||||
string writefile = addName(masterTmpDir, (*it)->latexName());
|
string writefile = addName(masterTmpDir, (*it)->latexName());
|
||||||
(*it)->makeLaTeXFile(FileName(writefile), runparams, false);
|
(*it)->makeLaTeXFile(FileName(writefile), masterTmpDir,
|
||||||
|
runparams, false);
|
||||||
(*it)->markDepClean(masterTmpDir);
|
(*it)->markDepClean(masterTmpDir);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -716,7 +716,7 @@ void PreviewLoader::Impl::dumpPreamble(otexstream & os) const
|
|||||||
runparams.nice = true;
|
runparams.nice = true;
|
||||||
runparams.moving_arg = true;
|
runparams.moving_arg = true;
|
||||||
runparams.free_spacing = true;
|
runparams.free_spacing = true;
|
||||||
buffer_.writeLaTeXSource(os, runparams, true, false);
|
buffer_.writeLaTeXSource(os, buffer_.filePath(), runparams, true, false);
|
||||||
|
|
||||||
// FIXME! This is a HACK! The proper fix is to control the 'true'
|
// FIXME! This is a HACK! The proper fix is to control the 'true'
|
||||||
// passed to WriteStream below:
|
// passed to WriteStream below:
|
||||||
|
@ -623,7 +623,8 @@ void InsetInclude::latex(otexstream & os, OutputParams const & runparams) const
|
|||||||
runparams.master_language = buffer().params().language;
|
runparams.master_language = buffer().params().language;
|
||||||
runparams.par_begin = 0;
|
runparams.par_begin = 0;
|
||||||
runparams.par_end = tmp->paragraphs().size();
|
runparams.par_end = tmp->paragraphs().size();
|
||||||
if (!tmp->makeLaTeXFile(tmpwritefile, runparams, false)) {
|
if (!tmp->makeLaTeXFile(tmpwritefile, masterFileName(buffer()).
|
||||||
|
onlyPath().absFileName(), runparams, false)) {
|
||||||
docstring msg = bformat(_("Included file `%1$s' "
|
docstring msg = bformat(_("Included file `%1$s' "
|
||||||
"was not exported correctly.\nWarning: "
|
"was not exported correctly.\nWarning: "
|
||||||
"LaTeX export is probably incomplete."),
|
"LaTeX export is probably incomplete."),
|
||||||
@ -662,8 +663,8 @@ void InsetInclude::latex(otexstream & os, OutputParams const & runparams) const
|
|||||||
// In this case, it's not a LyX file, so we copy the file
|
// 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
|
// to the temp dir, so that .aux files etc. are not created
|
||||||
// in the original dir. Files included by this file will be
|
// in the original dir. Files included by this file will be
|
||||||
// found via the environment variable TEXINPUTS, which may be
|
// found via either the environment variable TEXINPUTS, or
|
||||||
// set in preferences and by default includes the original dir.
|
// input@path, see ../Buffer.cpp.
|
||||||
unsigned long const checksum_in = included_file.checksum();
|
unsigned long const checksum_in = included_file.checksum();
|
||||||
unsigned long const checksum_out = writefile.checksum();
|
unsigned long const checksum_out = writefile.checksum();
|
||||||
|
|
||||||
|
@ -510,6 +510,13 @@ otexstream & operator<<(otexstream & ots, docstring const & s)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
otexstream & operator<<(otexstream & ots, string const & s)
|
||||||
|
{
|
||||||
|
ots << s.c_str();
|
||||||
|
return ots;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
otexstream & operator<<(otexstream & ots, char const * s)
|
otexstream & operator<<(otexstream & ots, char const * s)
|
||||||
{
|
{
|
||||||
size_t const len = strlen(s);
|
size_t const len = strlen(s);
|
||||||
|
@ -154,6 +154,8 @@ otexstream & operator<<(otexstream &, odocstream_manip);
|
|||||||
///
|
///
|
||||||
otexstream & operator<<(otexstream &, docstring const &);
|
otexstream & operator<<(otexstream &, docstring const &);
|
||||||
///
|
///
|
||||||
|
otexstream & operator<<(otexstream &, std::string const &);
|
||||||
|
///
|
||||||
otexstream & operator<<(otexstream &, char const *);
|
otexstream & operator<<(otexstream &, char const *);
|
||||||
///
|
///
|
||||||
otexstream & operator<<(otexstream &, char);
|
otexstream & operator<<(otexstream &, char);
|
||||||
|
Loading…
Reference in New Issue
Block a user