sub dot2tex {
# Context for a dot2tex custom dependency assumed.
# Default options:
my $opts = '--figonly -fpgf -tmath';
# File that contains the option string. (Written after analysis of the
# log file for the previous *latex run.)
my $opt_file = "$_[0].dot2texopts";
# Ensure that it is known as a source file of this rule, since some
# changes in the main .tex could affect the options only, but not the
# contents of the .dot file
rdb_ensure_file( $rule, $opt_file );
if ( -e $opt_file && open( my $fh, '<', $opt_file ) ) {
$opts = <$fh>;
close $opt_file;
}
else { warn "dot2tex: Cannot open '$opt_file'\n"; }
my @cmd = ( 'dot2tex', split(/\s+/, $opts), '-o', $$Pdest, $$Psource );
print "dot2tex command line to execute:\n ", join( ' ', @cmd), "\n";
return system @cmd;
}
#---------------------------------
sub mylatex {
# Context for a *latex rule assumed.
# Run *latex as specified in my arguments, and then process the log file
# to deal with dot2tex conversions needed by the dot2texi package.
my ($base, @cmd) = @_;
my $log_name = "$aux_dir1$base.log";
my $return = system @cmd;
&examine_log_for_dot2tex( $log_name );
return $return;
}
#---------------------------------
sub examine_log_for_dot2tex {
# Context for a *latex rule assumed.
# From the log file given in the argument to this subroutine,
# find places where dot2tex would be invoked if *latex were used with
# the -shell-escape option. This invocation is on .dot files created
# by the dot2texi package.
# Find the basename of the .dot and .tex files (all assumed to be
# relative to the aux dir). (Basename includes a possible path
# component.)
# Ensure that for each .dot file the .tex file is in the source file of
# the current rule, so that latexmk will know to make a corresponding
# custom dependency.
# Put the option string in a file where the custom dependency for the
# dot-to-tex conversion can find it.
my $log_name = $_[0];
# Map of basenames_with_relative_path of dot/tex file to option string
my %found = ();
open( my $log_fh, '<', $log_name )
or ( warn( "examine_log_for_dot2tex: Can't read '$log_name'\n" ),
return
);
LINE:
while (my $line = <$log_fh> ) {
# Aim: find lines of form runsystem\(dot2tex followed by options
# followed by "-o file.tex file.dot)", for some value of file.
# Allow for continuation lines.
# Often use /.../x with x option to regex, to get space in pattern
# ignored, for readability
# Ignore lines with wrong start:
if ( $line !~ /^runsystem\(dot2tex \s+ (.*)$/x ) { next; }
# Rest of command line (after dot2tex) is in $1.
my $args = $1;
# Only keep going if arguments begin with options and have -o (for
# output file):
if ( $args !~ /(-.*) \s+ -o \s+ (.*) $/x ) {
next LINE;
}
# Putative options for command, then source and dest file:
my ($opts, $file_part) = ($1, $2);
# Remove superfluous space:
$opts =~ s/\s+/ /g;
$opts =~ s/\s*$//;
if ( $opts !~ /^(-\S+\s*)*$/x ) {
warn "Putative options for dot2tex in '$opts' aren't options\n";
next LINE;
}
my $attempts = 0;
CONT_LINE:
while ($attempts < 2) {
$attempts++;
if ($file_part =~ /^(.+) \.tex \s+ \1 \.dot\)/x ) {
($found{$1} = $opts) =~ s/\s+/ /g;
last CONT_LINE;
}
if (length($line) >= 80) {
if (eof($log_fh)) { last LINE; }
$file_part .= <$log_fh>;
# Remove trailing new line characters:
$file_part =~ s/[\n\r]$//;
}
else { last CONT_LINE; }
}
}
close $log_fh;
my @missing_files = ();
while (my ($base, $opts) = each %found) {
my $dot = "$aux_dir1$base.dot";
my $tex = "$aux_dir1$base.tex";
# File to save options for dot2tex command, so cusdep can read them:
my $opt_file = "$aux_dir1$base.dot2texopts";
write_to_file( $opt_file, "$opts\n" );
if (! -e $tex) { push @missing_files, $tex; }
}
if (@missing_files) {
# No-file lines for missing .tex files will tell latexmk to try
# to find a cusdep to make them:
append_to_file( $log_name, map("No file $_.\n", @missing_files) );
}
}
#---------------------------------
sub write_to_file {
# Usage: write_to_file( name, items to write )
my $file = shift;
open( my $fh, ">", $file )
or (warn "Cannot write to '$file'\n", return 0 );
print $fh @_;
close( $fh );
}
#---------------------------------
sub append_to_file {
# Usage: append_to_file( name, items to write )
my $file = shift;
open( my $fh, ">>", $file )
or (warn "Cannot append to '$file'\n", return 0 );
print $fh @_;
close( $fh );
}