我正在尝试建立一个.latexmkrc
文件来编译我正在创建的文档并调用biber
和bib2gls
,但我遇到了一个问题:有时调用规则bib2gls
有效(通过注册规则并通知操作),但有时则无效。
这是我的.latexmkrc
:
add_cus_dep('glo', 'gls', 0, 'run_makeglossaries');
add_cus_dep('acn', 'acr', 0, 'run_makeglossaries');
add_cus_dep('aux', 'glstex', 0, 'run_bib2gls');
sub run_makeglossaries {
if ( $silent ) {
system "makeglossaries -q '$_[0]'";
} else {
system "makeglossaries '$_[0]'";
};
}
sub run_bib2gls {
if ( $silent ) {
system "bib2gls --silent --group '$_[0]'";
} else {
system "bib2gls --group '$_[0]'";
};
}
push @generated_exts, 'glo', 'gls', 'glg';
push @generated_exts, 'acn', 'acr', 'alg';
$clean_ext .= ' %R.ist %R.xdy';
$clean_ext .= ' bbl run.xml'
据我了解,该add_cus_dep
过程将文件的所需输入扩展名与所需的输出扩展名链接起来,使用提供的函数名进行转换。
我的代码(关于run_bib2gls
)有什么错误吗?
答案1
实际上有两个问题需要解决:
存在一个问题,即如果文件不存在,则
latexmk
无法调用;这种情况需要从头开始创建文件。问题是无法识别文件中有关文件丢失的消息。(该消息不是 中编程的格式之一。)我将在下一个版本中修复此问题。同时,在您的文件 中插入以下行:bib2gls
.glstex
.glstex
latexmk
.log
latexmk
.latexmkrc
push @file_not_found, '^Package .* No file `([^\\\']*)\\\'';
文件中的更改
.bib
不会被latexmk
重新运行的原因所注意到。为了解决这个问题,需要分析bib2gls
日志文件以找到文件的名称,然后需要将其设置为依赖项。这可以通过子程序的以下扩展来完成:bib2gls
bib
run_bib2gls
sub run_bib2gls { if ( $silent ) { my $ret = system "bib2gls --silent --group '$_[0]'"; } else { my $ret = system "bib2gls --group '$_[0]'"; }; my ($base, $path) = fileparse( $_[0] ); if ($path && -e "$base.glstex") { rename "$base.glstex", "$path$base.glstex"; } # Analyze log file. local *LOG; $LOG = "$_[0].glg"; if (!$ret && -e $LOG) { open LOG, "<$LOG"; while (<LOG>) { if (/^Reading (.*\.bib)\s$/) { rdb_ensure_file( $rule, $1 ); } } close LOG; } return $ret; }
此代码还处理指定输出目录的情况。
@NicolaTalbot:是的,我确实知道 的选项-d
,bib2gls
但当我尝试它时,出现了问题:在bib2gls
中的第二次和后续调用中latexmk
,bib2gls
试图将 写入.glstex
错误的目录。不幸的是,我还没有找到问题所在。
答案2
我知道这已经很老了,但万一其他人需要的话。以下代码片段将正确(我希望)使用-d
开关bib2gls
。
sub run_bib2gls {
my ($base, $path) = fileparse( $_[0] );
my $silent_command = $silent ? "--silent" : "";
if ( $path ) {
my $ret = system("bib2gls $silent_command -d '$path' --group '$base'");
} else {
my $ret = system("bib2gls $silent_command --group '$_[0]'");
};
# Analyze log file.
local *LOG;
$LOG = "$_[0].glg";
if (!$ret && -e $LOG) {
open LOG, "<$LOG";
while (<LOG>) {
if (/^Reading (.*\.bib)\s$/) {
rdb_ensure_file( $rule, $1 );
}
}
close LOG;
}
return $ret;
}