通过 latexmk 使用 MiKTeX 选项

通过 latexmk 使用 MiKTeX 选项

当我正常使用 MiKTeX 时,我这样称呼:

pdflatex --aux-directory="C:\Users\doncherry\Documents\LaTeX\AUXI_global" foo.tex

对于 latexmk 输出 pdf(通过 pdfLaTeX)并进行连续预览,我的尝试是

latexmk-pvc-pdf foo

同一目录中有一个名为的文件latexmkrc(参见手动的),包含

$pdflatex = 'pdflatex --aux-directory="C:\Users\doncherry\Documents\LaTeX\AUXI_global" %O %S';
$pdf_previewer = '启动“C:\Program Files (x86)\SumatraPDF\SumatraPDF.exe”%O %S';

这不起作用,latexmk 只运行pdflatex一次,并且不会生成目录。Latexmk 生成错误消息:

Latexmk:错误,所以我没有完成目标的制定
Latexmk:(Pdf)LaTeX 无法生成日志文件

如何--aux-directory通过 latexmk 使用该选项?

答案1

我制作了一个新版本的 latexmk,它支持-aux-directory-output-directory。它的版本是 4.27a,可以在以下位置找到:

http://www.phys.psu.edu/~collins/latexmk/versions.html

这个版本将很快提交给 CTAN,但一些反馈会很有用,因为我还没有广泛测试新功能,特别是因为我目前无法访问 MiKTeX或更新版本可以在 CTAN 上找到也一样。

Latexmk 现在有选项-auxdir-aux-directory-outdir-out-directory,以及相应的配置变量$aux_dir$out_dir。有关更多详细信息,请参阅文档。要实现原始发帖人想要的效果,只需将

$aux_dir = 'C:/Users/doncherry/Documents/LaTeX/AUXI_global';

在 latexmkrc 文件中。(我在目录名称中使用了正斜杠,因为 MS-Windows 可以接受这些,并且避免违反引用约定。)

我已经对该-output-directory选项进行了一些测试,唯一需要解决的问题是 biblatex 与 bibtex 的组合不起作用,因为 bibtex 所需的文件不在其通常的位置。(Biblatex 与 biber 一起使用有效,bibtex 的常规使用也是如此。)如果您不使用 biblatex,最后一个问题不会影响您。

答案2

更新:John Collins 刚刚向我介绍了一个提供--aux-directory功能的未发布版本的 latexmk。他说他应该很快就能发布这个版本,他计划直接在这里回复。

同时,感谢您迄今为止的回复。


我联系了latexmk的作者John Collins,他回复如下:

--aux-directory="C:\Users\doncherry\Documents\LaTeX\AUXI_global"

问题是这会导致 MiKTeX 将所有额外文件写入其他目录,包括日志文件。Latexmk 需要读取日志文件以了解 pdflatex 运行期间发生了什么,但它不知道日志文件的位置已从其通常位置发生变化。这就是错误消息的原因

Latexmk: (Pdf)LaTeX failed to generate a log file

不幸的是,当前版本的 latexmk 不支持这种情况。支持这种情况显然是个好主意,但需要进行重大更改。它现在在我的 latexmk 改进列表中。

不幸的是,我没有看到好的解决方法。

答案3

嗯,正如 doncherry 已经发布的,当前版本中没有此选项。请在下面找到针对版本 4.26 的粗略补丁,或者直接下载修补脚本

您需要在配置文件中添加以下设置:

$auxdir = 'C:/Users/doncherry/Documents/LaTeX/AUXI_global/'

确保目录以/!结尾。

在我的测试中,只要我符号链接 PDF 文件,它实际上就包含了 TeXLive 和类似的选项,效果很好-output-directory。我目前无法在 Windows 下使用 MikTeX 进行测试,但它应该也在那里工作。

修补:

--- /usr/local/bin/latexmk  2011-08-12 02:21:46.000000000 +0200
+++ latexmk 2011-10-09 21:46:12.145915149 +0200
@@ -839,6 +839,7 @@
                         # tex, etc.  (If $jobname is non-empty, then
                         # the --jobname=... option is used on tex.)

+$auxdir = '';

 ## default flag settings.
 $recorder = 0;          # Whether to use recorder option on latex/pdflatex
@@ -1281,6 +1282,10 @@
   elsif (/^-jobname=(.*)$/) {
       $jobname = $1;
   }
