[luatex] kpse.find_file for (yet non-existant) output files
Lukas Heindl
oss.heindl+luatex at protonmail.com
Mon Jan 20 22:12:28 CET 2025
Hi,
I'm still working on the same project (an extraction script for the memoize package written in (tex)lua (see [1])). Now in the python version of that script there is that function `find_out` which is supposed to find a proper location for an output file. I see, the analog thing for input files can be done via `kpse.find_file` but I cannot find something implementing this for input files (which do not exist yet).
At first I thought, this function may be a bit weird, why not just directly use the path and why search multiple locations where to place this file, but according to the author [2], this is how TeX does writing output files as well (I wouldn't know as I'm not that deep into TeX stuff in this regard).
Therefore, if this is such a standard routine, I suspected there might be a similar function somewhere in the libraries included in luatex, but I can't find one. Am I just not good enough at searching, or is such a function just not available and I need to write it myself (again needing to implement more and more functions regarding pathutil stuff)?
For reference, the python implementation I'm speaking of [3]:
# This function finds the location for an output file, respecting
# |TEXMF_OUTPUT_DIRECTORY| and |TEXMFOUTPUT|, and the permissions in the
# filesystem. It returns an absolute file as-is. For a relative file, it
# tries |TEXMF_OUTPUT_DIRECTORY| (if defined), the current directory (unless
# |TEXMF_OUTPUT_DIRECTORY| is defined), and |TEXMFOUTPUT| directory (if
# defined), in this order. The first writable file found is returned; if no
# writable file is found, the file in either the current or the output
# directory is returned.
def find_out(f):
sanitize_filename(f)
if f.is_absolute():
return f
for df in (texmf_output_directory / f if texmf_output_directory else None,
f if not texmf_output_directory else None,
texmfoutput / f if texmfoutput else None):
if df and access_out(df):
return df
return texmf_output_directory / f if texmf_output_directory else f
With kind regards
Lukas
[1]: https://github.com/atticus-sullivan/memoize/tree/feat-texlua-script
[2]: https://github.com/atticus-sullivan/memoize/pull/2#issuecomment-2602732069
[3]: https://github.com/sasozivanovic/memoize/blob/ea88a43c3c7af71c9470b7d5e124dd236ea7f90c/memoize-extract.py#L218
More information about the luatex
mailing list.