On Mon, Nov 02, 2015 at 12:26:36PM -0500, PhilipPirrip wrote:

> On 11/02/2015 10:44 AM, Enrico Forestieri wrote:
> >On Sun, Nov 01, 2015 at 11:47:42PM -0500, PhilipPirrip wrote:
> >
> >>Hi Enrico, thank you  for your response. I hope the others will help us
> >>resolve this too.
> >
> >Given the overwhelming amount of replies, I doubt anyone is interested
> >in this matter.
> 
> Oh no, no, you're wrong. This is what I received from one of the well known
> developers: "Enrico is the Jedi Master of such things. I'd suggest you
> re-send this just to him."

You mean like Yoda? I don't know whether to feel flattered or offended ;)

> >>Anway... some of the developers here assumed TEXINPUTS covers even bib
> >>files. (see the posts on \input@path) I wouldn't mind if BIBINPUTS were not
> >>even configurable, make them . and the current document directory.
> >>I don't see why this is such a big deal. It's even standard latex behavior,
> >>it always searches in the current dir. The trouble with LyX is that it
> >>compiles in a temp dir, but does not copy any files it does not know of.
> >
> >This last observation suggests what is the minimal change to be performed,
> >i.e., let the latex run work as if the document dir was the current
> >directory. This means setting the relevant environment variables such
> >that the document dir is also scanned, without replicating the setting
> >for TEXINPUTS. I'll prepare a patch along these lines for review.
> 
> 
> I thank you for that! I'd be glad to be the first one to test it in both
> Windows and Linux.

Please, find attached the patch I come up with. It seems to work for me.

