如何配置 latexmk 以递归方式工作?(PDF 缩略图)

如何配置 latexmk 以递归方式工作?(PDF 缩略图)

我正在写一本书,其中将包含并解释一些不同的回忆录页面布局。

设置场景

在书中,我想要嵌入使用页面布局生成的 PDF 的页面缩略图,我已经成功做到了这一点\includegraphics[...]{<pdfname>}

那么,顶级文档“mlayout.tex”包含一系列 PDF 的页面,称为“mlayout-a”、“mlayout-b”等。

在下一级,文档(“mlayout-a.tex”等)在几行中设置样式(a、b、c…),并以\input{mlayout-text}

''mlayout-text.tex'' 包含 lipsum 的内容。我需要说明一些\marginparlipsum 或 blindtext 无法为我完成的具体事情,所以我使用这个第三级文件。

问题

这种依赖关系的嵌套似乎需要 latexmk;如果我更改 mlayout-text.tex,它将(我希望)使我能够简单地重新处理 mlayout.tex,从而自动重新生成所有中间 PDF。

第一次尝试,没有对 latexmkrc 进行任何修改,也没有尝试生成中间 PDF,因此我向 latexmkrc 添加了自定义依赖项:

add_cus_dep('tex', 'pdf', 0, 'maketex2pdf');
sub maketex2pdf {
    system("latexmk -pdf $_[0]");
}

但是,据我所知,它仍然无法检测到最低级文件(mlayout-text)的变化。

我究竟做错了什么?

笔记:我没有包含 MWE(以节省大量空间和大量时间);如果您认为问题需要,请发表评论,我会添加一个定制的(即小的)MWE。

答案1

你没有做错什么。在内部,latexmk 会使用单个源文件生成自定义依赖项,并且没有内置查找其他源文件的方法。递归调用的 latexmk 确实有此信息,但不会将其传播回调用者。但你可以使用 latexmk 的内部子例程通过一些技巧来获取此信息。在 latexmkrc 文件中,将 maketex2pdf 的定义更改为

sub maketex2pdf {

    # Make pdf file from tex file, recording dependencies
    my $dep_file = "$_[0].dep";
    system("latexmk -pdf -deps -deps-out=$dep_file $_[0]");

    # Read the list of dependencies, which is in the
    #   format of a fragment of a makefile.
    # In the precise format written by latexmk, source filenames on a
    #   are each on a separate line starting with white space; these
    #   lines often end with a continuation character.
    my $fh = new FileHandle "< $dep_file";
    if (! defined $fh ) {
        warn "maketex2pdf: Cannot read '$dep_file'\n";
        return;
    }
    while ( <$fh> ) {
        # Ignore comment lines:
        if ( /^\s*#/ ) { next; }
        if ( /^\s+(.*)$/ ) {
            # Line containing name of source file
            my $dep = $1;
            # Remove continuation character:
            $dep =~ s/\\$//;
            # Make sure this file is in the list of source files for the
            # current rule, by calling rdb_ensure_rule.  This is an 
            # internal latexmk subroutine.  The first argument to this
            # subroutine is $rule, which is a global variable that
            # indicates what rule is currently being processed.
            rdb_ensure_file( $rule, $dep );
        }
    }
    close $fh;
    return 0;
}

这对我构建的 MWE 起作用。

相关内容