latexmk:-draftmode 和重新定义的命令

latexmk:-draftmode 和重新定义的命令

我有这个 MWE(test.tex):

\documentclass[11pt]{article}
\begin{document}

Text.\footnote{Footnote text.}

\end{document}

我想这样编译它:

pdflatex -draftmode \
-output-directory=/tmp \
-jobname=footnotecheck \
'\AtBeginDocument{\newcounter{MyFootnote} \NewCommandCopy\MyOldFootnote\footnote \renewcommand{\footnote}[1]{\stepcounter{MyFootnote}\label{FootnoteMark\arabic{MyFootnote}}\MyOldFootnote{\label{FootnoteText\arabic{MyFootnote}}#1}}} \input{test}'

这样,我在.aux文件中就有了这种字符串(https://tex.stackexchange.com/a/381667/33634):

\newlabel{FootnoteMark1}{{}{1}{}{}{}}
\newlabel{FootnoteText1}{{1}{1}{}{}{}}

我使用它是draftmode因为我不想/不需要生成 .pdf 文件(而且它可以工作)。

现在我需要运行该命令适当的次数。我如何.latexmkrc为该命令准备一个文件?我试过:

$pdflatex = 'pdflatex -draftmode %O %S \
   "\AtBeginDocument{\newcounter{MyFootnote} \let\MyOldFootnote\footnote \renewcommand{\footnote}[1]{\stepcounter{MyFootnote}\label{FootnoteMark\arabic{MyFootnote}}\MyOldFootnote{\label{FootnoteText\arabic{MyFootnote}}#1}}}" \
   \input %S';

$out_dir = '/tmp';
$jobname = 'footnotecheck';

和命令:

latexmk -pdf test.tex

它适用于$out_dir并且$jobname但它不会重新定义\footnote命令,并给我警告:

Failure to make 'footnotecheck.pdf'
Latexmk: Errors, so I did not complete making targets
Collected error summary (may duplicate other messages):
  pdflatex: failed to create output file

Latexmk: If appropriate, the -f option can be used to get latexmk
  to try to force complete processing.

答案1

Latexmk 有一种内置方法,可以将 TeX 代码放在给 *latex 的命令行上,然后输入所需的源文件。在 latexmk 的命令行上,您可以使用选项-usepretex。在 latexmkrc 文件中,您可以设置变量$pre_tex_code,前提是您还重新定义了 pdflatex 等命令行的变量以使用%P占位符而不是占位%S符。

基本用法:使用OP给出的代码,latexmk最简单的命令行是:

latexmk -pdf -usepretex="\AtBeginDocument{\newcounter{MyFootnote} \let\MyOldFootnote\footnote \renewcommand{\footnote}[1]{\stepcounter{MyFootnote}\label{FootnoteMark\arabic{MyFootnote}}\MyOldFootnote{\label{FootnoteText\arabic{MyFootnote}}#1}}}" test.tex

-usepretex选项有两个作用:1. 它将要传递给 *latex 的代码设置为 。2. 它将 的定义更改$pdflatexpdflatex %O %P,其中%P表示指定的代码在命令行上传递给 pdflatex ,后跟读取源文件的代码。(该-usepretex选项还会导致$latex$lualatex$xelatex按照相同模式进行设置。)

在检查/调试此类情况时,最好查看 latexmk 的输出,它会报告 latexmk 用于调用 pdflatex 的命令行,并验证 latexmk 是否正在执行您希望它执行的操作。

OP的要求: OP 想要使用一个-jobname参数、一个输出目录,并使用-draftmodepdflatex 的选项来阻止生成 pdf 文件。最后一个要求的问题是 latexmk 将丢失的 pdf 文件视​​为错误;为了满足 latexmk,可以安排命令行来制作一个虚拟 pdf 文件。这可以通过以下方式完成(对于类 Unix 操作系统)

latexmk -pdf -usepretex="\AtBeginDocument{\newcounter{MyFootnote} \let\MyOldFootnote\footnote \renewcommand{\footnote}[1]{\stepcounter{MyFootnote}\label{FootnoteMark\arabic{MyFootnote}}\MyOldFootnote{\label{FootnoteText\arabic{MyFootnote}}#1}}}" -pdflatex="touch %D; pdflatex -draftmode %O %P" -output-directory=/tmp -jobname=footnotecheck test.tex

latexmkrc 文件中的设置 按照 latexmk 文档中的模式,你可以这样做

$pre_tex_code = '\AtBeginDocument{'.
                '\newcounter{MyFootnote}'.
                '\NewCommandCopy\MyOldFootnote\footnote'.
                '\renewcommand{\footnote}[1]{'.
                    '\stepcounter{MyFootnote}'.
                    '\label{FootnoteMark\arabic{MyFootnote}}'.
                    '\MyOldFootnote{\label{FootnoteText\arabic{MyFootnote}}#1}'.
                    '}'.
                '}';
alt_tex_cmds();

后面跟着任何想要的$pdflatex变量重新定义。这里 latexmkalt_tex_cmds()设置$pdflatexpdflatex %O %P(对于$latex$lualatex和 也类似$xelatex),这样给定的代码就可以在 pdflatex 命令行上使用。我使用了 Perl 的.运算符来连接字符串,这样指定要提供给 *latex 的 TeX 代码的语句就可以更容易地读取。我使用了单引号,因为在 Perl 中这样可以避免需要引用字符\

答案2

我找到了这个解决方案:

  1. 为了将重新定义的命令传递给pdflatexlatexmk定义的函数(在文件中footnotecheck.sh):
#!/bin/bash

footnoteCheck() {
    local options=""
    local filename=""

    if [[ $# -eq 1 ]]; then
        filename="$1"
    elif [[ $# -gt 1 ]]; then
        options="${@:1:$(($#-1))}"
        filename="${!#}"
    else
        echo "Usage: $0 [options] filename"
        exit 1
    fi

    pdflatex $options -draft "\AtBeginDocument{
        \newcounter{MyFootnote}
        \NewCommandCopy\MyOldFootnote\footnote
        \renewcommand{\footnote}[1]{
            \stepcounter{MyFootnote}
            \label{FootnoteMark\arabic{MyFootnote}}
            \MyOldFootnote{\label{FootnoteText\arabic{MyFootnote}}#1}
        }
    }\input{$filename}"
}
  1. 然后我写了我的.latexmkrc文件(文件footnotecheck.latexmkrc):
$pdflatex = "touch %D && bash -c 'source footnotecheck.sh; footnoteCheck %O  %S'";
$out_dir = '/tmp';
$jobname = 'footnotecheck';
  1. 命令:

    latexmk-pdf-r footnotecheck.latexmkrc 测试.tex

完成了工作。

请注意,我使用了-draftmode命令footnoteChecktouch %D,创建一个空jobname.pdf文件以避免出现“无法创建输出文件”的警告。

我不知道这是否是解决我的问题的最佳解决方案,并且我不明白为什么我需要在文件中使用source我的bash函数.latexmkrc(否则它不起作用)。

请让我知道我做对了什么或者是否有更好的解决方案。

编辑。 https://tex.stackexchange.com/users/8495/john-collins注释简化了很多可能的问题。我可以在单个命令行中完成所有操作:

latexmk -pdf -usepretex="\AtBeginDocument{\newcounter{MyFootnote} \let\MyOldFootnote\footnote \renewcommand{\footnote}[1]{\stepcounter{MyFootnote}\label{FootnoteMark\arabic{MyFootnote}}\MyOldFootnote{\label{FootnoteText\arabic{MyFootnote}}#1}}}" -pdflatex="touch %D; pdflatex -draftmode %O %P" -output-directory=/tmp -jobname=footnotecheck test.tex

相关内容