我正在尝试在 texstudio 中使用 latexdiff 脚本。以下脚本有什么问题。
%SCRIPT
var cf = app.getCurrentFileName();
var ld = new String(cf);
ld=ld.substring(0,ld.lastIndexOf("/"));
information("Select original file");
fileChooser.setDir(ld);
fileChooser.setFilter("TeX files (*.tex)");
fileChooser.exec();
var fold=new String();
fold=fileChooser.fileName();
fold=fold.substring(fold.lastIndexOf("/")+1);
information("Select revised file");
fileChooser.setDir(ld);
fileChooser.setFilter("TeX files (*.tex)");
fileChooser.exec();
var fnew=new String();
fnew=fileChooser.fileName();
fnew=fnew.substring(fnew.lastIndexOf("/")+1);
information("Select changes tracking file");
fileChooser.setDir(ld);
fileChooser.setFilter("TeX files (*.tex)");
fileChooser.exec(fout);
var fout=new String();
fout=fileChooser.fileName();
fout=fout.substring(fout.lastIndexOf("/")+1);
var cmd=new String();
cmd="cd "+ld+" ; latexdiff-so "+fold+" "+fnew+" > "+fout+"\"";
dialog=new UniversalInputDialog();
dialog.add(cmd,"run command?");
var rpl=dialog.exec();
if(rpl!=null){
system(cmd);
}
delete(cmd);
delete(dialog);
delete(fold);
delete(fnew);
delete(fout);
delete(ld);
当我尝试运行该脚本时出现以下错误:
“不支持指定的 stdout 重定向:“> CHANGE.tex”。请参阅手册了解详细信息。”
答案1
我花了很多功夫处理输出重定向,因为它似乎自上次回答以来就被破坏了。系统()现在似乎会丢弃“>”符号后面的所有内容,即使它在 cmd 字符串中被引号括起来(Windows 10 上的 TeXstudio 2.12.0)。我的解决方案是重定向到/dev/null(支持此功能),这样就可以检索 latexdiff 的输出读取所有标准输出字符串()在从返回的进程对象上系统()然后将其写入文件并编译并显示结果(使用buildManager进行猜测)。
我希望我的 TeXstudio latexdiff 脚本版本对其他人有用。不使用“cmd”,因此它可能也可以在非 Windows 上运行。
%SCRIPT
// Execute latexdiff-so with current file as new file
// optional magic comments in .tex file as input parameters:
// !TeX latexdiff:original = <original file>
// !TeX latexdiff:output = <output file>
// Requires perl and latexdiff to be installed
var cf = app.getCurrentFileName();
var ld = new String(cf);
ld=ld.substring(0,ld.lastIndexOf("/")); //Local directory
fnew = cf;
var fold = editor.document().getMagicComment("latexdiff:original");
if(fold == "")
{
fileChooser.setDir(ld);
fileChooser.setFilter("TeX files (*.tex)");
fileChooser.exec();
fold=fileChooser.fileName();
}
var fout = String(editor.document().getMagicComment("latexdiff:output"));
if(fout == "") // if path not given in magic comment
{
fileChooser.setDir(ld);
fileChooser.setFilter("TeX files (*.tex)");
fileChooser.exec();
fout=fileChooser.fileName();
}
else if(!((fout.indexOf(":") != -1) || (fout.indexOf("/")==0)))
fout = ld + '/' + fout; // if relative path, make absolute
var proc = system("latexdiff-so \"" + fold + "\" \"" + fnew + "\" > /dev/null", ld)
proc.waitForFinished();
writeFile(fout, proc.readAllStandardOutputStr());
//app.load(fout); // load diff file
buildManager.runCommand("txs:///quick", fout);
//app.load(fnew); // change back to original file
delete(proc);
delete(fold);
delete(fout);
delete(fnew);
delete(cf);
delete(ld);
答案2
所有命令都直接执行。不涉及 shell。如果您需要 shell 功能,则必须将调用包装在 shell 中:
sh -c "/path/to/testscript foo > bar"
或者在 Windows 上:
cmd /C "/path/to/testscript.bat foo > bar"
请参阅章节Shell 功能在里面用户手册。
答案3
Christian 的脚本对我来说不太管用。使用 Windows。经过大量实验后,以下是有效的方法:
...
var ldfout = ld+"\\"+fout;
var cmdstr = new String();
cmdstr = "latexdiff-so "+fold+" "+fnew+" > /dev/null";
var proc = system("cmd /C "+cmdstr,ld);
proc.waitForFinished();
writeFile(ldfout, proc.readAllStandardOutputStr());
app.load(ldfout); // load diff file
buildManager.runCommand("txs:///quick", ldfout);
注意事项:
"cmd /C "
需要system
调用 Windows。writeFile
写入 TekStudio 路径,除非fout
有全局路径
答案4
正如 epR8GaYuh 所建议的,这是脚本的原始来源。
需要说明的是,代码未在视频中列出。单击视频下方评论中的“显示更多”即可获得链接。