latexmk -outdir 带有 \include

latexmk -outdir 带有 \include

我正在尝试让 latexmk 编译一个带有\include{...}对特定build目录的外部引用的 .tex 文件,这样我就不会用.aux文件等污染我的目录树。

然而,它latexmk在编译包含的文件时似乎没有像我预期的那样工作。例如,考虑一个file1.tex包含以下内容的文件

%%%%%
\include{chapters/test}
%%%%%

当我跑步时

latexmk -pdf -pdflatex="pdflatex -interaction=nonstopmode -file-line-error" file1.tex

一切正常,但是

latexmk -pdf -pdflatex="pdflatex -interaction=nonstopmode -file-line-error" -outdir=build file1.tex

给了我错误

Latexmk: Missing input file: 'chapters/test.aux' from line
  'No file chapters/test.aux.'

如果我没有该\include语句,\input而是使用,则所有内容都会像您期望的那样顺利编译到构建目录中。

作为参考,我在使用 MacTeX 的 Mac OSX 上工作,据我所知,MacTeX 和 MikeTeX 在实现上存在一些差异latexmk...如能得到任何帮助我将非常感激,因为我已经为此苦苦思索了一段时间。

答案1

实际上,这不是latexmk问题。如果您查看.log文件或实际屏幕输出,您会发现它pdflatex有问题。如果您pdflatex从命令行使用该-output-directory=build选项运行,您将得到完全相同的错误。主要错误是pdflatex无法创建文件chapters/test.aux

解决方案很简单,就是创建chapters构建目录的子目录。

(您看到的消息latexmk是其对当前编程为常见的重要警告和错误的总结。但这是一个不完整的总结。一般来说,如果您发现错误但不明白如何处理,那么值得查看该文件;它提供的信息比总结.log多得多。)latexmk

答案2

正如@john-collins 上面所写的,这不是问题,latexmk而是你的 tex 解释器中的问题pdflatex

解决您的问题的另一个方法是重新定义\include命令以在实际执行之前创建输出目录\include

我的实施如下lualatex

\ifluatex%
    \directlua{%
        function makeparentdirs(path_with_filename)
            local mkdirp = require('mkdirp_lua/mkdirp')
            mkdirp(path_with_filename)

            require('lfs')
            % -- delete lowest directory which collides with file name
            if lfs.attributes(path_with_filename).mode == 'directory' then
                lfs.rmdir(path_with_filename)
            end
        end
    }%
\fi

\let\OLDinclude\include
\renewcommand{\include}[1]{%
    \ifluatex%
        \directlua{makeparentdirs(\luastring{\auxdirname} .. '/' .. \luastring{#1})}%
    \fi%
    \OLDinclude{#1}%
}

但这个解决方案并不好,因为:

  • 根据平台和命令行开关的不同,辅助文件的目录可能会有所不同。您必须\newcommand*{\auxdirname}{auxdir}先通过运行或类似命令来手动定义它。
  • 它依赖于一个单独的 lua 库https://github.com/xpol/mkdirp.lua

该解决方案适用于 tikz 的外部库,该库还需要在使用自定义(非自动编号)目录时创建 outdir/auxdir 中的文件夹。

答案3

有两种可能性:

  1. 我也遇到了这些错误,当使用\doincludeonly来自https://en.wikibooks.org/wiki/TeX/includeonly在这种情况下,可以安全地忽略这些错误。

    但是,如果您愿意,您可以在使用命令之前生成文档的完整版本,从而使 latex 停止生成这些错误\doincludeonly

    然后,下次,它就不会抛出错误,直到您清除文件的乳胶缓存。

  2. 也可能由于此错误而发生如何在 Tex Live 上报告 pdflatex/latexmk 上的 --output-directory 错误?它不会自行创建输出目录。因此,您只能手动创建目录。

    你可以使用这个我无法在文件“foo.aux”上写入自己创建目录结构。

    您还可以看到为什么 latex 没有告诉我哪个命令未定义?了解有关其他错误的更多信息。

相关内容