我尝试在“_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
将其重命名为。最后,我只需用 结束条件,这表明应该继续。c
renameTo(...)
true
halt
希望能帮助到你。:)
评论更新:使用时renameTo(...)
,人们可能会观察到该方法的行为是本质上依赖于平台。一个可能的替代方案是利用move
NIO 中的操作。将最后一条指令行替换Files
为StandardCopyOption
% arara: --> d.renameTo(c); true
经过
% arara: --> java.nio.file.Files.move(d.toPath(), c.toPath(),
% arara: --> java.nio.file.StandardCopyOption.REPLACE_EXISTING);
% arara: --> true
这样就可以了。