Arara xelatexmk 规则存在问题

Arara xelatexmk 规则存在问题

在 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我在Ubuntu12.04 LTS (所有更新) 中使用2012 (所有更新) Precise PangolinMacTeX在 (所有更新) 中使用 2012 (所有更新)。此外,我还使用了(v.2.0) 和(v.4.31)OS X Mountain Lion的最新版本。araralatexmk

答案1

更新如下:

错误发生的原因有两个

  1. 的论点latexmk不喜欢空格。(这可以解决)
  2. 您无法将选项传递给latexmk。我猜 perl 解释器可以处理这个问题。的作者arara提到 扩展已由 正确完成,棘手的部分依赖于通过标志arara提交给 Perl 解释器的替换代码。-elatexmk

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.execommand.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像下面示例这样的简单规则,或者组合一些基本规则,如xelatexmakeindexclean

请使用以下规则:

!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 (或更新版本) 中,latexmkJohn 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,一个简单的规则就可以了。现在,有了更复杂的结构,事情可能会变得令人困惑。多亏了SystemUtilsorb 标签,我们可以根据底层操作系统添加有关特定命令的条件表达式;我们可以轻松地用单引号替换双引号,正如手册中latexmk所说的那样。但我们正在处理一个更复杂的命令,它涉及故意从调用中更改 Perl 变量latexmk

标志允许我们向执行流注入任意值。从中-e,我们可以看到 - 通过生成的- 将指令扩展为命令是简洁的 - 如果我们将其复制/粘贴到终端并运行它,该命令实际上是正确的。真正的问题是执行组件如何将整个命令解析为可执行文件 + 参数。将标志中的整个值视为一个字符串似乎存在问题。latexmkarara.logarara-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/'''

相关内容