我有这个 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. 它将 的定义更改$pdflatex
为pdflatex %O %P
,其中%P
表示指定的代码在命令行上传递给 pdflatex ,后跟读取源文件的代码。(该-usepretex
选项还会导致$latex
,$lualatex
和$xelatex
按照相同模式进行设置。)
在检查/调试此类情况时,最好查看 latexmk 的输出,它会报告 latexmk 用于调用 pdflatex 的命令行,并验证 latexmk 是否正在执行您希望它执行的操作。
OP的要求: OP 想要使用一个-jobname
参数、一个输出目录,并使用-draftmode
pdflatex 的选项来阻止生成 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()
设置$pdflatex
为pdflatex %O %P
(对于$latex
、$lualatex
和 也类似$xelatex
),这样给定的代码就可以在 pdflatex 命令行上使用。我使用了 Perl 的.
运算符来连接字符串,这样指定要提供给 *latex 的 TeX 代码的语句就可以更容易地读取。我使用了单引号,因为在 Perl 中这样可以避免需要引用字符\
。
答案2
我找到了这个解决方案:
- 为了将重新定义的命令传递给
pdflatex
我latexmk
定义的函数(在文件中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}"
}
- 然后我写了我的
.latexmkrc
文件(文件footnotecheck.latexmkrc
):
$pdflatex = "touch %D && bash -c 'source footnotecheck.sh; footnoteCheck %O %S'";
$out_dir = '/tmp';
$jobname = 'footnotecheck';
命令:
latexmk-pdf-r footnotecheck.latexmkrc 测试.tex
完成了工作。
请注意,我使用了-draftmode
命令footnoteCheck
和touch %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