使用 Arara 指令将 pdf 从构建文件夹移动到根文件夹

使用 Arara 指令将 pdf 从构建文件夹移动到根文件夹

我尝试在“_build”子目录中创建所有辅助文件,但自动将创建的 PDF 移回与 .tex 相同的目录。

换句话说,我希望将 .tex 和 .pdf 放在一个文件夹中,将其他构建文件放在“_build”文件夹中。

我想我可以用 arara 的 move 命令来实现这一点。但我不知道如何自动化文件名。

梅威瑟:

% arara: lualatex: { options:  [ '--output-directory=_build' ], draft: true }
% arara: biber: { options: ['--output_directory=_build'] }
% arara: lualatex: { options:  [ '--output-directory=_build' ], synctex: true }
% arara: lualatex: { options:  [ '--output-directory=_build' ], synctex: true }
% arara: move: {  files: [ '_build/tmp.pdf' ], target: ['./'] }

\documentclass{report}
\usepackage{lipsum}
\begin{document}
  \lipsum[5]
\end{document}

我宁愿不需要为每个新文档或文件名更改更改序言。但我不知道如何让这样的事情发挥作用:

% arara: move: {  files: [ '_build/@{getBasename(currentFile())}.pdf' ], target: ['./'] }

我怎样才能实现这个目标?

答案1

正如评论中提到的,orb 标签扩展只允许在内部进行options,而不允许在其他键中进行,因此尝试在内部扩展基本名称引用files将会失败。这是设计使然,因为团队不希望任意进行 orb 标签扩展。话虽如此,我们始终欢迎功能请求。:)

解决这种情况的典型方法是使用自定义规则,也许是对现有规则的扩展move。但是,在这个答案中,我将采取另一种方法,并使用 MVEL 和 Java 方法在条件范围内提供解决方案:

% arara: lualatex: { options:  [ '--output-directory=_build' ] }
% arara: halt if a = getOriginalReference().getName();
% arara: --> b = a.substring(0, a.lastIndexOf('.'));
% arara: --> c = toFile(b + '.pdf');
% arara: --> d = toFile('_build/' + b + '.pdf');
% arara: --> d.renameTo(c); true

\documentclass{report}
\usepackage{lipsum}
\begin{document}
\lipsum[5]
\end{document}

让我们从第二行开始分析一下这里发生的事情:

% arara: halt if a = getOriginalReference().getName();

我将halt在本例中使用指令,因为它只是暂停工具。条件的第一部分获取原始引用(无论files)并提取文件名作为字符串。a然后变量只保存.tex文件名(没有路径引用)。

% arara: --> b = a.substring(0, a.lastIndexOf('.'));

变量b保存不带相应扩展名的文件名a。这相当于获取基本名称,例如,如果a = foo.tex,则b = foo

% arara: --> c = toFile(b + '.pdf');

变量c现在保存文件基名加上后缀.pdf作为File参考。

% arara: --> d = toFile('_build/' + b + '.pdf');

类似地,变量d保存文件基名加上.pdf附加到_build/字符串的后缀,指示路径位置。变量将所有这些作为File引用保存。

% arara: --> d.renameTo(c); true

现在,有了两个File引用,我们只需使用Java 中的方法告诉d将其重命名为。最后,我只需用 结束条件,这表明应该继续。crenameTo(...)truehalt

希望能帮助到你。:)

评论更新:使用时renameTo(...),人们可能会观察到该方法的行为是本质上依赖于平台。一个可能的替代方案是利用moveNIO 中的操作。将最后一条指令行替换FilesStandardCopyOption

% arara: --> d.renameTo(c); true

经过

% arara: --> java.nio.file.Files.move(d.toPath(), c.toPath(),
% arara: --> java.nio.file.StandardCopyOption.REPLACE_EXISTING);
% arara: --> true

这样就可以了。

相关内容