我有以下乳胶文件:
\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-latexmkrc
latexmk 发行版中的文件中。这为使用 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 更为通用。