latexmk 带有外部引用

latexmk 带有外部引用

有没有办法让 latexmk 知道外部引用,因为它们是通过 xr 包导入的?我的问题是我有几个每周练习表的文件。有时我会引用通过 xr 包包含的早期练习(很棒的东西……)。当出现错误时,我有时必须在下一个练习表发布后才能更正练习表。所以我想要一个已经改变latexmk file2的识别file1,因此file1在处理之前必须重新编译file2……?

当然,我可以(实际上也确实)将所有内容放在一个大的 make 文件中,该文件根据各个文件的依赖关系调用 latexmk 命令,但是有没有一种 latexmk 固有的方法可以自动化这一过程?

答案1

  • 下列标记依赖关系在外部texaux主文件中的文件上,即使这些文件尚不存在(否则就没有tex文件依赖性,aux如果文件不存在,文件依赖性不会自动发生 - 包生成的警告xr不会被处理,latexmk因为它与标准 LaTeX 警告不同;即文件名后缺少一个句点)。
  • 然后它使用自定义依赖以便latexmk它知道如何构建aux文件。如果aux需要重新生成具有不同根文件名的文件,则会导致latexmk处理相应的作业(在单独的系统调用)。请注意,使用此方法,latexmk处理外部文档时生成的任何警告都将不是在主要运行结束时进行总结,并且$max_repeat和的概念Run number $pass{$rule} of rule '$rule'被弱化!
  • latexmk当激活该选项时效果最佳recorder(自 v4.31 起为默认设置,否则可通过命令行选项-recorder=1或中的相应行启用.latexmkrc);如果没有该选项,可能会错过对外部aux文件的更改,但对外部tex文件的更改仍将启动正确的处理。
  • 目前,这需要使用命令\myexternaldocument而不是\externaldocument,尽管原始命令可以修补。

为了更好地说明,我提供了一个最小示例(尽管问题中没有提供)的代码。下面显示了三个文件:file1.texfile2.tex.latexmkrc

  • file1中引用了某件事file2
  • 执行latexmk file1足以正确构建file1file2
  • 请记住,使用该-deps选项latexmk将显示依赖数据库,并可能有助于验证事情进展情况。
  • 请注意注释行file2.tex以便于测试。

这里是file1.tex

\documentclass{article}

%%% HELPER CODE FOR DEALING WITH EXTERNAL REFERENCES
\usepackage{xr}
\makeatletter
\newcommand*{\addFileDependency}[1]{% argument=file name and extension
  \typeout{(#1)}% latexmk will find this if $recorder=0 (however, in that case, it will ignore #1 if it is a .aux or .pdf file etc and it exists! if it doesn't exist, it will appear in the list of dependents regardless)
  \@addtofilelist{#1}% if you want it to appear in \listfiles, not really necessary and latexmk doesn't use this
  \IfFileExists{#1}{}{\typeout{No file #1.}}% latexmk will find this message if #1 doesn't exist (yet)
}
\makeatother

\newcommand*{\myexternaldocument}[1]{%
    \externaldocument{#1}%
    \addFileDependency{#1.tex}%
    \addFileDependency{#1.aux}%
}
%%% END HELPER CODE

% put all the external documents here!
\myexternaldocument{file2}

% just to see what's happening
\listfiles

\begin{document}

Label1 is on page \pageref{label1} of file2.

\end{document}

file2.tex

\documentclass{article}
\usepackage{lipsum}
\begin{document}
%\lipsum[1-10]% to test, comment or uncomment this line, and rerun `latexmk file1`. Note that both are then rebuilt as necessary and the page number in the generated `file1` is always correct.
\section{Label1}
\label{label1}
This is referenced by file1.
\end{document}

最后.latexmkrc

add_cus_dep( 'tex', 'aux', 0, 'makeexternaldocument' );

sub makeexternaldocument {
    # if the dependency isn't one of the files that this latexmk run will consider, process it
    # without this test, we would get an infinite loop!
    if (!($root_filename eq $_[0]))
    {
        system( "latexmk \"$_[0]\"" );
    }
}

答案2

除非两个或多个文件之间存在内部链接,否则我怀疑 latexmk 不会识别这一点。因此,两种情况是:

  1. 多个文件之间的内部链接:例如,如果 file1.tex 中有此短语,则如果 file2 或 file3 等发生变化,latexmk 将识别出需要重新编译

    %文件1.tex

    \begin{document}
    
    \input{file2.tex}
    \input{file3.tex}
    
    \end{document}
    

    %文件 1.tex 结束

  2. 生成文件:但是如果你在生成文件或普通 unix 脚本文件中使用 for 循环,其中的内容如下:

    for /r %%x in (*.tex) do pdflatex "%%x"
    

    那么 LaTeX 就会识别出一个微小的变化,但它只是一个 for 循环,而不是 latexmk 执行的单独行。

希望对您有所帮助。希望看到其他人能为您提供解决方案。

相关内容