# This file gives a configuration suitable when chapterbib is being used. # Latexmk without special configuration works with chapterbib only if # chapter bibliographies are used, but not when an overall consolidated # document-level bibliography is used. (This is because one of the runs of # bibtex gives an error of a kind that causes latexmk to stop further # processing. The chapterbib documentation mentions this problem # explicitly and says the error is to be ignored.) # The configuration in this file allows the use of a document level # bibliographys without any errors. It works equally when there is no # document level bibliography and when chapterbib is not used. $bibtex = 'bibtex %O %S'; $bibtex_save = $bibtex; $bibtex = 'internal bibtex_fix %R %D %S'; $clean_ext .= " %R-mod.blg %R-mod.aux %R-mod.bbl"; sub bibtex_fix { my ($root, $dest, $source) = @_; local ($base_bare, $path, $ext) = fileparse( $source, '\.[^\.]*' ); if ($path eq './') { $path = ''; } local $base = $path.$base_bare; my $ret = 0; if ( $base_bare eq $root ) { print "--- Will run bibtex on modified '$root.aux' file\n"; my $aux_mod_base = $base."-mod"; # Open output (modified aux file) here rather than in fix_aux, and # make the relevant variables local. This is instead opening both # files in fix_aux itself. The reason: fix_aux calls itself # recursively, but must always write to the same file. open( local $out_fh, ">", $aux_mod_base$ext ); if (!$out_fh) { die "Cannot write to '$aux_mod_base$ext'\n"; } local $level = 0; fix_aux( $source ); close $out_fh; # Override source, dest, and basenames, since they are to have the path given # in the arguments to this subroutine, instead of the path given in the # corresponding names in the rule. Latexmk may change directory before # calling this subroutine, and adjusts the arguments accordingly: $ret = Run_subst( $bibtex_save, 2, undef, "$aux_mod_base$ext", "$aux_mod_base.bbl", $aux_mod_base ); foreach ( 'bbl', 'blg' ) { copy "$aux_mod_base.$_", "$path$root.$_"; } } else { $ret = Run_subst( $bibtex_save, 2, undef, $source, $dest, $base ); } return $ret; } sub fix_aux { # Read aux file, outputting flattened version to file handle $out_fh and # removing \bibdata and \bibstyle lines that were in included .aux files. my $aux_file = $_[0]; print "Processing '$aux_file'\n"; open( my $aux_fh, "<", $aux_file ); if (!$aux_fh) { die "$My_name: Couldn't read aux file '$aux_file'\n"; } $level++; while (<$aux_fh>) { if ( ($level > 1) && ( /^\\bibdata\{(.*)\}/ || /^\\bibstyle\{(.*)\}/ ) ) { next; } elsif ( /^\\\@input\{(.*)\}/ ) { fix_aux( $path.$1 ); next; } else { print $out_fh $_; } } close($aux_fh); $level--; }