我正在尝试解析命令行中给 lualatex 的额外参数 — — 例如lualatex --jobname=out in.tex myarg
。
虽然我在文档中找不到它,但我发现了这个答案我可以使用该arg
变量来访问命令行参数。但是,这些给我全部给予 lualatex 的参数,包括选项和输入文件。
目前我的代码看起来像这样:
function get_args()
arguments = {}
reached_doc_arguments = false
document_arg_position = -1
for index,argument in ipairs(arg) do
if reached_doc_arguments then
arguments[index - document_arg_position] = argument
elseif argument:match("%.tex$") then
document_arg_position = index
reached_doc_arguments = true
end
end
return arguments
end
但是,如果省略.tex
后缀,并且在输入文件后给出选项,则此方法会失败。我无法跳过第一个参数,因为可能指定了选项,并且如上所述,我不能使用 \jobname 或 status.filename。
我想知道是否有一种更完整的方法来做这样的事情?
答案1
LuaTeX 解析其命令行参数的方式如下:
- 如果参数包含反斜杠
\
,则将其和所有其他参数视为 TeX 代码 - 如果参数以破折号开头
-
,则将其视为引擎的标志 - 如果该参数是第一个不以反斜杠或破折号开头的参数,则将其视为文件名(
.tex
如果不存在则隐式) - 否则,忽略该参数
为了仅捕获引擎忽略的这些最终参数,您需要以与引擎相同的方式处理这些参数。我相信此代码可以满足您的要求:
\documentclass{article}
\usepackage{luacode}
\begin{luacode*}
function get_args()
local arguments = {}
local filename_found = false
for _, argument in ipairs(arg) do
if argument:match("^%-") then -- Flags
-- Ignore this argument
elseif argument:match("\\") then -- Inline TeX code
-- Ignore all following arguments
break
elseif not filename_found then
filename_found = true
else
arguments[#arguments + 1] = argument
end
end
return arguments
end
\end{luacode*}
\begin{document}
Arguments: \directlua{
for _, argument in ipairs(get_args()) do
tex.sprint(argument .. " ")
end
}
\end{document}