我正在努力卓越并latexmk
通过添加自定义依赖项进行通信.latexmkrc
。
据我了解,它的工作原理是在编译时将每个/命令exceltex
的条目写入文件,然后使用脚本从文件中提取信息。手动例程:,,,并且有效。所以我相信我需要以下依赖关系:\inctab
inccell
excltx
Perl
Spreadsheet::ParseExcel
.xls
latexmk
exceltex
latexmk
excltex
并且xls
:如果xls
文件被改变,exceltex
则被调用。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
?我尝试过exceltex
xls
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
文件。