我以前从未尝试过在文档中包含 Lua 代码,所以请多多包涵。我追求的是一个模式匹配表达式,最终会采用(stuff1)->(stuff2)
并替换它,!(stuff1)||(stuff2)
但首先要迈出一小步...
在本页底部:使用 Lua 进行编程提到了匹配平衡字符串的模式。在修改了一些我在地点我决定尝试以下方法:
\documentclass{article}
\def\swap#1{%
\directlua{%
local s, _ = string.gsub("#1","%b()%b()","%2%1")
tex.sprint(s)}
}
\begin{document}
\swap{(a)(b)}
\end{document}
这根本不起作用。有人能解释一下我做错了什么吗?
答案1
该模式%b()%b()
不包含捕获,因此%1
和%2
未分配。您需要一对额外的括号
(%b())(%b())
下一个问题是,百分比字符在 TeX 中通常是注释字符。有很多方法可以解决这个问题,下面的示例将字符串与百分比字符分开定义在一个组中,其中百分比字符的 catcode 更改为数字等符号的 catcode。另请参阅包luacode
。
使用"#1"
是有风险的,#1
可能包含破坏字符串语法的内容。因此我添加了\luatexluaescapestring
(LuaLaTeX 中的名称\luaescapestring
)。
\documentclass{article}
\begingroup
\catcode`\%=12\relax
\gdef\swapgsubargs{"(%b())(%b())","%2%1"}
\endgroup
\def\swap#1{%
\directlua{%
local s, _ = string.gsub("\luatexluaescapestring{#1}",\swapgsubargs)
tex.sprint(s)%
}%
}
\begin{document}
\swap{(a)(b)}
\end{document}