在包含 LaTeX 命令的 LuaTeX 参数中匹配 %s 时遇到问题

在包含 LaTeX 命令的 LuaTeX 参数中匹配 %s 时遇到问题

我希望我能清楚地传达这一点。我一直在尝试将一个参数传递给包含 LaTeX 命令的 Lua 函数。通常这可以正常工作,但如果 Lua 尝试在此参数中匹配/替换 %s,它似乎会将该命令视为没有花括号并且仅对以下单个字符进行操作。因此,使用文件“new.lua”中的代码如下...

local function test(str)
    newstr = str:gsub("(-+)","X")
    tex.print(newstr)
end

return {test=test}

并在 LaTeX 中编写以下内容:

\documentclass{article}
\usepackage{luacode}
\directlua{lua = require("new.lua")}
\newcommand{\test}[1]{\directlua{lua.test(\luastringN{#1})}}

\begin{document}

\test{aaa-\textbf{bbb}-ccc}

\end{document}

我得到了期望的结果:

极光bbb韓國

但如果我尝试用空格代替-,如下所示:

(卢阿)

local function test(str)
    newstr = str:gsub("(%s+)","X")
    tex.print(newstr)
end

return {test=test}

(乳胶)

\documentclass{article}
\usepackage{luacode}
\directlua{lua = require("new.lua")}
\newcommand{\test}[1]{\directlua{lua.test(\luastringN{#1})}}

\begin{document}

\test{aaa \textbf{bbb} ccc}

\end{document}

我得到了错误的输出

啊啊啊啊啊啊啊啊啊啊啊

并出现以下错误:

! Undefined control sequence.
l.1 aaaX\textbfX
              {bbb}Xccc
l.8 \test{aaa \textbf{bbb} ccc}

在尝试解决这个问题时,我注意到,将这里的 X 替换为非字母字符会使命令仅对该字符进行操作,然后在整个单元后“添加”空格。因此,使用以下 Lua...

local function test(str)
    newstr = str:gsub("(%s+)","1")
    tex.print(newstr)
end

return {test=test}

和前面的例子一样,我得到:

AAA1级1bbb1ccc

理想情况下,我希望 match/sub 将 LaTeX 命令视为不涉及“隐藏”空格(如果这有意义的话);也就是说,我只想匹配实际书写的 LaTeX 中存在的空格。

我知道这个问题源于对 TeX 处理标记的方式的错误理解,但我不确定如何纠正它或正确理解它。

答案1

\textbf {bbb}当 LaTeX 传递参数 时,会插入中的空格#1,因此之前 已经\directlua涉及。因此,您无法从 Lua 方面采取任何措施来阻止这种情况。要从 LaTeX 方面解决这个问题,您需要使用一些类别代码等技巧,但效果并不好。

作为一种解决方法,您可以从 Lua 中删除插入的空间,替换模式

反斜杠字母字符 [可能的空格] [花括号或方括号]

具有相同的序列,但没有空格。带有可选参数的命令被标记为\command [optional argument]{normal argument},因此空格始终位于命令后面。

梅威瑟:

local function test(str)
    --texio.write(str)
    newstr = str:gsub("(\\%a+)%s-([{[])","%1%2")
    --texio.write(newstr)
    newstr = newstr:gsub("(%s+)","1")
    tex.print(newstr)
end

return {test=test}
\documentclass{article}
\usepackage{luacode}
\directlua{lua = require("new.lua")}
\newcommand{\test}[1]{\directlua{lua.test(\luastringN{#1})}}

\begin{document}
\test{aaa \textbf{bbb} ccc}

\end{document}

结果:

在此处输入图片描述

相关内容