summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/doc/support/latexmk/example_rcfiles/dot2tex-latexmkrc
diff options
context:
space:
mode:
Diffstat (limited to 'Master/texmf-dist/doc/support/latexmk/example_rcfiles/dot2tex-latexmkrc')
-rw-r--r--Master/texmf-dist/doc/support/latexmk/example_rcfiles/dot2tex-latexmkrc175
1 files changed, 175 insertions, 0 deletions
diff --git a/Master/texmf-dist/doc/support/latexmk/example_rcfiles/dot2tex-latexmkrc b/Master/texmf-dist/doc/support/latexmk/example_rcfiles/dot2tex-latexmkrc
new file mode 100644
index 00000000000..64693cab33c
--- /dev/null
+++ b/Master/texmf-dist/doc/support/latexmk/example_rcfiles/dot2tex-latexmkrc
@@ -0,0 +1,175 @@
+# ================ Customization for dot2tex: ================================
+
+push @generated_exts, '%R-dot2tex-fig*.tex', '%R-dot2tex-fig*.dot',
+ '%R-dot2tex-fig*.dot2texopts';
+add_cus_dep( 'dot', 'tex', 0, 'dot2tex' );
+
+# Fancy: prefix string for each *latex by "internal" mylatex and basename of tex file
+#foreach my $name ( 'latex', 'pdflatex', 'lualatex', 'xelatex' ) {
+# ${$name} = "internal mylatex %B ". ${$name};
+#}
+
+$latex = 'internal mylatex %B latex %O %S';
+$lualatex = 'internal mylatex %B lualatex %O %S';
+$pdflatex = 'internal mylatex %B pdflatex %O %S';
+$xelatex = 'internal mylatex %B xelatex %O %S';
+
+
+#---------------------------------
+
+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 );
+}
+
+#---------------------------------