What does kpsewhich stand for?
Karl's Path SEarch Library WHICH
As info kpathsea
says (online manual here), Kpathsea is a library for path searching (e.g., for very quickly locating a given .sty
file in a set of potentially large TEXMF trees, without doing a recursive directory tree traversal every time a given file is needed; this is important when compiling LaTeX documents using several packages, themselves requiring other packages, possibly various font files, etc.).
This path search gives the pathse
part, abbreviated as pse
. The “which“ reminds of the Unix which
utility, which tells you the path of the executable run for a given command, according to your PATH environment variable. For instance:
$ which find
/usr/bin/find
I believe the “k” stands for “Karl Berry”. :-)
Complements
The comparison between which
and kpsewhich
goes further than that. As Unix shells often maintain a cache of executables present in directories of the PATH in order to offer efficient lookup for command completion, the Kpathsea library maintains a filename database (comprised of the ls-R
files in each TEXMF tree) in order to offer similar fast lookup to TeX-related programs.
In Unix shells, the cache can often be updated with a hash command (hash -r
in Bash, rehash
in Zsh) when you've added or removed executables from your PATH and wish to refresh the cache without restarting your shell; for the Kpathsea library, the corresponding operation is done with mktexlsr
, also known as texhash
.
Finally, which
looks up a given executable in the directories listed in PATH1, in some way similarly as kpsewhich
for finding a TeX-related file using either on-disk lookup or only the filename database (it depends on whether the TEXMF tree is preceded with !!
where it is used in texmf.cnf
2). kpsewhich
is more sophisticated than a typical which
builtin, though, as it can return different results depending on what was given as -progname
, has a notion of variables that can be set in texmf.cnf
, can look up in-cache-only or on-disk depending on the per-directory-settings in texmf.cnf
, etc.
Footnotes
In Bash and Zsh at least, it seems to really search the PATH: if you add a new executable to a directory of your PATH, the
which
builtin of these shells finds it right away without any need to runhash -r
orrehash
(this may not be the case for command completion).See for instance
/usr/share/texlive/texmf-dist/web2c/texmf.cnf
on Debian.