latexmk 与 pythontex、lualatex 和长名称不起作用

latexmk 与 pythontex、lualatex 和长名称不起作用

我有以下乳胶文件:

\documentclass{article}
\usepackage[keeptemps, depythontex, runall=false, fvextfile=55]{pythontex}%rerun=always, 
\begin{document}
computed by python: \pys[sname]{1+1=!{1+1}}
\end{document}

我将其命名为manualLMP.tex。我有一个针对 latexmk 的标准配置文件,以便lualatex pythontex 可以正常工作。这次,一切都很好。

如果我调用同一个文件manualLatexMavenPlugin.tex,它就不起作用了。重要的是名称要长一点。如果我运行

latexmk manualLatexMavenPlugin -lualatex="pdflatex %O %S"

或者与 xelatex 相同,但与 lualatex 不同。

我必须承认,我不明白 .latexmkrc 文件。核心是

$extra_rule_spec{'pythontex'} = [ 'internal', '', 'mypythontex', "%R.pytxcode", "pythontex-files-%R/%R.pytxmcr", "%R", 1 ];

不幸的$extra_rule_spec是 latexmk 文档中没有提到。此外,我找不到有关此文档所指 latexmk 版本的任何信息。我​​使用 latexmk 4.79,luahbtex 版本 1.16。发行版是 texlive。

只是一个观察:只有当我使用 lualatex 运行 latexmk 时我才会收到反馈:

Latexmk: Missing input file 'pythontex-files-manualLatexMavenPlugin/manualLatexMavenPlugin.pytxmcr.Run PythonTeX to create it' (or dependence on it) from following:

这可能表明被Run解释为扩展名。只有文件名很长时才会发生粘合。这也可能是 lualatex 或 latexmk 中的一个错误。

我认为,第一步应该研究 latexmk 使用的机制。

答案1

回答这个问题可以提供一些关于在非平凡情况下 latexmk 中“幕后”发生的事情的信息。

语境:Pythontex 允许 .tex 文档在 Python 中运行计算,然后排版结果。pythontex 的基本工作流程是 (a) 使用 pythontex 编译 .tex 文档包裹. (b)运行 pythontex程序读取步骤(a)中生成的指定计算的文件。(c)再次编译.tex 文档以使用步骤(b)的结果。

配置latexmk 使用 pythontex:所需代码位于pythontex-latexmkrclatexmk 发行版中的文件中。这为使用 pythontex 程序设置了一个“规则”。其主要输入文件是在 tex 文档的 *latex 编译中生成的扩展名为 pytxcode 的文件。其主要输出文件扩展名为 pytxmcr,并由文档的下一个编译读取。该规则使用 Perl 子例程以适当的参数运行 pythontex 程序,然后确定依赖项:读取了哪些文件,除了主要输入和输出之外还写入了哪些文件?

功能:在 *latex 首次编译 .tex 文件时,pythontex 包会向 .log 文件写入一条警告,指出它所需的 pytxmcr 文件不存在。Latexmk 看到该警告,并发现缺失的文件可以由 pythontex 规则生成。因此,它将该规则链接到其规则网络中。规则运行,并生成缺失的文件。因此 latexmk 重新编译 .tex 文件,并读取缺失的文件。之后,有关 pythontex 包读取和写入内容的信息会出现在 fls 文件中,该文件提供了主要的依赖关系信息。

lualatex 出了什么问题:Latexmk(v. 4.80)运行了 lualatex,但没有运行 pythontex 或第二次运行 lualatex。在输出中,它说明了它正在做什么,并提供了有关它发现的内容的重要信息

Latexmk: Getting log file 'aux_dir/manualLatexMavenPlugin.log'
Latexmk: Examining 'aux_dir/manualLatexMavenPlugin.fls'
Latexmk: Examining 'aux_dir/manualLatexMavenPlugin.log'
Latexmk: Missing input file 'pythontex-files/manualLatexMavenPlugin/manualLatexMavenPlugin.pytxmcr.Run PythonTeX to create it' (or dependence on it) from following:
No file pythontex-files-manualLatexMavenPlugin/manualLatexMavenPlugin.pytxmcr.Run PythonTeX to create it.

请注意有关丢失输入文件的行中单引号的准确位置。Latexmk 报告说它认为日志文件告诉它有一个丢失的文件。但文件的扩展名不是预期的带扩展名的扩展名,.pytxmcr而是带有非常长的扩展名.pytxmcr.Run PythonTeX to create it(!)。查看日志文件显示 latexmk 将两个相邻的行连接在一起。第一行的长度为 78 个字节,latexmk 假设这对行是一行长行,并换行以使其保持在日志文件中行的长度限制内。

为什么只有 lualatex 有问题:与 pdflatex 和 xelatex 不同,lualatex 的换行相当混乱,而 latexmk 允许这种混乱。不幸的是,这导致了一个错误,latexmk 认为一行已经换行,但实际上并没有,而且当前版本中没有对此进行编程。使用 pythontex 会使问题更加严重,因为它处理的文件名相当长。

解决方法: (a) 将 .tex 文件名改得稍长或稍短一些。(b) 使用 TeXLive 发行版,将环境变量设置max_print_line为较大的值,例如 10000,以停止大量换行。(c) 手动运行 pythontex 一次,然后使用选项运行 latexmk -g。之后 latexmk 将正常工作,因为它现在从 .fls 文件中获取依赖项信息。

下一版本:latexmk 的下一个版本(可能是 4.81)将会修复此问题,这比仅针对 pythontex 更为通用。

相关内容