我的整个文档中有以下 LaTeX 编码,并且想要进行全局转换:
\author{Bronnikov Kirill A{$^{1}$}{$^{2}$}{$^{3}$}}
\author{Santos N O{$^{4}$}{$^{5}$}}
\author{Wang Anzhong{$^{6}$}{$^{7}$}{$^{8}$}}{$^{9}$}}
应该
\author{Kirill A Bronnikov{$^{1}$}, {$^{2}$} and {$^{3}$}}
\author{N O Santos{$^{4}$} and {$^{5}$}}
\author{Anzhong Wang{$^{6}$}, {$^{7}$}, {$^{8}$}} and {$^{9}$}}
我的 Lua 脚本是:
TeXInput=string.gsub(TeXInput,[[{%$%^{(.-)}%$}{%$%^{(.-)}%$}]],[[{$^{%1}$},{$^{%2}$}]])
但是这只是转换单个地方,如何and
使用 Lua 添加最终文本?
答案1
您的正则表达式应该是%$}{%$
。请注意,美元符号在 Lua 正则表达式中具有特殊含义,用百分号(即转义字符)进行转义。
您必须应用此正则表达式两次:首先,插入逗号,将替换次数限制为模式数减一;其次,插入“and”。
string:gmatch
将返回迭代器,可用于计算所需分隔符的数量,并string:gsub
进行替换。
local tex = '{$^{1}$}{$^{2}$}{$^{3}$}'
local function commafy (text)
local pattern = '%$}{%$'
local count = 0
for _ in tex:gmatch (pattern) do
count = count + 1
end
return tex:gsub (pattern, '$}, {$', count - 1):gsub (pattern, '$} and {$')
end
print (commafy (tex))
答案2
据我所知,您的示例匹配所有出现的情况,而不仅仅是第一次
测试lua
{$^{1}$}{$^{2}$}{$^{3}$}
{$^{a}$}{$^{b}$}{$^{c}$}
和一个 Lua 文件
local f = io.open("testlua.tex")
local TeXInput = f:read("*a")
f:close()
TeXInput=string.gsub(TeXInput,
[[{%$%^{(.-)}%$}{%$%^{(.-)}%$}{%$%^{(.-)}%$}]],
[[{$^{%1}$},{$^{%2}$} and {$^{%3}$}]])
print(TeXInput)
产生此终端输出
$ texlua dd316.lua
{$^{1}$},{$^{2}$} and {$^{3}$}
{$^{a}$},{$^{b}$} and {$^{c}$}