有没有人有我可以与 TeXworks 一起使用的搜索和替换 lua 脚本的示例。我这里有一个相当大的文档(大约 3'000 页 DIN A5),我需要不断更新。为了更改$
和\$
进行各种其他替换,我想运行一个“全部替换”脚本,该脚本可以在一次运行中完成所有替换。
当需要从 MS Word 或 WWW 等中获取文本时,这可能非常有用。
答案1
你的问题很有趣,我保证会尽快点赞。和往常一样,我的票数已经用完了。
我会尽量写一个谦虚的答案。如果解决方案可能因任何错误或烦恼而造成任何麻烦,我真的很抱歉,我是 Lua 新手。:)
首先,我们需要在 TeXworks 中启用脚本语言插件。我们只需转到选项卡Preferences
中的即可完成此操作Scripts
:
我们只需要勾选复选框即可。:)
现在,让我们看看将脚本放在哪里。转到Scripts
、Scripting TeXworks
、Show Scripts Folder
:
操作系统文件管理器将出现我们想要的文件夹。:)
在我的 Mac 上,它位于~/Library/TeXworks/scripts
。现在,创建一个名为的新文件replaceList.lua
并添加以下内容,就像它:
--[[TeXworksScript
Title: Replace list
Description: A replacement script
Author: Paulo Cereda
Version: 1.0
Date: 2012-11-28
Script-Type: standalone
Context: TeXDocument
]]
-- implements the 'strip' function in order to extract
-- elements from a string according to a specific
-- separator. The output is a table containing each
-- element from the input string.
-- Thanks to the http://lua-users.org/wiki/SplitJoin wiki.
string.split = function(str, pattern)
pattern = pattern or "[^%s]+"
if pattern:len() == 0 then
pattern = "[^%s]+"
end
local parts = {__index = table.insert}
setmetatable(parts, parts)
str:gsub(pattern, parts)
setmetatable(parts, nil)
parts.__index = nil
return parts
end
-- gets a string containing a list of patterns. This is
-- the first dialog window that appears in the script
-- execution.
local listOfPatterns = TW.getText(nil, "List of patterns to replace - 1/2", "Please, add a list of patterns to replace, separated by comma.")
-- gets a string containing a list of words to replace the
-- patterns obtainted in the previous step. This is the
-- second dialog window that appears in the script
-- execution
local listOfReplacements = TW.getText(nil, "List of patterns to replace - 2/2", "Please, add a list of replacements, separated by comma.")
-- checks if both inputs are valid
if (listOfPatterns ~= nil) and (listOfReplacements) then
-- split the patterns into elements of a table. In our
-- case, the separator is a comma.
local patternsToLook = string.split(listOfPatterns, "[^,%s]+")
-- split the values into elements of a table. In our case,
-- the separator is a comma.
local valuesToReplace = string.split(listOfReplacements, "[^,%s]+")
-- the number of elements of both tables must be equal
if (#patternsToLook == #valuesToReplace) then
-- iterate through the patterns table
for index, currentValue in ipairs(patternsToLook) do
-- select all the text from the current
-- document
TW.target.selectAll();
-- get all the selected text
local text = TW.target.selection
-- checks if there's actually a text
if (text ~= nil) then
-- replace all occurrences of the current
-- pattern by its corresponding value
local toReplace, _ = string.gsub(text, currentValue, valuesToReplace[index])
-- insert modified text into the
-- document
TW.target.insertText(toReplace)
end
end
end
end
我向 Patrick、Taco 和其他 Lua 大师表示诚挚的歉意。:)
现在,我们的文件夹中有一个新文件replaceList.lua
:
现在,回到 TeXworks,我们需要重新加载脚本列表。这很简单,我们需要转到Scripts
、Scripting TeXworks
、Reload Scripts List
:
完成。:)
让我们创建一个测试文件:
是时候运行我们的脚本了。只需转到Scripts
并选择Replace list
:
现在,TeXworks 脚本 API 的魔力将显现出来。首先,我们将定义要查找的模式列表:
我猜是支持正则表达式的。
我告诉我们的脚本寻找三个单词,以逗号分隔。单击后OK
,将出现一个新窗口,其中包含替换单词列表:
当然,两个列表必须具有相同的大小。:)
单击 后OK
,将显示新文本:
好了!:)
希望我的回答能帮到你。:)