latexmk 中的 exceltex 依赖项

latexmk 中的 exceltex 依赖项

我正在努力卓越latexmk通过添加自定义依赖项进行通信.latexmkrc

据我了解,它的工作原理是在编译时将每个/命令exceltex的条目写入文件,然后使用脚本从文件中提取信息。手动例程:,,,并且有效。所以我相信我需要以下依赖关系:\inctabinccellexcltxPerlSpreadsheet::ParseExcel.xlslatexmkexceltexlatexmk

  1. excltex并且xls:如果xls文件被改变,exceltex则被调用。
  2. excltex并且tex:如果tex带有\inccell/\inctab调用的文件发生变化,exceltex则会调用。

据我了解,latexmk它无法处理一个依赖项中的多个文件,因此我首先专注于使 #2 正常工作。我尝试过:

add_cus_dep('excltx', 'tex', 0, 'excel2tex');
    sub excel2tex {
        system("exceltex \"$_[0].tex\"") ;
    }

这将latexmk生成以下输出:

For rule 'cusdep excltx tex test', running '&do_cusdep(  )' ...
Latexmk: Possible misconfiguration or bug:
  In trying to apply custom-dependency rule
  to make 'test.tex' from 'test.excltx'
  the function name is blank.

我的意图是依赖项将触发exceltex file.tex。为什么没有发生这种情况?我如何更改依赖项以使其运行exceltex

.latexmkrc跟进:假设上述依赖项有效(在注释掉 中的所有其他依赖项、运行并取消注释已平息的依赖项后有效),当文件发生更改时latexmk,我该如何运行latexmk?我尝试过exceltexxls

add_cus_dep('tex', 'xls', 0, 'excel2tex');

add_cus_dep('excltx', 'xls', 0, 'excel2tex'); 

(两者兼而有之,效果很好)。如果我强制进行完全重新编译,它就会起作用。使用正常编译时,文档的内容tex不会改变,但xls文件会发生变化,latexmk因此不会注意到文件中的更改xls

答案1

由于“可能存在配置错误或错误”这一难题现在无法重现,我们暂时可以忽略这部分问题。我将回答问题的其余部分,即如何创建在文件xls更改时运行的自定义依赖项。以下是适合某个文件的经过测试的代码latexmkrc

add_cus_dep('excltx', 'tex', 0, 'excel2tex');
sub excel2tex {
    # First find dependency/ies on .xls files, by parsing the .excltx file,
    my $Hsource = new FileHandle;
    my %xls = ();
    my $source = "$_[0].excltx";
    if (! open $Hsource, "<$source") {
        warn "excel2tex subroutine: Could not read '$source'\n";
        return 1;
    }
    while ( <$Hsource> ) {
        if ( /^\s*;/ ) { next; }
        if ( /^\s*[ct]:[^:]*\:([^!]*)!/ ) { $xls{$1} = 1; }
    }
    close $Hsource;
    foreach (keys %xls) {
        rdb_ensure_file( $rule, $_ );
    }
    return system("exceltex \"$_[0]\"") ;
}

功能如下:主tex文件使用该包exceltex来使用电子表格中单元格的内容xls。它通过将单元格的规范写入扩展名为 的文件来实现此目的excltx。脚本exceltex读取该文件,从电子表格中提取数据,并将其写入在下次编译主文档时读取的文件中。(该exceltex包及其脚本是 TeXLive 当前版本的一部分。)

除了运行exceltex脚本之外,上面定义的子程序还会读取excltx文件以查找所用电子表格文件的名称。然后,它使用的内部子程序latexmk将这些文件添加到自定义依赖项的源文件列表中。因此,如果电子表格文件(或文件)发生更改,即使没有任何其他更改,latexmk也会知道重新运行exceltex,然后在必要时重新编译主tex文件。

相关内容