Set correct path to (biblatex) bibliography databases that are entered relative to child documents.

Fixes: #11105
This commit is contained in:
Juergen Spitzmueller 2018-04-07 22:09:06 +02:00
parent 503c7c1688
commit 2ecc3b09c6
3 changed files with 30 additions and 7 deletions

View File

@ -3150,9 +3150,28 @@ vector<docstring> const Buffer::prepareBibFilePaths(OutputParams const & runpara
string utf8input = to_utf8(bit.first); string utf8input = to_utf8(bit.first);
string database = string database =
prepareFileNameForLaTeX(utf8input, ".bib", runparams.nice); prepareFileNameForLaTeX(utf8input, ".bib", runparams.nice);
FileName const try_in_file = FileName try_in_file =
makeAbsPath(database + ".bib", filePath()); makeAbsPath(database + ".bib", filePath());
bool const not_from_texmf = try_in_file.isReadableFile(); bool not_from_texmf = try_in_file.isReadableFile();
// If the file has not been found, try with the real file name
// (it might come from a child in a sub-directory)
if (!not_from_texmf) {
try_in_file = bit.second;
if (try_in_file.isReadableFile()) {
// Check if the file is in texmf
FileName kpsefile(findtexfile(changeExtension(utf8input, "bib"), "bib", true));
not_from_texmf = kpsefile.empty()
|| kpsefile.absFileName() != try_in_file.absFileName();
if (not_from_texmf)
// If this exists, make path relative to the master
// FIXME Unicode
database =
removeExtension(prepareFileNameForLaTeX(
to_utf8(makeRelPath(from_utf8(try_in_file.absFileName()),
from_utf8(filePath()))),
".bib", runparams.nice));
}
}
if (!runparams.inComment && !runparams.dryrun && !runparams.nice && if (!runparams.inComment && !runparams.dryrun && !runparams.nice &&
not_from_texmf) { not_from_texmf) {

View File

@ -1124,7 +1124,8 @@ cmd_ret const runCommand(string const & cmd)
} }
FileName const findtexfile(string const & fil, string const & /*format*/) FileName const findtexfile(string const & fil, string const & /*format*/,
bool const onlykpse)
{ {
/* There is no problem to extend this function too use other /* There is no problem to extend this function too use other
methods to look for files. It could be setup to look methods to look for files. It could be setup to look
@ -1137,9 +1138,11 @@ FileName const findtexfile(string const & fil, string const & /*format*/)
// If the file can be found directly, we just return a // If the file can be found directly, we just return a
// absolute path version of it. // absolute path version of it.
FileName const absfile(makeAbsPath(fil)); if (!onlykpse) {
if (absfile.exists()) FileName const absfile(makeAbsPath(fil));
return absfile; if (absfile.exists())
return absfile;
}
// Now we try to find it using kpsewhich. // Now we try to find it using kpsewhich.
// It seems from the kpsewhich manual page that it is safe to use // It seems from the kpsewhich manual page that it is safe to use

View File

@ -305,7 +305,8 @@ bool readLink(FileName const & file, FileName & link);
* \param format The file format as used by kpsewhich, e.g. "bib", "bst" etc. * \param format The file format as used by kpsewhich, e.g. "bib", "bst" etc.
*/ */
FileName const findtexfile(std::string const & fil, FileName const findtexfile(std::string const & fil,
std::string const & format); std::string const & format,
bool const onlykpse = false);
/** \param file1, file2 the two files to be compared. Must have absolute paths. /** \param file1, file2 the two files to be compared. Must have absolute paths.
* \returns 1 if \c file1 has a more recent timestamp than \c file2, * \returns 1 if \c file1 has a more recent timestamp than \c file2,