finding locations of many files via kpse
Erik Nijenhuis
erik at xerdi.com
Tue Aug 6 11:38:58 CEST 2024
Hi Karl,
On Mon, 2024-08-05 at 14:18 -0600, Karl Berry wrote:
> Specifically, I used getopt_long_only pervasively throughout the TeX
> engines, drivers, etc., back when I unified option handling among the
> programs extant in the late 1980s. Programs added since then sometimes
> use getopt_long_only, sometimes not. We use the Perl equivalent of
> getopt_long_only in tlmgr and install-tl.
Thanks, that clarifies a lot!
> I don't know what you mean. lua-alt-getopt was an early Lua option
> parsing package written independently by Aleksey Cheusov (and not
> updated since 2010). It's not used within TL as far as I know.
> Grepping in a bindir, I see that luaotfload-tool uses it, and, so far as
> that grep showed, nothing else.
Because it would be nice if there's a utility which makes it easy and consistent
for anyone who would want to create a CLI in LuaTeX. However, the script I
mentioned doesn't support `getopt_long_only` after some investigation
unfortunately...
> Me too. That's why I used it. At some point I had to copy the source
> files into TL (kpathsea/getopt*) because of incompatibilities, but it's
> still GNU getopt.
>
> However, from a historical standpoint, the alternative getopt
> library within TeX Live should be favored instead,
>
> I'm not aware of any "alternative library" in TL (for C).
Thanks for clarifying. With alternative library I meant the getopt files in TL.
Didn't know it's an exact copy of GNU getopt.
So to follow up on Norbert's synopsis, it could be something like:
```lua
local function parse_opts(args)
local options = {
mark_sys_files = false,
progname = "lualatex"
}
local remaining_args = {}
local i = 1
while i <= #args do
local arg = args[i]
if arg:match("^%-%-?mark%-sys%-files$") then
options.mark_sys_files = true
elseif arg:match("^%-?%-?progname=") then
options.progname = arg:match("^%-?%-?progname=(.*)")
elseif arg:match("^%-?%-?progname$") then
i = i + 1
if i <= #args then
options.progname = args[i]
else
error("Option 'progname' requires an argument")
end
else
table.insert(remaining_args, arg)
end
i = i + 1
end
return options, remaining_args
end
local function parse_args(args)
local options, remaining_args = parse_opts(args)
if #remaining_args == 0 then
error("Expected subdir argument")
end
local subdir = remaining_args[1]
return options, subdir
end
local options, subdir = parse_args(arg)
if options.mark_sys_files then
print("System files will be marked.")
else
print("System files will not be marked.")
end
print("Program name:", options.progname)
print("Subdirectory:", subdir)
```
This would then work for the following cases:
```bash
texlua norbert-search.lua --mark-sys-files --progname=myprogram subdir
texlua norbert-search.lua --mark-sys-files --progname myprogram subdir
texlua norbert-search.lua -mark-sys-files -progname=myprogram subdir
texlua norbert-search.lua -mark-sys-files -progname myprogram subdir
```
Although, subdir might be an option as well and by default the cwd.
Best, Erik
More information about the texhax
mailing list.