.latexmkrc 用于 bib2gls

.latexmkrc 用于 bib2gls

我正在尝试建立一个.latexmkrc文件来编译我正在创建的文档并调用biberbib2gls,但我遇到了一个问题:有时调用规则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

实际上有两个问题需要解决:

  1. 存在一个问题,即如果文件不存在,则latexmk无法调用;这种情况需要从头开始创建文件。问题是无法识别文件中有关文件丢失的消息。(该消息不是 中编程的格式之一。)我将在下一个版本中修复此问题。同时,在您的文件 中插入以下行:bib2gls.glstex.glstexlatexmk.loglatexmk.latexmkrc

    push @file_not_found, '^Package .* No file `([^\\\']*)\\\'';
    
  2. 文件中的更改.bib不会被latexmk重新运行的原因所注意到。为了解决这个问题,需要分析bib2gls日志文件以找到文件的名称,然后需要将其设置为依赖项。这可以通过子程序的以下扩展来完成:bib2glsbibrun_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:是的,我确实知道 的选项-dbib2gls但当我尝试它时,出现了问题:在bib2gls中的第二次和后续调用中latexmkbib2gls试图将 写入.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;
}

相关内容