# This shows how to use Asymptote (http://asymptote.sourceforge.net/, # or http://www.ctan.org/pkg/asymptote/) # with latexmk. Asymptote is a vector graphics language with a # processing program that generates graphics files that can be used in # a LaTex file. # # The definitions in this file enable automatic compilation of .asy files # containing asymptote code to be compiled to graphics files. The .asy files # may be created as stand-alone files or may be created during a *latex # run by the use of the asymptote package with a document that contains # sections of asymptote code. # The following definitions arrange to run asy with the correct output # file type. They run asy in a verbose mode so that dependency # information on imported files can be extracted. To avoid adding a # lot of extra printout on the screen of unimportant messages, the # output is sent to a log file. Since this includes error messages, # which the user should see, latexmk types out error messages and the # like. These definitions need latexmk 4.48 or later. add_cus_dep("asy","eps",0,"asy2eps"); add_cus_dep("asy","pdf",0,"asy2pdf"); add_cus_dep("asy","tex",0,"asy2tex"); sub asy2eps { return asy2x( $_[0], 'eps' ); } sub asy2pdf { return asy2x( $_[0], 'pdf' ); } sub asy2tex { return asy2x( $_[0], 'tex' ); } sub asy2x { my ($base, $fmt ) = @_; my $log_file = "$base.log"; my $cmd = "asy -vv -noV -f \"$fmt\" -o \"$base.$fmt\" \"$base\" > '$log_file' 2>&1"; print "asy2x: Running '$cmd'\n"; my $ret = system($cmd); my $FH = undef; if (! open( $FH, "<", $log_file ) ) { warn "asy2x: Couldn't read log file '$log_file':\n $!"; return $ret; } my %imports = ("$base.asy" => 1); while (<$FH>) { s/\s*$//; if (/^(Including|Loading) .* from (.*)$/) { my $import = $2; # Convert MSWin directory separator to / $import =~ s(\\)(/)g; $imports{$import} = 1; } elsif ( /^error/ || /^.*\.asy: \d/ ) { warn "==Message from asy: $_\n"; $ret = 1; } elsif ( /^kpsewhich / || /^Processing / || /^Using / || /^Welcome / || /^Wrote /|| /^cd /|| /^gs / ) { } else { # warn "==Message from asy: $_\n"; } } close $FH; show_hash( '', \%imports ); rdb_set_source( $rule, keys %imports ); return $ret; }