在 luatex 中解析附加命令行参数

在 luatex 中解析附加命令行参数

我正在尝试解析命令行中给 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 解析其命令行参数的方式如下:

  1. 如果参数包含反斜杠\,则将其和所有其他参数视为 TeX 代码
  2. 如果参数以破折号开头-,则将其视为引擎的标志
  3. 如果该参数是第一个不以反斜杠或破折号开头的参数,则将其视为文件名(.tex如果不存在则隐式)
  4. 否则,忽略该参数

为了仅捕获引擎忽略的这些最终参数,您需要以与引擎相同的方式处理这些参数。我相信此代码可以满足您的要求:

\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}

相关内容