texstudio 的 latexdiff 脚本

texstudio 的 latexdiff 脚本

我正在尝试在 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 所建议的,这是脚本的原始来源。

https://www.youtube.com/redirect?v=IAWEywCx9hQ&event=video_description&q=https%3A%2F%2Fgoo.gl%2FXTsv8i&redir_token=1t3DFuFCfMZZsmqSds-otFoISsF8MTU0NTExMTU2NkAxNTQ1MDI1MTY2

需要说明的是,代码未在视频中列出。单击视频下方评论中的“显示更多”即可获得链接。

正确的视频是带有此图像的 YouTube 视频,开头是蝴蝶。在此处输入图片描述

相关内容