我希望我能清楚地传达这一点。我一直在尝试将一个参数传递给包含 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}
结果: