Luatex 模式匹配 %b

Luatex 模式匹配 %b

我以前从未尝试过在文档中包含 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}

结果

相关内容