+  elsif (/^-auxdir="(.*)"$/) {
+      $auxdir = $1;
+      $auxdir .= '/' if ($auxdir !~ /\/$/);
+  }
   elsif (/^-l$/)     { $landscape_mode = 1; }
   elsif (/^-l-$/)    { $landscape_mode = 0; }
   elsif (/^-latex=(.*)$/) {
@@ -1707,7 +1712,7 @@
     # Initialize basic dependency information:

     # For use under error conditions:
-    @default_includes = ($texfile_name, "$root_filename.aux");  
+    @default_includes = ($texfile_name, "$auxdir$root_filename.aux");  

     $fdb_file = "$root_filename.$fdb_ext";

@@ -1748,7 +1753,7 @@
         }
         else {
             # No fdb file, so do inferior job by parse_logB
-            print "$My_name: Examining log file '$root_filename.log' for generated files...\n";
+            print "$My_name: Examining log file '$auxdir$root_filename.log' for generated files...\n";

             # Variables set by parse_logB. Can I remove them
             local %generated_log = ();
@@ -1840,7 +1845,7 @@
     }

     $have_fdb = 0;
-    if ( (! -e $fdb_file) && (! -e "$root_filename.aux") ) {
+    if ( (! -e $fdb_file) && (! -e "$auxdir$root_filename.aux") ) {
         # No aux and no fdb file => set up trivial aux file 
         #    and corresponding fdb_file.  Arrange them to provoke one run 
         #    as minimum, but no more if actual aux file is trivial.
@@ -1860,7 +1865,7 @@
    rdb_recurseA( [keys %possible_primaries],
              sub{ if ( $$Ptest_kind == 1 ) { $$Ptest_kind = 3;} }
         );
-        if ( -e "$root_filename.log" ) {
+        if ( -e "$auxdir$root_filename.log" ) {
        rdb_for_some( [keys %possible_primaries], \&rdb_set_latex_deps );
    }
     }
@@ -2170,7 +2175,7 @@
     # 2. Write a corresponding fdb file
     # 3. Provoke a run of (pdf)latex (actually of all primaries). 

-    local $aux_file = "$root_filename.aux";
+    local $aux_file = "$auxdir$root_filename.aux";
     open( aux_file, '>', $aux_file )
         or die "Cannot write file '$aux_file'\n";
     print aux_file "\\relax \n";
@@ -3150,7 +3155,7 @@
     $bad_reference = 0;
     $bad_citation = 0;

-    my $log_name = "$root_filename.log";
+    my $log_name = "$auxdir$root_filename.log";
     my $log_file = new FileHandle;
     if ( ! open( $log_file, "<$log_name" ) ) {
         return 0;
@@ -4204,7 +4209,7 @@
     # $reference_changed, $bad_reference $bad_citation

     &parse_logB;
-    my $fls_file = "$root_filename.fls";
+    my $fls_file = "$auxdir$root_filename.fls";
     if ($recorder && test_gen_file($fls_file) ) {
         parse_fls( $fls_file, \%source_fls, \%generated_fls );
         foreach (keys %source_fls) {
@@ -5573,7 +5578,7 @@
     if (-e $$Pdest) { $missing_dvi_pdf = '';}

     ######### Analyze results of run:
-    if ( ! -e "$root_filename.log" ) {
+    if ( ! -e "$auxdir$root_filename.log" ) {
         $failure = 1;
         $$Plast_result = 2;
         $$Plast_message = $failure_msg = "(Pdf)LaTeX failed to generate a log file";

答案4

正如其他作者已经指出的,latexmk目前不支持该--aux-directory标志。

由于我发现所有辅助文件和其他文件在乳胶文件的文件夹中乱飞很烦人,所以我选择使用该latexmk选项-jobname=

为此,需要有一个子文件夹(例如文件夹“build”)。这样,您可以运行以下命令:

latexmk -pvc -pdf -jobfile=build/foo foo

这会将生成的所有文件放入latexmk该子文件夹中。这有三个缺点:

  1. 文件夹“build”需要在那里。
  2. 生成的 PDF 也位于该子文件夹中。
  3. 您必须输入两次文件名。

为了克服最后一点,我使用了这个 bash 函数:

function latexme() {
  jobname=`echo $@|sed 's/\.tex$//g'`;
  latexmk -pvc -pdf -jobname=build/$jobname "$@";
}

有了这个,我只需要调用这个:

latexme foo.tex

由于这使用 Bash,我不确定如何在 Windows 上执行此操作。但至少您可以将所有生成的文件放入另一个文件夹中。

相关内容