> Philip Pirrip wrote on 2015-09-02:
> > Since the way \input@path is being used in the biblatex hack from
> > http://wiki.lyx.org/BibTeX/Biblatex is barely legal, maybe LyX should
> > define its own command, say \LyX@basepath that'd contain the absolute
> > path to the master .lyx document (no qoutes, no curly braces - only for
> > the brave).
> > Would you be willing to do that? (being that biblatex support is nowhere
> > on the horizon yet)
> 
> Georg: After all these discussions it is clear that something like this is
> needed.
> However, I do not want to clutter all documents with that (since 95% of the
> users don't need it). I would prefer a solution where we extend the layout
> definition language so that you could use a placeholder that will be
> replaced by LyX with the master document path. Then everybody who needs this
> path could write a module that pulls in the path into a LaTeX macro in the
> most simple case, or in more advanced cases it could directly be used in the
> preamble code that needs it.

I still think this is not necessary. Instead of fiddling with \input@path,
if you are willing to add the --enable-write18 option to your call for
latex, the following lines in the preamble should do the trick:

\usepackage{catchfile,ifplatform}
\immediate\write18{kpsewhich --var-value=TEXINPUTS > \jobname.tmp}
\CatchFileDef{\temp}{\jobname.tmp}{\endlinechar=-1}
\ifwindows
  \def\getdocdir#1;#2;#3;#4\next{\gdef\docdir{#3}}
\else
  \def\getdocdir#1:#2:#3\next{\gdef\docdir{#2}}
\fi
\expandafter\getdocdir\temp\next

After that, you have the path to the document dir in the macro \docdir.
The only catch is that TEXINPUTS might be customized, but then one
could use BIBINPUTS instead, if the patch is accepted.

-- 
Enrico
diff --git a/src/support/filetools.cpp b/src/support/filetools.cpp
index 204c842..310e621 100644
--- a/src/support/filetools.cpp
+++ b/src/support/filetools.cpp
@@ -710,8 +710,12 @@ string latexEnvCmdPrefix(string const & path, string const 
& lpath)
        string texinputs_prefix = lyxrc.texinputs_prefix.empty() ? string()
                : os::latex_path_list(
                        replaceCurdirPath(path, lyxrc.texinputs_prefix));
+       string const allother_prefix = os::latex_path_list(path);
        string const sep = string(1, os::path_separator(os::TEXENGINE));
        string const texinputs = getEnv("TEXINPUTS");
+       string const bibinputs = getEnv("BIBINPUTS");
+       string const bstinputs = getEnv("BSTINPUTS");
+       string const texfonts = getEnv("TEXFONTS");
 
        if (use_lpath) {
                string const abslpath = FileName::isAbsolute(lpath)
@@ -727,13 +731,28 @@ string latexEnvCmdPrefix(string const & path, string 
const & lpath)
 
        if (os::shell() == os::UNIX)
                return "env TEXINPUTS=\"." + sep + texinputs_prefix
-                                         + sep + texinputs + "\" ";
+                                          + sep + texinputs + "\" "
+                        + "BIBINPUTS=\"." + sep + allother_prefix
+                                          + sep + bibinputs + "\" "
+                        + "BSTINPUTS=\"." + sep + allother_prefix
+                                          + sep + bstinputs + "\" "
+                        + "TEXFONTS=\"."  + sep + allother_prefix
+                                          + sep + texfonts + "\" ";
        else
-               // NOTE: the dummy blank dir is necessary to force the
+               // NOTE: the dummy blank dirs are necessary to force the
                //       QProcess parser to quote the argument (see bug 9453)
                return "cmd /d /c set \"TEXINPUTS=." + sep + " "
-                                               + sep + texinputs_prefix
-                                               + sep + texinputs + "\" & ";
+                                               + sep + texinputs_prefix
+                                               + sep + texinputs + "\" & "
+                              + "set \"BIBINPUTS=." + sep + " "
+                                               + sep + allother_prefix
+                                               + sep + bibinputs + "\" & "
+                              + "set \"BSTINPUTS=." + sep + " "
+                                               + sep + allother_prefix
+                                               + sep + bstinputs + "\" & "
+                              + "set \"TEXFONTS=."  + sep + " "
+                                               + sep + allother_prefix
+                                               + sep + texfonts + "\" & ";
 }
 
 
diff --git a/src/support/os_cygwin.cpp b/src/support/os_cygwin.cpp
index 572273c..3464c04 100644
--- a/src/support/os_cygwin.cpp
+++ b/src/support/os_cygwin.cpp
@@ -438,11 +438,21 @@ bool autoOpenFile(string const & filename, auto_open_mode 
const mode,
 {
        string const texinputs = os::latex_path_list(
                        replaceCurdirPath(path, lyxrc.texinputs_prefix));
+       string const otherinputs = os::latex_path_list(path);
        string const sep = windows_style_tex_paths_ ? ";" : ":";
-       string const oldval = getEnv("TEXINPUTS");
-       string const newval = "." + sep + texinputs + sep + oldval;
+       string const oldtexinputs = getEnv("TEXINPUTS");
+       string const newtexinputs = "." + sep + texinputs + sep + oldtexinputs;
+       string const oldbibinputs = getEnv("BIBINPUTS");
+       string const newbibinputs = "." + sep + otherinputs + sep + 
oldbibinputs;
+       string const oldbstinputs = getEnv("BSTINPUTS");
+       string const newbstinputs = "." + sep + otherinputs + sep + 
oldbstinputs;
+       string const oldtexfonts = getEnv("TEXFONTS");
+       string const newtexfonts = "." + sep + otherinputs + sep + oldtexfonts;
        if (!path.empty() && !lyxrc.texinputs_prefix.empty()) {
-               setEnv("TEXINPUTS", newval);
+               setEnv("TEXINPUTS", newtexinputs);
+               setEnv("BIBINPUTS", newbibinputs);
+               setEnv("BSTINPUTS", newbstinputs);
+               setEnv("TEXFONTS", newtexfonts);
                cygwin_internal(CW_SYNC_WINENV);
        }
 
@@ -453,7 +463,10 @@ bool autoOpenFile(string const & filename, auto_open_mode 
const mode,
                                        win_path.c_str(), NULL, NULL, 1)) > 32;
 
        if (!path.empty() && !lyxrc.texinputs_prefix.empty()) {
-               setEnv("TEXINPUTS", oldval);
+               setEnv("TEXINPUTS", oldtexinputs);
+               setEnv("BIBINPUTS", oldbibinputs);
+               setEnv("BSTINPUTS", oldbstinputs);
+               setEnv("TEXFONTS", oldtexfonts);
                cygwin_internal(CW_SYNC_WINENV);
        }
        return success;
diff --git a/src/support/os_unix.cpp b/src/support/os_unix.cpp
index 81cbb35..9109fbb 100644
--- a/src/support/os_unix.cpp
+++ b/src/support/os_unix.cpp
@@ -298,14 +298,29 @@ bool autoOpenFile(string const & filename, auto_open_mode 
const mode,
 
        string const texinputs = os::latex_path_list(
                replaceCurdirPath(path, lyxrc.texinputs_prefix));
-       string const oldval = getEnv("TEXINPUTS");
-       string const newval = ".:" + texinputs + ":" + oldval;
-       if (!path.empty() && !lyxrc.texinputs_prefix.empty())
-               setEnv("TEXINPUTS", newval);
+       string const otherinputs = os::latex_path_list(path);
+       string const oldtexinputs = getEnv("TEXINPUTS");
+       string const newtexinputs = ".:" + texinputs + ":" + oldtexinputs;
+       string const oldbibinputs = getEnv("BIBINPUTS");
+       string const newbibinputs = ".:" + otherinputs + ":" + oldbibinputs;
+       string const oldbstinputs = getEnv("BSTINPUTS");
+       string const newbstinputs = ".:" + otherinputs + ":" + oldbstinputs;
+       string const oldtexfonts = getEnv("TEXFONTS");
+       string const newtexfonts = ".:" + otherinputs + ":" + oldtexfonts;
+       if (!path.empty() && !lyxrc.texinputs_prefix.empty()) {
+               setEnv("TEXINPUTS", newtexinputs);
+               setEnv("BIBINPUTS", newbibinputs);
+               setEnv("BSTINPUTS", newbstinputs);
+               setEnv("TEXFONTS", newtexfonts);
+       }
        status = LSOpenFromURLSpec (&launchUrlSpec, NULL);
        CFRelease(launchItems);
-       if (!path.empty() && !lyxrc.texinputs_prefix.empty())
-               setEnv("TEXINPUTS", oldval);
+       if (!path.empty() && !lyxrc.texinputs_prefix.empty()) {
+               setEnv("TEXINPUTS", oldtexinputs);
+               setEnv("BIBINPUTS", oldbibinputs);
+               setEnv("BSTINPUTS", oldbstinputs);
+               setEnv("TEXFONTS", oldtexfonts);
+       }
        return status == 0;
 #else
        // silence compiler warnings
diff --git a/src/support/os_win32.cpp b/src/support/os_win32.cpp
index 0928259..c50fa05 100644
--- a/src/support/os_win32.cpp
+++ b/src/support/os_win32.cpp
@@ -544,19 +544,34 @@ bool autoOpenFile(string const & filename, auto_open_mode 
const mode,
 {
        string const texinputs = os::latex_path_list(
                        replaceCurdirPath(path, lyxrc.texinputs_prefix));
+       string const otherinputs = os::latex_path_list(path);
        string const sep = windows_style_tex_paths_ ? ";" : ":";
-       string const oldval = getEnv("TEXINPUTS");
-       string const newval = "." + sep + texinputs + sep + oldval;
-       if (!path.empty() && !lyxrc.texinputs_prefix.empty())
-               setEnv("TEXINPUTS", newval);
+       string const oldtexinputs = getEnv("TEXINPUTS");
+       string const newtexinputs = "." + sep + texinputs + sep + oldtexinputs;
+       string const oldbibinputs = getEnv("BIBINPUTS");
+       string const newbibinputs = "." + sep + otherinputs + sep + 
oldbibinputs;
+       string const oldbstinputs = getEnv("BSTINPUTS");
+       string const newbstinputs = "." + sep + otherinputs + sep + 
oldbstinputs;
+       string const oldtexfonts = getEnv("TEXFONTS");
+       string const newtexfonts = "." + sep + otherinputs + sep + oldtexfonts;
+       if (!path.empty() && !lyxrc.texinputs_prefix.empty()) {
+               setEnv("TEXINPUTS", newtexinputs);
+               setEnv("BIBINPUTS", newbibinputs);
+               setEnv("BSTINPUTS", newbstinputs);
+               setEnv("TEXFONTS", newtexfonts);
+       }
 
        // reference: http://msdn.microsoft.com/en-us/library/bb762153.aspx
        char const * action = (mode == VIEW) ? "open" : "edit";
        bool success = reinterpret_cast<int>(ShellExecute(NULL, action,
                to_local8bit(from_utf8(filename)).c_str(), NULL, NULL, 1)) > 32;
 
-       if (!path.empty() && !lyxrc.texinputs_prefix.empty())
-               setEnv("TEXINPUTS", oldval);
+       if (!path.empty() && !lyxrc.texinputs_prefix.empty()) {
+               setEnv("TEXINPUTS", oldtexinputs);
+               setEnv("BIBINPUTS", oldbibinputs);
+               setEnv("BSTINPUTS", oldbstinputs);
+               setEnv("TEXFONTS", oldtexfonts);
+       }
        return success;
 }
 

Reply via email to