在 Mac OS X 和 Ubuntu 中进行了多次测试后,我无法arara
按照 Brent Longborough 的xelatexmk.yalm
规则运行。无论我做什么,arara
似乎都会运行latexmk
和pdflatex
,而不是xelatex
。我已与 Brent 讨论过这个问题,他很友善地向我提供了力所能及的帮助,但无济于事。(他没有遇到这个问题,即使使用我的文件!)我没有使用任何.latexmkrc
文件进行测试。
如果我尝试使用其他的arara
规则(例如xelatex.yalm
),它们可以正常工作。我的系统(系统!)或设置有问题,不允许我使用 Brentxelatexmk.yalm
规则。
有任何想法吗?
这是我的 MWE:
% arara: xelatexmk
\documentclass{article}
\usepackage{xltxtra}
\begin{document}
Testing . . .
\end{document}
这是我本次运行的编译日志文件:http://pastebin.com/jXYPQhAz
这是arara
的日志文件:http://pastebin.com/VYMi4Xca
这是我的xelatexmk.yalm
文件:
!config
# LaTeXmk with XeLaTeX rule for arara
# author: Brent Longborough
# last edited by: Brent Longborough
# made to work by: Paulo Cereda
identifier: xelatexmk
name: XeLaTeXmK
command: 'latexmk -e "$pdflatex=q/xelatex @{ action == "" ? "" : "--interaction=" + action } @{shell} @{ synctex == "" ? "--synctex=1" : synctex } @{expandoptions} %O %S/" @{ist} -pdf @{file}.tex'
arguments:
- identifier: action
flag: '@{value}'
- identifier: shell
flag: '@{value.toLowerCase() == "yes" || value.toLowerCase() == "true" || value.toLowerCase() == "on" ? "--shell-escape" : "--no-shell-escape" }'
- identifier: synctex
flag: '@{value.toLowerCase() == "no" || value.toLowerCase() == "false" || value.toLowerCase() == "off" ? "--synctex=0" : "--synctex=1" }'
- identifier: expandoptions
flag: '@{value}'
- identifier: ist
flag: '-e "$makeindex=q/makeindex %O -s @{value}.ist -o %D %S/"'
TeXLive
我在Ubuntu
12.04 LTS (所有更新) 中使用2012 (所有更新) Precise Pangolin
。MacTeX
在 (所有更新) 中使用 2012 (所有更新)。此外,我还使用了(v.2.0) 和(v.4.31)OS X Mountain Lion
的最新版本。arara
latexmk
答案1
更新如下:
错误发生的原因有两个
- 的论点
latexmk
不喜欢空格。(这可以解决) - 您无法将选项传递给
latexmk
。我猜 perl 解释器可以处理这个问题。的作者arara
提到 扩展已由 正确完成,棘手的部分依赖于通过标志arara
提交给 Perl 解释器的替换代码。-e
latexmk
latexmk
关于为什么它适用于 Windows 而不适用于 Unix/Mac 的完整解释可以在第 5 页的文档中找到
在命令行中,需要注意正确引用代码中的特殊字符。例如,假设您想设置 latex 命令以使用其
-shell-escape
选项,那么在 UNIX/LINUX 下,您可以使用以下行latexmk -e '$latex=q/latex %O -shell-escape %S/' file.tex
请注意,单引号会阻止普通 UNIX/LINUX 命令 shell 将引号内的字符视为特殊字符。(在此示例中,构造
q/.../
是与使用单引号等效的 Perl 习惯用法。这避免了在已引用的字符串中获取引号字符的复杂性,这种方式与 shell 和操作系统无关。)上述命令行在带有 或cmd.exe
或command.com
的MS-Windows 下不起作用4nt.exe
。对于带有这些命令 shell 的 MS-Windows,您可以使用latexmk -e "$latex=q/latex %O -shell-escape %S/" file.tex
或者
latexmk -e "$latex='latex %O -shell-escape %S'" file.tex
最后两个示例不适用于 UNIX/LINUX 命令 shell。
您可以使用latexmk
像下面示例这样的简单规则,或者组合一些基本规则,如xelatex
、makeindex
和clean
。
请使用以下规则:
!config
# Simple LaTeXmk with XeLaTeX rule for arara
# author: Marco Daniel
identifier: xelatexmk
name: XeLaTeXmK
command: 'latexmk -e "$pdflatex=q/xelatex%O%S/" -pdf @{file}.tex'
arguments: []
在新版本 4.31 (或更新版本) 中,latexmk
John Collins 提供了一些额外的选项。John Collins 写道:
顺便说一句,自 v. 4.31 以来,latexmk 支持 pdflatex 和朋友的大多数选项,包括
-synctex=...
和-interaction=....
它还有一个-xelatex
选项。因此,现在使用复杂构造来获取所需的 pdflatex 命令行的需要少了很多。不幸的是,我(尚未)将其纳入文档。运行latexmk --showextraoptions
以查看它目前支持哪些选项,除了列出的选项之外latexmk --help
。 – John Collins 4 小时前
根据此信息,您可以将以下规则与 tex 文件内的所有选项一起使用。
!config
# LaTeXmk with XeLaTeX rule for arara
# author: Brent Longborough
# last edited by: Brent Longborough
# made to work by: Paulo Cereda
identifier: xelatexmk
name: XeLaTeXmKFixed
command: 'latexmk -e "$pdflatex=q/xelatex%O%S/" @{ action == "" ? "" : " -interaction=" + action } @{ synctex == "" ? "--synctex=1" : synctex } @{shell} @{expandoptions} @{ist} -pdf @{file}.tex'
arguments:
- identifier: action
flag: '@{value}'
- identifier: shell
flag: '@{value.toLowerCase() == "yes" || value.toLowerCase() == "true" || value.toLowerCase() == "on" ? " -shell-escape" : " -no-shell-escape" }'
- identifier: synctex
flag: '@{value.toLowerCase() == "no" || value.toLowerCase() == "false" || value.toLowerCase() == "off" ? " -synctex=0" : " -synctex=1" }'
- identifier: expandoptions
flag: ' @{value}'
- identifier: ist
flag: ' -e "$makeindex=q/makeindex %O -s @{value}.ist -o %D %S/"'
答案2
实际的答案已经由 Marco 给出了,我只是补充一些借口解释。:)
首先,非常感谢你提供的这个案例研究。:)
我一定会深入研究这种奇怪的行为,并尝试找到一些答案。
现在,我仅补充 Marco 的回答,它为您提供了一个实用的解决方案,而且确实是正确的方法。
正如伟大的约翰·柯林斯在latexmk
手册中提到的那样,让事情按照我们期望的方式跨平台运行是相当复杂的。每个系统都有自己的特点、局限性和烦恼。
arara
依赖于库来进行系统调用。这是必要的,因为不是每个操作系统的行为都相同 - 即使在类 Unix 中,我们也可能限制缓冲区大小,从而导致死锁。这个核心组件arara
运行良好,但遗憾的是可能会有误导算法的棘手条目。
仅举一个例子:arara
不允许子 shell 或命令连接。在我看来,这种行为其实很好。这是一种强迫用户编写更简洁规则的方式。
对于latexmk
,一个简单的规则就可以了。现在,有了更复杂的结构,事情可能会变得令人困惑。多亏了SystemUtils
orb 标签,我们可以根据底层操作系统添加有关特定命令的条件表达式;我们可以轻松地用单引号替换双引号,正如手册中latexmk
所说的那样。但我们正在处理一个更复杂的命令,它涉及故意从调用中更改 Perl 变量latexmk
。
标志允许我们向执行流注入任意值。从中-e
,我们可以看到 - 通过生成的- 将指令扩展为命令是简洁的 - 如果我们将其复制/粘贴到终端并运行它,该命令实际上是正确的。真正的问题是执行组件如何将整个命令解析为可执行文件 + 参数。将标志中的整个值视为一个字符串似乎存在问题。latexmk
arara
.log
arara
-e
遗憾的是,我现在没有办法测试它。谢天谢地,几天后,我的 Mountain Lion 和 TeX Live 2012 就可以运行了,这样我就可以报告结果了。目前,按照 Marco 的建议,编写一条简单的规则,这是我能想到的唯一方法。
无论是latexmk
还是都不arara
是罪魁祸首。或者至少,我们不能arara
因为猜测复杂命令的错误解析而责怪它。它通常能正确完成所有操作,但您知道,我们总是会遇到一些例外。我会看看我能做些什么,也许在下一个版本中。
答案3
对优秀但过时的早期答案的更新:使用 Arara 4.0,现在可以使用 xelatex 和 latexmk 规则% arara: latexmk: { engine: xelatex }
。请参阅官方第 116 页手动的。
答案4
通过从规则中删除双引号 ("),它现在似乎可以工作了。我已将 (") 替换为成对的 ('),这似乎是在规则中转义单引号的方法。
还有更多的测试要做,但我知道这解决了 OP 的问题。
修正后的规则为:
!config
# LaTeXmk with XeLaTeX rule for arara
# author: Brent Longborough
# last edited by: Brent Longborough
# made to work on Win by: Paulo Cereda
# and on Unix & Mac by: Marco Daniel
# and then by Brent Longborough again, maybe
identifier: xelatexmk
name: XeLaTeXmK
command: 'latexmk -e ''$pdflatex=q/xelatex%O%S/''@{ action == "" ? "" : " -interaction=" + action }@{ synctex == "" ? " --synctex=1" : synctex }@{shell}@{expandoptions}@{ist} -pdf @{file}.tex'
arguments:
- identifier: action
flag: '@{value}'
- identifier: shell
flag: '@{value.toLowerCase() == "yes" || value.toLowerCase() == "true" || value.toLowerCase() == "on" ? " -shell-escape" : " -no-shell-escape" }'
- identifier: synctex
flag: '@{value.toLowerCase() == "no" || value.toLowerCase() == "false" || value.toLowerCase() == "off" ? " -synctex=0" : " -synctex=1" }'
- identifier: expandoptions
flag: ' @{value}'
- identifier: ist
flag: ' -e ''$makeindex=q/makeindex %O -s @{value}.ist -o %D %S/'''