尝试创建模块函数时出现错误未定义的控制序列

尝试创建模块函数时出现错误未定义的控制序列

在下面的代码中,名为的函数json_parser用于解析 JSON。我最初将这个函数保留为一个单独的模块,json.lua并使用以下命令来调用它:

local json = require("json")

但出于某种原因,我想将其打包到一个文件中,并尝试用它创建一个函数。它工作正常,但在将其设为函数后,我收到错误。我在 latex 文件中使用此代码并使用 运行它lualatex

    \begin{luacode}
    local function json_parser()
        local lpeg = assert(require("lpeg"))
        local C, Cf, Cg, Ct, P, R, S, V =
            lpeg.C, lpeg.Cf, lpeg.Cg, lpeg.Ct, lpeg.P, lpeg.R, lpeg.S, lpeg.V

        -- number parsing
        local digit    = R"09"
        local dot      = P"."
        local eE       = S"eE"
        local sign     = S"+-"^-1
        local mantissa = digit^1 * dot * digit^0 + dot * digit^1 + digit^1
        local exponent = (eE * sign * digit^1)^-1
        local real     = sign * mantissa * exponent / tonumber

        -- optional whitespace
        local ws = S" \t\n\r"^0

        -- match a literal string surrounded by whitespace
        local lit = function(str)
            return ws * P(str) * ws
        end

        -- match a literal string and synthesize an attribute
        local attr = function(str,attr)
            return ws * P(str) / function() return attr end * ws
        end

        -- JSON grammar
        local json = P{
            "object",

            value =
                V"null_value" +
                V"bool_value" +
                V"string_value" +
                V"real_value" +
                V"array" +
                V"object",

            null_value =
                attr("null", nil),

            bool_value =
                attr("true", true) + attr("false", false),

            string_value =
                ws * P'"' * C((P'\\"' + 1 - P'"')^0) * P'"' * ws,

            real_value =
                ws * real * ws,

            array =
                lit"[" * Ct((V"value" * lit","^-1)^0) * lit"]",

            member_pair =
                Cg(V"string_value" * lit":" * V"value") * lit","^-1,

            object =
                lit"{" * Cf(Ct"" * V"member_pair"^0, rawset) * lit"}"
        }

        return { parse = function(str) return assert(json:match(str)) end }
    end

    local socket = require("socket")

    local json = json_parser()
    local file = io.open("sample-true.json")
    local start = socket.gettime()
    tab = json.parse(file:read("*all"))
    texio.write_nl("Time passed parsing JSON: " .. socket.gettime() - start .. " s\string\n")
    file:close()
\end{luacode}

黄色部分是我遇到的错误。这可能是什么原因造成的? 在此处输入图片描述

答案1

luacode 环境仍然执行 tex 命令,因此 \t 爆炸。使用 luacode* 环境:

\documentclass{article}
\usepackage{luacode}

% gives error:
\begin{luacode}
 -- \t
\end{luacode}

% works:
\begin{luacode*}
 -- \t 
\end{luacode*}


\begin{document}

bkbkbk
\end{document}

相关内容