diff options
33 files changed, 1118 insertions, 36 deletions
diff --git a/Build/source/texk/texlive/linked_scripts/Makefile.am b/Build/source/texk/texlive/linked_scripts/Makefile.am index 4674af5aded..3523a64943b 100644 --- a/Build/source/texk/texlive/linked_scripts/Makefile.am +++ b/Build/source/texk/texlive/linked_scripts/Makefile.am @@ -156,6 +156,7 @@ texmf_other_scripts = \ texdef/texdef.pl \ texdiff/texdiff \ texdirflatten/texdirflatten \ + texfot/texfot.pl \ texlive/rungs.tlu \ texlive/tlmgr.pl \ texlive/updmap.pl \ diff --git a/Build/source/texk/texlive/linked_scripts/Makefile.in b/Build/source/texk/texlive/linked_scripts/Makefile.in index 06602c59b7f..da49e5709e3 100644 --- a/Build/source/texk/texlive/linked_scripts/Makefile.in +++ b/Build/source/texk/texlive/linked_scripts/Makefile.in @@ -362,6 +362,7 @@ texmf_other_scripts = \ texdef/texdef.pl \ texdiff/texdiff \ texdirflatten/texdirflatten \ + texfot/texfot.pl \ texlive/rungs.tlu \ texlive/tlmgr.pl \ texlive/updmap.pl \ diff --git a/Build/source/texk/texlive/linked_scripts/glossaries/makeglossaries b/Build/source/texk/texlive/linked_scripts/glossaries/makeglossaries index 40088ddb71c..3082593df0b 100755 --- a/Build/source/texk/texlive/linked_scripts/glossaries/makeglossaries +++ b/Build/source/texk/texlive/linked_scripts/glossaries/makeglossaries @@ -2,7 +2,7 @@ # File : makeglossaries # Author : Nicola Talbot -# Version : 2.12 (2014/01/20) +# Version : 2.14 (2014/03/06) # Description: simple Perl script that calls makeindex or xindy. # Intended for use with "glossaries.sty" (saves having to remember # all the various switches) @@ -27,9 +27,13 @@ # glossary-super.sty, glossaries.perl. # Also makeglossaries and makeglossaries. -my $version="2.12 (2014-01-20)"; +my $version="2.14 (2014-03-06)"; # History: +# v2.14 (2014/03/06) +# * Added -Q and -k options +# v2.13 (2014/01/21) +# * Added check for leading and trailing quotes in filename # v2.12 (2014/01/20) # * Added check for '*' in istfilename # * Fixed bug report @@ -100,7 +104,8 @@ use warnings; # v2.05 added $opt_d # v2.08 added $opt_x and $opt_m use vars qw($opt_q $opt_t $opt_o $opt_s $opt_p $opt_g $opt_c $opt_r - $opt_l $opt_i $opt_L $opt_n $opt_C $opt_d $opt_x $opt_m); + $opt_l $opt_i $opt_L $opt_n $opt_C $opt_d $opt_x $opt_m $opt_Q + $opt_k); $Getopt::Std::STANDARD_HELP_VERSION = 1; @@ -109,7 +114,7 @@ $Getopt::Std::STANDARD_HELP_VERSION = 1; # .tex file) # v1.5 added -n (print the command that would be issued but # don't actually run the command) -getopts('s:o:t:p:L:C:ilqrcgnd:x:m:'); +getopts('s:o:t:p:L:C:ilqQkrcgnd:x:m:'); unless ($#ARGV == 0) { @@ -219,6 +224,9 @@ my %codepage = (); my $ext = ''; my $name = $ARGV[0]; +# v2.13 added: +$name=~s/^"(.*)"$/$1/; + # modified this to make sure users don't try passing the # tex file: if (length($ARGV[0]) > 3 and substr($ARGV[0],-4,1) eq ".") @@ -470,7 +478,7 @@ else # v1.7 print warnings to STDOUT instead of STDERR - # v1.6 added file existance test + # v1.6 added file existence test unless (-e $inputfile) { # v2.09 suppress warning if -q switch in use @@ -532,7 +540,7 @@ else } else { - print STDERR "Unable to create '$outfile' $!\n"; + warn "Unable to create '$outfile' $!\n"; } next; @@ -569,6 +577,13 @@ sub scan_aux{ { while (<AUXFILE>) { + #v2.14 added + if (m/\\\@gls\@reference/) + { + die "Your document has used \\makenoidxglossaries\n", + "You don't need makeindex or xindy.\n"; + } + # v1.9 added if (m/\\\@input{(.+)\.aux}/) { @@ -639,9 +654,9 @@ sub scan_aux{ } else { - print STDERR + warn "Unknown ordering '$ordering'\n", - "Assuming word ordering\n"; + "Assuming word ordering\n" unless ($opt_q); $letterordering = 0; } } @@ -652,7 +667,7 @@ sub scan_aux{ } else { - print STDERR "Unable to open $name.aux: $!\n"; + warn "Unable to open $name.aux: $!\n"; } } @@ -672,7 +687,8 @@ sub run_app{ return if ($dontexec); # v2.11 added double-quotes around $appname - if (open (STATUS, "\"$appname\" $appargs 2>&1 |")) + # v2.14 added -k switch + if (not $opt_k and open (STATUS, "\"$appname\" $appargs 2>&1 |")) { while (<STATUS>) { @@ -689,9 +705,14 @@ sub run_app{ } else { - $warnings = "WARNING: Unable to fork \"$appname\": $!\n"; + unless ($opt_k) + { + $warnings = "Unable to fork \"$appname\" with redirection $!\n"; - print STDERR $warnings, "Retrying without redirection.\n"; + # v2.14 added check for quiet switches + warn $warnings, + "Retrying without redirection.\n" unless ($quiet or $opt_Q); + } $status = `\"$appname\" $appargs`; @@ -702,18 +723,72 @@ sub run_app{ if ($?) { - $errno = $?; + # v2.14 Fixed error number assignment + $errno = ($? >> 8); + + # v2.14 Added check for existence of transcript + unless (-e $trans) + { + $log .= "\n$appname didn't create a transcript.\n"; + + if (not $appname=~/\//) + { + # No path specified + $log .= "Check that $appname has been installed and\nis on your system's PATH.\n"; + + if (defined $ENV{PATH}) + { + $log .= "Your PATH environment variable is set to: \n" + . $ENV{PATH} . "\n"; + } + else + { + $log .= "I'm sorry, I can't detect your PATH environment variable\n"; + } + + $log .= "Try manually running:\n\"$appname\" $appargs\n"; + } + elsif (not -e $appname) + { + if ($^O=~/Win/) + { + if (-e "$appname.exe" or -e "$appname.bat") + { + $log .= "Try manually running:\n\"$appname\" $appargs\n"; + } + else + { + $log .= "File '$appname' doesn't exist.\n"; + } + } + else + { + $log .= "File '$appname' doesn't exist.\n"; + } + } + else + { + $log .= "Try manually running:\n\"$appname\" $appargs\n"; + } + } if (open LOGFILE, ">>$trans") { print LOGFILE "\n\n*** Unable to execute: '\"$appname\" $appargs' ***\n\n"; - print LOGFILE "Status report:\n\n"; - print LOGFILE "$log"; + print LOGFILE "Failed with error code $errno.\n\n"; + + if ($log) + { + print LOGFILE "Status report:\n\n"; + print LOGFILE "$log", "\n"; + } + + print LOGFILE "Warnings:\n\n",$warnings, "\n" if $warnings; close LOGFILE; } else { - print STDERR "Unable to open '$trans' $!\n"; + warn "Unable to open '$trans' $!\n"; } } @@ -889,7 +964,7 @@ sub xindy{ { my $message = "$&\nRetrying using default codepage.\n"; - print STDERR $message; + warn $message; $retry .= $message; } @@ -908,7 +983,7 @@ sub xindy{ { my $message = "$&\nRetrying with -L general\n"; - print STDERR $message; + warn $message; $retry .= $message; } @@ -1002,7 +1077,7 @@ sub xindy{ } else { - print STDERR "Unable to open '$trans' $!\n"; + warn "Unable to open '$trans' $!\n"; } } } @@ -1018,6 +1093,8 @@ sub HELP_MESSAGE{ print "-o <gls>\tUse <gls> as the output file.\n"; print "\t\t(Don't use -o if you have more than one glossary.)\n"; print "-q\t\tQuiet mode.\n"; + print "-Q\t\tSilence unable to fork warning.\n"; + print "-k\t\tDon't try to use piped redirection.\n"; print "-s <sty>\tEmploy <sty> as the style file.\n"; print "-t <log>\tEmploy <log> as the transcript file.\n"; print "\t\t(Don't use -t if you have more than one glossary\n"; @@ -1058,7 +1135,7 @@ makeglossaries - Calls makeindex/xindy for LaTeX documents using glossaries pac =head1 SYNOPSIS -B<makeglossaries> [B<-o> I<file>] [B<-q>] [B<-s> I<file>] +B<makeglossaries> [B<-o> I<file>] [B<-q>] [B<-Q>] [B<-s> I<file>] [B<-t> I<file>] [B<-L> I<language>] [B<-c>] [B<-g>] [B<-l>] [B<-p> I<num>] [B<-r>] [B<-d> I<aux dir>] [B<-m> I<file>] [B<-x> I<file>] [B<--version>] [B<--help>] I<filename> @@ -1082,6 +1159,15 @@ the option arguments to B<makeglossaries>. Quiet mode. Reduces chatter to standard output. +=item B<-Q> + +Silences warning about being unable to fork. + +=item B<-k> + +Don't try forking with piped redirection. (Lessens the +effect of -q) + =item B<-o> I<file> Use I<file> as the output file. (Only suitable for documents @@ -1162,7 +1248,7 @@ See L<http://www.latex-project.org/lppl.txt> for details. =head1 AUTHOR Nicola L. C. Talbot, -L<http://theoval.cmp.uea.ac.uk/~nlct/> +L<http://www.dickimaw-books.com/> =head1 RECOMMENDED READING diff --git a/Build/source/texk/texlive/linked_scripts/texfot/texfot.pl b/Build/source/texk/texlive/linked_scripts/texfot/texfot.pl new file mode 100755 index 00000000000..39325c4c891 --- /dev/null +++ b/Build/source/texk/texlive/linked_scripts/texfot/texfot.pl @@ -0,0 +1,324 @@ +#!/usr/bin/env perl +# $Id: texfot,v 1.19 2014/03/10 16:10:56 karl Exp $ +# Invoke a TeX command, filtering all but interesting terminal output; +# do not look at the log or check any output files. +# Exit status is that of the subprogram. +# Tee the complete (unfiltered) output to (by default) /tmp/fot. +# +# Public domain. Originally written 2014 by Karl Berry. + +my $ident = '$Id: texfot,v 1.19 2014/03/10 16:10:56 karl Exp $'; +(my $prg = $0) =~ s,^.*/,,; +$| = 1; # no I/O buffering + +# require_order because we don't want getopt to permute anything; +# arguments to the tex invocation must remain in order, not be handled here. +use Getopt::Long qw(:config require_order); +use Pod::Usage; + +my $opt_debug = 0; +my @opt_ignore = (); +my $opt_interactive = 0; +my $opt_quiet = 0; +my $opt_tee = ($ENV{"TMPDIR"} || "/tmp") . "/fot"; +my $opt_version = 0; +my $opt_help = 0; + +exit (&main ()); + +sub main { + my $ret = GetOptions ( + "debug!" => \$opt_debug, + "ignore=s" => \@opt_ignore, + "interactive!" => \@opt_interactive, + "quiet!" => \$opt_quiet, + "tee=s" => \$opt_tee, + "version" => \$opt_version, + "help|?" => \$opt_help) || pod2usage (2); + + # --help, --version + pod2usage ("-exitstatus" => 0, "-verbose" => 2) + if $opt_help; + # + if ($opt_version) { + print "$ident\n"; + return 0; + } + + die "$prg: missing TeX command, i.e., a non-option argument\n" + . "Try --help if you need it." + if ! @ARGV; + + # guess we're going to do something. typically no interaction. + close (STDIN) unless $opt_interactive; + + local *FOTTMP; + $FOTTMP = ">$opt_tee"; + open (FOTTMP) || die "$prg: aborting, open(FOTTMP) failed: $!"; + + print "$0: invoking: @ARGV\n" unless $opt_quiet; + open (TEX, "-|", @ARGV) || die "$prg: open(TeX) failed: $! [cmd=@ARGV]\n"; + + my $print_next = 0; + while (<TEX>) { + print FOTTMP; # tee everything + + &debug ("checking for print_next (is $print_next)\n"); + if ($print_next) { + &debug (" printing next ($print_next)\n"); + print; + $print_next = 0; + next; + } + + &debug ("checking ignores\n"); + next if /^( + LaTeX\ Warning:\ You\ have\ requested\ package + |LaTeX\ Font\ Warning:\ Some\ font\ shapes + |pdfTeX\ warning:.*inclusion:\ fou #nd PDF version ... + |pdfTeX\ warning:.*inclusion:\ mul #tiple pdfs with page group + |Reloading\ Xunicode\ for\ encoding # spurious *** + |This\ is.*epsf\.tex # so what + )/x; + + # don't anchor user's ignores, leave it up to them. + for my $user_ignore (@opt_ignore) { + &debug ("checking user ignore $extra_ignore\n"); + next if /${user_ignore}/; + } + + &debug ("checking for print_next\n"); + if (/^( + .*?:[0-9]+: # usual file:lineno: form + |! # usual ! form + |.*pdfTeX\ warning # pdftex complaints often cross lines + |>\ [^<] # from \show..., but not "> <img.whatever" + |removed\ on\ input\ line # hyperref + )/x) { + &debug (" found print_next ($1)\n"); + print; + $print_next = 1; + next; + } + + &debug ("checking for showing\n"); + if (/^( + This\ is + |Output\ written + |No\ pages\ of\ output + |(Und|Ov)erfull + |(LaTeX|Package).*(Error|Warning) + |.*Citation.*undefined + |.*\ Error # as in \Url Error ->... + |Missing\ character: # good to show (need \tracinglostchars=1) + |\*\*\*\s # *** from some packages or subprograms + |l\.[0-9]+\ # line number marking + |all\ text\ was\ ignored\ after\ line + |.*Fatal\ error + |.*for\ symbol.*on\ input\ line + )/x) { + &debug (" matched for showing ($1)\n"); + print $_; + next; + } + + &debug ("done with all checks, ignoring line: $_"); + } + + close (TEX); + + return $?; # return exit value from command +} + +sub debug { + warn ("$prg: ", @_) + if $opt_debug; +} +__END__ + +=head1 NAME + +texfot - run TeX, filtering online transcript for interesting messages + +=head1 SYNOPSIS + +texfot [I<option>]... I<texcmd> [I<texarg>...] + +=head1 DESCRIPTION + +C<texfot> invokes I<texcmd> with the given I<texarg> arguments, +filtering the online output for ``interesting'' messages. Its exit +value is that of I<texcmd>. Examples: + + # Basic invocation: + texfot pdflatex file.tex + + # Ordinarily the output is copied to /tmp/fot before filtering; + # omit that: + texfot --tee=/dev/null file.tex + + # Example with more complex engine invocation: + texfot lualatex --recorder '\nonstopmode\input file' + +Aside from its own options, described below, C<texfot> just runs the +given command with the given arguments (same approach to command line +syntax as C<nice>, C<time>, C<timeout>, etc.). Thus, C<texfot> works +with any engine and any command line options. + +C<texfot> does not look at the log file or any other possible output +file(s); it only looks at standard output from the command. + +The messages shown are intended to be those which probably deserve some +action by the author: error messages, overfull and underfull boxes, +undefined citations, missing characters from fonts, etc. + +=head1 FLOW OF OPERATION + +Here is the order in which lines of output are checked: + +=over 4 + +=item 1. + +If the ``next line'' needs to be printed (see below), print it. + +=item 2. + +Otherwise, if the line matches the built-in list of regexps to ignore, +or any user-supplied list of regexps to ignore (given with C<--ignore>, +see below), in that order, ignore it. + +=item 3. + +Otherwise, if the line matches the list of regexps for which the next +line (two lines in all) should be shown, set the ``next line'' flag for +the next time around the loop and show this line. Examples are the +usual C<!> and C<filename:lineno:> error messages, which are generally +followed by a line with specific detail about the error. + +=item 4. + +Otherwise, if the line matches the list of regexps to show, show it. + +=item 5. + +Otherwise, ignore this line. + +=back + +Once a particular check matches, the program moves on process the next +line. + +Don't hesitate to peruse the source to the script, which is essentially +a straightforward loop matching against the different regexp lists as +above. You can see all the messages in the different categories in the +source. + +Incidentally, although nothing in this basic operation is specific to +TeX engines, all the regular expressions included in the program are +specific to TeX. So in practice the program isn't useful except with +TeX engines, although it would be easy enough to adapt it (if there was +anything else as verbose as TeX to make that useful). + +=head1 OPTIONS + +The following are the options to C<texfot> itself (not the TeX engine +being invoked; consult the TeX documentation or the engine's C<--help> +output for that). The first non-option terminates C<texfot>'s option +parsing, and the remainder of the command line is invoked as the TeX +command, without further parsing. For example, C<texfot --debug tex +--debug> will output debugging information from both C<texfot> and +C<tex>. + +Options may start with either - or --, and may be unambiguously +abbreviated. It is best to use the full option name in scripts, though, +to avoid possible collisions with new options in the future. + +=over 4 + +=item C<--debug> + +=item C<--no-debug> + +Output (or not) what is being done on standard error. Off by default. + +=item C<--ignore> I<regexp> + +Ignore lines in the TeX output matching (Perl) I<regexp>. Can be +repeated. Adds to the default set of ignore regexps rather than +replacing. These regexps are not automatically anchored (or otherwise +altered), just used as-is. + +=item C<--interactive> + +=item C<--no-interactive> + +By default, standard input to the TeX process is closed so that TeX's +interactive mode (waiting for input upon error, the C<*> prompt, etc.) +never happens. Giving C<--interactive> allows interaction to happen. + +=item C<--quiet> + +=item C<--no-quiet> + +By default, the TeX command being invoked is reported on standard output. +C<--quiet> omits that. + +=item C<--tee> I<file> + +By default, the output being filtered is C<tee>-ed, before filtering, to +C<$TMPDIR/fot> (C</tmp/fot> if C<TMPDIR> is not set), to make it easy to +check the full output when the filtering seems suspect. This option +allows specifying a different file. Use S<C<--tee /dev/null>> if you don't +want the original output at all. + +=item C<--version> + +Output version information and exit successfully. + +=item C<--help> + +Display this help and exit successfully. + +=back + +=head1 RATIONALE + +I wrote this because, in my work as a TUGboat editor +(L<http://tug.org/TUGboat>, submissions welcome), I end up running and +rerunning many papers, many times. It was too easy to lose warnings I +needed to see in the mass of unvarying and uninteresting output from +TeX, such as all the style files being read and all the fonts being +used. I wanted to see all and only those messages which actually needed +some action by me. + +I found some other programs of a similar nature, the C<silence> LaTeX +package, and plenty of other (La)TeX wrappers, but it seemed none of +them did what I wanted. Either they read the log file (I wanted the +online output only), or they output more or less than I wanted, or they +required invoking TeX differently (I wanted to keep my build process +exactly the same, definitely including the TeX invocation, which can get +complicated). Hence I finally went ahead and wrote this. + +Here are some keywords if you want to explore other options: +texloganalyser, pydflatex, logfilter, latexmk, rubber, arara, and +searching for C<log> at L<http://ctan.org/search>. + +C<texfot> is written in Perl, and runs on Unix, and does not work on +Windows. (If by some chance anyone wants to run this on Windows, please +make your own fork; I'm not interested in supporting it.) + +The name comes from the C<trip.fot> and C<trap.fot> files that are part +of Knuth's trip and trap torture tests, which record the online output +from the programs. I am not sure what "fot" stands for in trip and +trap, but I can pretend that it stands for "filter online transcript" in +the present S<case :).> + +=head1 AUTHORS AND COPYRIGHT + +This script and its documentation were written by Karl Berry and both are +released to the public domain. Email C<karl@freefriends.org> with +bug reports. There is no home page beyond the package on CTAN: +L<http://www.ctan.org/pkg/texfot>. + +=cut diff --git a/Master/bin/alpha-linux/texfot b/Master/bin/alpha-linux/texfot new file mode 120000 index 00000000000..ee6a51334b7 --- /dev/null +++ b/Master/bin/alpha-linux/texfot @@ -0,0 +1 @@ +../../texmf-dist/scripts/texfot/texfot.pl
\ No newline at end of file diff --git a/Master/bin/amd64-freebsd/texfot b/Master/bin/amd64-freebsd/texfot new file mode 120000 index 00000000000..ee6a51334b7 --- /dev/null +++ b/Master/bin/amd64-freebsd/texfot @@ -0,0 +1 @@ +../../texmf-dist/scripts/texfot/texfot.pl
\ No newline at end of file diff --git a/Master/bin/amd64-kfreebsd/texfot b/Master/bin/amd64-kfreebsd/texfot new file mode 120000 index 00000000000..ee6a51334b7 --- /dev/null +++ b/Master/bin/amd64-kfreebsd/texfot @@ -0,0 +1 @@ +../../texmf-dist/scripts/texfot/texfot.pl
\ No newline at end of file diff --git a/Master/bin/amd64-netbsd/texfot b/Master/bin/amd64-netbsd/texfot new file mode 120000 index 00000000000..ee6a51334b7 --- /dev/null +++ b/Master/bin/amd64-netbsd/texfot @@ -0,0 +1 @@ +../../texmf-dist/scripts/texfot/texfot.pl
\ No newline at end of file diff --git a/Master/bin/armel-linux/texfot b/Master/bin/armel-linux/texfot new file mode 120000 index 00000000000..ee6a51334b7 --- /dev/null +++ b/Master/bin/armel-linux/texfot @@ -0,0 +1 @@ +../../texmf-dist/scripts/texfot/texfot.pl
\ No newline at end of file diff --git a/Master/bin/armhf-linux/texfot b/Master/bin/armhf-linux/texfot new file mode 120000 index 00000000000..ee6a51334b7 --- /dev/null +++ b/Master/bin/armhf-linux/texfot @@ -0,0 +1 @@ +../../texmf-dist/scripts/texfot/texfot.pl
\ No newline at end of file diff --git a/Master/bin/i386-cygwin/texfot b/Master/bin/i386-cygwin/texfot new file mode 120000 index 00000000000..ee6a51334b7 --- /dev/null +++ b/Master/bin/i386-cygwin/texfot @@ -0,0 +1 @@ +../../texmf-dist/scripts/texfot/texfot.pl
\ No newline at end of file diff --git a/Master/bin/i386-freebsd/texfot b/Master/bin/i386-freebsd/texfot new file mode 120000 index 00000000000..ee6a51334b7 --- /dev/null +++ b/Master/bin/i386-freebsd/texfot @@ -0,0 +1 @@ +../../texmf-dist/scripts/texfot/texfot.pl
\ No newline at end of file diff --git a/Master/bin/i386-kfreebsd/texfot b/Master/bin/i386-kfreebsd/texfot new file mode 120000 index 00000000000..ee6a51334b7 --- /dev/null +++ b/Master/bin/i386-kfreebsd/texfot @@ -0,0 +1 @@ +../../texmf-dist/scripts/texfot/texfot.pl
\ No newline at end of file diff --git a/Master/bin/i386-linux/texfot b/Master/bin/i386-linux/texfot new file mode 120000 index 00000000000..ee6a51334b7 --- /dev/null +++ b/Master/bin/i386-linux/texfot @@ -0,0 +1 @@ +../../texmf-dist/scripts/texfot/texfot.pl
\ No newline at end of file diff --git a/Master/bin/i386-netbsd/texfot b/Master/bin/i386-netbsd/texfot new file mode 120000 index 00000000000..ee6a51334b7 --- /dev/null +++ b/Master/bin/i386-netbsd/texfot @@ -0,0 +1 @@ +../../texmf-dist/scripts/texfot/texfot.pl
\ No newline at end of file diff --git a/Master/bin/i386-solaris/texfot b/Master/bin/i386-solaris/texfot new file mode 120000 index 00000000000..ee6a51334b7 --- /dev/null +++ b/Master/bin/i386-solaris/texfot @@ -0,0 +1 @@ +../../texmf-dist/scripts/texfot/texfot.pl
\ No newline at end of file diff --git a/Master/bin/mips-irix/texfot b/Master/bin/mips-irix/texfot new file mode 120000 index 00000000000..ee6a51334b7 --- /dev/null +++ b/Master/bin/mips-irix/texfot @@ -0,0 +1 @@ +../../texmf-dist/scripts/texfot/texfot.pl
\ No newline at end of file diff --git a/Master/bin/mipsel-linux/texfot b/Master/bin/mipsel-linux/texfot new file mode 120000 index 00000000000..ee6a51334b7 --- /dev/null +++ b/Master/bin/mipsel-linux/texfot @@ -0,0 +1 @@ +../../texmf-dist/scripts/texfot/texfot.pl
\ No newline at end of file diff --git a/Master/bin/powerpc-linux/texfot b/Master/bin/powerpc-linux/texfot new file mode 120000 index 00000000000..ee6a51334b7 --- /dev/null +++ b/Master/bin/powerpc-linux/texfot @@ -0,0 +1 @@ +../../texmf-dist/scripts/texfot/texfot.pl
\ No newline at end of file diff --git a/Master/bin/sparc-solaris/texfot b/Master/bin/sparc-solaris/texfot new file mode 120000 index 00000000000..ee6a51334b7 --- /dev/null +++ b/Master/bin/sparc-solaris/texfot @@ -0,0 +1 @@ +../../texmf-dist/scripts/texfot/texfot.pl
\ No newline at end of file diff --git a/Master/bin/universal-darwin/texfot b/Master/bin/universal-darwin/texfot new file mode 120000 index 00000000000..ee6a51334b7 --- /dev/null +++ b/Master/bin/universal-darwin/texfot @@ -0,0 +1 @@ +../../texmf-dist/scripts/texfot/texfot.pl
\ No newline at end of file diff --git a/Master/bin/win32/texfot.exe b/Master/bin/win32/texfot.exe Binary files differnew file mode 100755 index 00000000000..5777d90a17a --- /dev/null +++ b/Master/bin/win32/texfot.exe diff --git a/Master/bin/x86_64-darwin/texfot b/Master/bin/x86_64-darwin/texfot new file mode 120000 index 00000000000..ee6a51334b7 --- /dev/null +++ b/Master/bin/x86_64-darwin/texfot @@ -0,0 +1 @@ +../../texmf-dist/scripts/texfot/texfot.pl
\ No newline at end of file diff --git a/Master/bin/x86_64-linux/texfot b/Master/bin/x86_64-linux/texfot new file mode 120000 index 00000000000..ee6a51334b7 --- /dev/null +++ b/Master/bin/x86_64-linux/texfot @@ -0,0 +1 @@ +../../texmf-dist/scripts/texfot/texfot.pl
\ No newline at end of file diff --git a/Master/bin/x86_64-solaris/texfot b/Master/bin/x86_64-solaris/texfot new file mode 120000 index 00000000000..ee6a51334b7 --- /dev/null +++ b/Master/bin/x86_64-solaris/texfot @@ -0,0 +1 @@ +../../texmf-dist/scripts/texfot/texfot.pl
\ No newline at end of file diff --git a/Master/texmf-dist/doc/man/man1/texfot.1 b/Master/texmf-dist/doc/man/man1/texfot.1 new file mode 100644 index 00000000000..b0b18cd683d --- /dev/null +++ b/Master/texmf-dist/doc/man/man1/texfot.1 @@ -0,0 +1,310 @@ +.\" Automatically generated by Pod::Man 2.27 (Pod::Simple 3.28) +.\" +.\" Standard preamble: +.\" ======================================================================== +.de Sp \" Vertical space (when we can't use .PP) +.if t .sp .5v +.if n .sp +.. +.de Vb \" Begin verbatim text +.ft CW +.nf +.ne \\$1 +.. +.de Ve \" End verbatim text +.ft R +.fi +.. +.\" Set up some character translations and predefined strings. \*(-- will +.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left +.\" double quote, and \*(R" will give a right double quote. \*(C+ will +.\" give a nicer C++. Capital omega is used to do unbreakable dashes and +.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff, +.\" nothing in troff, for use with C<>. +.tr \(*W- +.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' +.ie n \{\ +. ds -- \(*W- +. ds PI pi +. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch +. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch +. ds L" "" +. ds R" "" +. ds C` "" +. ds C' "" +'br\} +.el\{\ +. ds -- \|\(em\| +. ds PI \(*p +. ds L" `` +. ds R" '' +. ds C` +. ds C' +'br\} +.\" +.\" Escape single quotes in literal strings from groff's Unicode transform. +.ie \n(.g .ds Aq \(aq +.el .ds Aq ' +.\" +.\" If the F register is turned on, we'll generate index entries on stderr for +.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index +.\" entries marked with X<> in POD. Of course, you'll have to process the +.\" output yourself in some meaningful fashion. +.\" +.\" Avoid warning from groff about undefined register 'F'. +.de IX +.. +.nr rF 0 +.if \n(.g .if rF .nr rF 1 +.if (\n(rF:(\n(.g==0)) \{ +. if \nF \{ +. de IX +. tm Index:\\$1\t\\n%\t"\\$2" +.. +. if !\nF==2 \{ +. nr % 0 +. nr F 2 +. \} +. \} +.\} +.rr rF +.\" +.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). +.\" Fear. Run. Save yourself. No user-serviceable parts. +. \" fudge factors for nroff and troff +.if n \{\ +. ds #H 0 +. ds #V .8m +. ds #F .3m +. ds #[ \f1 +. ds #] \fP +.\} +.if t \{\ +. ds #H ((1u-(\\\\n(.fu%2u))*.13m) +. ds #V .6m +. ds #F 0 +. ds #[ \& +. ds #] \& +.\} +. \" simple accents for nroff and troff +.if n \{\ +. ds ' \& +. ds ` \& +. ds ^ \& +. ds , \& +. ds ~ ~ +. ds / +.\} +.if t \{\ +. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" +. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' +. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' +. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' +. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' +. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' +.\} +. \" troff and (daisy-wheel) nroff accents +.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' +.ds 8 \h'\*(#H'\(*b\h'-\*(#H' +.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] +.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' +.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' +.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] +.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] +.ds ae a\h'-(\w'a'u*4/10)'e +.ds Ae A\h'-(\w'A'u*4/10)'E +. \" corrections for vroff +.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' +.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' +. \" for low resolution devices (crt and lpr) +.if \n(.H>23 .if \n(.V>19 \ +\{\ +. ds : e +. ds 8 ss +. ds o a +. ds d- d\h'-1'\(ga +. ds D- D\h'-1'\(hy +. ds th \o'bp' +. ds Th \o'LP' +. ds ae ae +. ds Ae AE +.\} +.rm #[ #] #H #V #F C +.\" ======================================================================== +.\" +.IX Title "TEXFOT 1" +.TH TEXFOT 1 "2014-03-10" "texfot" "Karl Berry" +.\" For nroff, turn off justification. Always turn off hyphenation; it makes +.\" way too many mistakes in technical documents. +.if n .ad l +.nh +.SH "NAME" +texfot \- run TeX, filtering online transcript for interesting messages +.SH "SYNOPSIS" +.IX Header "SYNOPSIS" +texfot [\fIoption\fR]... \fItexcmd\fR [\fItexarg\fR...] +.SH "DESCRIPTION" +.IX Header "DESCRIPTION" +\&\f(CW\*(C`texfot\*(C'\fR invokes \fItexcmd\fR with the given \fItexarg\fR arguments, +filtering the online output for ``interesting'' messages. Its exit +value is that of \fItexcmd\fR. Examples: +.PP +.Vb 2 +\& # Basic invocation: +\& texfot pdflatex file.tex +\& +\& # Ordinarily the output is copied to /tmp/fot before filtering; +\& # omit that: +\& texfot \-\-tee=/dev/null file.tex +\& +\& # Example with more complex engine invocation: +\& texfot lualatex \-\-recorder \*(Aq\enonstopmode\einput file\*(Aq +.Ve +.PP +Aside from its own options, described below, \f(CW\*(C`texfot\*(C'\fR just runs the +given command with the given arguments (same approach to command line +syntax as \f(CW\*(C`nice\*(C'\fR, \f(CW\*(C`time\*(C'\fR, \f(CW\*(C`timeout\*(C'\fR, etc.). Thus, \f(CW\*(C`texfot\*(C'\fR works +with any engine and any command line options. +.PP +\&\f(CW\*(C`texfot\*(C'\fR does not look at the log file or any other possible output +file(s); it only looks at standard output from the command. +.PP +The messages shown are intended to be those which probably deserve some +action by the author: error messages, overfull and underfull boxes, +undefined citations, missing characters from fonts, etc. +.SH "FLOW OF OPERATION" +.IX Header "FLOW OF OPERATION" +Here is the order in which lines of output are checked: +.IP "1." 4 +If the ``next line'' needs to be printed (see below), print it. +.IP "2." 4 +Otherwise, if the line matches the built-in list of regexps to ignore, +or any user-supplied list of regexps to ignore (given with \f(CW\*(C`\-\-ignore\*(C'\fR, +see below), in that order, ignore it. +.IP "3." 4 +Otherwise, if the line matches the list of regexps for which the next +line (two lines in all) should be shown, set the ``next line'' flag for +the next time around the loop and show this line. Examples are the +usual \f(CW\*(C`!\*(C'\fR and \f(CW\*(C`filename:lineno:\*(C'\fR error messages, which are generally +followed by a line with specific detail about the error. +.IP "4." 4 +Otherwise, if the line matches the list of regexps to show, show it. +.IP "5." 4 +Otherwise, ignore this line. +.PP +Once a particular check matches, the program moves on process the next +line. +.PP +Don't hesitate to peruse the source to the script, which is essentially +a straightforward loop matching against the different regexp lists as +above. You can see all the messages in the different categories in the +source. +.PP +Incidentally, although nothing in this basic operation is specific to +TeX engines, all the regular expressions included in the program are +specific to TeX. So in practice the program isn't useful except with +TeX engines, although it would be easy enough to adapt it (if there was +anything else as verbose as TeX to make that useful). +.SH "OPTIONS" +.IX Header "OPTIONS" +The following are the options to \f(CW\*(C`texfot\*(C'\fR itself (not the TeX engine +being invoked; consult the TeX documentation or the engine's \f(CW\*(C`\-\-help\*(C'\fR +output for that). The first non-option terminates \f(CW\*(C`texfot\*(C'\fR's option +parsing, and the remainder of the command line is invoked as the TeX +command, without further parsing. For example, \f(CW\*(C`texfot \-\-debug tex +\&\-\-debug\*(C'\fR will output debugging information from both \f(CW\*(C`texfot\*(C'\fR and +\&\f(CW\*(C`tex\*(C'\fR. +.PP +Options may start with either \- or \-\-, and may be unambiguously +abbreviated. It is best to use the full option name in scripts, though, +to avoid possible collisions with new options in the future. +.ie n .IP """\-\-debug""" 4 +.el .IP "\f(CW\-\-debug\fR" 4 +.IX Item "--debug" +.PD 0 +.ie n .IP """\-\-no\-debug""" 4 +.el .IP "\f(CW\-\-no\-debug\fR" 4 +.IX Item "--no-debug" +.PD +Output (or not) what is being done on standard error. Off by default. +.ie n .IP """\-\-ignore"" \fIregexp\fR" 4 +.el .IP "\f(CW\-\-ignore\fR \fIregexp\fR" 4 +.IX Item "--ignore regexp" +Ignore lines in the TeX output matching (Perl) \fIregexp\fR. Can be +repeated. Adds to the default set of ignore regexps rather than +replacing. These regexps are not automatically anchored (or otherwise +altered), just used as-is. +.ie n .IP """\-\-interactive""" 4 +.el .IP "\f(CW\-\-interactive\fR" 4 +.IX Item "--interactive" +.PD 0 +.ie n .IP """\-\-no\-interactive""" 4 +.el .IP "\f(CW\-\-no\-interactive\fR" 4 +.IX Item "--no-interactive" +.PD +By default, standard input to the TeX process is closed so that TeX's +interactive mode (waiting for input upon error, the \f(CW\*(C`*\*(C'\fR prompt, etc.) +never happens. Giving \f(CW\*(C`\-\-interactive\*(C'\fR allows interaction to happen. +.ie n .IP """\-\-quiet""" 4 +.el .IP "\f(CW\-\-quiet\fR" 4 +.IX Item "--quiet" +.PD 0 +.ie n .IP """\-\-no\-quiet""" 4 +.el .IP "\f(CW\-\-no\-quiet\fR" 4 +.IX Item "--no-quiet" +.PD +By default, the TeX command being invoked is reported on standard output. +\&\f(CW\*(C`\-\-quiet\*(C'\fR omits that. +.ie n .IP """\-\-tee"" \fIfile\fR" 4 +.el .IP "\f(CW\-\-tee\fR \fIfile\fR" 4 +.IX Item "--tee file" +By default, the output being filtered is \f(CW\*(C`tee\*(C'\fR\-ed, before filtering, to +\&\f(CW\*(C`$TMPDIR/fot\*(C'\fR (\f(CW\*(C`/tmp/fot\*(C'\fR if \f(CW\*(C`TMPDIR\*(C'\fR is not set), to make it easy to +check the full output when the filtering seems suspect. This option +allows specifying a different file. Use \f(CW\*(C`\-\-tee\ /dev/null\*(C'\fR if you don't +want the original output at all. +.ie n .IP """\-\-version""" 4 +.el .IP "\f(CW\-\-version\fR" 4 +.IX Item "--version" +Output version information and exit successfully. +.ie n .IP """\-\-help""" 4 +.el .IP "\f(CW\-\-help\fR" 4 +.IX Item "--help" +Display this help and exit successfully. +.SH "RATIONALE" +.IX Header "RATIONALE" +I wrote this because, in my work as a TUGboat editor +(<http://tug.org/TUGboat>, submissions welcome), I end up running and +rerunning many papers, many times. It was too easy to lose warnings I +needed to see in the mass of unvarying and uninteresting output from +TeX, such as all the style files being read and all the fonts being +used. I wanted to see all and only those messages which actually needed +some action by me. +.PP +I found some other programs of a similar nature, the \f(CW\*(C`silence\*(C'\fR LaTeX +package, and plenty of other (La)TeX wrappers, but it seemed none of +them did what I wanted. Either they read the log file (I wanted the +online output only), or they output more or less than I wanted, or they +required invoking TeX differently (I wanted to keep my build process +exactly the same, definitely including the TeX invocation, which can get +complicated). Hence I finally went ahead and wrote this. +.PP +Here are some keywords if you want to explore other options: +texloganalyser, pydflatex, logfilter, latexmk, rubber, arara, and +searching for \f(CW\*(C`log\*(C'\fR at <http://ctan.org/search>. +.PP +\&\f(CW\*(C`texfot\*(C'\fR is written in Perl, and runs on Unix, and does not work on +Windows. (If by some chance anyone wants to run this on Windows, please +make your own fork; I'm not interested in supporting it.) +.PP +The name comes from the \f(CW\*(C`trip.fot\*(C'\fR and \f(CW\*(C`trap.fot\*(C'\fR files that are part +of Knuth's trip and trap torture tests, which record the online output +from the programs. I am not sure what \*(L"fot\*(R" stands for in trip and +trap, but I can pretend that it stands for \*(L"filter online transcript\*(R" in +the present case\ :). +.SH "AUTHORS AND COPYRIGHT" +.IX Header "AUTHORS AND COPYRIGHT" +This script and its documentation were written by Karl Berry and both are +released to the public domain. Email \f(CW\*(C`karl@freefriends.org\*(C'\fR with +bug reports. There is no home page beyond the package on \s-1CTAN: +\&\s0<http://www.ctan.org/pkg/texfot>. diff --git a/Master/texmf-dist/doc/man/man1/texfot.man1.pdf b/Master/texmf-dist/doc/man/man1/texfot.man1.pdf Binary files differnew file mode 100644 index 00000000000..09512664d91 --- /dev/null +++ b/Master/texmf-dist/doc/man/man1/texfot.man1.pdf diff --git a/Master/texmf-dist/doc/support/texfot/README b/Master/texmf-dist/doc/support/texfot/README new file mode 100644 index 00000000000..a4b7bddd10f --- /dev/null +++ b/Master/texmf-dist/doc/support/texfot/README @@ -0,0 +1,9 @@ +texfot is a Perl script to filter the online output from a TeX run, +attempting to show only those messages which probably deserve some +change in the source. The TeX invocation itself need not change. + +Originally written in 2014. Released to the public domain. + +Author: Karl Berry <karl@freefriends.org> +Home page: http://www.ctan.org/pkg/texfot + diff --git a/Master/texmf-dist/scripts/texfot/texfot.pl b/Master/texmf-dist/scripts/texfot/texfot.pl new file mode 100755 index 00000000000..39325c4c891 --- /dev/null +++ b/Master/texmf-dist/scripts/texfot/texfot.pl @@ -0,0 +1,324 @@ +#!/usr/bin/env perl +# $Id: texfot,v 1.19 2014/03/10 16:10:56 karl Exp $ +# Invoke a TeX command, filtering all but interesting terminal output; +# do not look at the log or check any output files. +# Exit status is that of the subprogram. +# Tee the complete (unfiltered) output to (by default) /tmp/fot. +# +# Public domain. Originally written 2014 by Karl Berry. + +my $ident = '$Id: texfot,v 1.19 2014/03/10 16:10:56 karl Exp $'; +(my $prg = $0) =~ s,^.*/,,; +$| = 1; # no I/O buffering + +# require_order because we don't want getopt to permute anything; +# arguments to the tex invocation must remain in order, not be handled here. +use Getopt::Long qw(:config require_order); +use Pod::Usage; + +my $opt_debug = 0; +my @opt_ignore = (); +my $opt_interactive = 0; +my $opt_quiet = 0; +my $opt_tee = ($ENV{"TMPDIR"} || "/tmp") . "/fot"; +my $opt_version = 0; +my $opt_help = 0; + +exit (&main ()); + +sub main { + my $ret = GetOptions ( + "debug!" => \$opt_debug, + "ignore=s" => \@opt_ignore, + "interactive!" => \@opt_interactive, + "quiet!" => \$opt_quiet, + "tee=s" => \$opt_tee, + "version" => \$opt_version, + "help|?" => \$opt_help) || pod2usage (2); + + # --help, --version + pod2usage ("-exitstatus" => 0, "-verbose" => 2) + if $opt_help; + # + if ($opt_version) { + print "$ident\n"; + return 0; + } + + die "$prg: missing TeX command, i.e., a non-option argument\n" + . "Try --help if you need it." + if ! @ARGV; + + # guess we're going to do something. typically no interaction. + close (STDIN) unless $opt_interactive; + + local *FOTTMP; + $FOTTMP = ">$opt_tee"; + open (FOTTMP) || die "$prg: aborting, open(FOTTMP) failed: $!"; + + print "$0: invoking: @ARGV\n" unless $opt_quiet; + open (TEX, "-|", @ARGV) || die "$prg: open(TeX) failed: $! [cmd=@ARGV]\n"; + + my $print_next = 0; + while (<TEX>) { + print FOTTMP; # tee everything + + &debug ("checking for print_next (is $print_next)\n"); + if ($print_next) { + &debug (" printing next ($print_next)\n"); + print; + $print_next = 0; + next; + } + + &debug ("checking ignores\n"); + next if /^( + LaTeX\ Warning:\ You\ have\ requested\ package + |LaTeX\ Font\ Warning:\ Some\ font\ shapes + |pdfTeX\ warning:.*inclusion:\ fou #nd PDF version ... + |pdfTeX\ warning:.*inclusion:\ mul #tiple pdfs with page group + |Reloading\ Xunicode\ for\ encoding # spurious *** + |This\ is.*epsf\.tex # so what + )/x; + + # don't anchor user's ignores, leave it up to them. + for my $user_ignore (@opt_ignore) { + &debug ("checking user ignore $extra_ignore\n"); + next if /${user_ignore}/; + } + + &debug ("checking for print_next\n"); + if (/^( + .*?:[0-9]+: # usual file:lineno: form + |! # usual ! form + |.*pdfTeX\ warning # pdftex complaints often cross lines + |>\ [^<] # from \show..., but not "> <img.whatever" + |removed\ on\ input\ line # hyperref + )/x) { + &debug (" found print_next ($1)\n"); + print; + $print_next = 1; + next; + } + + &debug ("checking for showing\n"); + if (/^( + This\ is + |Output\ written + |No\ pages\ of\ output + |(Und|Ov)erfull + |(LaTeX|Package).*(Error|Warning) + |.*Citation.*undefined + |.*\ Error # as in \Url Error ->... + |Missing\ character: # good to show (need \tracinglostchars=1) + |\*\*\*\s # *** from some packages or subprograms + |l\.[0-9]+\ # line number marking + |all\ text\ was\ ignored\ after\ line + |.*Fatal\ error + |.*for\ symbol.*on\ input\ line + )/x) { + &debug (" matched for showing ($1)\n"); + print $_; + next; + } + + &debug ("done with all checks, ignoring line: $_"); + } + + close (TEX); + + return $?; # return exit value from command +} + +sub debug { + warn ("$prg: ", @_) + if $opt_debug; +} +__END__ + +=head1 NAME + +texfot - run TeX, filtering online transcript for interesting messages + +=head1 SYNOPSIS + +texfot [I<option>]... I<texcmd> [I<texarg>...] + +=head1 DESCRIPTION + +C<texfot> invokes I<texcmd> with the given I<texarg> arguments, +filtering the online output for ``interesting'' messages. Its exit +value is that of I<texcmd>. Examples: + + # Basic invocation: + texfot pdflatex file.tex + + # Ordinarily the output is copied to /tmp/fot before filtering; + # omit that: + texfot --tee=/dev/null file.tex + + # Example with more complex engine invocation: + texfot lualatex --recorder '\nonstopmode\input file' + +Aside from its own options, described below, C<texfot> just runs the +given command with the given arguments (same approach to command line +syntax as C<nice>, C<time>, C<timeout>, etc.). Thus, C<texfot> works +with any engine and any command line options. + +C<texfot> does not look at the log file or any other possible output +file(s); it only looks at standard output from the command. + +The messages shown are intended to be those which probably deserve some +action by the author: error messages, overfull and underfull boxes, +undefined citations, missing characters from fonts, etc. + +=head1 FLOW OF OPERATION + +Here is the order in which lines of output are checked: + +=over 4 + +=item 1. + +If the ``next line'' needs to be printed (see below), print it. + +=item 2. + +Otherwise, if the line matches the built-in list of regexps to ignore, +or any user-supplied list of regexps to ignore (given with C<--ignore>, +see below), in that order, ignore it. + +=item 3. + +Otherwise, if the line matches the list of regexps for which the next +line (two lines in all) should be shown, set the ``next line'' flag for +the next time around the loop and show this line. Examples are the +usual C<!> and C<filename:lineno:> error messages, which are generally +followed by a line with specific detail about the error. + +=item 4. + +Otherwise, if the line matches the list of regexps to show, show it. + +=item 5. + +Otherwise, ignore this line. + +=back + +Once a particular check matches, the program moves on process the next +line. + +Don't hesitate to peruse the source to the script, which is essentially +a straightforward loop matching against the different regexp lists as +above. You can see all the messages in the different categories in the +source. + +Incidentally, although nothing in this basic operation is specific to +TeX engines, all the regular expressions included in the program are +specific to TeX. So in practice the program isn't useful except with +TeX engines, although it would be easy enough to adapt it (if there was +anything else as verbose as TeX to make that useful). + +=head1 OPTIONS + +The following are the options to C<texfot> itself (not the TeX engine +being invoked; consult the TeX documentation or the engine's C<--help> +output for that). The first non-option terminates C<texfot>'s option +parsing, and the remainder of the command line is invoked as the TeX +command, without further parsing. For example, C<texfot --debug tex +--debug> will output debugging information from both C<texfot> and +C<tex>. + +Options may start with either - or --, and may be unambiguously +abbreviated. It is best to use the full option name in scripts, though, +to avoid possible collisions with new options in the future. + +=over 4 + +=item C<--debug> + +=item C<--no-debug> + +Output (or not) what is being done on standard error. Off by default. + +=item C<--ignore> I<regexp> + +Ignore lines in the TeX output matching (Perl) I<regexp>. Can be +repeated. Adds to the default set of ignore regexps rather than +replacing. These regexps are not automatically anchored (or otherwise +altered), just used as-is. + +=item C<--interactive> + +=item C<--no-interactive> + +By default, standard input to the TeX process is closed so that TeX's +interactive mode (waiting for input upon error, the C<*> prompt, etc.) +never happens. Giving C<--interactive> allows interaction to happen. + +=item C<--quiet> + +=item C<--no-quiet> + +By default, the TeX command being invoked is reported on standard output. +C<--quiet> omits that. + +=item C<--tee> I<file> + +By default, the output being filtered is C<tee>-ed, before filtering, to +C<$TMPDIR/fot> (C</tmp/fot> if C<TMPDIR> is not set), to make it easy to +check the full output when the filtering seems suspect. This option +allows specifying a different file. Use S<C<--tee /dev/null>> if you don't +want the original output at all. + +=item C<--version> + +Output version information and exit successfully. + +=item C<--help> + +Display this help and exit successfully. + +=back + +=head1 RATIONALE + +I wrote this because, in my work as a TUGboat editor +(L<http://tug.org/TUGboat>, submissions welcome), I end up running and +rerunning many papers, many times. It was too easy to lose warnings I +needed to see in the mass of unvarying and uninteresting output from +TeX, such as all the style files being read and all the fonts being +used. I wanted to see all and only those messages which actually needed +some action by me. + +I found some other programs of a similar nature, the C<silence> LaTeX +package, and plenty of other (La)TeX wrappers, but it seemed none of +them did what I wanted. Either they read the log file (I wanted the +online output only), or they output more or less than I wanted, or they +required invoking TeX differently (I wanted to keep my build process +exactly the same, definitely including the TeX invocation, which can get +complicated). Hence I finally went ahead and wrote this. + +Here are some keywords if you want to explore other options: +texloganalyser, pydflatex, logfilter, latexmk, rubber, arara, and +searching for C<log> at L<http://ctan.org/search>. + +C<texfot> is written in Perl, and runs on Unix, and does not work on +Windows. (If by some chance anyone wants to run this on Windows, please +make your own fork; I'm not interested in supporting it.) + +The name comes from the C<trip.fot> and C<trap.fot> files that are part +of Knuth's trip and trap torture tests, which record the online output +from the programs. I am not sure what "fot" stands for in trip and +trap, but I can pretend that it stands for "filter online transcript" in +the present S<case :).> + +=head1 AUTHORS AND COPYRIGHT + +This script and its documentation were written by Karl Berry and both are +released to the public domain. Email C<karl@freefriends.org> with +bug reports. There is no home page beyond the package on CTAN: +L<http://www.ctan.org/pkg/texfot>. + +=cut diff --git a/Master/tlpkg/bin/tlpkg-ctan-check b/Master/tlpkg/bin/tlpkg-ctan-check index 4d718406f9c..c26fa163986 100755 --- a/Master/tlpkg/bin/tlpkg-ctan-check +++ b/Master/tlpkg/bin/tlpkg-ctan-check @@ -459,7 +459,7 @@ my @TLP_working = qw( tex-ewd tex-font-errors-cheatsheet tex-gyre tex-gyre-math tex-label tex-overview tex-refs texapi texbytopic texcount - texdef texdiff texdirflatten texdraw texilikechaps texilikecover + texdef texdiff texdirflatten texdraw texfot texilikechaps texilikecover texliveonfly texloganalyser texlogos texmate texments texpower texshade textcase textfit textglos textgreek textmerg textopo textpath textpos diff --git a/Master/tlpkg/libexec/ctan2tds b/Master/tlpkg/libexec/ctan2tds index 63ffde95d74..45640235d51 100755 --- a/Master/tlpkg/libexec/ctan2tds +++ b/Master/tlpkg/libexec/ctan2tds @@ -1123,6 +1123,7 @@ chomp ($Build = `cd $Master/../Build/source && pwd`); 'skb' => '&PREHOOK_flatten1', 'suftesi' => '&PREHOOK_suftesi', 'texdraw' => '&PREHOOK_texdraw', + 'texfot' => '&PREHOOK_texfot', 'tui' => '&PREHOOK_tui', 'vhistory' => '&PREHOOK_vhistory', 'wsuipa' => '&PREHOOK_wsuipa', @@ -2505,6 +2506,7 @@ $standardxmt='\.xmt'; 'texdef' => '\.pl$', 'texdiff' => 'texdiff$', 'texdirflatten' => 'texdirflatten$', + 'texfot' => 'texfot\.pl$', 'texliveonfly' => '\.py$', 'texloganalyser' => 'texloganalyser', 'typeoutfileinfo' => '\.sh$', @@ -2552,6 +2554,7 @@ $standardxmt='\.xmt'; 'splitindex' => '\.1$', 'sty2dtx' => '\.1$', 'texdiff' => 'texdiff.1', + 'texfot' => '\.1$', 'texdirflatten' => 'texdirflatten.1', 'wheretotrim' => '\.1$', ); @@ -4772,20 +4775,6 @@ sub PREHOOK_fontools { &SYSTEM ("$RM -rf doc"); # remove distributed pdf's } -sub PREHOOK_latex_git_log { - print "PREHOOK_$package - make .1 with pod2man\n"; - &prehook_pod2man ("Robin Schneider", $package); -} - -sub prehook_pod2man { - my ($author,@scripts) = @_; - for my $script (@scripts) { - my $pod2man = qq(pod2man --center="$author" --release="$package") - . ' --section=1'; - &SYSTEM ("$pod2man $script - >$script.1"); - } -} - sub PREHOOK_ibygrk { print "PREHOOK_$package - handle ibycus4.map\n"; # ibygrk has two instances of the same file ibycus4.map; it is @@ -4864,6 +4853,12 @@ sub PREHOOK_texdraw { &SYSTEM ("cd manual && $RM *.c *.h texi2dvi texinfo.tex"); } +sub PREHOOK_texfot { + print "PREHOOK_$package - make .1 with pod2man\n"; + &prehook_pod2man ("Karl Berry", "$package.pl"); + &SYSTEM ("$RM $package.pdf"); +} + sub PREHOOK_tui { print "PREHOOK_$package - flatten only some subdirs\n"; &SYSTEM ("$MV doc/* tex/* ."); @@ -4887,6 +4882,16 @@ sub PREHOOK_wsuipa { } +sub prehook_pod2man { + my ($author,@scripts) = @_; + for my $script (@scripts) { + my $pod2man = qq(pod2man --center="$author" --release="$package") + . ' --section=1'; + (my $base = $script) =~ s,\.pl$,,; + &SYSTEM ("$pod2man $script - >$base.1"); + } +} + sub POSTamscls { print "POST$package - bst/amscls, rm dup sources, restore amsbooka\n"; diff --git a/Master/tlpkg/tlpsrc/collection-binextra.tlpsrc b/Master/tlpkg/tlpsrc/collection-binextra.tlpsrc index 6ce7c0e82ad..9ee425e4177 100644 --- a/Master/tlpkg/tlpsrc/collection-binextra.tlpsrc +++ b/Master/tlpkg/tlpsrc/collection-binextra.tlpsrc @@ -64,6 +64,7 @@ depend texdef depend texdiff depend texdirflatten depend texdoc +depend texfot depend texliveonfly depend texloganalyser depend texware diff --git a/Master/tlpkg/tlpsrc/texfot.tlpsrc b/Master/tlpkg/tlpsrc/texfot.tlpsrc new file mode 100644 index 00000000000..dca338c719c --- /dev/null +++ b/Master/tlpkg/tlpsrc/texfot.tlpsrc @@ -0,0 +1 @@ +binpattern f bin/${ARCH}/${PKGNAME} |