我想在使用 pdflatex 等编译输入文件之前对其进行预处理。
我找到了一种方法来做到这一点,使用“内部”规范中描述latexmk 手册,但我希望使用自定义依赖项有一种更简单、更灵活的方法。
我正在使用预处理器开源TeX(版本 1.18.1),文件扩展名为.lhs
。我的 latexmk 版本是 4.37(2013 年 7 月 2 日)。
“内部”方式
一个文件input.lhs
:
\documentclass{article}
%include polycode.fmt
\begin{document}
Hello, |world|! % The | and | are used by lhs2TeX.
\end{document}
这.latexmkrc
:
push @generated_exts, 'tex'; # Remove generated .tex on clean-up
# Use subroutine to do preprocessing and running pdflatex
$pdflatex = 'internal mylatex %B %O';
sub mylatex {
my $base = shift @_;
my $tex = "$base.tex";
# Run the preprocessor
system('lhs2TeX', '--poly', '-o', $tex, "$base.lhs") == 0 or return $?;
# Run pdflatex
return system('pdflatex', @_, $tex);
}
在命令行中:
$ latexmk -silent -pdf input.lhs
Latexmk: Run number 1 of rule 'pdflatex'
Latexmk: calling mylatex( input -interaction=batchmode -recorder )
This is pdfTeX, Version 3.1415926-2.5-1.40.14 (TeX Live 2013)
restricted \write18 enabled.
entering extended mode
这成功生成了适当的input.pdf
。但这也要求我进行硬编码pdflatex
。
使用自定义依赖项的尝试失败
这.latexmkrc
:
$cleanup_includes_cusdep_generated = 1; # Remove generated .tex on clean-up
# Set preprocessor as a custom dependency
add_cus_dep('lhs', 'tex', 1, 'run_lhs2TeX');
sub run_lhs2TeX {
my $base = shift @_;
# Run the preprocessor
return system('lhs2TeX', '--poly', '-o', "$base.tex", "$base.lhs");
}
此处创建的规则从未触发。我猜这不起作用是因为 latexmk 不使用依赖项作为初始输入,而只对包含在其他文件中的文件使用依赖项(例如 via \input
)。
结论
有没有简单的方式,可能类似于上面的自定义依赖项尝试,配置 latexmk 以使用预处理器?它不应该需要对编译器进行硬编码。(我可以使用 Makefile 来做到这一点,但如果我无论如何都要使用 latexmk,那么我更愿意使用 latexmk 来做所有事情。)
答案1
你可以使用任意一种解决方案:
对于第一个解决方案(包含要运行的内部子程序
lhsTeX
和pdflatex
),安排在文件中添加一行.fls
以告知latexmk
该.lhs
文件是运行的有效源文件pdflatex
。合适的.latexmkrc
文件是# Use subroutine to do preprocessing and running pdflatex $pdflatex = 'internal mylatex %B %O'; sub mylatex { my $base = shift @_; my $tex = "$base.tex"; # Run the preprocessor system('lhs2TeX', '--poly', '-o', $tex, "$base.lhs") == 0 or return $?; # Run pdflatex my $return = system('pdflatex', @_, $tex); system "echo INPUT $base.lhs >> $aux_dir1$base.fls"; return $return; }
我还会删除输入的行
tex
。@generated_exts
该.tex
文件太重要了,latexmk
以至于将文件视为已生成文件毫无用处.tex
。使用自定义依赖项解决方案:
- 在
.latexmkrc
文件中,删除行设置$cleanup_includes_cusdep_generated
。这很重要。要创建自定义依赖项规则,自定义依赖项的输出文件需要存在,这样它latexmk
才知道有什么要做。因此,删除该.tex
文件会阻止latexmk
发现自定义依赖项的需要。 - 在第一次运行之前,请
lhs2TeX
手动应用以创建文件。这将启动检测和文件之间依赖关系.tex
的过程。latexmk
.lhs
.tex
- 在
可以做出更好的解决方案,但我能想到的方案需要使用latexmk
内部构件或进行修改latexmk
。