commit 2ecc3b09c6a9c663bec87356b2ec512f37676c5c
Author: Juergen Spitzmueller <[email protected]>
Date: Sat Apr 7 22:09:06 2018 +0200
Set correct path to (biblatex) bibliography databases that are entered
relative to child documents.
Fixes: #11105
---
src/Buffer.cpp | 23 +++++++++++++++++++++--
src/support/filetools.cpp | 11 +++++++----
src/support/filetools.h | 3 ++-
3 files changed, 30 insertions(+), 7 deletions(-)
diff --git a/src/Buffer.cpp b/src/Buffer.cpp
index b7360b3..09dfff9 100644
--- a/src/Buffer.cpp
+++ b/src/Buffer.cpp
@@ -3150,9 +3150,28 @@ vector<docstring> const
Buffer::prepareBibFilePaths(OutputParams const & runpara
string utf8input = to_utf8(bit.first);
string database =
prepareFileNameForLaTeX(utf8input, ".bib",
runparams.nice);
- FileName const try_in_file =
+ FileName try_in_file =
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 &&
not_from_texmf) {
diff --git a/src/support/filetools.cpp b/src/support/filetools.cpp
index 7bff99d..694ae53 100644
--- a/src/support/filetools.cpp
+++ b/src/support/filetools.cpp
@@ -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
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
// absolute path version of it.
- FileName const absfile(makeAbsPath(fil));
- if (absfile.exists())
- return absfile;
+ if (!onlykpse) {
+ FileName const absfile(makeAbsPath(fil));
+ if (absfile.exists())
+ return absfile;
+ }
// Now we try to find it using kpsewhich.
// It seems from the kpsewhich manual page that it is safe to use
diff --git a/src/support/filetools.h b/src/support/filetools.h
index 6a9abc1..05b3d70 100644
--- a/src/support/filetools.h
+++ b/src/support/filetools.h
@@ -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.
*/
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.
* \returns 1 if \c file1 has a more recent timestamp than \c file2,