本人使用TeXstudio编辑器。因latex编译的.toc文件
为什么不从根源出发,直接修复.tex文件的问题。
但每次编译前都要修改文件太繁琐,想通过宏(Script Macros)命令解决。
从你的描述来看,这个问题和「对任意一个文本文件进行该操作」无异,只是这个文件恰好是「.toc」,因此可以认为这个问题和LaTeX其实不太相关。
曾尝试通过AI生成脚本,但执行总通不过。
你并未提供别人可以复现的所有必要信息。
你最好举例说明.toc文件的具体情况,具体要如何匹配「删除文件中全部有字符串\selectlanguage *{sanskrit}和\selectlanguage *[script=Devanagari,numerals=Devanagari]{sanskrit}的行;」。例如这里\selectlanguage其后是否总是有空格,是否除了这两种情况还可能有其他的情况,这都可能影响脚本的写法。
最好补充给一个.toc修改前的范例和预期的脚本处理结果。否则别人不容易复现和测试。
Edited:
要注意阅读文档:
- https://texstudio-org.github.io/advanced.html#script-macros
- https://doc.qt.io/qt-6/qtqml-javascript-functionlist.html
应该先明确这个「编辑宏」的功能支持哪些语法....「QFile未定义显然是因为TeXStudio的脚本功能不支持这个"类"...」
我稍微vibe了一下,下面这个脚本似乎可行:
function cleanToc() {
var texFile = app.getCurrentFileName();
if (!texFile) {
alert("没有打开任何文件。");
return;
}
var tocFile = texFile.replace(/\.[^.]+$/, "") + ".toc";
var content = readFile(tocFile);
if (content === undefined || content === null) {
alert("无法读取 " + tocFile);
return;
}
var lines = content.split(/\r?\n/);
var result = [];
var deleted = 0;
// 匹配所有 \selectlanguage *{sanskrit} 以及带可选参数的形式
var re = /^\s*\\selectlanguage\s*\*(?:\[[^\]]*\])?\{sanskrit\}/i;
for (var i = 0; i < lines.length; i++) {
var line = lines[i];
if (re.test(line.trim())) {
deleted++;
continue;
}
result.push(line);
}
writeFile(tocFile, result.join("\n"));
alert("清理完成:删除 " + deleted + " 行。\n文件:" + tocFile);
}
cleanToc();但是你没有提供别人可以复现的条件...我无法测试...
Before

Run

After

其中
// 匹配所有 \selectlanguage *{sanskrit} 以及带可选参数的形式
var re = /^\s*\\selectlanguage\s*\*(?:\[[^\]]*\])?\{sanskrit\}/i;为匹配的正则表达式,可能要按需修改。
另外,为什么不从源头入手,「目录有问题」具体是哪里有问题?上述工作流非常不顺畅,而且路径也是写死的...
总的来说这个需求并不太合理....





























问 TeXstudio编辑器下“编辑宏”(Script Macros)问题