配置 latexmk 以使用预处理器(lhs2TeX)

配置 latexmk 以使用预处理器(lhs2TeX)

我想在使用 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

你可以使用任意一种解决方案:

  1. 对于第一个解决方案(包含要运行的内部子程序lhsTeXpdflatex),安排在文件中添加一行.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

  2. 使用自定义依赖项解决方案:

    1. .latexmkrc文件中,删除行设置$cleanup_includes_cusdep_generated。这很重要。要创建自定义依赖项规则,自定义依赖项的输出文件需要存在,这样它latexmk才知道有什么要做。因此,删除该.tex文件会阻止latexmk发现自定义依赖项的需要。
    2. 在第一次运行之前,请lhs2TeX手动应用以创建文件。这将启动检测和文件之间依赖关系.tex的过程。latexmk.lhs.tex

可以做出更好的解决方案,但我能想到的方案需要使用latexmk内部构件或进行修改latexmk

相关内容