Mail Archives: cygwin/2005/12/07/12:44:34
OK, let's back up a bit, and see why kpsexpand is needed in the first
place.
Graphics in Octave use gnuplot. The legend function from Octave Forge
sends a "save FILE" command to gnuplot so that it can extract some
information about gnuplot's current state. If you do the following
mv /usr/bin/kpsexpand. /usr/bin/kpsexpand-save
gnuplot
...
gnuplot> save "foo"
you should see the errors
sh: kpsexpand: command not found
So, why does gnuplot need kpsexpand to save state? Looking at the
gnuplot sources, one finds
/* Yet, no special font paths for these operating systems:
* MSDOS, ATARI, AMIGA, MTOS, NeXT, ultrix, VMS, _IBMR2, alliant
*
* Environmental variables are written as $(name).
* Commands are written as $`command`.
*/
[...]
#if defined(_Windows) && !defined(FONTPATHSET)
# define FONTPATHSET
static const struct path_table fontpath_tbl[] =
{
{ "$(windir)\\fonts" },
/* Ghostscript */
{ "c:\\gs\\fonts" },
/* X11 */
{ "$(CYGWIN_ROOT)\\usr\\X11R6\\lib\\X11\\fonts\\Type1" },
/* fpTeX */
{ "$`kpsewhich -expand-path=$HOMETEXMF`\\fonts\\type1!" },
{ "$`kpsewhich -expand-path=$TEXMFLOCAL`\\fonts\\type1!" },
{ "$`kpsewhich -expand-path=$TEXMFMAIN`\\fonts\\type1!" },
{ "$`kpsewhich -expand-path=$TEXMFDIST`\\fonts\\type1!" },
{ NULL }
};
#endif
[...]
/* Fallback: Should work for unix */
#ifndef FONTPATHSET
static const struct path_table fontpath_tbl[] =
{
/* teTeX or TeXLive */
{ "$`kpsexpand '$HOMETEXMF'`/fonts/type1!" },
{ "$`kpsexpand '$TEXMFLOCAL'`/fonts/type1!" },
{ "$`kpsexpand '$TEXMFMAIN'`/fonts/type1!" },
{ "$`kpsexpand '$TEXMFDIST'`/fonts/type1!" },
/* Linux paths */
{ "/usr/X11R6/lib/X11/fonts/Type1" },
{ "/usr/X11R6/lib/X11/fonts/truetype" },
/* HP-UX */
{ "/usr/lib/X11/fonts!"},
/* Ghostscript */
{ "/usr/share/ghostscript/fonts" },
{ "/usr/local/share/ghostscript/fonts" },
{ NULL }
};
#endif
[...]
switch (action) {
case ACTION_CLEAR:
/* Clear fontpath, fall through to init */
FPRINTF((stderr, "Clear fontpath\n"));
free(fontpath);
fontpath = p = last = NULL;
/* HBB 20000726: 'limit' has to be initialized to NULL, too! */
limit = NULL;
case ACTION_INIT:
/* Init fontpath from environment */
FPRINTF((stderr, "Init fontpath from environment\n"));
assert(fontpath == NULL);
if (!fontpath)
{
char *envlib = getenv("GNUPLOT_FONTPATH");
if (envlib) {
/* get paths from environment */
int len = strlen(envlib);
fontpath = gp_strdup(envlib);
/* point to end of fontpath */
last = fontpath + len;
/* convert all PATHSEPs to \0 */
PATHSEP_TO_NUL(fontpath);
}
#if defined(HAVE_DIRENT_H) || defined(_Windows)
else {
/* set hardcoded paths */
const struct path_table *curr_fontpath = fontpath_tbl;
[...]
in src/variable.c. The above is taken from a recent CVS checkout, but
the 4.0.0 sources for the current Cygwin package have similar lines.
So gnuplot is using kpsexpand to locate some font files.
It looks like there are a couple of options.
One is to set GNUPLOT_FONTPATH in the environment before calling
gnuplot.
Another is to make a wrapper kpsexpand that looks for the real version
and does nothing if the real version is not present:
#! /bin/sh
if [ -x /usr/bin/kpsexpand ]; then
exec /usr/bin/kspexpand "$@"
fi
(though you might want to add some comments about why this is needed).
If the real kpsexpand is not present, then chances are the font files
are not -either, so it should not matter that the corresponding
directories named in the fontpath are bogus. You could install the
wrapper script in one of the directories in Octave's DEFAULT_EXEC_PATH
(for example, /usr/lib/octave/2.1.72/exec/i686-pc-cygwin, where a
couple of other scripts are already installed), then it would only be
found by Octave and should not introduce any other conflicts.
jwe
--
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
Problem reports: http://cygwin.com/problems.html
Documentation: http://cygwin.com/docs.html
FAQ: http://cygwin.com/faq/
- Raw text -