summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rwxr-xr-xBuild/source/texk/texlive/linked_scripts/latexdiff/latexdiff-vc.pl112
-rwxr-xr-xBuild/source/texk/texlive/linked_scripts/latexdiff/latexdiff.pl387
-rwxr-xr-xBuild/source/texk/texlive/linked_scripts/texlive/tlmgr.pl183
-rw-r--r--Master/texmf-dist/doc/man/man1/latexdiff-vc.146
-rw-r--r--Master/texmf-dist/doc/man/man1/latexdiff-vc.man1.pdfbin10964 -> 32148 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/latexdiff.1153
-rw-r--r--Master/texmf-dist/doc/man/man1/latexdiff.man1.pdfbin37584 -> 65711 bytes
-rw-r--r--Master/texmf-dist/doc/man/man1/latexrevise.129
-rw-r--r--Master/texmf-dist/doc/man/man1/latexrevise.man1.pdfbin8976 -> 29859 bytes
-rw-r--r--Master/texmf-dist/doc/support/latexdiff/README8
-rw-r--r--Master/texmf-dist/doc/support/latexdiff/doc/latexdiff-man.pdfbin288437 -> 268129 bytes
-rw-r--r--Master/texmf-dist/doc/support/latexdiff/doc/latexdiff-man.tex16
-rwxr-xr-xMaster/texmf-dist/doc/support/latexdiff/latexdiff387
-rwxr-xr-xMaster/texmf-dist/doc/support/latexdiff/latexdiff-fast387
-rwxr-xr-xMaster/texmf-dist/scripts/latexdiff/latexdiff-vc.pl112
-rwxr-xr-xMaster/texmf-dist/scripts/latexdiff/latexdiff.pl387
16 files changed, 1495 insertions, 712 deletions
diff --git a/Build/source/texk/texlive/linked_scripts/latexdiff/latexdiff-vc.pl b/Build/source/texk/texlive/linked_scripts/latexdiff/latexdiff-vc.pl
index 7d954c15ec2..c8d6d3b7c5b 100755
--- a/Build/source/texk/texlive/linked_scripts/latexdiff/latexdiff-vc.pl
+++ b/Build/source/texk/texlive/linked_scripts/latexdiff/latexdiff-vc.pl
@@ -25,6 +25,13 @@
#
# Detailed usage information at the end of the file
#
+# TODO/IDEAS: - option to call external pre-processing codes
+#
+# version 1.1.1:
+# - better detection of RCS system
+# - undocumented option --debug/--nodebug to override default setting for debug mode (Default: 0)#
+# - bug fix: --flatten option combined with --pdf caused confusion of old and new file
+#
# version 1.1.0:
#
# - with option --flatten and version control option, checkout the whole tree into a temporary directory
@@ -53,10 +60,13 @@ use strict ;
use warnings ;
my $versionstring=<<EOF ;
-This is LATEXDIFF-VC 1.1.0
+This is LATEXDIFF-VC 1.1.1
(c) 2005-2015 F J Tilmann
EOF
+# output debug and intermediate files, set to 0 in final distribution
+my $debug=0;
+
# Option names
my ($version,$help,$fast,$so,$postscript,$pdf,$onlychanges,$flatten,$force,$dir,$cvs,$rcs,$svn,$git,$hg,$diffcmd,$patchcmd,@revs);
@@ -86,7 +96,11 @@ GetOptions('revision|r:s' => \@revs,
'only-changes' => \$onlychanges,
'flatten:s' => \$flatten,
'version' => \$version,
- 'help|h' => \$help);
+ 'help|h' => \$help,
+ 'debug!' => \$debug);
+
+##print STDERR "DEBUG 1:revs($#revs): " . join(":",@revs) . "\n";
+##print STDERR "DEBUG 1:ARGV($#ARGV): " . join(":",@ARGV) . "\n";
$extracomp = join(" ",grep(/BAR/,@ARGV)); # special latexdiff options requiring additional compilation
@@ -125,12 +139,12 @@ if ( $git ) {
# check whether the first file name or first passed-through option for latexdiff got misinterpreted as an option to an empty -r option
if ( @revs && ( -f $revs[$#revs] || $revs[$#revs] =~ /^-/ ) ) {
- unshift @ARGV,$revs[$#revs];
+ push @ARGV,$revs[$#revs];
$revs[$#revs]="";
}
# check whether the first file name or first passed-through option for latexdiff got misinterpreted as an option to an empty -d option
if ( defined($dir) && ( -f $dir || $dir =~ /^-/ ) ) {
- unshift @ARGV,$dir;
+ push @ARGV,$dir;
$dir="";
}
# check whether the first file name or first passed-through option for latexdiff got misinterpreted as an option to an empty --flatten option
@@ -139,8 +153,7 @@ if ( defined($flatten) && ( -f $flatten || $flatten =~ /^-/ ) ) {
$flatten="";
}
-
-#print "DEBUG: latexdiff-vc command line: ", join(" ",@ARGV), "\n";
+print "DEBUG: PDF $pdf latexdiff-vc command line: ", join(" ",@ARGV), "\n" if $debug;
$file2=pop @ARGV;
( defined($file2) && $file2 =~ /\.(tex|bbl|flt)$/ ) or pod2usage("Must specify at least one tex, bbl or flt file");
@@ -158,7 +171,7 @@ if (! $vc && scalar(@revs)>0 ) {
$vc="GIT";
} elsif ( $0 =~ /-hg$/ ) {
$vc="HG";
- } elsif ( -e "$file2,v" ) {
+ } elsif ( -e "$file2,v" || -d "RCS" ) {
print STDERR "Guess you are using RCS ...\n";
$vc="RCS";
} elsif ( -d ".svn" ) {
@@ -192,7 +205,7 @@ if ( scalar(@revs)>0 ) {
$diffcmd = "rcsdiff -u -r";
$patchcmd = "patch -R -p0";
} elsif ( $vc eq "SVN" ) {
- $diffcmd = "svn diff -r ";
+ $diffcmd = "svn diff --internal-diff -r ";
$patchcmd = "patch -R -p0";
} elsif ( $vc eq "GIT" ) {
$diffcmd = "git diff -r --relative --no-prefix ";
@@ -231,7 +244,7 @@ if ( defined($flatten) ) {
# impose ZLABEL subtype if --only-changes option
if ( $onlychanges ) {
- push @ldoptions, "-s", "ZLABEL" ;
+ push @ldoptions, "-s", "ZLABEL","-f","IDENTICAL" ;
}
if ( scalar(@revs) == 0 ) {
@@ -244,7 +257,7 @@ if ( scalar(@revs) == 0 ) {
if ( $flatten ) {
pod2usage("Only one root file must be given if --flatten option is used with version control") if @files != 1;
$tempdir='.' if ( $flatten eq "keep-intermediate" );
- print "flatten tempdir |$tempdir|";
+ print "flatten tempdir |$tempdir|\n";
if ( $vc eq "SVN" ) {
my (@infoout)=`svn info`;
my (@urlline) = grep(/^URL:/, @infoout);
@@ -277,7 +290,6 @@ if ( ($vc eq "SVN" || $vc eq "CVS") && scalar(@revs)) {
length($revs[0]) > 0 or $revs[0]="HEAD";
}
-#exit ;
# cycle through all files
@@ -352,7 +364,7 @@ while ( $infile=$file2=shift @files ) {
die "Abort ... " ;
}
}
- print "Running $latexdiff\n";
+ print "Running: $latexdiff $options \"$file1\" \"$file2\" > \"$diff\"\n";
unless ( system("$latexdiff $options \"$file1\" \"$file2\" > \"$diff\"") == 0 ) {
print STDERR "Something went wrong in $latexdiff. Deleting $diff and abort\n" ; unlink $diff ; exit(5)
};
@@ -384,44 +396,44 @@ foreach $diff ( @difffiles ) {
}
if ( $pdf | $postscript ) {
- print STDERR "PDF: $pdf Postscript: $postscript cwd $cwd\n";
-
- if ( system("grep -q \'^[^%]*\\\\bibliography\' \"$diff\"") == 0 ) {
- system("$latexcmd --interaction=batchmode \"$diff\"; bibtex \"$diffbase\";");
- push @ptmpfiles, "$diffbase.bbl","$diffbase.bbl" ;
- }
+ print STDERR "PDF: $pdf Postscript: $postscript cwd $cwd\n" if $debug;
- # if special needs, as CHANGEBAR
- if ( $extracomp ) {
- # print "Extracomp\n";
- system("$latexcmd --interaction=batchmode \"$diff\";");
- }
-
- # final compilation
- system("$latexcmd --interaction=batchmode \"$diff\";"); # needed if cross-refs
- system("$latexcmd \"$diff\";"); # final, with possible error messages
-
- if ( $postscript ) {
- my $dvi="$diffbase.dvi";
- my $ps="$diffbase.ps";
- my $ppoption="";
+ if ( system("grep -q \'^[^%]*\\\\bibliography{\' \"$diff\"") == 0 ) {
+ system("$latexcmd --interaction=batchmode \"$diff\"; bibtex \"$diffbase\";");
+ push @ptmpfiles, "$diffbase.bbl","$diffbase.bbl" ;
+ }
- if ( $onlychanges ) {
- $ppoption="-pp ".join(",",findchangedpages("$diffbase.aux"));
+ # if special needs, as CHANGEBAR
+ if ( $extracomp ) {
+ # print "Extracomp\n";
+ system("$latexcmd --interaction=batchmode \"$diff\";");
}
- system("dvips $ppoption -o $ps $dvi");
- push @ptmpfiles, "$diffbase.aux","$diffbase.log",$dvi ;
- print "Generated postscript file $ps\n";
- }
- elsif ( $pdf ) {
- if ( $onlychanges ) {
- my @pages=findchangedpages("$diffbase.aux");
- system ("pdftk \"$diffbase.pdf\" cat " . join(" ",@pages) . " output \"$diffbase-changedpage.pdf\"")==0 or
- die ("Could not execute <pdftk $diffbase.pdf cat " . join(" ",@pages) . " output $diffbase-changedpage.pdf> . Return code: $?");
- move("$diffbase-changedpage.pdf","$diffbase.pdf");
+
+ # final compilation
+ system("$latexcmd --interaction=batchmode \"$diff\";"); # needed if cross-refs
+ system("$latexcmd \"$diff\";"); # final, with possible error messages
+
+ if ( $postscript ) {
+ my $dvi="$diffbase.dvi";
+ my $ps="$diffbase.ps";
+ my $ppoption="";
+
+ if ( $onlychanges ) {
+ $ppoption="-pp ".join(",",findchangedpages("$diffbase.aux"));
+ }
+ system("dvips $ppoption -o $ps $dvi");
+ push @ptmpfiles, "$diffbase.aux","$diffbase.log",$dvi ;
+ print "Generated postscript file $ps\n";
+ } elsif ( $pdf ) {
+ if ( $onlychanges ) {
+ my @pages=findchangedpages("$diffbase.aux");
+ ### print ("Running pdftk \"$diffbase.pdf\" cat " . join(" ",@pages) . " output \"$diffbase-changedpage.pdf\"\n") or
+ system ("pdftk \"$diffbase.pdf\" cat " . join(" ",@pages) . " output \"$diffbase-changedpage.pdf\"")==0 or
+ die ("Could not execute <pdftk $diffbase.pdf cat " . join(" ",@pages) . " output $diffbase-changedpage.pdf> . Return code: $?");
+ move("$diffbase-changedpage.pdf","$diffbase.pdf");
+ }
+ push @ptmpfiles, "$diffbase.aux","$diffbase.log";
}
- push @ptmpfiles, "$diffbase.aux","$diffbase.log";
- }
}
unlink @ptmpfiles;
chdir $cwd;
@@ -464,6 +476,7 @@ sub checkout_dir {
if ( $vc eq "SVN" ) {
system("svn checkout -r $rev $rootdir $dirname")==0 or die "Something went wrong in executing: svn checkout -r $rev $rootdir $dirname";
} elsif ( $vc eq "GIT" ) {
+ $rev="HEAD" if length($rev)==0;
system("git archive --format=tar $rev | ( cd $dirname ; tar -xf -)")==0 or die "Something went wrong in executing: git archive --format=tar $rev | ( cd $dirname ; tar -xf -)";
} elsif ( $vc eq "HG" ) {
system("hg archive --type files -r $rev $dirname")==0 or die "Something went wrong in executing: hg archive --type files -r $rev $dirname";
@@ -509,7 +522,7 @@ B<latexdiff-vc> [ F<latexdiff-options> ] [ F<latexdiff-vc-options> ][ B<--posts
=head1 DESCRIPTION
I<latexdiff-vc> is a wrapper script that applies I<latexdiff> to a
-file, or multiple files under version control (CVS, RCS or SVN), and optionally runs the
+file, or multiple files under version control (git, subversion (SVN), mercurial (hg), CVS, RCS), and optionally runs the
sequence of C<latex> and C<dvips> or C<pdflatex> commands necessary to
produce pdf or postscript output of the difference tex file(s). It can
also be applied to a pair of files to automatise the generation of difference
@@ -524,7 +537,7 @@ file in postscript or pdf format.
Set the version system.
If no version system is specified, latexdiff-vc will venture a guess.
-latexdiff-cvs and latexdiff-rcs are variants of latexdiff-vc which default to
+latexdiff-cvs, latexdiff-rcs etc are variants of latexdiff-vc which default to
the respective versioning system. However, this default can still be overridden using the options above.
=item B<-r>, B<-r> F<rev> or B<--revision>, B<--revision=>F<rev>
@@ -633,11 +646,12 @@ or higher are required.
=head1 BUG REPORTING
Please submit bug reports using the issue tracker of the github repository page I<https://github.com/ftilmann/latexdiff.git>,
-or send them to I<tilmann -- AT -- gfz-potsdam.de>. Include the serial number of I<latexdiff-vc>
+or send them to I<tilmann -- AT -- gfz-potsdam.de>. Include the version number of I<latexdiff-vc>
(option C<--version>).
=head1 AUTHOR
+Version 1.1.1
Copyright (C) 2005-2015 Frederik Tilmann
This program is free software; you can redistribute it and/or modify
diff --git a/Build/source/texk/texlive/linked_scripts/latexdiff/latexdiff.pl b/Build/source/texk/texlive/linked_scripts/latexdiff/latexdiff.pl
index 171c24be7ae..697571fd4a0 100755
--- a/Build/source/texk/texlive/linked_scripts/latexdiff/latexdiff.pl
+++ b/Build/source/texk/texlive/linked_scripts/latexdiff/latexdiff.pl
@@ -23,7 +23,14 @@
# Detailed usage information at the end of the file
#
# ToDo:
-# DONE
+#
+# Version 1.1.1
+# - patch mhchem: allow ce in equations
+# - flatten now also expands \input etc. in the preamble (but not \usepackage!)
+# - Better support for Japanese ( contributed by github user kshramt )
+# - prevent duplicated verbatim hashes (patch contributed by github user therussianjig, issue #36)
+# - disable deleted label commands (fixes issue #31)
+# - introduce post-processing to reinstate most deleted environments and all needed item commands (fixes issue #1)
#
# Version 1.1.0
# - treat diacritics (\",\', etc) as safe commands
@@ -582,7 +589,7 @@ my ($algodiffversion)=split(/ /,$Algorithm::Diff::VERSION);
my ($versionstring)=<<EOF ;
-This is LATEXDIFF 1.1.0 (Algorithm::Diff $Algorithm::Diff::VERSION, Perl $^V)
+This is LATEXDIFF 1.1.1 (Algorithm::Diff $Algorithm::Diff::VERSION, Perl $^V)
(c) 2004-2015 F J Tilmann
EOF
@@ -595,16 +602,19 @@ my $MATHENV='(?:equation[*]?|displaymath|DOLLARDOLLAR)[*]?' ; # Enviro
my $MATHREPL='displaymath'; # Environment introducing deleted maths blocks
my $MATHARRENV='(?:eqnarray|align|alignat|gather|multline|flalign)[*]?' ; # Environments turning on eqnarray math mode
my $MATHARRREPL='eqnarray*'; # Environment introducing deleted maths blocks
-my $ARRENV='(?:array|[pbvBV]?matrix|smallmatrix|cases|split)'; # Environments making arrays in math mode. The underlining style does not cope well with those - as a result in-text math environments are surrounded by \mbox{ } if any of these commands is used in an inline math block
+my $ARRENV='(?:aligned|array|[pbvBV]?matrix|smallmatrix|cases|split)'; # Environments making arrays in math mode. The underlining style does not cope well with those - as a result in-text math environments are surrounded by \mbox{ } if any of these commands is used in an inline math block
my $COUNTERCMD='(?:footnote|part|chapter|section|subsection|subsubsection|paragraph|subparagraph)'; # textcmds which are associated with a counter
# If any of these commands occur in a deleted block
# they will be succeeded by an \addtocounter{...}{-1}
# for the associated counter such that the overall numbers
# should be the same as in the new file
-my @UNSAFEMATHCMD=('qedhere'); # Commands which are definitely unsafe for marking up (amsmath qedhere only tested to not work with UNDERLINE markup)
+my $LABELCMD='(?:label)'; # matching commands are disabled within deleted blocks - mostly useful for maths mode, as otherwise it would be fine to just not add those to SAFECMDLIST
+my @UNSAFEMATHCMD=('qedhere'); # Commands which are definitely unsafe for marking up in math mode (amsmath qedhere only tested to not work with UNDERLINE markup) (only affects WHOLE and COARSE math markup modes). Note that unlike text mode (or FINE math mode0 deleted unsafe commands are not deleted but simply taken outside \DIFdel
my $MBOXINLINEMATH=0; # if set to 1 then surround marked-up inline maths expression with \mbox ( to get around compatibility
# problems between some maths packages and ulem package
+my $LISTENV='(?:itemize|description|enumerate)'; # list making environments - they will generally be kept
+my $ITEMCMD='item';
# Markup strings
# If at all possible, do not change these as parts of the program
@@ -888,6 +898,8 @@ foreach $assign ( @config ) {
$assign=~ m/\s*(\w*)\s*=\s*(\S*)\s*$/ or die "Illegal assignment $assign in configuration list (must be variable=value)";
if ( $1 eq "MINWORDSBLOCK" ) { $MINWORDSBLOCK = $2; }
elsif ( $1 eq "FLOATENV" ) { $FLOATENV = $2 ; }
+ elsif ( $1 eq "ITEMCMD" ) { $ITEMCMD = $2 ; }
+ elsif ( $1 eq "LISTENV" ) { $LISTENV = $2 ; }
elsif ( $1 eq "PICTUREENV" ) { $PICTUREENV = $2 ; }
elsif ( $1 eq "MATHENV" ) { $MATHENV = $2 ; }
elsif ( $1 eq "MATHREPL" ) { $MATHREPL = $2 ; }
@@ -934,15 +946,17 @@ if ($showtext) {
if ($showconfig) {
print "Configuration variables:\n";
- print "MINWORDSBLOCK=$MINWORDSBLOCK\n";
+ print "ARRENV=$ARRENV\n";
+ print "COUNTERCMD=$COUNTERCMD\n";
print "FLOATENV=$FLOATENV\n";
- print "PICTUREENV=$PICTUREENV\n";
- print "MATHENV=$MATHENV\n";
- print "MATHREPL=$MATHREPL\n";
+ print "ITEMCMD=$ITEMCMD\n";
+ print "LISTENV=$LISTENV\n";
print "MATHARRENV=$MATHARRENV\n";
print "MATHARRREPL=$MATHARRREPL\n";
- print "ARRENV=$ARRENV\n";
- print "COUNTERCMD=$COUNTERCMD\n";
+ print "MATHENV=$MATHENV\n";
+ print "MATHREPL=$MATHREPL\n";
+ print "MINWORDSBLOCK=$MINWORDSBLOCK\n";
+ print "PICTUREENV=$PICTUREENV\n";
}
if ($showconfig || $showtext || $showsafe || $showpreamble) {
exit 0; }
@@ -971,13 +985,14 @@ push(@SAFECMDLIST, qr/^QLEFTBRACE$/, qr/^QRIGHTBRACE$/);
# Patterns. These are used by some of the subroutines, too
# I can only define them down here because value of extraspace depends on an option
+
my $pat0 = '(?:[^{}])*';
- my $pat1 = '(?:[^{}]|\{'.$pat0.'\})*';
- my $pat2 = '(?:[^{}]|\{'.$pat1.'\})*';
- my $pat3 = '(?:[^{}]|\{'.$pat2.'\})*';
- my $pat4 = '(?:[^{}]|\{'.$pat3.'\})*';
- my $pat5 = '(?:[^{}]|\{'.$pat4.'\})*';
- my $pat6 = '(?:[^{}]|\{'.$pat5.'\})*';
+ my $pat_n = $pat0;
+# if you get "undefined control sequence MATHBLOCKmath" error, increase the maximum value in this loop
+ for (my $i_pat = 0; $i_pat < 20; ++$i_pat){
+ $pat_n = '(?:[^{}]|\{'.$pat_n.'\})*';
+ }
+
my $brat0 = '(?:[^\[\]]|\\\[|\\\])*';
my $abrat0 = '(?:[^<>])*';
@@ -991,11 +1006,12 @@ push(@SAFECMDLIST, qr/^QLEFTBRACE$/, qr/^QRIGHTBRACE$/);
# such that a\_b is interpreted as a{\_}b by latex but a{\_b} by perl
my $quotedunderscore='\\\\_';
# word: sequence of letters or accents followed by letter
- my $word='(?:[-\w\d*]|\\\\[\"\'\`~^][A-Za-z\*])+';
+ my $word_ja='\p{Han}+|\p{InHiragana}+|\p{InKatakana}+';
+ my $word='(?:' . $word_ja . '|(?:(?:[-\w\d*]|\\\\[\"\'\`~^][A-Za-z\*])(?!(?:' . $word_ja . ')))+)';
my $cmdleftright='\\\\(?:left|right|[Bb]igg?[lrm]?|middle)\s*(?:[<>()\[\]|]|\\\\(?:[|{}]|\w+))';
- my $cmdoptseq='\\\\[\w\d\*]+'.$extraspace.'(?:(?:<'.$abrat0.'>|\['.$brat0.'\]|\{'. $pat6 . '\}|\(' . $coords .'\))'.$extraspace.')*';
+ my $cmdoptseq='\\\\[\w\d\*]+'.$extraspace.'(?:(?:<'.$abrat0.'>|\['.$brat0.'\]|\{'. $pat_n . '\}|\(' . $coords .'\))'.$extraspace.')*';
my $backslashnl='\\\\\n';
- my $oneletcmd='\\\\.\*?(?:\['.$brat0.'\]|\{'. $pat6 . '\})*';
+ my $oneletcmd='\\\\.\*?(?:\['.$brat0.'\]|\{'. $pat_n . '\})*';
my $math='\$(?:[^$]|\\\$)*?\$|\\\\[(](?:.|\n)*?\\\\[)]';
## the current maths command cannot cope with newline within the math expression
my $comment='%.*?\n';
@@ -1005,10 +1021,10 @@ push(@SAFECMDLIST, qr/^QLEFTBRACE$/, qr/^QRIGHTBRACE$/);
my ($oldfile, $newfile) = @ARGV;
# check for existence of input files
if ( ! -e $oldfile ) {
- die "Input file $oldfile does not exist.";
+ die "Input file $oldfile does not exist";
}
if ( ! -e $newfile ) {
- die "Input file $newfile does not exist.";
+ die "Input file $newfile does not exist";
}
@@ -1052,6 +1068,10 @@ exetime(1);
if ($flatten) {
$oldbody=flatten($oldbody,$oldpreamble,$oldfile,$encoding);
$newbody=flatten($newbody,$newpreamble,$newfile,$encoding);
+ # flatten preamble
+ $oldpreamble=flatten($oldpreamble,$oldpreamble,$oldfile,$encoding);
+ $newpreamble=flatten($newpreamble,$newpreamble,$newfile,$encoding);
+
}
@@ -1179,7 +1199,7 @@ if (defined $packages{"glossaries"} ) {
}
}
-if (defined $packages{"chemformula"} ) {
+if (defined $packages{"chemformula"} or defined $packages{"chemmacros"} ) {
print STDERR "chemformula package detected.\n" if $verbose ;
init_regex_arr_ext(\@SAFECMDLIST,'ch');
push(@UNSAFEMATHCMD,'ch');
@@ -1191,7 +1211,7 @@ if (defined $packages{"chemformula"} ) {
if (defined $packages{"mhchem"} ) {
print STDERR "mhchem package detected.\n" if $verbose ;
init_regex_arr_ext(\@SAFECMDLIST,'ce');
- push(@UNSAFEMATHCMD,'cee');
+ push(@UNSAFEMATHCMD,'ce','cee');
# The next command would be needed to allow highlighting the interior of \cee commands in math environments
# but the redefinitions in chemformula are too deep to make this viable
# push(@MATHTEXTCMDLIST,'cee');
@@ -1235,6 +1255,11 @@ foreach $mboxcmd ( @MBOXCMDLIST ) {
init_regex_arr_ext(\@SAFECMDLIST, $mboxcmd);
}
+# check if \label is in SAFECMDLIST, and if yes replace "label" in $LABELCMD by something that never matches (we hope!)
+if ( iscmd("label",\@SAFECMDLIST,\@SAFECMDEXCL) ) {
+ $LABELCMD=~ s/label/NEVERMATCHLABEL/;
+}
+
print STDERR "Preprocessing body. " if $verbose;
@@ -1249,14 +1274,14 @@ if ( $debug ) {
print RAWDIFF $diffbo;
close(RAWDIFF);
}
-print STDERR "(",exetime()," s)\n","Postprocessing body. \n " if $verbose;
+print STDERR "(",exetime()," s)\n","Postprocessing body. \n" if $verbose;
postprocess($diffbo);
$diffall =join("\n",@diffpreamble) ;
# add visible labels
if (defined($visiblelabel)) {
# Give information right after \begin{document} (or at the beginning of the text for files without preamble
### if \date command is used, add information to \date argument, otherwise give right after \begin{document}
- ### $diffall=~s/(\\date$extraspace(?:\[$brat0\])?$extraspace)\{($pat6)\}/$1\{$2 \\ LATEXDIFF comparison \\ Old: $oldlabel \\ New: $newlabel \}/ or
+ ### $diffall=~s/(\\date$extraspace(?:\[$brat0\])?$extraspace)\{($pat_n)\}/$1\{$2 \\ LATEXDIFF comparison \\ Old: $oldlabel \\ New: $newlabel \}/ or
$diffbo = "\\begin{verbatim}LATEXDIFF comparison\nOld: $oldlabel\nNew: $newlabel\\end{verbatim}\n$diffbo" ;
}
@@ -1347,18 +1372,24 @@ sub read_file_with_encoding {
# %packages=list_packages($preamble)
# scans the arguments for \documentclass,\RequirePackage and \usepackage statements and constructs a hash
# whose keys are the included packages, and whose values are the associated optional arguments
+# if argument of \usepackage or \RequirePackage is comma separated list, treat as different packages
sub list_packages {
my ($preamble)=@_;
my %packages=();
+ my $pkg;
# remove comments
$preamble=~s/(?<!\\)%.*$//mg ;
while ( $preamble =~ m/\\(?:documentclass|usepackage|RequirePackage)(?:\[($brat0)\])?\{(.*?)\}/gs ) {
if (defined($1)) {
- $packages{$2}=$1;
+ foreach $pkg ( split /,/,$2 ) {
+ $packages{$pkg}=$1;
+ }
} else {
- $packages{$2}="";
+ foreach $pkg ( split /,/,$2 ) {
+ $packages{$pkg}="";
+ }
}
}
return (%packages);
@@ -1389,7 +1420,7 @@ sub add_safe_commands {
}
}
- while ( $preamble =~ m/\\(?:new|renew|provide)command\s*{\\(\w*)\}(?:|\[\d*\])\s*\{(${pat6})\}/osg ) {
+ while ( $preamble =~ m/\\(?:new|renew|provide)command\s*{\\(\w*)\}(?:|\[\d*\])\s*\{(${pat_n})\}/osg ) {
my $maybe_to_test = $1;
my $should_be_safe = $2;
my $success = 0;
@@ -1443,7 +1474,7 @@ sub flatten {
print STDERR "DEBUG: includeonly $includeonly\n" if $debug;
# recursively replace \\input and \\include files
- $text=~s/(^(?:[^%\n]|\\%)*)\\input{(.*?)}|\\include{(${includeonly}(?:\.tex)?)}/{
+ 1 while $text=~s/(^(?:[^%\n]|\\%)*)\\input{(.*?)}|\\include{(${includeonly}(?:\.tex)?)}/{
$begline=(defined($1)? $1 : "") ;
$fname = $2 if defined($2) ;
$fname = $3 if defined($3) ;
@@ -1724,7 +1755,7 @@ sub pass1 {
# print STDERR "Unchanged block $cnt, $last1,$last2 \n";
if ($cnt < $MINWORDSBLOCK
&& $cnt==scalar (
- grep { /^$wpat/ || ( /^\\((?:[`'^"~=.]|[\w\d@*]+))((?:\[$brat0\]|\{$pat6\})*)/o
+ grep { /^$wpat/ || ( /^\\((?:[`'^"~=.]|[\w\d@*]+))((?:\[$brat0\]|\{$pat_n\})*)/o
&& iscmd($1,\@SAFECMDLIST,\@SAFECMDEXCL)
&& scalar(@dummy=split(" ",$2))<3 ) }
@$block) ) {
@@ -1856,7 +1887,7 @@ sub extracttextblocks {
for ($i=0;$i< scalar @$block;$i++) {
($token,$index)=@{ $block->[$i] };
# store pure text blocks
- if ($token =~ /$wpat/ || ( $token =~/^\\((?:[`'^"~=.]|[\w\d@\*]+))((?:${extraspace}\[$brat0\]${extraspace}|${extraspace}\{$pat6\})*)/o
+ if ($token =~ /$wpat/ || ( $token =~/^\\((?:[`'^"~=.]|[\w\d@\*]+))((?:${extraspace}\[$brat0\]${extraspace}|${extraspace}\{$pat_n\})*)/o
&& iscmd($1,\@SAFECMDLIST,\@SAFECMDEXCL)
&& !iscmd($1,\@TEXTCMDLIST,\@TEXTCMDEXCL))) {
# we have text or a command which can be treated as text
@@ -1910,7 +1941,7 @@ sub extractcommands {
# $2: \cmd
# $3: last argument
# $4: } + trailing spaces
- if ( ( $token =~ m/^(\\([\w\d\*]+)(?:${extraspace}\[$brat0\]|${extraspace}\{$pat6\})*${extraspace}\{)($pat6)(\}\s*)$/so )
+ if ( ( $token =~ m/^(\\([\w\d\*]+)(?:${extraspace}\[$brat0\]|${extraspace}\{$pat_n\})*${extraspace}\{)($pat_n)(\}\s*)$/so )
&& iscmd($2,\@TEXTCMDLIST,\@TEXTCMDEXCL) ) {
# push(@$retval,[ $2,$index,$1,$3,$4 ]);
($cmd,$open,$mid,$closing) = ($2,$1,$3,$4) ;
@@ -2062,8 +2093,8 @@ sub marktags {
# $2: cmd
# $3: last argument
# $4: } + trailing spaces
- ### pre-0.3 if ( ( $token =~ m/^(\\([\w\d\*]+)(?:\[$brat0\]|\{$pat6\})*\{)($pat6)(\}\s*)$/so )
- if ( ( $word =~ m/^(\\([\w\d\*]+)(?:${extraspace}\[$brat0\]|${extraspace}\{$pat6\})*${extraspace}\{)($pat6)(\}\s*)$/so )
+ ### pre-0.3 if ( ( $token =~ m/^(\\([\w\d\*]+)(?:\[$brat0\]|\{$pat_n\})*\{)($pat_n)(\}\s*)$/so )
+ if ( ( $word =~ m/^(\\([\w\d\*]+)(?:${extraspace}\[$brat0\]|${extraspace}\{$pat_n\})*${extraspace}\{)($pat_n)(\}\s*)$/so )
&& (iscmd($2,\@TEXTCMDLIST,\@TEXTCMDEXCL)|| iscmd($2,\@MATHTEXTCMDLIST,\@MATHTEXTCMDEXCL))
&& ( !$cmdcomment || !iscmd($2,\@CONTEXT2CMDLIST, \@CONTEXT2CMDEXCL) ) ) {
# Condition 1: word is a command? - if yes, $1,$2,.. will be set as above
@@ -2097,7 +2128,6 @@ sub marktags {
# ""
local @SAFECMDLIST=(".*");
local @SAFECMDEXCL=('\\','\\\\',@UNSAFEMATHCMD);
- ### print STDERR "DEBUG: Command $command argtext ",join(",",@argtext),"\n" if $debug;
push(@$retval,$command,marktags("","",$open,$close,"","",$comment,\@argtext)#@argtext
,$closingbracket);
} else {
@@ -2111,6 +2141,7 @@ sub marktags {
push (@$retval,$opencmd) if $cmd==-1 ;
push (@$retval,$close,$opencmd) if $cmd==0 ;
$word =~ s/\n/\n${opencmd}/sg if $cmdcomment ; # if opencmd is a comment, repeat this at the beginning of every line
+ ### print STDERR "MARKTAGS: Add command |$word|\n";
push (@$retval,$word);
$cmd=1;
}
@@ -2127,7 +2158,7 @@ sub marktags {
###print STDERR "DEBUG Mboxsafecmd detected:$word:\n" if $debug ;
push(@$retval,"\\mbox{$AUXCMD\n\\" . $1 . $2 . $3 ."}$AUXCMD\n" );
} else {
- # $word is a normal word or a safe command (not in MBOXCMDLIST
+ # $word is a normal word or a safe command (not in MBOXCMDLIST)
push (@$retval,$word);
}
$cmd=0;
@@ -2140,6 +2171,53 @@ sub marktags {
return @$retval;
}
+#used in preprocess
+sub take_comments_and_enter_from_frac() {
+ ###*************take the \n and % between frac and {}***********
+ ###notice all of the substitution are made none global
+ while( m/\\begin{($MATHENV|$MATHARRENV|SQUAREBRACKET)}(.*?)\\frac(([\s]*%[^\n]*?)*[\r\n|\r|\n])+\{(.*?)\\end{\1}/s ) {
+ ### if there isn't any % or \n in the pattern $2 then there should be an \\end{...} in $2
+ if( $2 !~ m/\\end{$1}/s ) {
+ ### take out % and \n from the next match only (none global)
+ s/\\begin{($MATHENV|$MATHARRENV|SQUAREBRACKET)}(.*?)\\frac(([\s]*%[^\n]*?)*[\r\n|\r|\n])+\{(.*?)\\end{\1}/\\begin{$1}$2\\frac{$5\\end{$1}/s;
+ }
+ else{
+ ###there are no more % and \n in $2, we want to find the next one so we clear the begin-end from the pattern
+ s/\\begin{($MATHENV|$MATHARRENV|SQUAREBRACKET)}(.*?)\\end{\1}/MATHBLOCK$1$2MATHBLOCKEND/s;
+ }
+ }
+ ###cleaning up
+ while( s/MATHBLOCK($MATHENV|$MATHARRENV|SQUAREBRACKET)(.*?)MATHBLOCKEND/\\begin{$1}$2\\end{$1}/s ){}
+ ###*************take the \n and % between frac and {}***********
+
+ ###**********take the \n and % between {} and {} of the frac***************
+ while( m/\\begin\{($MATHENV|$MATHARRENV|SQUAREBRACKET)\}(.*?)\\frac\{(.*?)\\end\{\1\}/s ) {
+ ### if there isn't any more //frac before the first //end in the pattern $2 then there should be an \\end{...} in $2
+ if( $2 !~ m/\\end\{$1\}/s ) {
+ ### from now on CURRFRAC is the frac we are looking at
+ s/\\begin\{($MATHENV|$MATHARRENV|SQUAREBRACKET)\}(.*?)\\frac\{(.*?)\\end\{\1\}/\\begin\{$1\}$2CURRFRAC\{$3\\end\{$1\}/s;
+ while( m/\\begin\{($MATHENV|$MATHARRENV|SQUAREBRACKET)\}(.*?)CURRFRAC\{(.*?)\\end\{\1\}/s ) {
+ if( m/\\begin\{($MATHENV|$MATHARRENV|SQUAREBRACKET)\}(.*?)CURRFRAC\{($pat_n)\}([\s]*(%[^\n]*?)*[\r\n|\r|\n])+[\s]*\{(.*?)\\end{\1}/s ) {
+ s/\\begin\{($MATHENV|$MATHARRENV|SQUAREBRACKET)\}(.*?)CURRFRAC\{($pat_n)\}([\s]*(%[^\n]*?)*[\r\n|\r|\n])+[\s]*\{(.*?)\\end\{\1\}/\\begin\{$1\}$2CURRFRAC\{$3\}\{$6\\end\{$1\}/s;
+ }
+ else { # there is no comment or \n between the two brackets {}{}
+ ### change CURRFRAC to FRACSTART so we can change them all back to //frac{ when we finish
+ s/\\begin{($MATHENV|$MATHARRENV|SQUAREBRACKET)}(.*?)CURRFRAC\{(.*?)\\end{\1}/\\begin{$1}$2FRACSTART\{$3\\end{$1}/s;
+ }
+ }
+ }
+ else{
+ ###there are no more frac in $2, we want to find the next one so we clear the begin-end from the pattern
+ s/\\begin{($MATHENV|$MATHARRENV|SQUAREBRACKET)}(.*?)\\end{\1}/MATHBLOCK$1$2MATHBLOCKEND/s;
+ }
+
+ }
+ ###cleaning up
+ while( s/MATHBLOCK($MATHENV|$MATHARRENV|SQUAREBRACKET)(.*?)MATHBLOCKEND/\\begin{$1}$2\\end{$1}/s ){}
+ s/FRACSTART/\\frac/g;
+ ###***************take the \n and % between {} and {} of the frac*********************
+}
+
# preprocess($string, ..)
# carry out the following pre-processing steps for all arguments:
# 1. Remove leading white-space
@@ -2165,7 +2243,7 @@ sub marktags {
# Returns: leading white space removed in step 1
sub preprocess {
for (@_) {
- # Change \{ to \QLEFTBRACE and \} to \QRIGHTBRACE
+ # Change \{ to \QLEFTBRACE, \} to \QRIGHTBRACE, and \& to \AMPERSAND
s/(?<!\\)\\{/\\QLEFTBRACE /sg;
s/(?<!\\)\\}/\\QRIGHTBRACE /sg;
s/(?<!\\)\\&/\\AMPERSAND /sg;
@@ -2179,11 +2257,14 @@ sub preprocess {
s/(\\verb\*?)(\S)(.*?)\2/"${1}{". tohash(\%verbhash,"${2}${3}${2}") ."}"/esg;
s/\\begin\{(verbatim\*?)\}(.*?)\\end\{\1\}/"\\${1}{". tohash(\%verbhash,"${2}") . "}"/esg;
# Convert _n or _\cmd into \SUBSCRIPTNB{n} or \SUBSCRIPTNB{\cmd} and _{nnn} into \SUBSCRIPT{nn}
- 1 while s/(?<!\\)_([^{\\]|\\\w+)/\\SUBSCRIPTNB{$1}/g ;
- 1 while s/(?<!\\)_{($pat6)}/\\SUBSCRIPT{$1}/g ;
+ 1 while s/(?<!\\)_(\s*([^{\\\s]|\\\w+))/\\SUBSCRIPTNB{$1}/g ;
+ 1 while s/(?<!\\)_(\s*{($pat_n)})/\\SUBSCRIPT$1/g ;
# Convert ^n into \SUPERSCRIPTNB{n} and ^{nnn} into \SUPERSCRIPT{nn}
- 1 while s/(?<!\\)\^([^{\\]|\\\w+)/\\SUPERSCRIPTNB{$1}/g ;
- 1 while s/(?<!\\)\^{($pat6)}/\\SUPERSCRIPT{$1}/g ;
+ 1 while s/(?<!\\)\^(\s*([^{\\\s]|\\\w+))/\\SUPERSCRIPTNB{$1}/g ;
+ 1 while s/(?<!\\)\^(\s*{($pat_n)})/\\SUPERSCRIPT$1/g ;
+ # Convert \sqrt{n} into \SQRT{n} and \sqrt nn into SQRTNB{nn}
+ 1 while s/(?<!\\)\\sqrt(\s*([^{\\\s]|\\\w+))/\\SQRTNB{$1}/g ;
+ 1 while s/(?<!\\)\\sqrt(\s*{($pat_n)})/\\SQRT$1/g ;
# Convert $$ $$ into \begin{DOLLARDOLLAR} \end{DOLLARDOLLAR}
s/\$\$(.*?)\$\$/\\begin{DOLLARDOLLAR}$1\\end{DOLLARDOLLAR}/sg;
# Convert \[ \] into \begin{SQUAREBRACKET} \end{SQUAREBRACKET}
@@ -2196,6 +2277,9 @@ sub preprocess {
# Also convert all array environments into ARRAYBLOCK environments
if ( $mathmarkup != FINE ) {
s/\\begin{($ARRENV)}(.*?)\\end{\1}/\\ARRAYBLOCK$1\{$2\}/sg;
+
+ take_comments_and_enter_from_frac();
+
s/\\begin{($MATHENV|$MATHARRENV|SQUAREBRACKET)}(.*?)\\end{\1}/\\MATHBLOCK$1\{$2\}/sg;
}
# add final token " STOP"
@@ -2213,16 +2297,17 @@ sub tohash {
@arr=unpack('c*',$string);
- foreach $val (@arr) {
- $sum += $i*$val;
- $i++;
- }
- $hstr= "$sum";
- if (defined($hash->{$hstr}) && $string ne $hash->{$hstr}) {
- warn "Repeated hash value for verbatim mode in spite of different content.";
- $hstr="-$hstr";
+ while (1) {
+ foreach $val (@arr) {
+ $sum += $i*$val;
+ $i++;
+ }
+ $hstr= "$sum";
+ last unless (defined($hash->{$hstr}) && $string ne $hash->{$hstr});
+ # else found a duplicate HASH need to repeat for a higher hash value
}
$hash->{$hstr}=$string;
+ ### print STDERR "Hash:$hstr: Content:$string:\n";
return($hstr);
}
@@ -2293,6 +2378,8 @@ sub postprocess {
# second level blocks
my ($begin2,$cnt2,$len2,$eqarrayblock,$mathblock);
+ my (@textparts,@newtextparts,@liststack,$listtype,$listlast);
+
for (@_) {
# change $'s in comments to something harmless
@@ -2375,14 +2462,25 @@ sub postprocess {
# Convert MATHBLOCKmath commands to their uncounted numbers (e.g. convert equation -> displaymath
# (environments defined in $MATHENV will be replaced by $MATHREPL, and environments in $MATHARRENV
# will be replaced by $MATHARRREPL
- $delblock=~ s/\\MATHBLOCK($MATHENV)\{($pat6)\}/\\MATHBLOCK$MATHREPL\{$2\}/sg;
- $delblock=~ s/\\MATHBLOCK($MATHARRENV)\{($pat6)\}/\\MATHBLOCK$MATHARRREPL\{$2\}/sg;
+ $delblock=~ s/\\MATHBLOCK($MATHENV)\{($pat_n)\}/\\MATHBLOCK$MATHREPL\{$2\}/sg;
+ $delblock=~ s/\\MATHBLOCK($MATHARRENV)\{($pat_n)\}/\\MATHBLOCK$MATHARRREPL\{$2\}/sg;
}
+ # Reinstate completely deleted list environments. note that items within the
+ # environment will still be commented out. They will be restored later
+ $delblock=~ s/(\%DIFDELCMD < \s*\\begin\{($LISTENV)\}\s*?(?:\n|$DELCMDCLOSE))(.*?)(\%DIFDELCMD < \s*\\end\{\2\})/{
+ ### # block within the search; replacement environment
+ ### "$1\\begin{$2}$AUXCMD\n". restore_item_commands($3). "\n\\end{$2}$AUXCMD\n$4";
+ "$1\\begin{$2}$AUXCMD\n$3\n\\end{$2}$AUXCMD\n$4";
+ }/esg;
# b.where one of the commands matching $COUNTERCMD is used as a DIFAUXCMD, add a statement
# subtracting one from the respective counter to keep numbering consistent with new file
- $delblock=~ s/\\($COUNTERCMD)((?:${extraspace}\[$brat0\]${extraspace}|${extraspace}\{$pat6\})*\s*${AUXCMD}\n)/\\$1$2\\addtocounter{$1}{-1}${AUXCMD}\n/sg ;
+ $delblock=~ s/\\($COUNTERCMD)((?:${extraspace}\[$brat0\]${extraspace}|${extraspace}\{$pat_n\})*\s*${AUXCMD}\n)/\\$1$2\\addtocounter{$1}{-1}${AUXCMD}\n/sg ;
+
+# bb. disable active labels within deleted blocks (as these are not safe commands, this should normally only
+# happen within deleted maths blocks
+ $delblock=~ s/(\\$LABELCMD(?:${extraspace})\{(?:[^{}])*\}[\t ]*)\n?/${DELCMDOPEN}$1${DELCMDCLOSE}/smg ;
# c. If in-line math mode contains array environment, enclose the whole environment in \mbox'es
@@ -2430,6 +2528,36 @@ sub postprocess {
pos = $begin + length($addblock);
}
+ # Go through whole text, and by counting list environment commands, find out when we are within a list environment.
+ # Within those restore deleted \item commands
+ @textparts=split /(?<!$DELCMDOPEN)(\\(?:begin|end)\{$LISTENV\})/ ;
+ @liststack=();
+ @newtextparts=map {
+ ### print STDERR ":::::::: $_\n";
+ if ( ($listtype) = m/^\\begin\{($LISTENV)\}$/ ) {
+ print STDERR "DEBUG: postprocess \\begin{$listtype}\n" if $debug;
+ push @liststack,$listtype;
+ } elsif ( ($listtype) = m/^\\end\{($LISTENV)\}$/ ) {
+ print STDERR "DEBUG: postprocess \\end{$listtype}\n" if $debug;
+ if (scalar @liststack > 0) {
+ $listlast=pop(@liststack);
+ ($listtype eq $listlast) or warn "Invalid nesting of list environments: $listlast environment closed by \\end{$listtype}.";
+ } else {
+ warn "Invalid nesting of list environments: \\end{$listtype} encountered without matching \\begin{$listtype}.";
+ }
+ } else {
+ print STDERR "DEBUG: postprocess \@liststack=(",join(",",@liststack),")\n" if $debug;
+ if (scalar @liststack > 0 ) {
+ # we are within a list environment and should replace all item commands
+ $_=restore_item_commands($_);
+ }
+ # else: we are outside a list environment and do not need to do anything
+ }
+ $_ } @textparts; # end of map command
+ # replace the main text with the modified version
+ $_= "@newtextparts";
+
+
# Replace MATHMODE environments from step 1a above by the correct Math environment
@@ -2449,12 +2577,12 @@ sub postprocess {
s/\\begin{((?:$MATHENV)|(?:$MATHARRENV)|SQUAREBRACKET)}$AUXCMD\n((?:\s*%.[^\n]*\n)*)\\end{\1}$AUXCMD\n/$2/sg;
} else {
# math modes OFF,WHOLE,COARSE: Convert \MATHBLOCKmath{..} commands back to environments
- s/\\MATHBLOCK($MATHENV|$MATHARRENV|SQUAREBRACKET)\{($pat6)\}/\\begin{$1}$2\\end{$1}/sg;
+ s/\\MATHBLOCK($MATHENV|$MATHARRENV|SQUAREBRACKET)\{($pat_n)\}/\\begin{$1}$2\\end{$1}/sg;
# convert ARRAYBLOCK.. commands back to environments
- s/\\ARRAYBLOCK($ARRENV)\{($pat6)\}/\\begin{$1}$2\\end{$1}/sg;
+ s/\\ARRAYBLOCK($ARRENV)\{($pat_n)\}/\\begin{$1}$2\\end{$1}/sg;
}
# Convert all PICTUREblock{..} commands back to the appropriate environments
- s/\\PICTUREBLOCK($PICTUREENV)\{($pat6)\}/\\begin{$1}$2\\end{$1}/sg;
+ s/\\PICTUREBLOCK($PICTUREENV)\{($pat_n)\}/\\begin{$1}$2\\end{$1}/sg;
#0.5: # Remove all mark up within picture environments
# while ( m/\\begin\{($PICTUREENV)\}.*?\\end\{\1\}/sg ) {
# $cnt=0;
@@ -2463,10 +2591,10 @@ sub postprocess {
# $float=$&;
# $float =~ s/\\DIFaddbegin //g;
# $float =~ s/\\DIFaddend //g;
-# $float =~ s/\\DIFadd\{($pat6)\}/$1/g;
+# $float =~ s/\\DIFadd\{($pat_n)\}/$1/g;
# $float =~ s/\\DIFdelbegin //g;
# $float =~ s/\\DIFdelend //g;
-# $float =~ s/\\DIFdel\{($pat6)\}//g;
+# $float =~ s/\\DIFdel\{($pat_n)\}//g;
# $float =~ s/$DELCMDOPEN.*//g;
# substr($_,$begin,$len)=$float;
# pos = $begin + length($float);
@@ -2529,11 +2657,15 @@ sub postprocess {
# 4. Convert \begin{DOLLARDOLLAR} \end{DOLLARDOLLAR} into $$ $$
s/\\begin\{DOLLARDOLLAR\}(.*?)\\end\{DOLLARDOLLAR\}/\$\$$1\$\$/sg;
# 5. Convert \SUPERSCRIPTNB{n} into ^n and \SUPERSCRIPT{nn} into ^{nnn}
- 1 while s/\\SUPERSCRIPT{($pat6)}/^{$1}/g ;
- 1 while s/\\SUPERSCRIPTNB{($pat0)}/^$1/g ;
+ 1 while s/\\SUPERSCRIPT(\s*{($pat_n)})/^$1/g ;
+ 1 while s/\\SUPERSCRIPTNB{(\s*$pat0)}/^$1/g ;
# Convert \SUBSCRIPNB{n} into _n and \SUBCRIPT{nn} into _{nnn}
- 1 while s/\\SUBSCRIPT{($pat6)}/_{$1}/g ;
- 1 while s/\\SUBSCRIPTNB{($pat0)}/_$1/g ;
+ 1 while s/\\SUBSCRIPT(\s*{($pat_n)})/_$1/g ;
+ 1 while s/\\SUBSCRIPTNB{(\s*$pat0)}/_$1/g ;
+ # Convert \SQRT{n} into \sqrt{n} and \SQRTNB{nn} into \sqrt nn
+ 1 while s/\\SQRT(\s*{($pat_n)})/\\sqrt$1/g ;
+ 1 while s/\\SQRTNB{(\s*$pat0)}/\\sqrt$1/g ;
+
1 while s/(%.*)\\CRIGHTBRACE (.*)$/$1\}$2/mg ;
1 while s/(%.*)\\CLEFTBRACE (.*)$/$1\{$2/mg ;
@@ -2547,6 +2679,24 @@ sub postprocess {
}
}
+# $out = restore_item_commands($listenviron)
+# short helper function for post-process, which restores deleted \item commands in its argument (as DIFAUXCMDs)
+sub restore_item_commands {
+ my ($string)=@_ ;
+ my ($itemarg,@itemargs);
+ $string =~ s/(\%DIFDELCMD < \s*(\\$ITEMCMD)((?:<$abrat0>)?)((?:\[$brat0\])?)\s*?(?:\n|$DELCMDCLOSE))/
+ # if \item has an []argument, then mark up the argument as deleted)
+ if (length($4)>0) {
+ # use substr to exclude square brackets at end points
+ @itemargs=splitlatex(substr($4,1,length($4)-2));
+ $itemarg="[".join("",marktags("","",$DELOPEN,$DELCLOSE,$DELCMDOPEN,$DELCMDCLOSE,$DELCOMMENT,\@itemargs))."]";
+ } else {
+ $itemarg="";
+ }
+ "$1$2$3$itemarg$AUXCMD\n"/sge;
+ return($string);
+}
+
# @auxlines=preprocess_preamble($oldpreamble,$newpreamble);
# pre-process preamble by looking for commands used in \maketitle (title, author, date etc commands)
@@ -2573,7 +2723,7 @@ sub preprocess_preamble {
# resue in a more complex regex
$titlecmd =~ s/[\$\^]//g;
# make sure to not match on comment lines:
- $titlecmdpat=qr/^(?:[^%\n]|\\%)*(\\($titlecmd)$extraspace(?:\[($brat0)\])?(?:\{($pat6)\}))/ms;
+ $titlecmdpat=qr/^(?:[^%\n]|\\%)*(\\($titlecmd)$extraspace(?:\[($brat0)\])?(?:\{($pat_n)\}))/ms;
@oldtitlecommands= ( $$oldpreambleref =~ m/$titlecmdpat/g );
@newtitlecommands= ( $$newpreambleref =~ m/$titlecmdpat/g );
@@ -2801,7 +2951,7 @@ format as new.tex but has all changes relative to old.tex marked up or commented
--subtype=markstyle
-s markstyle Add code to preamble for selected style for bracketing
commands (e.g. to mark changes in margin)
- Available styles: SAFE MARGINAL DVIPSCOL COLOR ZLABEL ONLYCHANGEDPAGE (LABEL)*
+ Available styles: SAFE MARGIN DVIPSCOL COLOR ZLABEL ONLYCHANGEDPAGE (LABEL)*
[ Default: SAFE ]
* LABEL subtype is deprecated
@@ -2892,15 +3042,17 @@ format as new.tex but has all changes relative to old.tex marked up or commented
--config var1=val1,var2=val2,...
-c var1=val1,.. Set configuration variables.
-c configfile Available variables:
- MINWORDSBLOCK (integer)
+ ARRENV (RegEx)
+ COUNTERCMD (RegEx)
FLOATENV (RegEx)
- PICTUREENV (RegEx)
- MATHENV (RegEx)
- MATHREPL (String)
+ ITEMCMD (RegEx)
+ LISTENV (RegEx)
MATHARRENV (RegEx)
MATHARRREPL (String)
- ARRENV (RegEx)
- COUNTERCMD (RegEx)
+ MATHENV (RegEx)
+ MATHREPL (String)
+ MINWORDSBLOCK (integer)
+ PICTUREENV (RegEx)
This option can be repeated.
@@ -2911,7 +3063,7 @@ format as new.tex but has all changes relative to old.tex marked up or commented
Use of the --packages option disables automatic scanning, so if for any
reason package specific parsing needs to be switched off, use --packages=none.
The following packages trigger special behaviour:
- endfloat hyperref amsmath apacite siunitx cleveref glossaries mhchem chemformula
+ endfloat hyperref amsmath apacite siunitx cleveref glossaries mhchem chemformula/chemmacros
[ Default: scan the preamble for \\usepackage commands to determine
loaded packages.]
@@ -3159,7 +3311,7 @@ B<-s markstyle>
Add code to preamble for selected style for bracketing
commands (e.g. to mark changes in margin). This option defines
C<\DIFaddbegin>, C<\DIFaddend>, C<\DIFdelbegin> and C<\DIFdelend> commands.
-Available styles: C<SAFE MARGINAL COLOR DVIPSCOL ZLABEL ONLYCHANGEDPAGE (LABEL)*>
+Available styles: C<SAFE MARGIN COLOR DVIPSCOL ZLABEL ONLYCHANGEDPAGE (LABEL)*>
[ Default: C<SAFE> ]
* Subtype C<LABEL> is deprecated
@@ -3250,7 +3402,7 @@ Define most of the glossaries commands as safe, protecting them with \mbox'es wh
Treat C<\ce> as a safe command, i.e. it will be highlighted (note that C<\cee> will not be highlighted in equations as this leads to processing errors)
-=item C<chemformula>
+=item C<chemformula> or C<chemmacros>
Treat C<\ch> as a safe command outside equations, i.e. it will be highlighted (note that C<\ch> will not be highlighted in equations as this leads to processing errors)
@@ -3351,23 +3503,27 @@ Set configuration variables. The option can be repeated to set different
variables (as an alternative to the comma-separated list).
Available variables (see below for further explanations):
-C<MINWORDSBLOCK> (integer)
+C<ARRENV> (RegEx)
-C<FLOATENV> (RegEx)
+C<COUNTERCMD> (RegEx)
-C<PICTUREENV> (RegEx)
+C<FLOATENV> (RegEx)
-C<MATHENV> (RegEx)
+C<ITEMCMD> (RegEx)
-C<MATHREPL> (String)
+C<LISTENV> (RegEx)
C<MATHARRENV> (RegEx)
C<MATHARRREPL> (String)
-C<ARRENV> (RegEx)
+C<MATHENV> (RegEx)
-C<COUNTERCMD> (RegEx)
+C<MATHREPL> (String)
+
+C<MINWORDSBLOCK> (integer)
+
+C<PICTUREENV> (RegEx)
=item B<--show-safecmd>
@@ -3641,12 +3797,22 @@ Make no difference between the main text and floats.
=over 10
-=item C<MINWORDSBLOCK>
+=item C<ARRENV>
-Minimum number of tokens required to form an independent block. This value is
-used in the algorithm to detect changes of complete blocks by merging identical text parts of less than C<MINWORDSBLOCK> to the preceding added and discarded parts.
+If a match to C<ARRENV> is found within an inline math environment within a deleted or added block, then the inlined math
+is surrounded by C<\mbox{>...C<}>. This is necessary as underlining does not work within inlined array environments.
-[ Default: 3 ]
+[ Default: C<ARRENV>=S<C<(?:array|[pbvBV]matrix)> >
+
+=item C<COUNTERCMD>
+
+If a command in a deleted block which is also in the textcmd list matches C<COUNTERCMD> then an
+additional command C<\addtocounter{>F<cntcmd>C<}{-1}>, where F<cntcmd> is the matching command, is appended in the diff file such that the numbering in the diff file remains synchronized with the
+numbering in the new file.
+
+[ Default: C<COUNTERCMD>=C<(?:footnote|part|section|subsection> ...
+
+C<|subsubsection|paragraph|subparagraph)> ]
=item C<FLOATENV>
@@ -3656,18 +3822,21 @@ are replaced by their FL variaties.
[ Default: S<C<(?:figure|table|plate)[\w\d*@]*> >]
-=item C<PICTUREENV>
+=item C<ITEMCMD>
-Within environments whose name matches the regular expression in C<PICTUREENV>
-all latexdiff markup is removed (in pathologic cases this might lead to
- inconsistent markup but this situation should be rare).
+Commands representing new item line with list environments.
-[ Default: S<C<(?:picture|DIFnomarkup)[\w\d*@]*> >]
+[ Default: \C<item> ]
+
+=item C<LISTENV>
+
+Environments whose name matches the regular expression in C<LISTENV> are list environments.
+
+[ Default: S<C<(?:itemize|enumerate|description)> >]
=item C<MATHENV>,C<MATHREPL>
-If both \begin and \end for a math environment (environment name matching C<MATHENV>
-or \[ and \])
+If both \begin and \end for a math environment (environment name matching C<MATHENV> or \[ and \])
are within the same deleted block, they are replaced by a \begin and \end commands for C<MATHREPL>
rather than being commented out.
@@ -3679,22 +3848,20 @@ as C<MATHENV>,C<MATHREPL> but for equation arrays
[ Default: C<MATHARRENV>=S<C<eqnarray\*?> >, C<MATHREPL>=S<C<eqnarray> >]
-=item C<ARRENV>
-
-If a match to C<ARRENV> is found within an inline math environment within a deleted or added block, then the inlined math
-is surrounded by C<\mbox{>...C<}>. This is necessary as underlining does not work within inlined array environments.
+=item C<MINWORDSBLOCK>
-[ Default: C<ARRENV>=S<C<(?:array|[pbvBV]matrix)> >
+Minimum number of tokens required to form an independent block. This value is
+used in the algorithm to detect changes of complete blocks by merging identical text parts of less than C<MINWORDSBLOCK> to the preceding added and discarded parts.
-=item C<COUNTERCMD>
+[ Default: 3 ]
-If a command in a deleted block which is also in the textcmd list matches C<COUNTERCMD> then an
-additional command C<\addtocounter{>F<cntcmd>C<}{-1}>, where F<cntcmd> is the matching command, is appended in the diff file such that the numbering in the diff file remains synchronized with the
-numbering in the new file.
+=item C<PICTUREENV>
-[ Default: C<COUNTERCMD>=C<(?:footnote|part|section|subsection> ...
+Within environments whose name matches the regular expression in C<PICTUREENV>
+all latexdiff markup is removed (in pathologic cases this might lead to
+inconsistent markup but this situation should be rare).
-C<|subsubsection|paragraph|subparagraph)> ]
+[ Default: S<C<(?:picture|DIFnomarkup)[\w\d*@]*> >]
=back
@@ -3721,21 +3888,25 @@ For custom packages you can define the commands which need to be protected by C<
Try options C<--math-markup=whole>. If even that fails, you can turn off mark up for equations with C<--math-markup=off>.
-=item How can I just show the pages
+=item How can I just show the pages where changes had been made
Use options -C<-s ZLABEL> (some postprocessing required) or C<-s ONLYCHANGEDPAGE>. C<latexdiff-vc --ps|--pdf> with C<--only-changes> option takes care of
-the post-processing for you (requires zref packages).
+the post-processing for you (requires zref package to be installed).
=back
=head1 BUGS
-Option allow-spaces not implemented entirely consistently. It breaks
+=over 10
+
+=item Option allow-spaces not implemented entirely consistently. It breaks
the rules that number and type of white space does not matter, as
different numbers of inter-argument spaces are treated as significant.
+=back
+
Please submit bug reports using the issue tracker of the github repository page I<https://github.com/ftilmann/latexdiff.git>,
-or send them to I<tilmann -- AT -- gfz-potsdam.de>. Include the serial number of I<latexdiff>
+or send them to I<tilmann -- AT -- gfz-potsdam.de>. Include the version number of I<latexdiff>
(from comments at the top of the source or use B<--version>). If you come across latex
files that are error-free and conform to the specifications set out
above, and whose differencing still does not result in error-free
@@ -3762,7 +3933,7 @@ I<latexdiff-fast> requires the I<diff> command to be present.
=head1 AUTHOR
-Version 1.1.0
+Version 1.1.1
Copyright (C) 2004-2015 Frederik Tilmann
This program is free software; you can redistribute it and/or modify
@@ -3783,7 +3954,7 @@ dashbox
emph
fbox
framebox
-hspace
+hspace\*?
math.*
makebox
mbox
@@ -3993,6 +4164,8 @@ _
AMPERSAND
(SUPER|SUB)SCRIPTNB
(SUPER|SUB)SCRIPT
+SQRT
+SQRTNB
PERCENTAGE
DOLLAR
%%END SAFE COMMANDS
diff --git a/Build/source/texk/texlive/linked_scripts/texlive/tlmgr.pl b/Build/source/texk/texlive/linked_scripts/texlive/tlmgr.pl
index 7f3a9dc3e33..ffddf3b7aa3 100755
--- a/Build/source/texk/texlive/linked_scripts/texlive/tlmgr.pl
+++ b/Build/source/texk/texlive/linked_scripts/texlive/tlmgr.pl
@@ -1,13 +1,13 @@
#!/usr/bin/env perl
-# $Id: tlmgr.pl 39104 2015-12-14 15:56:11Z karl $
+# $Id: tlmgr.pl 39198 2015-12-25 03:12:03Z preining $
#
# Copyright 2008-2015 Norbert Preining
# This file is licensed under the GNU General Public License version 2
# or any later version.
#
-my $svnrev = '$Revision: 39104 $';
-my $datrev = '$Date: 2015-12-14 16:56:11 +0100 (Mon, 14 Dec 2015) $';
+my $svnrev = '$Revision: 39198 $';
+my $datrev = '$Date: 2015-12-25 04:12:03 +0100 (Fri, 25 Dec 2015) $';
my $tlmgrrevision;
my $prg;
if ($svnrev =~ m/: ([0-9]+) /) {
@@ -745,7 +745,7 @@ sub do_cmd_and_check
return ($F_OK);
} else {
info("\n");
- tlwarn("$cmd failed (status $ret), output:\n$out\n");
+ tlwarn("$prg: $cmd failed (status $ret), output:\n$out\n");
return ($F_ERROR);
}
}
@@ -951,8 +951,8 @@ sub action_include_tlpobj {
my $mothership = $1;
my $mothertlp = $localtlpdb->get_package($mothership);
if (!defined($mothertlp)) {
- tlwarn("We are trying to add ${type} files to a nonexistent package $mothership!\n");
- tlwarn("Trying to continue!\n");
+ tlwarn("$prg: We are trying to add ${type} files to a nonexistent package $mothership!\n");
+ tlwarn("$prg: Trying to continue!\n");
# the best we can do is rename that package to $mothername and add it!
$tlpobj->name($mothership);
# add the src/docfiles tlpobj under the mothership name
@@ -1218,7 +1218,7 @@ sub action_paper {
#
sub action_path {
if ($opts{"usermode"}) {
- tlwarn("action `path' not supported in usermode!\n");
+ tlwarn("$prg: action `path' not supported in usermode!\n");
exit 1;
}
my $what = shift @ARGV;
@@ -1269,7 +1269,7 @@ sub action_path {
} elsif ($opts{"w32mode"} eq "admin") {
$winadminmode = 1;
} else {
- tlwarn("Unknown --w32admin mode: $opts{w32mode}, should be 'admin' or 'user'\n");
+ tlwarn("$prg: Unknown --w32admin mode: $opts{w32mode}, should be 'admin' or 'user'\n");
return ($F_ERROR);
}
} else {
@@ -1277,10 +1277,10 @@ sub action_path {
if ($opts{"w32mode"} eq "user") {
$winadminmode = 0;
} elsif ($opts{"w32mode"} eq "admin") {
- tlwarn("You don't have the privileges to work in --w32mode admin\n");
+ tlwarn("$prg: You don't have the privileges to work in --w32mode admin\n");
return ($F_ERROR);
} else {
- tlwarn("Unknown --w32admin mode: $opts{w32mode}, should be 'admin' or 'user'\n");
+ tlwarn("$prg: Unknown --w32admin mode: $opts{w32mode}, should be 'admin' or 'user'\n");
return ($F_ERROR);
}
}
@@ -1344,7 +1344,7 @@ sub action_dumptlpdb {
$remotetlpdb->writeout;
} else {
- tlwarn("tlmgr dump-tlpdb: need exactly one of --local and --remote.\n");
+ tlwarn("$prg dump-tlpdb: need exactly one of --local and --remote.\n");
return ($F_ERROR);
}
@@ -1411,7 +1411,7 @@ sub action_info {
if (@cand) {
my $first = shift @cand;
if (defined($first)) {
- tlwarn("strange, we have a first candidate but no tlp: $pkg\n");
+ tlwarn("$prg: strange, we have a first candidate but no tlp: $pkg\n");
$ret |= $F_WARNING;
next;
}
@@ -1430,11 +1430,11 @@ sub action_info {
$ret |= action_info(@aaa);
next;
} else {
- tlwarn("strange, package listed but no residual candidates: $pkg\n");
+ tlwarn("$prg: strange, package listed but no residual candidates: $pkg\n");
next;
}
} else {
- tlwarn("strange, package listed but no candidates: $pkg\n");
+ tlwarn("$prg: strange, package listed but no candidates: $pkg\n");
$ret |= $F_WARNING;
next;
}
@@ -1558,7 +1558,7 @@ sub action_info {
for my $d (sort @todo) {
my $foo = $tlpdb->get_package($d);
if (!$foo) {
- tlwarn ("\nShould not happen, no dependent package $d\n");
+ tlwarn ("$prg: Should not happen, no dependent package $d\n");
$ret |= $F_WARNING;
next;
}
@@ -1748,7 +1748,7 @@ sub restore_one_package {
# this way we get rid of useless files
my $restore_file = "$bd/${pkg}.r${rev}.tar.xz";
if (! -r $restore_file) {
- tlwarn("Cannot read $restore_file, no action taken\n");
+ tlwarn("$prg: Cannot read $restore_file, no action taken\n");
return ($F_ERROR);
}
$localtlpdb->remove_package($pkg);
@@ -1940,8 +1940,8 @@ sub action_backup {
# we need to check the tlpdb
my $tlpdb_option = $localtlpdb->option("autobackup");
if (!defined($tlpdb_option)) {
- tlwarn ("--clean given without an argument, but no default clean\n");
- tlwarn ("mode specified in the tlpdb.\n");
+ tlwarn ("$prg: --clean given without an argument, but no default clean\n");
+ tlwarn ("$prg: mode specified in the tlpdb.\n");
return ($F_ERROR);
}
$opts{"clean"} = $tlpdb_option;
@@ -1952,8 +1952,8 @@ sub action_backup {
# get rid of leading zeros etc etc
$opts{"clean"} = $opts{"clean"} + 0;
} else {
- tlwarn ("clean mode as specified on the command line or as given by default\n");
- tlwarn ("must be an integer larger or equal than -1, terminating.\n");
+ tlwarn ("$prg: clean mode as specified on the command line or as given by default\n");
+ tlwarn ("$prg: must be an integer larger or equal than -1, terminating.\n");
return($F_ERROR);
}
}
@@ -2074,10 +2074,10 @@ sub write_w32_updater {
my $root = $localtlpdb->root;
my $temp = "$root/temp";
TeXLive::TLUtils::mkdirhier($temp);
- tlwarn("Backup option not implemented for infrastructure update.\n") if ($opts{"backup"});
+ tlwarn("$prg: Backup option not implemented for infrastructure update.\n") if ($opts{"backup"});
if ($media eq 'local_uncompressed') {
- tlwarn("Creating updater from local_uncompressed currently not implemented!\n");
- tlwarn("But it should not be necessary!\n");
+ tlwarn("$prg: Creating updater from local_uncompressed currently not implemented!\n");
+ tlwarn("$prg: But it should not be necessary!\n");
return 1; # abort
}
my (@upd_tar, @upd_tlpobj, @upd_info, @rst_tar, @rst_tlpobj, @rst_info);
@@ -2117,7 +2117,7 @@ sub write_w32_updater {
# create backup; make_container expects file name in a format: some-name.r[0-9]+
my ($size, $md5, $fullname) = $localtlp->make_container("tar", $root, $temp, "__BACKUP_$pkg.r$oldrev");
if ($size <= 0) {
- tlwarn("Creation of backup container of $pkg failed.\n");
+ tlwarn("$prg: Creation of backup container of $pkg failed.\n");
return 1; # backup failed? abort
}
foreach my $pkg_part (@pkg_parts) {
@@ -2128,13 +2128,13 @@ sub write_w32_updater {
}
# now we should have the file present
if (!-r "$temp/$pkg_part.tar.xz") {
- tlwarn("Couldn't get $pkg_part.tar.xz, that is bad\n");
+ tlwarn("$prg: Couldn't get $pkg_part.tar.xz, that is bad\n");
return 1; # abort
}
# unpack xz archive
my $sysret = system("$::progs{'xzdec'} < \"$temp/$pkg_part.tar.xz\" > \"$temp/$pkg_part.tar\"");
if ($sysret) {
- tlwarn("Couldn't unpack $pkg_part.tar.xz\n");
+ tlwarn("$prg: Couldn't unpack $pkg_part.tar.xz\n");
return 1; # unpack failed? abort
}
unlink("$temp/$pkg_part.tar.xz"); # we don't need that archive anymore
@@ -2238,7 +2238,7 @@ EOF
copy("$root/tlpkg/installer/tar.exe", "$temp");
# make sure copied tar is working
if (system("\"$temp/tar.exe\" --version >nul")) {
- tlwarn("Could not copy tar.exe, that is bad.\n");
+ tlwarn("$prg: Could not copy tar.exe, that is bad.\n");
return 1; # abort
}
open UPDATER, ">$temp/updater-w32" or die "Cannot create updater script: $!";
@@ -2305,7 +2305,7 @@ sub auto_remove_install_force_packages {
next if $removals_full{$p};
my $remotetlp = $remotetlpdb->get_package($p);
if (!defined($remotetlp)) {
- tlwarn("Strange, $p mentioned but not found anywhere!\n");
+ tlwarn("$prg: Strange, $p mentioned but not found anywhere!\n");
next;
}
next if ($remotetlp->category ne "Collection");
@@ -2456,7 +2456,7 @@ sub action_update {
# if --list is given: nothing
# other options just change the behaviour
if (!($opts{"list"} || @ARGV || $opts{"all"} || $opts{"self"})) {
- tlwarn("tlmgr update: specify --list, --all, --self, or a list of package names.\n");
+ tlwarn("$prg update: specify --list, --all, --self, or a list of package names.\n");
return ($F_ERROR);
}
@@ -2506,8 +2506,8 @@ sub action_update {
debug ("Automatic backups activated, keeping $autobackup backups.\n");
$opts{"backup"} = 1;
} else {
- tlwarn ("Option autobackup can only be an integer >= -1.\n");
- tlwarn ("Disabling auto backups.\n");
+ tlwarn ("$prg: Option autobackup can only be an integer >= -1.\n");
+ tlwarn ("$prg: Disabling auto backups.\n");
$localtlpdb->option("autobackup", 0);
$autobackup = 0;
$ret |= $F_WARNING;
@@ -2568,7 +2568,7 @@ sub action_update {
if ($opts{"self"}) {
info("$prg: no updates for tlmgr present.\n");
} else {
- tlwarn("tlmgr update: please specify a list of packages, --all, or --self.\n");
+ tlwarn("$prg update: please specify a list of packages, --all, or --self.\n");
return ($F_ERROR);
}
}
@@ -2632,9 +2632,9 @@ sub action_update {
}
}
if ($in_conflict) {
- tlwarn("Conflicts have been found:\n");
+ tlwarn("$prg: Conflicts have been found:\n");
for (@option_conflict_lines) { tlwarn(" $_"); }
- tlwarn("Please resolve these conflicts!\n");
+ tlwarn("$prg: Please resolve these conflicts!\n");
return ($F_ERROR);
}
@@ -2691,7 +2691,7 @@ sub action_update {
# install new packages
my $mediatlp = $remotetlpdb->get_package($pkg);
if (!defined($mediatlp)) {
- tlwarn("\nShould not happen: $pkg not found in $location\n");
+ tlwarn("\n$prg: Should not happen: $pkg not found in $location\n");
$ret |= $F_WARNING;
next;
}
@@ -2804,7 +2804,7 @@ sub action_update {
# are actually disabled?!?!?!
for my $p (@updated, @removals) {
my $pkg = $localtlpdb->get_package($p);
- tlwarn("Should not happen: $p not found in local tlpdb\n") if (!$pkg);
+ tlwarn("$prg: Should not happen: $p not found in local tlpdb\n") if (!$pkg);
next;
for my $f ($pkg->all_files) {
push @{$old_files_to_pkgs{$f}}, $p;
@@ -2812,7 +2812,7 @@ sub action_update {
}
for my $p (@updated, @new) {
my $pkg = $remotetlpdb->get_package($p);
- tlwarn("Should not happen: $p not found in $location\n") if (!$pkg);
+ tlwarn("$prg: Should not happen: $p not found in $location\n") if (!$pkg);
next;
for my $f ($pkg->all_files) {
if ($pkg->relocated) {
@@ -3118,7 +3118,7 @@ sub action_update {
$tlp->relocated);
if ($s <= 0) {
tlwarn("\n$prg: Creation of backup container of $pkg failed.\n");
- tlwarn("Continuing to update other packages, please retry...\n");
+ tlwarn("$prg: Continuing to update other packages, please retry...\n");
$ret |= $F_WARNING;
# we should try to update other packages at least
next;
@@ -3169,7 +3169,7 @@ sub action_update {
# dirs from the new package before re-installing the old one.
# TODO
logpackage("failed update: $pkg ($rev -> $mediarevstr)");
- tlwarn("\n\nInstallation of new version of $pkg did fail, trying to unwind.\n");
+ tlwarn("$prg: Installation of new version of $pkg did fail, trying to unwind.\n");
if (win32()) {
# w32 is notorious for not releasing a file immediately
# we experienced permission denied errors
@@ -3192,11 +3192,11 @@ sub action_update {
$localtlpdb->save;
logpackage("restore: $pkg ($rev)");
$ret |= $F_WARNING;
- tlwarn("Restoring old package state succeeded.\n");
+ tlwarn("$prg: Restoring old package state succeeded.\n");
} else {
logpackage("failed restore: $pkg ($rev)");
- tlwarn("Restoring of old package did NOT succeed.\n");
- tlwarn("Most likely repair: run tlmgr install $pkg and hope.\n");
+ tlwarn("$prg: Restoring of old package did NOT succeed.\n");
+ tlwarn("$prg: Most likely repair: run tlmgr install $pkg and hope.\n");
# TODO_ERRORCHECKING
# should we return F_ERROR here??? If we would do this, then
# no postactions at all would run? Maybe better only to give
@@ -3224,7 +3224,7 @@ sub action_update {
$mediatlp = $remotetlpdb->get_package($pkg);
}
if (!defined($mediatlp)) {
- tlwarn("\nShould not happen: $pkg not found in $location\n");
+ tlwarn("\n$prg: Should not happen: $pkg not found in $location\n");
$ret |= $F_WARNING;
next;
}
@@ -3507,7 +3507,7 @@ sub action_install {
if (check_for_critical_updates( $localtlpdb, $remotetlpdb)) {
critical_updates_warning();
if ($opts{"force"}) {
- tlwarn("Continuing due to --force\n");
+ tlwarn("$prg: Continuing due to --force\n");
} else {
if ($::gui_mode) {
# return here and don't do any updates
@@ -3734,7 +3734,7 @@ sub show_list_of_packages {
if (@cand) {
my $first = shift @cand;
if (defined($first)) {
- tlwarn("strange, we have a first candidate but no tlp: $_\n");
+ tlwarn("$prg: strange, we have a first candidate but no tlp: $_\n");
next;
}
# already shifted away the first element
@@ -3751,15 +3751,15 @@ sub show_list_of_packages {
}
next;
} else {
- tlwarn("strange, package listed but no residual candidates: $_\n");
+ tlwarn("$prg: strange, package listed but no residual candidates: $_\n");
next;
}
} else {
- tlwarn("strange, package listed but no candidates: $_\n");
+ tlwarn("$prg: strange, package listed but no candidates: $_\n");
next;
}
} else {
- tlwarn("strange, package cannot be found in remote tlpdb: $_\n");
+ tlwarn("$prg: strange, package cannot be found in remote tlpdb: $_\n");
next;
}
}
@@ -3965,7 +3965,7 @@ sub action_repository {
}
my ($tlpdb, $errormsg) = setup_one_remotetlpdb($loc);
if (!defined($tlpdb)) {
- tlwarn("cannot get TLPDB from location $loc\n\n");
+ tlwarn("$prg: cannot get TLPDB from location $loc\n\n");
} else {
print "Packages at $loc:\n";
my %pkgs = merge_sub_packages($tlpdb->list_packages);
@@ -4235,14 +4235,14 @@ sub action_option {
if (defined($2)) {
# lower border
if ($2 > $n) {
- tlwarn("value $n for $what out of range ($TLPDBOptions{$opt}->[0])\n");
+ tlwarn("$prg: value $n for $what out of range ($TLPDBOptions{$opt}->[0])\n");
$isgood = 0;
}
}
if (defined($4)) {
# upper border
if ($4 < $n) {
- tlwarn("value $n for $what out of range ($TLPDBOptions{$opt}->[0])\n");
+ tlwarn("$prg: value $n for $what out of range ($TLPDBOptions{$opt}->[0])\n");
$isgood = 0;
}
}
@@ -4252,7 +4252,7 @@ sub action_option {
$localtlpdb->option($opt, $n);
}
} else {
- tlwarn ("Unknown type of option $opt: $TLPDBOptions{$opt}->[0]\n");
+ tlwarn ("$prg: Unknown type of option $opt: $TLPDBOptions{$opt}->[0]\n");
return ($F_ERROR);
}
}
@@ -4264,7 +4264,7 @@ sub action_option {
$tlpo->writeout(\*TOFD);
close(TOFD);
} else {
- tlwarn("Cannot save 00texlive.installation to $::maintree/tlpkg/tlpobj/00texlive.installation.tlpobj\n");
+ tlwarn("$prg: Cannot save 00texlive.installation to $::maintree/tlpkg/tlpobj/00texlive.installation.tlpobj\n");
$ret |= $F_WARNING;
}
}
@@ -4301,7 +4301,7 @@ sub action_platform {
return ($F_WARNING);
}
if ($opts{"usermode"}) {
- tlwarn("action `platform' not supported in usermode\n");
+ tlwarn("$prg: action `platform' not supported in usermode\n");
return ($F_ERROR);
}
my $what = shift @ARGV;
@@ -4356,7 +4356,7 @@ sub action_platform {
}
}
} else {
- tlwarn("action platform add, cannot find package $pkg.$a\n");
+ tlwarn("$prg: action platform add, cannot find package $pkg.$a\n");
$ret |= $F_WARNING;
}
}
@@ -4388,7 +4388,7 @@ sub action_platform {
my $currentarch = $localtlpdb->platform();
foreach my $a (@ARGV) {
if (!TeXLive::TLUtils::member($a, @already_installed_arch)) {
- tlwarn("Platform $a not installed, use 'tlmgr platform list'!\n");
+ tlwarn("$prg: Platform $a not installed, use 'tlmgr platform list'!\n");
$ret |= $F_WARNING;
next;
}
@@ -4430,7 +4430,7 @@ sub action_platform {
# try to remove bin/$a dirs
for my $a (@todoarchs) {
if (!rmdir("$Master/bin/$a")) {
- tlwarn("binary directory $Master/bin/$a not empty after removal of $a.\n");
+ tlwarn("$prg: binary directory $Master/bin/$a not empty after removal of $a.\n");
$ret |= $F_WARNING;
}
}
@@ -4454,14 +4454,14 @@ sub action_platform {
$localtlpdb->save;
} else {
if (!TeXLive::TLUtils::member($arg, @already_installed_arch)) {
- tlwarn("cannot set platform to a not installed one.\n");
+ tlwarn("$prg: cannot set platform to a not installed one.\n");
return ($F_ERROR);
}
$localtlpdb->setting('platform', $arg);
$localtlpdb->save;
}
} else {
- tlwarn("Unknown option for platform: $what\n");
+ tlwarn("$prg: Unknown option for platform: $what\n");
$ret |= $F_ERROR;
}
return ($ret);
@@ -4472,7 +4472,7 @@ sub action_platform {
#
sub action_generate {
if ($opts{"usermode"}) {
- tlwarn("action `generate' not supported in usermode!\n");
+ tlwarn("$prg: action `generate' not supported in usermode!\n");
return $F_ERROR;
}
my $what = shift @ARGV;
@@ -4498,7 +4498,7 @@ sub action_generate {
# if --rebuild-sys is given *and* --dest we warn that this might not
# work if the destination is not the default one
if ($opts{"rebuild-sys"} && $opts{"dest"}) {
- tlwarn("tlmgr generate $what: warning: both --rebuild-sys and --dest\n",
+ tlwarn("$prg generate $what: warning: both --rebuild-sys and --dest\n",
"given; the call to fmtutil-sys can fail if the given\n",
"destination is different from the default.\n");
}
@@ -4748,13 +4748,13 @@ sub action_recreate_tlpdb {
if (member($opts{"platform"}, @archs)) {
push @deps, "setting_platform:" . $opts{"platform"};
} else {
- tlwarn("The platform you passed in with --platform is not present in $Master/bin\n");
- tlwarn("Please specify one of the available ones: @archs\n");
+ tlwarn("$prg: The platform you passed in with --platform is not present in $Master/bin\n");
+ tlwarn("$prg: Please specify one of the available ones: @archs\n");
exit(1);
}
} else {
- tlwarn("More than one platform available: @archs\n");
- tlwarn("Please pass one as the default you are running on with --platform=...\n");
+ tlwarn("$prg: More than one platform available: @archs\n");
+ tlwarn("$prg: Please pass one as the default you are running on with --platform=...\n");
exit(1);
}
}
@@ -4833,7 +4833,7 @@ sub action_check {
my $tltree = init_tltree($svn);
$ret |= check_files($tltree);
} elsif ($what =~ m/^collections/i) {
- tlwarn("the \"collections\" check is replaced by the \"depends\" check.\n");
+ tlwarn("$prg: the \"collections\" check is replaced by the \"depends\" check.\n");
$ret |= check_depends();
} elsif ($what =~ m/^depends/i) {
$ret |= check_depends();
@@ -5064,7 +5064,7 @@ sub check_executes {
foreach my $mf (keys %maps) {
my @pkgsfound = @{$maps{$mf}};
if ($#pkgsfound > 0) {
- tlwarn ("map file $mf is referenced in the executes of @pkgsfound\n");
+ tlwarn ("$prg: map file $mf is referenced in the executes of @pkgsfound\n");
} else {
# less then 1 occurrences is not possible, so we have only one
# package that contains the reference to that map file
@@ -5082,7 +5082,7 @@ sub check_executes {
foreach my $k (keys %mapfn) {
my @bla = @{$mapfn{$k}};
if ($#bla > 0) {
- tlwarn ("map file $mf occurs multiple times (in pkgs: @bla)!\n");
+ tlwarn ("$prg: map file $mf occurs multiple times (in pkgs: @bla)!\n");
}
}
} else {
@@ -5090,7 +5090,7 @@ sub check_executes {
# in the right package!
my ($pkgcontained) = ( $found[0] =~ m/^(.*):.*$/ );
if ($pkgcontained ne $pkgfoundexecute) {
- tlwarn("map file $mf: execute in $pkgfoundexecute, map file in $pkgcontained\n");
+ tlwarn("$prg: map file $mf: execute in $pkgfoundexecute, map file in $pkgcontained\n");
}
}
}
@@ -5333,7 +5333,7 @@ sub check_depends {
sub action_postaction {
my $how = shift @ARGV;
if (!defined($how) || ($how !~ m/^(install|remove)$/i)) {
- tlwarn("action postaction needs at least two arguments, first being either 'install' or 'remove'\n");
+ tlwarn("$prg: action postaction needs at least two arguments, first being either 'install' or 'remove'\n");
return;
}
my $type = shift @ARGV;
@@ -5344,7 +5344,7 @@ sub action_postaction {
$badtype = 1;
}
if ($badtype) {
- tlwarn("action postaction needs as second argument one from 'shortcut', 'fileassoc', 'script'\n");
+ tlwarn("$prg: action postaction needs as second argument one from 'shortcut', 'fileassoc', 'script'\n");
return;
}
if (win32()) {
@@ -5359,11 +5359,11 @@ sub action_postaction {
chomp($ENV{"TEXMFSYSVAR"} = `kpsewhich -var-value TEXMFVAR`);
} elsif ($opts{"w32mode"} eq "admin") {
if (!TeXLive::TLWinGoo::admin()) {
- tlwarn("You don't have the permissions for --w32mode=admin\n");
+ tlwarn("$prg: You don't have the permissions for --w32mode=admin\n");
return;
}
} else {
- tlwarn("action postaction --w32mode can only be 'admin' or 'user'\n");
+ tlwarn("$prg: action postaction --w32mode can only be 'admin' or 'user'\n");
return;
}
}
@@ -5374,7 +5374,7 @@ sub action_postaction {
@todo = $localtlpdb->list_packages;
} else {
if ($#ARGV < 0) {
- tlwarn("action postaction: need either --all or a list of packages\n");
+ tlwarn("$prg: action postaction: need either --all or a list of packages\n");
return;
}
init_local_db();
@@ -5383,13 +5383,13 @@ sub action_postaction {
}
if ($type =~ m/^shortcut$/i) {
if (!win32()) {
- tlwarn("action postaction shortcut only works on windows.\n");
+ tlwarn("$prg: action postaction shortcut only works on windows.\n");
return;
}
for my $p (@todo) {
my $tlp = $localtlpdb->get_package($p);
if (!defined($tlp)) {
- tlwarn("$p is not installed, ignoring it.\n");
+ tlwarn("$prg: $p is not installed, ignoring it.\n");
} else {
# run all shortcut actions, desktop and menu integration
TeXLive::TLUtils::do_postaction($how, $tlp, 0, 1, 1, 0);
@@ -5397,13 +5397,13 @@ sub action_postaction {
}
} elsif ($type =~ m/^fileassoc$/i) {
if (!win32()) {
- tlwarn("action postaction fileassoc only works on windows.\n");
+ tlwarn("$prg: action postaction fileassoc only works on windows.\n");
return;
}
my $fa = $localtlpdb->option("file_assocs");
if ($opts{"fileassocmode"}) {
if ($opts{"fileassocmode"} < 1 || $opts{"fileassocmode"} > 2) {
- tlwarn("action postaction: value of --fileassocmode can only be 1 or 2\n");
+ tlwarn("$prg: action postaction: value of --fileassocmode can only be 1 or 2\n");
return;
}
$fa = $opts{"fileassocmode"};
@@ -5411,7 +5411,7 @@ sub action_postaction {
for my $p (@todo) {
my $tlp = $localtlpdb->get_package($p);
if (!defined($tlp)) {
- tlwarn("$p is not installed, ignoring it.\n");
+ tlwarn("$prg: $p is not installed, ignoring it.\n");
} else {
TeXLive::TLUtils::do_postaction($how, $tlp, $fa, 0, 0, 0);
}
@@ -5420,13 +5420,13 @@ sub action_postaction {
for my $p (@todo) {
my $tlp = $localtlpdb->get_package($p);
if (!defined($tlp)) {
- tlwarn("$p is not installed, ignoring it.\n");
+ tlwarn("$prg: $p is not installed, ignoring it.\n");
} else {
TeXLive::TLUtils::do_postaction($how, $tlp, 0, 0, 0, 1);
}
}
} else {
- tlwarn("action postaction needs one of 'shortcut', 'fileassoc', 'script'\n");
+ tlwarn("$prg: action postaction needs one of 'shortcut', 'fileassoc', 'script'\n");
return;
}
}
@@ -5575,7 +5575,7 @@ sub texconfig_conf_mimic {
info("$m: " . `kpsewhich $m`);
}
- #tlwarn("missing finding of XDvi, config!\n");
+ #tlwarn("$prg: missing finding of XDvi, config!\n");
info("============================= font map files =============================\n");
for my $m (qw/psfonts.map pdftex.map ps2pk.map kanjix.map/) {
@@ -5640,11 +5640,11 @@ sub init_local_db {
# setup the programs, for w32 we need the shipped wget/xz etc, so we
# pass the location of these files to setup_programs.
if (!setup_programs("$Master/tlpkg/installer", $localtlpdb->platform)) {
- tlwarn("Couldn't set up the necessary programs.\nInstallation of packages is not supported.\nPlease report to texlive\@tug.org.\n");
+ tlwarn("$prg: Couldn't set up the necessary programs.\nInstallation of packages is not supported.\nPlease report to texlive\@tug.org.\n");
if (defined($should_i_die) && $should_i_die) {
return ($F_ERROR);
} else {
- tlwarn("Continuing anyway ...\n");
+ tlwarn("$prg: Continuing anyway ...\n");
return ($F_WARNING);
}
}
@@ -5840,7 +5840,8 @@ sub setup_one_remotetlpdb
my $rem_digest;
if (read ($fh, $rem_digest, 32) != 32) {
info(<<END_NO_INTERNET);
-Unable to download the remote TeX Live database,
+No connection to the internet.
+Unable to download the checksum of the remote TeX Live database,
but found a local copy so using that.
You may want to try specifying an explicit or different CTAN mirror;
@@ -6019,14 +6020,14 @@ sub load_config_file {
} elsif ($val eq "1") {
$config{"gui-expertmode"} = 1;
} else {
- tlwarn("$fn: Unknown value for gui-expertmode: $val\n");
+ tlwarn("$prg: $fn: Unknown value for gui-expertmode: $val\n");
}
} elsif ($key eq "persistent-downloads") {
if (($val eq "0") || ($val eq "1")) {
$config{'persistent-downloads'} = $val;
} else {
- tlwarn("$fn: Unknown value for persistent-downloads: $val\n");
+ tlwarn("$prg: $fn: Unknown value for persistent-downloads: $val\n");
}
} elsif ($key eq "gui-lang") {
@@ -6038,11 +6039,11 @@ sub load_config_file {
} elsif ($val eq "1") {
$config{"auto-remove"} = 1;
} else {
- tlwarn("$fn: Unknown value for auto-remove: $val\n");
+ tlwarn("$prg: $fn: Unknown value for auto-remove: $val\n");
}
} else {
- tlwarn("$fn: Unknown tlmgr configuration variable: $key\n");
+ tlwarn("$prg: $fn: Unknown tlmgr configuration variable: $key\n");
}
}
}
@@ -6140,7 +6141,7 @@ sub check_for_critical_updates
# that should not happen, we expanded in the localtlpdb so why
# should it not be present, any anyway, those are so fundamental
# so they have to be there
- tlwarn("\nFundamental package $pkg not present, uh oh, goodbye");
+ tlwarn("\n$prg: Fundamental package $pkg not present, uh oh, goodbye");
die "Should not happen, $pkg not found";
}
my $localrev = $tlp->revision;
@@ -6208,7 +6209,7 @@ sub check_on_writable {
tlwarn("specifically, the directory $Master/tlpkg/ is not writable.\n");
tlwarn("Please run this program as administrator, or contact your local admin.\n");
if ($opts{"dry-run"}) {
- tlwarn("Continuing due to --dry-run\n");
+ tlwarn("$prg: Continuing due to --dry-run\n");
return 1;
} else {
return 0;
diff --git a/Master/texmf-dist/doc/man/man1/latexdiff-vc.1 b/Master/texmf-dist/doc/man/man1/latexdiff-vc.1
index dec9e1306fb..067af21f186 100644
--- a/Master/texmf-dist/doc/man/man1/latexdiff-vc.1
+++ b/Master/texmf-dist/doc/man/man1/latexdiff-vc.1
@@ -1,4 +1,4 @@
-.\" Automatically generated by Pod::Man 2.25 (Pod::Simple 3.16)
+.\" Automatically generated by Pod::Man 2.27 (Pod::Simple 3.28)
.\"
.\" Standard preamble:
.\" ========================================================================
@@ -38,6 +38,8 @@
. ds PI \(*p
. ds L" ``
. ds R" ''
+. ds C`
+. ds C'
'br\}
.\"
.\" Escape single quotes in literal strings from groff's Unicode transform.
@@ -48,17 +50,24 @@
.\" 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.
-.ie \nF \{\
-. de IX
-. tm Index:\\$1\t\\n%\t"\\$2"
+.\"
+.\" Avoid warning from groff about undefined register 'F'.
+.de IX
..
-. nr % 0
-. rr F
-.\}
-.el \{\
-. 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.
@@ -124,7 +133,7 @@
.\" ========================================================================
.\"
.IX Title "LATEXDIFF-VC 1"
-.TH LATEXDIFF-VC 1 "2015-04-14" "perl v5.14.2" " "
+.TH LATEXDIFF-VC 1 "2015-12-26" "perl v5.18.2" " "
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
@@ -143,7 +152,7 @@ latexdiff\-vc \- wrapper script that calls latexdiff for different versions of a
.SH "DESCRIPTION"
.IX Header "DESCRIPTION"
\&\fIlatexdiff-vc\fR is a wrapper script that applies \fIlatexdiff\fR to a
-file, or multiple files under version control (\s-1CVS\s0, \s-1RCS\s0 or \s-1SVN\s0), and optionally runs the
+file, or multiple files under version control (git, subversion (\s-1SVN\s0), mercurial (hg), \s-1CVS, RCS\s0), and optionally runs the
sequence of \f(CW\*(C`latex\*(C'\fR and \f(CW\*(C`dvips\*(C'\fR or \f(CW\*(C`pdflatex\*(C'\fR commands necessary to
produce pdf or postscript output of the difference tex file(s). It can
also be applied to a pair of files to automatise the generation of difference
@@ -155,16 +164,16 @@ file in postscript or pdf format.
Set the version system.
If no version system is specified, latexdiff-vc will venture a guess.
.Sp
-latexdiff-cvs and latexdiff-rcs are variants of latexdiff-vc which default to
+latexdiff-cvs, latexdiff-rcs etc are variants of latexdiff-vc which default to
the respective versioning system. However, this default can still be overridden using the options above.
.IP "\fB\-r\fR, \fB\-r\fR \fIrev\fR or \fB\-\-revision\fR, \fB\-\-revision=\fR\fIrev\fR" 4
.IX Item "-r, -r rev or --revision, --revision=rev"
-Choose revision (under \s-1RCS\s0, \s-1CVS\s0, \s-1SVN\s0, \s-1GIT\s0 or \s-1HG\s0). One or two \fB\-r\fR options can be
+Choose revision (under \s-1RCS, CVS, SVN, GIT\s0 or \s-1HG\s0). One or two \fB\-r\fR options can be
specified, and they result in different behaviour:
.RS 4
.IP "\fBlatexdiff-vc\fR \-r \fIfile.tex\fR ..." 4
.IX Item "latexdiff-vc -r file.tex ..."
-compares \fIfile.tex\fR with the most recent version checked into \s-1RCS\s0.
+compares \fIfile.tex\fR with the most recent version checked into \s-1RCS.\s0
.IP "\fBlatexdiff-vc\fR \-r \fIrev1\fR \fIfile.tex\fR ..." 4
.IX Item "latexdiff-vc -r rev1 file.tex ..."
compares \fIfile.tex\fR with revision \fIrev1\fR.
@@ -175,7 +184,7 @@ compares revisions \fIrev1\fR and \fIrev2\fR of \fIfile.tex\fR.
Multiple files can be specified for all of the above options. All files must have the
extension \f(CW\*(C`.tex\*(C'\fR, though.
.IP "\fBlatexdiff-vc\fR \fIold.tex\fR \fInew.tex\fR" 4
-.IX Item "latexdiff-vc old.tex new.tex"
+.IX Item "latexdiff-vc old.tex new.tex"
compares two files.
.RE
.RS 4
@@ -184,7 +193,7 @@ The name of the difference file is generated automatically and
reported to stdout.
.RE
.IP "\fB\-d\fR or \fB\-\-dir\fR \fB\-d\fR \fIpath\fR or \fB\-\-dir=\fR\fIpath\fR" 4
-.IX Item "-d or --dir -d path or --dir=path"
+.IX Item "-d or --dir -d path or --dir=path"
Rather than appending the string \f(CW\*(C`diff\*(C'\fR and optionally the version
numbers given to the output-file, this will prepend a directory name \f(CW\*(C`diff\*(C'\fR
to the
@@ -216,7 +225,7 @@ run the sequence \f(CW\*(C`pdflatex; pdflatex\*(C'\fR on the difference file, or
\&\f(CW\*(C`pdflatex; bibtex; pdflatex; pdflatex\*(C'\fR for files requiring bibtex.
.IP "\fB\-\-only\-changes\fR" 4
.IX Item "--only-changes"
-Post-process the output such that only pages with changes on them are displayed. This requires the use of subtype \s-1ZLABEL\s0
+Post-process the output such that only pages with changes on them are displayed. This requires the use of subtype \s-1ZLABEL \s0
in latexdiff, which will be set automatically, but any manually set \-s option will be overruled (also requires zref package to
be installsed). (note that this option must be combined with \-\-ps or \-\-pdf to make sense)
.IP "\fB\-\-force\fR" 4
@@ -244,10 +253,11 @@ or higher are required.
.SH "BUG REPORTING"
.IX Header "BUG REPORTING"
Please submit bug reports using the issue tracker of the github repository page \fIhttps://github.com/ftilmann/latexdiff.git\fR,
-or send them to \fItilmann \*(-- \s-1AT\s0 \*(-- gfz\-potsdam.de\fR. Include the serial number of \fIlatexdiff-vc\fR
+or send them to \fItilmann \*(-- \s-1AT\s0 \*(-- gfz\-potsdam.de\fR. Include the version number of \fIlatexdiff-vc\fR
(option \f(CW\*(C`\-\-version\*(C'\fR).
.SH "AUTHOR"
.IX Header "AUTHOR"
+Version 1.1.1
Copyright (C) 2005\-2015 Frederik Tilmann
.PP
This program is free software; you can redistribute it and/or modify
diff --git a/Master/texmf-dist/doc/man/man1/latexdiff-vc.man1.pdf b/Master/texmf-dist/doc/man/man1/latexdiff-vc.man1.pdf
index aa1fcab822f..fa6f683059d 100644
--- a/Master/texmf-dist/doc/man/man1/latexdiff-vc.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/latexdiff-vc.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/latexdiff.1 b/Master/texmf-dist/doc/man/man1/latexdiff.1
index 24834cbde14..815f23d874e 100644
--- a/Master/texmf-dist/doc/man/man1/latexdiff.1
+++ b/Master/texmf-dist/doc/man/man1/latexdiff.1
@@ -1,4 +1,4 @@
-.\" Automatically generated by Pod::Man 2.25 (Pod::Simple 3.16)
+.\" Automatically generated by Pod::Man 2.27 (Pod::Simple 3.28)
.\"
.\" Standard preamble:
.\" ========================================================================
@@ -38,6 +38,8 @@
. ds PI \(*p
. ds L" ``
. ds R" ''
+. ds C`
+. ds C'
'br\}
.\"
.\" Escape single quotes in literal strings from groff's Unicode transform.
@@ -48,17 +50,24 @@
.\" 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.
-.ie \nF \{\
-. de IX
-. tm Index:\\$1\t\\n%\t"\\$2"
+.\"
+.\" Avoid warning from groff about undefined register 'F'.
+.de IX
..
-. nr % 0
-. rr F
-.\}
-.el \{\
-. 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.
@@ -124,7 +133,7 @@
.\" ========================================================================
.\"
.IX Title "LATEXDIFF 1"
-.TH LATEXDIFF 1 "2015-04-14" "perl v5.14.2" " "
+.TH LATEXDIFF 1 "2015-12-26" "perl v5.18.2" " "
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
@@ -270,7 +279,7 @@ CHANGEBAR CCHANGEBAR CULINECHBAR CFONTCBHBAR BOLD\*(C'\fR
Add code to preamble for selected style for bracketing
commands (e.g. to mark changes in margin). This option defines
\&\f(CW\*(C`\eDIFaddbegin\*(C'\fR, \f(CW\*(C`\eDIFaddend\*(C'\fR, \f(CW\*(C`\eDIFdelbegin\*(C'\fR and \f(CW\*(C`\eDIFdelend\*(C'\fR commands.
-Available styles: \f(CW\*(C`SAFE MARGINAL COLOR DVIPSCOL ZLABEL ONLYCHANGEDPAGE (LABEL)*\*(C'\fR
+Available styles: \f(CW\*(C`SAFE MARGIN COLOR DVIPSCOL ZLABEL ONLYCHANGEDPAGE (LABEL)*\*(C'\fR
.Sp
[ Default: \f(CW\*(C`SAFE\*(C'\fR ]
* Subtype \f(CW\*(C`LABEL\*(C'\fR is deprecated
@@ -294,7 +303,7 @@ obtained by executing
.Sp
[Default encoding is utf8 unless the first few lines of the preamble contain
an invocation \f(CW\*(C`\eusepackage[..]{inputenc}\*(C'\fR in which case the
-encoding chosen by this command is asssumed. Note that \s-1ASCII\s0 (standard
+encoding chosen by this command is asssumed. Note that \s-1ASCII \s0(standard
latex) is a subset of utf8]
.IP "\fB\-\-preamble=file\fR or \fB\-p file\fR" 4
.IX Item "--preamble=file or -p file"
@@ -352,9 +361,9 @@ Define most of the glossaries commands as safe, protecting them with \embox'es w
.el .IP "\f(CWmhchem\fR" 8
.IX Item "mhchem"
Treat \f(CW\*(C`\ece\*(C'\fR as a safe command, i.e. it will be highlighted (note that \f(CW\*(C`\ecee\*(C'\fR will not be highlighted in equations as this leads to processing errors)
-.ie n .IP """chemformula""" 8
-.el .IP "\f(CWchemformula\fR" 8
-.IX Item "chemformula"
+.ie n .IP """chemformula"" or ""chemmacros""" 8
+.el .IP "\f(CWchemformula\fR or \f(CWchemmacros\fR" 8
+.IX Item "chemformula or chemmacros"
Treat \f(CW\*(C`\ech\*(C'\fR as a safe command outside equations, i.e. it will be highlighted (note that \f(CW\*(C`\ech\*(C'\fR will not be highlighted in equations as this leads to processing errors)
.RE
.RS 4
@@ -369,7 +378,7 @@ Print generated or included preamble commands to stdout.
.IX Subsection "Configuration"
.ie n .IP "\fB\-\-exclude\-safecmd=exclude\-file\fR or \fB\-A exclude-file\fR or \fB\-\-exclude\-safecmd=""cmd1,cmd2,...""\fR" 4
.el .IP "\fB\-\-exclude\-safecmd=exclude\-file\fR or \fB\-A exclude-file\fR or \fB\-\-exclude\-safecmd=``cmd1,cmd2,...''\fR" 4
-.IX Item "--exclude-safecmd=exclude-file or -A exclude-file or --exclude-safecmd=cmd1,cmd2,..."
+.IX Item "--exclude-safecmd=exclude-file or -A exclude-file or --exclude-safecmd=cmd1,cmd2,..."
.PD 0
.IP "\fB\-\-replace\-safecmd=replace\-file\fR" 4
.IX Item "--replace-safecmd=replace-file"
@@ -438,7 +447,7 @@ their arguments.
Define safe commands, which additionally need to be protected by encapsulating
in an \e\embox{..}. This is sometimes needed to get around incompatibilities
between external packages and the ulem package, which is used for highlighting
-in the default style \s-1UNDERLINE\s0 as well as \s-1CULINECHBAR\s0 \s-1CFONTSTRIKE\s0
+in the default style \s-1UNDERLINE\s0 as well as \s-1CULINECHBAR CFONTSTRIKE\s0
.IP "\fB\-\-config var1=val1,var2=val2,...\fR or \fB\-c var1=val1,..\fR" 4
.IX Item "--config var1=val1,var2=val2,... or -c var1=val1,.."
.PD 0
@@ -449,23 +458,27 @@ Set configuration variables. The option can be repeated to set different
variables (as an alternative to the comma-separated list).
Available variables (see below for further explanations):
.Sp
-\&\f(CW\*(C`MINWORDSBLOCK\*(C'\fR (integer)
+\&\f(CW\*(C`ARRENV\*(C'\fR (RegEx)
.Sp
-\&\f(CW\*(C`FLOATENV\*(C'\fR (RegEx)
+\&\f(CW\*(C`COUNTERCMD\*(C'\fR (RegEx)
.Sp
-\&\f(CW\*(C`PICTUREENV\*(C'\fR (RegEx)
+\&\f(CW\*(C`FLOATENV\*(C'\fR (RegEx)
.Sp
-\&\f(CW\*(C`MATHENV\*(C'\fR (RegEx)
+\&\f(CW\*(C`ITEMCMD\*(C'\fR (RegEx)
.Sp
-\&\f(CW\*(C`MATHREPL\*(C'\fR (String)
+\&\f(CW\*(C`LISTENV\*(C'\fR (RegEx)
.Sp
\&\f(CW\*(C`MATHARRENV\*(C'\fR (RegEx)
.Sp
\&\f(CW\*(C`MATHARRREPL\*(C'\fR (String)
.Sp
-\&\f(CW\*(C`ARRENV\*(C'\fR (RegEx)
+\&\f(CW\*(C`MATHENV\*(C'\fR (RegEx)
.Sp
-\&\f(CW\*(C`COUNTERCMD\*(C'\fR (RegEx)
+\&\f(CW\*(C`MATHREPL\*(C'\fR (String)
+.Sp
+\&\f(CW\*(C`MINWORDSBLOCK\*(C'\fR (integer)
+.Sp
+\&\f(CW\*(C`PICTUREENV\*(C'\fR (RegEx)
.IP "\fB\-\-show\-safecmd\fR" 4
.IX Item "--show-safecmd"
Print list of RegEx matching and excluding safe commands.
@@ -516,7 +529,7 @@ expected, e.g. correction of typos.
.IP "\fB\-\-disable\-citation\-markup\fR or \fB\-\-disable\-auto\-mbox\fR" 4
.IX Item "--disable-citation-markup or --disable-auto-mbox"
Suppress citation markup and markup of other vulnerable commands in styles
-using ulem (\s-1UNDERLINE\s0,FONTSTRIKE, \s-1CULINECHBAR\s0)
+using ulem (\s-1UNDERLINE,FONTSTRIKE, CULINECHBAR\s0)
(the two options are identical and are simply aliases)
.IP "\fB\-\-enable\-citation\-markup\fR or \fB\-\-enforce\-auto\-mbox\fR" 4
.IX Item "--enable-citation-markup or --enforce-auto-mbox"
@@ -532,7 +545,7 @@ Default is to work silently.
.IP "\fB\-\-driver=type\fR" 4
.IX Item "--driver=type"
Choose driver for changebar package (only relevant for styles using
- changebar: \s-1CCHANGEBAR\s0 \s-1CFONTCHBAR\s0 \s-1CULINECHBAR\s0 \s-1CHANGEBAR\s0). Possible
+ changebar: \s-1CCHANGEBAR CFONTCHBAR CULINECHBAR CHANGEBAR\s0). Possible
drivers are listed in changebar manual, e.g. pdftex,dvips,dvitops
[Default: dvips]
.IP "\fB\-\-ignore\-warnings\fR" 4
@@ -688,13 +701,23 @@ Mark additions the same way as in the main text. Deleted environments are marke
Make no difference between the main text and floats.
.SS "Configuration Variables"
.IX Subsection "Configuration Variables"
-.ie n .IP """MINWORDSBLOCK""" 10
-.el .IP "\f(CWMINWORDSBLOCK\fR" 10
-.IX Item "MINWORDSBLOCK"
-Minimum number of tokens required to form an independent block. This value is
-used in the algorithm to detect changes of complete blocks by merging identical text parts of less than \f(CW\*(C`MINWORDSBLOCK\*(C'\fR to the preceding added and discarded parts.
+.ie n .IP """ARRENV""" 10
+.el .IP "\f(CWARRENV\fR" 10
+.IX Item "ARRENV"
+If a match to \f(CW\*(C`ARRENV\*(C'\fR is found within an inline math environment within a deleted or added block, then the inlined math
+is surrounded by \f(CW\*(C`\embox{\*(C'\fR...\f(CW\*(C`}\*(C'\fR. This is necessary as underlining does not work within inlined array environments.
.Sp
-[ Default: 3 ]
+[ Default: \f(CW\*(C`ARRENV\*(C'\fR=\f(CW\*(C`(?:array|[pbvBV]matrix)\*(C'\fR\
+.ie n .IP """COUNTERCMD""" 10
+.el .IP "\f(CWCOUNTERCMD\fR" 10
+.IX Item "COUNTERCMD"
+If a command in a deleted block which is also in the textcmd list matches \f(CW\*(C`COUNTERCMD\*(C'\fR then an
+additional command \f(CW\*(C`\eaddtocounter{\*(C'\fR\fIcntcmd\fR\f(CW\*(C`}{\-1}\*(C'\fR, where \fIcntcmd\fR is the matching command, is appended in the diff file such that the numbering in the diff file remains synchronized with the
+numbering in the new file.
+.Sp
+[ Default: \f(CW\*(C`COUNTERCMD\*(C'\fR=\f(CW\*(C`(?:footnote|part|section|subsection\*(C'\fR ...
+.Sp
+\&\f(CW\*(C`|subsubsection|paragraph|subparagraph)\*(C'\fR ]
.ie n .IP """FLOATENV""" 10
.el .IP "\f(CWFLOATENV\fR" 10
.IX Item "FLOATENV"
@@ -703,19 +726,22 @@ considered floats. Within these environments, the \fIlatexdiff\fR markup comman
are replaced by their \s-1FL\s0 variaties.
.Sp
[ Default: \f(CW\*(C`(?:figure|table|plate)[\ew\ed*@]*\*(C'\fR\ ]
-.ie n .IP """PICTUREENV""" 10
-.el .IP "\f(CWPICTUREENV\fR" 10
-.IX Item "PICTUREENV"
-Within environments whose name matches the regular expression in \f(CW\*(C`PICTUREENV\*(C'\fR
-all latexdiff markup is removed (in pathologic cases this might lead to
- inconsistent markup but this situation should be rare).
-.Sp
-[ Default: \f(CW\*(C`(?:picture|DIFnomarkup)[\ew\ed*@]*\*(C'\fR\ ]
+.ie n .IP """ITEMCMD""" 10
+.el .IP "\f(CWITEMCMD\fR" 10
+.IX Item "ITEMCMD"
+Commands representing new item line with list environments.
+.Sp
+[ Default: \e\f(CW\*(C`item\*(C'\fR ]
+.ie n .IP """LISTENV""" 10
+.el .IP "\f(CWLISTENV\fR" 10
+.IX Item "LISTENV"
+Environments whose name matches the regular expression in \f(CW\*(C`LISTENV\*(C'\fR are list environments.
+.Sp
+[ Default: \f(CW\*(C`(?:itemize|enumerate|description)\*(C'\fR\ ]
.ie n .IP """MATHENV"",""MATHREPL""" 10
.el .IP "\f(CWMATHENV\fR,\f(CWMATHREPL\fR" 10
.IX Item "MATHENV,MATHREPL"
-If both \ebegin and \eend for a math environment (environment name matching \f(CW\*(C`MATHENV\*(C'\fR
-or \e[ and \e])
+If both \ebegin and \eend for a math environment (environment name matching \f(CW\*(C`MATHENV\*(C'\fR or \e[ and \e])
are within the same deleted block, they are replaced by a \ebegin and \eend commands for \f(CW\*(C`MATHREPL\*(C'\fR
rather than being commented out.
.Sp
@@ -726,23 +752,21 @@ rather than being commented out.
as \f(CW\*(C`MATHENV\*(C'\fR,\f(CW\*(C`MATHREPL\*(C'\fR but for equation arrays
.Sp
[ Default: \f(CW\*(C`MATHARRENV\*(C'\fR=\f(CW\*(C`eqnarray\e*?\*(C'\fR\ , \f(CW\*(C`MATHREPL\*(C'\fR=\f(CW\*(C`eqnarray\*(C'\fR\ ]
-.ie n .IP """ARRENV""" 10
-.el .IP "\f(CWARRENV\fR" 10
-.IX Item "ARRENV"
-If a match to \f(CW\*(C`ARRENV\*(C'\fR is found within an inline math environment within a deleted or added block, then the inlined math
-is surrounded by \f(CW\*(C`\embox{\*(C'\fR...\f(CW\*(C`}\*(C'\fR. This is necessary as underlining does not work within inlined array environments.
-.Sp
-[ Default: \f(CW\*(C`ARRENV\*(C'\fR=\f(CW\*(C`(?:array|[pbvBV]matrix)\*(C'\fR\
-.ie n .IP """COUNTERCMD""" 10
-.el .IP "\f(CWCOUNTERCMD\fR" 10
-.IX Item "COUNTERCMD"
-If a command in a deleted block which is also in the textcmd list matches \f(CW\*(C`COUNTERCMD\*(C'\fR then an
-additional command \f(CW\*(C`\eaddtocounter{\*(C'\fR\fIcntcmd\fR\f(CW\*(C`}{\-1}\*(C'\fR, where \fIcntcmd\fR is the matching command, is appended in the diff file such that the numbering in the diff file remains synchronized with the
-numbering in the new file.
+.ie n .IP """MINWORDSBLOCK""" 10
+.el .IP "\f(CWMINWORDSBLOCK\fR" 10
+.IX Item "MINWORDSBLOCK"
+Minimum number of tokens required to form an independent block. This value is
+used in the algorithm to detect changes of complete blocks by merging identical text parts of less than \f(CW\*(C`MINWORDSBLOCK\*(C'\fR to the preceding added and discarded parts.
.Sp
-[ Default: \f(CW\*(C`COUNTERCMD\*(C'\fR=\f(CW\*(C`(?:footnote|part|section|subsection\*(C'\fR ...
+[ Default: 3 ]
+.ie n .IP """PICTUREENV""" 10
+.el .IP "\f(CWPICTUREENV\fR" 10
+.IX Item "PICTUREENV"
+Within environments whose name matches the regular expression in \f(CW\*(C`PICTUREENV\*(C'\fR
+all latexdiff markup is removed (in pathologic cases this might lead to
+inconsistent markup but this situation should be rare).
.Sp
-\&\f(CW\*(C`|subsubsection|paragraph|subparagraph)\*(C'\fR ]
+[ Default: \f(CW\*(C`(?:picture|DIFnomarkup)[\ew\ed*@]*\*(C'\fR\ ]
.SH "COMMON PROBLEMS AND FAQ"
.IX Header "COMMON PROBLEMS AND FAQ"
.IP "Citations result in overfull boxes" 10
@@ -762,18 +786,17 @@ For custom packages you can define the commands which need to be protected by \f
.IP "Changes in complicated mathematical equations result in latex processing errors" 10
.IX Item "Changes in complicated mathematical equations result in latex processing errors"
Try options \f(CW\*(C`\-\-math\-markup=whole\*(C'\fR. If even that fails, you can turn off mark up for equations with \f(CW\*(C`\-\-math\-markup=off\*(C'\fR.
-.IP "How can I just show the pages" 10
-.IX Item "How can I just show the pages"
+.IP "How can I just show the pages where changes had been made" 10
+.IX Item "How can I just show the pages where changes had been made"
Use options \-\f(CW\*(C`\-s ZLABEL\*(C'\fR (some postprocessing required) or \f(CW\*(C`\-s ONLYCHANGEDPAGE\*(C'\fR. \f(CW\*(C`latexdiff\-vc \-\-ps|\-\-pdf\*(C'\fR with \f(CW\*(C`\-\-only\-changes\*(C'\fR option takes care of
-the post-processing for you (requires zref packages).
+the post-processing for you (requires zref package to be installed).
.SH "BUGS"
.IX Header "BUGS"
-Option allow-spaces not implemented entirely consistently. It breaks
-the rules that number and type of white space does not matter, as
-different numbers of inter-argument spaces are treated as significant.
+.IP "Option allow-spaces not implemented entirely consistently. It breaks the rules that number and type of white space does not matter, as different numbers of inter-argument spaces are treated as significant." 10
+.IX Item "Option allow-spaces not implemented entirely consistently. It breaks the rules that number and type of white space does not matter, as different numbers of inter-argument spaces are treated as significant."
.PP
Please submit bug reports using the issue tracker of the github repository page \fIhttps://github.com/ftilmann/latexdiff.git\fR,
-or send them to \fItilmann \*(-- \s-1AT\s0 \*(-- gfz\-potsdam.de\fR. Include the serial number of \fIlatexdiff\fR
+or send them to \fItilmann \*(-- \s-1AT\s0 \*(-- gfz\-potsdam.de\fR. Include the version number of \fIlatexdiff\fR
(from comments at the top of the source or use \fB\-\-version\fR). If you come across latex
files that are error-free and conform to the specifications set out
above, and whose differencing still does not result in error-free
@@ -797,7 +820,7 @@ version, \fIlatexdiff-so\fR, which has this package inlined, is available, too.
\&\fIlatexdiff-fast\fR requires the \fIdiff\fR command to be present.
.SH "AUTHOR"
.IX Header "AUTHOR"
-Version 1.1.0
+Version 1.1.1
Copyright (C) 2004\-2015 Frederik Tilmann
.PP
This program is free software; you can redistribute it and/or modify
diff --git a/Master/texmf-dist/doc/man/man1/latexdiff.man1.pdf b/Master/texmf-dist/doc/man/man1/latexdiff.man1.pdf
index 72318cf6833..29bd56bf6b6 100644
--- a/Master/texmf-dist/doc/man/man1/latexdiff.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/latexdiff.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/man/man1/latexrevise.1 b/Master/texmf-dist/doc/man/man1/latexrevise.1
index 259bbc29eea..cdb1aab46c8 100644
--- a/Master/texmf-dist/doc/man/man1/latexrevise.1
+++ b/Master/texmf-dist/doc/man/man1/latexrevise.1
@@ -1,4 +1,4 @@
-.\" Automatically generated by Pod::Man 2.25 (Pod::Simple 3.16)
+.\" Automatically generated by Pod::Man 2.27 (Pod::Simple 3.28)
.\"
.\" Standard preamble:
.\" ========================================================================
@@ -38,6 +38,8 @@
. ds PI \(*p
. ds L" ``
. ds R" ''
+. ds C`
+. ds C'
'br\}
.\"
.\" Escape single quotes in literal strings from groff's Unicode transform.
@@ -48,17 +50,24 @@
.\" 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.
-.ie \nF \{\
-. de IX
-. tm Index:\\$1\t\\n%\t"\\$2"
+.\"
+.\" Avoid warning from groff about undefined register 'F'.
+.de IX
..
-. nr % 0
-. rr F
-.\}
-.el \{\
-. 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.
@@ -124,7 +133,7 @@
.\" ========================================================================
.\"
.IX Title "LATEXREVISE 1"
-.TH LATEXREVISE 1 "2015-04-14" "perl v5.14.2" " "
+.TH LATEXREVISE 1 "2015-04-14" "perl v5.18.2" " "
.\" For nroff, turn off justification. Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.if n .ad l
diff --git a/Master/texmf-dist/doc/man/man1/latexrevise.man1.pdf b/Master/texmf-dist/doc/man/man1/latexrevise.man1.pdf
index 19a4aa582f9..4f6e01660d5 100644
--- a/Master/texmf-dist/doc/man/man1/latexrevise.man1.pdf
+++ b/Master/texmf-dist/doc/man/man1/latexrevise.man1.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/support/latexdiff/README b/Master/texmf-dist/doc/support/latexdiff/README
index 911b585deec..428564ad23f 100644
--- a/Master/texmf-dist/doc/support/latexdiff/README
+++ b/Master/texmf-dist/doc/support/latexdiff/README
@@ -94,6 +94,14 @@ latexchanges (Author: Jan-Ake Larsson) Wrapper script for applying latexdiff wit
Contributions by the following authors were incorporated into the latexdiff code, or inspired me to
extend latexdiff in a similar way: J. Paisley, N. Becker, K. Huebner
+EXTERNAL LATEXDIFF SUPPORT PROGRAMS
+
+LATEXDIFFCITE (Author: Christer van der Meeren) is a wrapper around latexdiff to make citations diff properly. It works by expanding \cite type commands using the bbl or bib file, such that citations are treated just like normal text rather than as atomic in the plain latexdiff.
+https://latexdiffcite.readthedocs.org
+
+GIT-LATEXDIFF (lead author: Matthieu Moy) is a wrapper (bash scipt) around latexdiff that allows using it to diff two revisions of a LaTeX file under git revision control (similar functionality is provided by latexdiff-vc --git with --flatten option included with this distribution but git-latexdiff allows more fine-grained control on (not to be confused with latexdiff-git, which is normally installed as a soft link to latexdiff-vc)
+https://gitorious.org/git-latexdiff/
+
LICENSE (also see file COPYING)
This program is free software; you can redistribute it and/or modify
diff --git a/Master/texmf-dist/doc/support/latexdiff/doc/latexdiff-man.pdf b/Master/texmf-dist/doc/support/latexdiff/doc/latexdiff-man.pdf
index f30d1869c86..7372b551dd5 100644
--- a/Master/texmf-dist/doc/support/latexdiff/doc/latexdiff-man.pdf
+++ b/Master/texmf-dist/doc/support/latexdiff/doc/latexdiff-man.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/support/latexdiff/doc/latexdiff-man.tex b/Master/texmf-dist/doc/support/latexdiff/doc/latexdiff-man.tex
index 2adffccd99a..1059eb25a3f 100644
--- a/Master/texmf-dist/doc/support/latexdiff/doc/latexdiff-man.tex
+++ b/Master/texmf-dist/doc/support/latexdiff/doc/latexdiff-man.tex
@@ -316,7 +316,7 @@ to make the markup visible. This is what it looks like:
If you approve of all the changes in the revision, just continue with
\verb|example-rev.tex| for the next revision. If you like to adopt
most but not all changes you can use \verb|latexrevise| in the
-following manner. Simply remove the \verb|\DIFdelbegin| and
+following manner. Simply edit \verb|example-diff.tex| to remove the \verb|\DIFdelbegin| and
\verb|\DIFdelend| tags around the text you would like to keep and
simply remove the text between \verb|\DIFaddbegin| and
\verb|\DIFaddend| tags, if you do not wish to keep them. Say you are happy with all proposed changes for the
@@ -348,8 +348,20 @@ are identical}.
}
and run
\begin{verbatim}
-latexrevise -a example-rev.tex > example-final.tex
+latexrevise -a example-diff.tex > example-final.tex
\end{verbatim}
\verb|example-final.tex| is then almost identical to
\verb|example-rev.tex| except for the last paragraph.
+
+\section*{External tools}
+The following is an incomplete list of wrappers written by others providing some added functionality. These are not included with the distribution but need to be downloaded and installed separately.
+
+\begin{description}
+ \item[latexdiffcite] (Author: Christer van der Meeren) is a wrapper around latexdiff to make citations diff properly. It works by expanding \verb|\cite| type commands using the bbl or bib file, such that citations are treated just like normal text rather than as atomic in the plain latexdiff. \\
+\verb|https://latexdiffcite.readthedocs.org|
+\item[git-latexdiff] (lead author: Matthieu Moy) is a wrapper (bash scipt) around latexdiff that allows using it to diff two revisions of a LaTeX file under git revision control Similar functionality is provided by \verb|latexdiff-vc --git| with \verb|--flatten| option included with this distribution but git-latexdiff allows more fine-grained control on varous aspects. (Not to be confused with latexdiff-git, which is normally installed as a soft link to latexdiff-vc) \\
+\verb|https://gitorious.org/git-latexdiff/|
+
+\end{description}
+
\end{document}
diff --git a/Master/texmf-dist/doc/support/latexdiff/latexdiff b/Master/texmf-dist/doc/support/latexdiff/latexdiff
index bb75ce4ac85..864b74eb167 100755
--- a/Master/texmf-dist/doc/support/latexdiff/latexdiff
+++ b/Master/texmf-dist/doc/support/latexdiff/latexdiff
@@ -23,7 +23,14 @@
# Detailed usage information at the end of the file
#
# ToDo:
-# DONE
+#
+# Version 1.1.1
+# - patch mhchem: allow ce in equations
+# - flatten now also expands \input etc. in the preamble (but not \usepackage!)
+# - Better support for Japanese ( contributed by github user kshramt )
+# - prevent duplicated verbatim hashes (patch contributed by github user therussianjig, issue #36)
+# - disable deleted label commands (fixes issue #31)
+# - introduce post-processing to reinstate most deleted environments and all needed item commands (fixes issue #1)
#
# Version 1.1.0
# - treat diacritics (\",\', etc) as safe commands
@@ -125,7 +132,7 @@ my ($algodiffversion)=split(/ /,$Algorithm::Diff::VERSION);
my ($versionstring)=<<EOF ;
-This is LATEXDIFF 1.1.0 (Algorithm::Diff $Algorithm::Diff::VERSION, Perl $^V)
+This is LATEXDIFF 1.1.1 (Algorithm::Diff $Algorithm::Diff::VERSION, Perl $^V)
(c) 2004-2015 F J Tilmann
EOF
@@ -138,16 +145,19 @@ my $MATHENV='(?:equation[*]?|displaymath|DOLLARDOLLAR)[*]?' ; # Enviro
my $MATHREPL='displaymath'; # Environment introducing deleted maths blocks
my $MATHARRENV='(?:eqnarray|align|alignat|gather|multline|flalign)[*]?' ; # Environments turning on eqnarray math mode
my $MATHARRREPL='eqnarray*'; # Environment introducing deleted maths blocks
-my $ARRENV='(?:array|[pbvBV]?matrix|smallmatrix|cases|split)'; # Environments making arrays in math mode. The underlining style does not cope well with those - as a result in-text math environments are surrounded by \mbox{ } if any of these commands is used in an inline math block
+my $ARRENV='(?:aligned|array|[pbvBV]?matrix|smallmatrix|cases|split)'; # Environments making arrays in math mode. The underlining style does not cope well with those - as a result in-text math environments are surrounded by \mbox{ } if any of these commands is used in an inline math block
my $COUNTERCMD='(?:footnote|part|chapter|section|subsection|subsubsection|paragraph|subparagraph)'; # textcmds which are associated with a counter
# If any of these commands occur in a deleted block
# they will be succeeded by an \addtocounter{...}{-1}
# for the associated counter such that the overall numbers
# should be the same as in the new file
-my @UNSAFEMATHCMD=('qedhere'); # Commands which are definitely unsafe for marking up (amsmath qedhere only tested to not work with UNDERLINE markup)
+my $LABELCMD='(?:label)'; # matching commands are disabled within deleted blocks - mostly useful for maths mode, as otherwise it would be fine to just not add those to SAFECMDLIST
+my @UNSAFEMATHCMD=('qedhere'); # Commands which are definitely unsafe for marking up in math mode (amsmath qedhere only tested to not work with UNDERLINE markup) (only affects WHOLE and COARSE math markup modes). Note that unlike text mode (or FINE math mode0 deleted unsafe commands are not deleted but simply taken outside \DIFdel
my $MBOXINLINEMATH=0; # if set to 1 then surround marked-up inline maths expression with \mbox ( to get around compatibility
# problems between some maths packages and ulem package
+my $LISTENV='(?:itemize|description|enumerate)'; # list making environments - they will generally be kept
+my $ITEMCMD='item';
# Markup strings
# If at all possible, do not change these as parts of the program
@@ -431,6 +441,8 @@ foreach $assign ( @config ) {
$assign=~ m/\s*(\w*)\s*=\s*(\S*)\s*$/ or die "Illegal assignment $assign in configuration list (must be variable=value)";
if ( $1 eq "MINWORDSBLOCK" ) { $MINWORDSBLOCK = $2; }
elsif ( $1 eq "FLOATENV" ) { $FLOATENV = $2 ; }
+ elsif ( $1 eq "ITEMCMD" ) { $ITEMCMD = $2 ; }
+ elsif ( $1 eq "LISTENV" ) { $LISTENV = $2 ; }
elsif ( $1 eq "PICTUREENV" ) { $PICTUREENV = $2 ; }
elsif ( $1 eq "MATHENV" ) { $MATHENV = $2 ; }
elsif ( $1 eq "MATHREPL" ) { $MATHREPL = $2 ; }
@@ -477,15 +489,17 @@ if ($showtext) {
if ($showconfig) {
print "Configuration variables:\n";
- print "MINWORDSBLOCK=$MINWORDSBLOCK\n";
+ print "ARRENV=$ARRENV\n";
+ print "COUNTERCMD=$COUNTERCMD\n";
print "FLOATENV=$FLOATENV\n";
- print "PICTUREENV=$PICTUREENV\n";
- print "MATHENV=$MATHENV\n";
- print "MATHREPL=$MATHREPL\n";
+ print "ITEMCMD=$ITEMCMD\n";
+ print "LISTENV=$LISTENV\n";
print "MATHARRENV=$MATHARRENV\n";
print "MATHARRREPL=$MATHARRREPL\n";
- print "ARRENV=$ARRENV\n";
- print "COUNTERCMD=$COUNTERCMD\n";
+ print "MATHENV=$MATHENV\n";
+ print "MATHREPL=$MATHREPL\n";
+ print "MINWORDSBLOCK=$MINWORDSBLOCK\n";
+ print "PICTUREENV=$PICTUREENV\n";
}
if ($showconfig || $showtext || $showsafe || $showpreamble) {
exit 0; }
@@ -514,13 +528,14 @@ push(@SAFECMDLIST, qr/^QLEFTBRACE$/, qr/^QRIGHTBRACE$/);
# Patterns. These are used by some of the subroutines, too
# I can only define them down here because value of extraspace depends on an option
+
my $pat0 = '(?:[^{}])*';
- my $pat1 = '(?:[^{}]|\{'.$pat0.'\})*';
- my $pat2 = '(?:[^{}]|\{'.$pat1.'\})*';
- my $pat3 = '(?:[^{}]|\{'.$pat2.'\})*';
- my $pat4 = '(?:[^{}]|\{'.$pat3.'\})*';
- my $pat5 = '(?:[^{}]|\{'.$pat4.'\})*';
- my $pat6 = '(?:[^{}]|\{'.$pat5.'\})*';
+ my $pat_n = $pat0;
+# if you get "undefined control sequence MATHBLOCKmath" error, increase the maximum value in this loop
+ for (my $i_pat = 0; $i_pat < 20; ++$i_pat){
+ $pat_n = '(?:[^{}]|\{'.$pat_n.'\})*';
+ }
+
my $brat0 = '(?:[^\[\]]|\\\[|\\\])*';
my $abrat0 = '(?:[^<>])*';
@@ -534,11 +549,12 @@ push(@SAFECMDLIST, qr/^QLEFTBRACE$/, qr/^QRIGHTBRACE$/);
# such that a\_b is interpreted as a{\_}b by latex but a{\_b} by perl
my $quotedunderscore='\\\\_';
# word: sequence of letters or accents followed by letter
- my $word='(?:[-\w\d*]|\\\\[\"\'\`~^][A-Za-z\*])+';
+ my $word_ja='\p{Han}+|\p{InHiragana}+|\p{InKatakana}+';
+ my $word='(?:' . $word_ja . '|(?:(?:[-\w\d*]|\\\\[\"\'\`~^][A-Za-z\*])(?!(?:' . $word_ja . ')))+)';
my $cmdleftright='\\\\(?:left|right|[Bb]igg?[lrm]?|middle)\s*(?:[<>()\[\]|]|\\\\(?:[|{}]|\w+))';
- my $cmdoptseq='\\\\[\w\d\*]+'.$extraspace.'(?:(?:<'.$abrat0.'>|\['.$brat0.'\]|\{'. $pat6 . '\}|\(' . $coords .'\))'.$extraspace.')*';
+ my $cmdoptseq='\\\\[\w\d\*]+'.$extraspace.'(?:(?:<'.$abrat0.'>|\['.$brat0.'\]|\{'. $pat_n . '\}|\(' . $coords .'\))'.$extraspace.')*';
my $backslashnl='\\\\\n';
- my $oneletcmd='\\\\.\*?(?:\['.$brat0.'\]|\{'. $pat6 . '\})*';
+ my $oneletcmd='\\\\.\*?(?:\['.$brat0.'\]|\{'. $pat_n . '\})*';
my $math='\$(?:[^$]|\\\$)*?\$|\\\\[(](?:.|\n)*?\\\\[)]';
## the current maths command cannot cope with newline within the math expression
my $comment='%.*?\n';
@@ -548,10 +564,10 @@ push(@SAFECMDLIST, qr/^QLEFTBRACE$/, qr/^QRIGHTBRACE$/);
my ($oldfile, $newfile) = @ARGV;
# check for existence of input files
if ( ! -e $oldfile ) {
- die "Input file $oldfile does not exist.";
+ die "Input file $oldfile does not exist";
}
if ( ! -e $newfile ) {
- die "Input file $newfile does not exist.";
+ die "Input file $newfile does not exist";
}
@@ -595,6 +611,10 @@ exetime(1);
if ($flatten) {
$oldbody=flatten($oldbody,$oldpreamble,$oldfile,$encoding);
$newbody=flatten($newbody,$newpreamble,$newfile,$encoding);
+ # flatten preamble
+ $oldpreamble=flatten($oldpreamble,$oldpreamble,$oldfile,$encoding);
+ $newpreamble=flatten($newpreamble,$newpreamble,$newfile,$encoding);
+
}
@@ -722,7 +742,7 @@ if (defined $packages{"glossaries"} ) {
}
}
-if (defined $packages{"chemformula"} ) {
+if (defined $packages{"chemformula"} or defined $packages{"chemmacros"} ) {
print STDERR "chemformula package detected.\n" if $verbose ;
init_regex_arr_ext(\@SAFECMDLIST,'ch');
push(@UNSAFEMATHCMD,'ch');
@@ -734,7 +754,7 @@ if (defined $packages{"chemformula"} ) {
if (defined $packages{"mhchem"} ) {
print STDERR "mhchem package detected.\n" if $verbose ;
init_regex_arr_ext(\@SAFECMDLIST,'ce');
- push(@UNSAFEMATHCMD,'cee');
+ push(@UNSAFEMATHCMD,'ce','cee');
# The next command would be needed to allow highlighting the interior of \cee commands in math environments
# but the redefinitions in chemformula are too deep to make this viable
# push(@MATHTEXTCMDLIST,'cee');
@@ -778,6 +798,11 @@ foreach $mboxcmd ( @MBOXCMDLIST ) {
init_regex_arr_ext(\@SAFECMDLIST, $mboxcmd);
}
+# check if \label is in SAFECMDLIST, and if yes replace "label" in $LABELCMD by something that never matches (we hope!)
+if ( iscmd("label",\@SAFECMDLIST,\@SAFECMDEXCL) ) {
+ $LABELCMD=~ s/label/NEVERMATCHLABEL/;
+}
+
print STDERR "Preprocessing body. " if $verbose;
@@ -792,14 +817,14 @@ if ( $debug ) {
print RAWDIFF $diffbo;
close(RAWDIFF);
}
-print STDERR "(",exetime()," s)\n","Postprocessing body. \n " if $verbose;
+print STDERR "(",exetime()," s)\n","Postprocessing body. \n" if $verbose;
postprocess($diffbo);
$diffall =join("\n",@diffpreamble) ;
# add visible labels
if (defined($visiblelabel)) {
# Give information right after \begin{document} (or at the beginning of the text for files without preamble
### if \date command is used, add information to \date argument, otherwise give right after \begin{document}
- ### $diffall=~s/(\\date$extraspace(?:\[$brat0\])?$extraspace)\{($pat6)\}/$1\{$2 \\ LATEXDIFF comparison \\ Old: $oldlabel \\ New: $newlabel \}/ or
+ ### $diffall=~s/(\\date$extraspace(?:\[$brat0\])?$extraspace)\{($pat_n)\}/$1\{$2 \\ LATEXDIFF comparison \\ Old: $oldlabel \\ New: $newlabel \}/ or
$diffbo = "\\begin{verbatim}LATEXDIFF comparison\nOld: $oldlabel\nNew: $newlabel\\end{verbatim}\n$diffbo" ;
}
@@ -890,18 +915,24 @@ sub read_file_with_encoding {
# %packages=list_packages($preamble)
# scans the arguments for \documentclass,\RequirePackage and \usepackage statements and constructs a hash
# whose keys are the included packages, and whose values are the associated optional arguments
+# if argument of \usepackage or \RequirePackage is comma separated list, treat as different packages
sub list_packages {
my ($preamble)=@_;
my %packages=();
+ my $pkg;
# remove comments
$preamble=~s/(?<!\\)%.*$//mg ;
while ( $preamble =~ m/\\(?:documentclass|usepackage|RequirePackage)(?:\[($brat0)\])?\{(.*?)\}/gs ) {
if (defined($1)) {
- $packages{$2}=$1;
+ foreach $pkg ( split /,/,$2 ) {
+ $packages{$pkg}=$1;
+ }
} else {
- $packages{$2}="";
+ foreach $pkg ( split /,/,$2 ) {
+ $packages{$pkg}="";
+ }
}
}
return (%packages);
@@ -932,7 +963,7 @@ sub add_safe_commands {
}
}
- while ( $preamble =~ m/\\(?:new|renew|provide)command\s*{\\(\w*)\}(?:|\[\d*\])\s*\{(${pat6})\}/osg ) {
+ while ( $preamble =~ m/\\(?:new|renew|provide)command\s*{\\(\w*)\}(?:|\[\d*\])\s*\{(${pat_n})\}/osg ) {
my $maybe_to_test = $1;
my $should_be_safe = $2;
my $success = 0;
@@ -986,7 +1017,7 @@ sub flatten {
print STDERR "DEBUG: includeonly $includeonly\n" if $debug;
# recursively replace \\input and \\include files
- $text=~s/(^(?:[^%\n]|\\%)*)\\input{(.*?)}|\\include{(${includeonly}(?:\.tex)?)}/{
+ 1 while $text=~s/(^(?:[^%\n]|\\%)*)\\input{(.*?)}|\\include{(${includeonly}(?:\.tex)?)}/{
$begline=(defined($1)? $1 : "") ;
$fname = $2 if defined($2) ;
$fname = $3 if defined($3) ;
@@ -1267,7 +1298,7 @@ sub pass1 {
# print STDERR "Unchanged block $cnt, $last1,$last2 \n";
if ($cnt < $MINWORDSBLOCK
&& $cnt==scalar (
- grep { /^$wpat/ || ( /^\\((?:[`'^"~=.]|[\w\d@*]+))((?:\[$brat0\]|\{$pat6\})*)/o
+ grep { /^$wpat/ || ( /^\\((?:[`'^"~=.]|[\w\d@*]+))((?:\[$brat0\]|\{$pat_n\})*)/o
&& iscmd($1,\@SAFECMDLIST,\@SAFECMDEXCL)
&& scalar(@dummy=split(" ",$2))<3 ) }
@$block) ) {
@@ -1399,7 +1430,7 @@ sub extracttextblocks {
for ($i=0;$i< scalar @$block;$i++) {
($token,$index)=@{ $block->[$i] };
# store pure text blocks
- if ($token =~ /$wpat/ || ( $token =~/^\\((?:[`'^"~=.]|[\w\d@\*]+))((?:${extraspace}\[$brat0\]${extraspace}|${extraspace}\{$pat6\})*)/o
+ if ($token =~ /$wpat/ || ( $token =~/^\\((?:[`'^"~=.]|[\w\d@\*]+))((?:${extraspace}\[$brat0\]${extraspace}|${extraspace}\{$pat_n\})*)/o
&& iscmd($1,\@SAFECMDLIST,\@SAFECMDEXCL)
&& !iscmd($1,\@TEXTCMDLIST,\@TEXTCMDEXCL))) {
# we have text or a command which can be treated as text
@@ -1453,7 +1484,7 @@ sub extractcommands {
# $2: \cmd
# $3: last argument
# $4: } + trailing spaces
- if ( ( $token =~ m/^(\\([\w\d\*]+)(?:${extraspace}\[$brat0\]|${extraspace}\{$pat6\})*${extraspace}\{)($pat6)(\}\s*)$/so )
+ if ( ( $token =~ m/^(\\([\w\d\*]+)(?:${extraspace}\[$brat0\]|${extraspace}\{$pat_n\})*${extraspace}\{)($pat_n)(\}\s*)$/so )
&& iscmd($2,\@TEXTCMDLIST,\@TEXTCMDEXCL) ) {
# push(@$retval,[ $2,$index,$1,$3,$4 ]);
($cmd,$open,$mid,$closing) = ($2,$1,$3,$4) ;
@@ -1605,8 +1636,8 @@ sub marktags {
# $2: cmd
# $3: last argument
# $4: } + trailing spaces
- ### pre-0.3 if ( ( $token =~ m/^(\\([\w\d\*]+)(?:\[$brat0\]|\{$pat6\})*\{)($pat6)(\}\s*)$/so )
- if ( ( $word =~ m/^(\\([\w\d\*]+)(?:${extraspace}\[$brat0\]|${extraspace}\{$pat6\})*${extraspace}\{)($pat6)(\}\s*)$/so )
+ ### pre-0.3 if ( ( $token =~ m/^(\\([\w\d\*]+)(?:\[$brat0\]|\{$pat_n\})*\{)($pat_n)(\}\s*)$/so )
+ if ( ( $word =~ m/^(\\([\w\d\*]+)(?:${extraspace}\[$brat0\]|${extraspace}\{$pat_n\})*${extraspace}\{)($pat_n)(\}\s*)$/so )
&& (iscmd($2,\@TEXTCMDLIST,\@TEXTCMDEXCL)|| iscmd($2,\@MATHTEXTCMDLIST,\@MATHTEXTCMDEXCL))
&& ( !$cmdcomment || !iscmd($2,\@CONTEXT2CMDLIST, \@CONTEXT2CMDEXCL) ) ) {
# Condition 1: word is a command? - if yes, $1,$2,.. will be set as above
@@ -1640,7 +1671,6 @@ sub marktags {
# ""
local @SAFECMDLIST=(".*");
local @SAFECMDEXCL=('\\','\\\\',@UNSAFEMATHCMD);
- ### print STDERR "DEBUG: Command $command argtext ",join(",",@argtext),"\n" if $debug;
push(@$retval,$command,marktags("","",$open,$close,"","",$comment,\@argtext)#@argtext
,$closingbracket);
} else {
@@ -1654,6 +1684,7 @@ sub marktags {
push (@$retval,$opencmd) if $cmd==-1 ;
push (@$retval,$close,$opencmd) if $cmd==0 ;
$word =~ s/\n/\n${opencmd}/sg if $cmdcomment ; # if opencmd is a comment, repeat this at the beginning of every line
+ ### print STDERR "MARKTAGS: Add command |$word|\n";
push (@$retval,$word);
$cmd=1;
}
@@ -1670,7 +1701,7 @@ sub marktags {
###print STDERR "DEBUG Mboxsafecmd detected:$word:\n" if $debug ;
push(@$retval,"\\mbox{$AUXCMD\n\\" . $1 . $2 . $3 ."}$AUXCMD\n" );
} else {
- # $word is a normal word or a safe command (not in MBOXCMDLIST
+ # $word is a normal word or a safe command (not in MBOXCMDLIST)
push (@$retval,$word);
}
$cmd=0;
@@ -1683,6 +1714,53 @@ sub marktags {
return @$retval;
}
+#used in preprocess
+sub take_comments_and_enter_from_frac() {
+ ###*************take the \n and % between frac and {}***********
+ ###notice all of the substitution are made none global
+ while( m/\\begin{($MATHENV|$MATHARRENV|SQUAREBRACKET)}(.*?)\\frac(([\s]*%[^\n]*?)*[\r\n|\r|\n])+\{(.*?)\\end{\1}/s ) {
+ ### if there isn't any % or \n in the pattern $2 then there should be an \\end{...} in $2
+ if( $2 !~ m/\\end{$1}/s ) {
+ ### take out % and \n from the next match only (none global)
+ s/\\begin{($MATHENV|$MATHARRENV|SQUAREBRACKET)}(.*?)\\frac(([\s]*%[^\n]*?)*[\r\n|\r|\n])+\{(.*?)\\end{\1}/\\begin{$1}$2\\frac{$5\\end{$1}/s;
+ }
+ else{
+ ###there are no more % and \n in $2, we want to find the next one so we clear the begin-end from the pattern
+ s/\\begin{($MATHENV|$MATHARRENV|SQUAREBRACKET)}(.*?)\\end{\1}/MATHBLOCK$1$2MATHBLOCKEND/s;
+ }
+ }
+ ###cleaning up
+ while( s/MATHBLOCK($MATHENV|$MATHARRENV|SQUAREBRACKET)(.*?)MATHBLOCKEND/\\begin{$1}$2\\end{$1}/s ){}
+ ###*************take the \n and % between frac and {}***********
+
+ ###**********take the \n and % between {} and {} of the frac***************
+ while( m/\\begin\{($MATHENV|$MATHARRENV|SQUAREBRACKET)\}(.*?)\\frac\{(.*?)\\end\{\1\}/s ) {
+ ### if there isn't any more //frac before the first //end in the pattern $2 then there should be an \\end{...} in $2
+ if( $2 !~ m/\\end\{$1\}/s ) {
+ ### from now on CURRFRAC is the frac we are looking at
+ s/\\begin\{($MATHENV|$MATHARRENV|SQUAREBRACKET)\}(.*?)\\frac\{(.*?)\\end\{\1\}/\\begin\{$1\}$2CURRFRAC\{$3\\end\{$1\}/s;
+ while( m/\\begin\{($MATHENV|$MATHARRENV|SQUAREBRACKET)\}(.*?)CURRFRAC\{(.*?)\\end\{\1\}/s ) {
+ if( m/\\begin\{($MATHENV|$MATHARRENV|SQUAREBRACKET)\}(.*?)CURRFRAC\{($pat_n)\}([\s]*(%[^\n]*?)*[\r\n|\r|\n])+[\s]*\{(.*?)\\end{\1}/s ) {
+ s/\\begin\{($MATHENV|$MATHARRENV|SQUAREBRACKET)\}(.*?)CURRFRAC\{($pat_n)\}([\s]*(%[^\n]*?)*[\r\n|\r|\n])+[\s]*\{(.*?)\\end\{\1\}/\\begin\{$1\}$2CURRFRAC\{$3\}\{$6\\end\{$1\}/s;
+ }
+ else { # there is no comment or \n between the two brackets {}{}
+ ### change CURRFRAC to FRACSTART so we can change them all back to //frac{ when we finish
+ s/\\begin{($MATHENV|$MATHARRENV|SQUAREBRACKET)}(.*?)CURRFRAC\{(.*?)\\end{\1}/\\begin{$1}$2FRACSTART\{$3\\end{$1}/s;
+ }
+ }
+ }
+ else{
+ ###there are no more frac in $2, we want to find the next one so we clear the begin-end from the pattern
+ s/\\begin{($MATHENV|$MATHARRENV|SQUAREBRACKET)}(.*?)\\end{\1}/MATHBLOCK$1$2MATHBLOCKEND/s;
+ }
+
+ }
+ ###cleaning up
+ while( s/MATHBLOCK($MATHENV|$MATHARRENV|SQUAREBRACKET)(.*?)MATHBLOCKEND/\\begin{$1}$2\\end{$1}/s ){}
+ s/FRACSTART/\\frac/g;
+ ###***************take the \n and % between {} and {} of the frac*********************
+}
+
# preprocess($string, ..)
# carry out the following pre-processing steps for all arguments:
# 1. Remove leading white-space
@@ -1708,7 +1786,7 @@ sub marktags {
# Returns: leading white space removed in step 1
sub preprocess {
for (@_) {
- # Change \{ to \QLEFTBRACE and \} to \QRIGHTBRACE
+ # Change \{ to \QLEFTBRACE, \} to \QRIGHTBRACE, and \& to \AMPERSAND
s/(?<!\\)\\{/\\QLEFTBRACE /sg;
s/(?<!\\)\\}/\\QRIGHTBRACE /sg;
s/(?<!\\)\\&/\\AMPERSAND /sg;
@@ -1722,11 +1800,14 @@ sub preprocess {
s/(\\verb\*?)(\S)(.*?)\2/"${1}{". tohash(\%verbhash,"${2}${3}${2}") ."}"/esg;
s/\\begin\{(verbatim\*?)\}(.*?)\\end\{\1\}/"\\${1}{". tohash(\%verbhash,"${2}") . "}"/esg;
# Convert _n or _\cmd into \SUBSCRIPTNB{n} or \SUBSCRIPTNB{\cmd} and _{nnn} into \SUBSCRIPT{nn}
- 1 while s/(?<!\\)_([^{\\]|\\\w+)/\\SUBSCRIPTNB{$1}/g ;
- 1 while s/(?<!\\)_{($pat6)}/\\SUBSCRIPT{$1}/g ;
+ 1 while s/(?<!\\)_(\s*([^{\\\s]|\\\w+))/\\SUBSCRIPTNB{$1}/g ;
+ 1 while s/(?<!\\)_(\s*{($pat_n)})/\\SUBSCRIPT$1/g ;
# Convert ^n into \SUPERSCRIPTNB{n} and ^{nnn} into \SUPERSCRIPT{nn}
- 1 while s/(?<!\\)\^([^{\\]|\\\w+)/\\SUPERSCRIPTNB{$1}/g ;
- 1 while s/(?<!\\)\^{($pat6)}/\\SUPERSCRIPT{$1}/g ;
+ 1 while s/(?<!\\)\^(\s*([^{\\\s]|\\\w+))/\\SUPERSCRIPTNB{$1}/g ;
+ 1 while s/(?<!\\)\^(\s*{($pat_n)})/\\SUPERSCRIPT$1/g ;
+ # Convert \sqrt{n} into \SQRT{n} and \sqrt nn into SQRTNB{nn}
+ 1 while s/(?<!\\)\\sqrt(\s*([^{\\\s]|\\\w+))/\\SQRTNB{$1}/g ;
+ 1 while s/(?<!\\)\\sqrt(\s*{($pat_n)})/\\SQRT$1/g ;
# Convert $$ $$ into \begin{DOLLARDOLLAR} \end{DOLLARDOLLAR}
s/\$\$(.*?)\$\$/\\begin{DOLLARDOLLAR}$1\\end{DOLLARDOLLAR}/sg;
# Convert \[ \] into \begin{SQUAREBRACKET} \end{SQUAREBRACKET}
@@ -1739,6 +1820,9 @@ sub preprocess {
# Also convert all array environments into ARRAYBLOCK environments
if ( $mathmarkup != FINE ) {
s/\\begin{($ARRENV)}(.*?)\\end{\1}/\\ARRAYBLOCK$1\{$2\}/sg;
+
+ take_comments_and_enter_from_frac();
+
s/\\begin{($MATHENV|$MATHARRENV|SQUAREBRACKET)}(.*?)\\end{\1}/\\MATHBLOCK$1\{$2\}/sg;
}
# add final token " STOP"
@@ -1756,16 +1840,17 @@ sub tohash {
@arr=unpack('c*',$string);
- foreach $val (@arr) {
- $sum += $i*$val;
- $i++;
- }
- $hstr= "$sum";
- if (defined($hash->{$hstr}) && $string ne $hash->{$hstr}) {
- warn "Repeated hash value for verbatim mode in spite of different content.";
- $hstr="-$hstr";
+ while (1) {
+ foreach $val (@arr) {
+ $sum += $i*$val;
+ $i++;
+ }
+ $hstr= "$sum";
+ last unless (defined($hash->{$hstr}) && $string ne $hash->{$hstr});
+ # else found a duplicate HASH need to repeat for a higher hash value
}
$hash->{$hstr}=$string;
+ ### print STDERR "Hash:$hstr: Content:$string:\n";
return($hstr);
}
@@ -1836,6 +1921,8 @@ sub postprocess {
# second level blocks
my ($begin2,$cnt2,$len2,$eqarrayblock,$mathblock);
+ my (@textparts,@newtextparts,@liststack,$listtype,$listlast);
+
for (@_) {
# change $'s in comments to something harmless
@@ -1918,14 +2005,25 @@ sub postprocess {
# Convert MATHBLOCKmath commands to their uncounted numbers (e.g. convert equation -> displaymath
# (environments defined in $MATHENV will be replaced by $MATHREPL, and environments in $MATHARRENV
# will be replaced by $MATHARRREPL
- $delblock=~ s/\\MATHBLOCK($MATHENV)\{($pat6)\}/\\MATHBLOCK$MATHREPL\{$2\}/sg;
- $delblock=~ s/\\MATHBLOCK($MATHARRENV)\{($pat6)\}/\\MATHBLOCK$MATHARRREPL\{$2\}/sg;
+ $delblock=~ s/\\MATHBLOCK($MATHENV)\{($pat_n)\}/\\MATHBLOCK$MATHREPL\{$2\}/sg;
+ $delblock=~ s/\\MATHBLOCK($MATHARRENV)\{($pat_n)\}/\\MATHBLOCK$MATHARRREPL\{$2\}/sg;
}
+ # Reinstate completely deleted list environments. note that items within the
+ # environment will still be commented out. They will be restored later
+ $delblock=~ s/(\%DIFDELCMD < \s*\\begin\{($LISTENV)\}\s*?(?:\n|$DELCMDCLOSE))(.*?)(\%DIFDELCMD < \s*\\end\{\2\})/{
+ ### # block within the search; replacement environment
+ ### "$1\\begin{$2}$AUXCMD\n". restore_item_commands($3). "\n\\end{$2}$AUXCMD\n$4";
+ "$1\\begin{$2}$AUXCMD\n$3\n\\end{$2}$AUXCMD\n$4";
+ }/esg;
# b.where one of the commands matching $COUNTERCMD is used as a DIFAUXCMD, add a statement
# subtracting one from the respective counter to keep numbering consistent with new file
- $delblock=~ s/\\($COUNTERCMD)((?:${extraspace}\[$brat0\]${extraspace}|${extraspace}\{$pat6\})*\s*${AUXCMD}\n)/\\$1$2\\addtocounter{$1}{-1}${AUXCMD}\n/sg ;
+ $delblock=~ s/\\($COUNTERCMD)((?:${extraspace}\[$brat0\]${extraspace}|${extraspace}\{$pat_n\})*\s*${AUXCMD}\n)/\\$1$2\\addtocounter{$1}{-1}${AUXCMD}\n/sg ;
+
+# bb. disable active labels within deleted blocks (as these are not safe commands, this should normally only
+# happen within deleted maths blocks
+ $delblock=~ s/(\\$LABELCMD(?:${extraspace})\{(?:[^{}])*\}[\t ]*)\n?/${DELCMDOPEN}$1${DELCMDCLOSE}/smg ;
# c. If in-line math mode contains array environment, enclose the whole environment in \mbox'es
@@ -1973,6 +2071,36 @@ sub postprocess {
pos = $begin + length($addblock);
}
+ # Go through whole text, and by counting list environment commands, find out when we are within a list environment.
+ # Within those restore deleted \item commands
+ @textparts=split /(?<!$DELCMDOPEN)(\\(?:begin|end)\{$LISTENV\})/ ;
+ @liststack=();
+ @newtextparts=map {
+ ### print STDERR ":::::::: $_\n";
+ if ( ($listtype) = m/^\\begin\{($LISTENV)\}$/ ) {
+ print STDERR "DEBUG: postprocess \\begin{$listtype}\n" if $debug;
+ push @liststack,$listtype;
+ } elsif ( ($listtype) = m/^\\end\{($LISTENV)\}$/ ) {
+ print STDERR "DEBUG: postprocess \\end{$listtype}\n" if $debug;
+ if (scalar @liststack > 0) {
+ $listlast=pop(@liststack);
+ ($listtype eq $listlast) or warn "Invalid nesting of list environments: $listlast environment closed by \\end{$listtype}.";
+ } else {
+ warn "Invalid nesting of list environments: \\end{$listtype} encountered without matching \\begin{$listtype}.";
+ }
+ } else {
+ print STDERR "DEBUG: postprocess \@liststack=(",join(",",@liststack),")\n" if $debug;
+ if (scalar @liststack > 0 ) {
+ # we are within a list environment and should replace all item commands
+ $_=restore_item_commands($_);
+ }
+ # else: we are outside a list environment and do not need to do anything
+ }
+ $_ } @textparts; # end of map command
+ # replace the main text with the modified version
+ $_= "@newtextparts";
+
+
# Replace MATHMODE environments from step 1a above by the correct Math environment
@@ -1992,12 +2120,12 @@ sub postprocess {
s/\\begin{((?:$MATHENV)|(?:$MATHARRENV)|SQUAREBRACKET)}$AUXCMD\n((?:\s*%.[^\n]*\n)*)\\end{\1}$AUXCMD\n/$2/sg;
} else {
# math modes OFF,WHOLE,COARSE: Convert \MATHBLOCKmath{..} commands back to environments
- s/\\MATHBLOCK($MATHENV|$MATHARRENV|SQUAREBRACKET)\{($pat6)\}/\\begin{$1}$2\\end{$1}/sg;
+ s/\\MATHBLOCK($MATHENV|$MATHARRENV|SQUAREBRACKET)\{($pat_n)\}/\\begin{$1}$2\\end{$1}/sg;
# convert ARRAYBLOCK.. commands back to environments
- s/\\ARRAYBLOCK($ARRENV)\{($pat6)\}/\\begin{$1}$2\\end{$1}/sg;
+ s/\\ARRAYBLOCK($ARRENV)\{($pat_n)\}/\\begin{$1}$2\\end{$1}/sg;
}
# Convert all PICTUREblock{..} commands back to the appropriate environments
- s/\\PICTUREBLOCK($PICTUREENV)\{($pat6)\}/\\begin{$1}$2\\end{$1}/sg;
+ s/\\PICTUREBLOCK($PICTUREENV)\{($pat_n)\}/\\begin{$1}$2\\end{$1}/sg;
#0.5: # Remove all mark up within picture environments
# while ( m/\\begin\{($PICTUREENV)\}.*?\\end\{\1\}/sg ) {
# $cnt=0;
@@ -2006,10 +2134,10 @@ sub postprocess {
# $float=$&;
# $float =~ s/\\DIFaddbegin //g;
# $float =~ s/\\DIFaddend //g;
-# $float =~ s/\\DIFadd\{($pat6)\}/$1/g;
+# $float =~ s/\\DIFadd\{($pat_n)\}/$1/g;
# $float =~ s/\\DIFdelbegin //g;
# $float =~ s/\\DIFdelend //g;
-# $float =~ s/\\DIFdel\{($pat6)\}//g;
+# $float =~ s/\\DIFdel\{($pat_n)\}//g;
# $float =~ s/$DELCMDOPEN.*//g;
# substr($_,$begin,$len)=$float;
# pos = $begin + length($float);
@@ -2072,11 +2200,15 @@ sub postprocess {
# 4. Convert \begin{DOLLARDOLLAR} \end{DOLLARDOLLAR} into $$ $$
s/\\begin\{DOLLARDOLLAR\}(.*?)\\end\{DOLLARDOLLAR\}/\$\$$1\$\$/sg;
# 5. Convert \SUPERSCRIPTNB{n} into ^n and \SUPERSCRIPT{nn} into ^{nnn}
- 1 while s/\\SUPERSCRIPT{($pat6)}/^{$1}/g ;
- 1 while s/\\SUPERSCRIPTNB{($pat0)}/^$1/g ;
+ 1 while s/\\SUPERSCRIPT(\s*{($pat_n)})/^$1/g ;
+ 1 while s/\\SUPERSCRIPTNB{(\s*$pat0)}/^$1/g ;
# Convert \SUBSCRIPNB{n} into _n and \SUBCRIPT{nn} into _{nnn}
- 1 while s/\\SUBSCRIPT{($pat6)}/_{$1}/g ;
- 1 while s/\\SUBSCRIPTNB{($pat0)}/_$1/g ;
+ 1 while s/\\SUBSCRIPT(\s*{($pat_n)})/_$1/g ;
+ 1 while s/\\SUBSCRIPTNB{(\s*$pat0)}/_$1/g ;
+ # Convert \SQRT{n} into \sqrt{n} and \SQRTNB{nn} into \sqrt nn
+ 1 while s/\\SQRT(\s*{($pat_n)})/\\sqrt$1/g ;
+ 1 while s/\\SQRTNB{(\s*$pat0)}/\\sqrt$1/g ;
+
1 while s/(%.*)\\CRIGHTBRACE (.*)$/$1\}$2/mg ;
1 while s/(%.*)\\CLEFTBRACE (.*)$/$1\{$2/mg ;
@@ -2090,6 +2222,24 @@ sub postprocess {
}
}
+# $out = restore_item_commands($listenviron)
+# short helper function for post-process, which restores deleted \item commands in its argument (as DIFAUXCMDs)
+sub restore_item_commands {
+ my ($string)=@_ ;
+ my ($itemarg,@itemargs);
+ $string =~ s/(\%DIFDELCMD < \s*(\\$ITEMCMD)((?:<$abrat0>)?)((?:\[$brat0\])?)\s*?(?:\n|$DELCMDCLOSE))/
+ # if \item has an []argument, then mark up the argument as deleted)
+ if (length($4)>0) {
+ # use substr to exclude square brackets at end points
+ @itemargs=splitlatex(substr($4,1,length($4)-2));
+ $itemarg="[".join("",marktags("","",$DELOPEN,$DELCLOSE,$DELCMDOPEN,$DELCMDCLOSE,$DELCOMMENT,\@itemargs))."]";
+ } else {
+ $itemarg="";
+ }
+ "$1$2$3$itemarg$AUXCMD\n"/sge;
+ return($string);
+}
+
# @auxlines=preprocess_preamble($oldpreamble,$newpreamble);
# pre-process preamble by looking for commands used in \maketitle (title, author, date etc commands)
@@ -2116,7 +2266,7 @@ sub preprocess_preamble {
# resue in a more complex regex
$titlecmd =~ s/[\$\^]//g;
# make sure to not match on comment lines:
- $titlecmdpat=qr/^(?:[^%\n]|\\%)*(\\($titlecmd)$extraspace(?:\[($brat0)\])?(?:\{($pat6)\}))/ms;
+ $titlecmdpat=qr/^(?:[^%\n]|\\%)*(\\($titlecmd)$extraspace(?:\[($brat0)\])?(?:\{($pat_n)\}))/ms;
@oldtitlecommands= ( $$oldpreambleref =~ m/$titlecmdpat/g );
@newtitlecommands= ( $$newpreambleref =~ m/$titlecmdpat/g );
@@ -2344,7 +2494,7 @@ format as new.tex but has all changes relative to old.tex marked up or commented
--subtype=markstyle
-s markstyle Add code to preamble for selected style for bracketing
commands (e.g. to mark changes in margin)
- Available styles: SAFE MARGINAL DVIPSCOL COLOR ZLABEL ONLYCHANGEDPAGE (LABEL)*
+ Available styles: SAFE MARGIN DVIPSCOL COLOR ZLABEL ONLYCHANGEDPAGE (LABEL)*
[ Default: SAFE ]
* LABEL subtype is deprecated
@@ -2435,15 +2585,17 @@ format as new.tex but has all changes relative to old.tex marked up or commented
--config var1=val1,var2=val2,...
-c var1=val1,.. Set configuration variables.
-c configfile Available variables:
- MINWORDSBLOCK (integer)
+ ARRENV (RegEx)
+ COUNTERCMD (RegEx)
FLOATENV (RegEx)
- PICTUREENV (RegEx)
- MATHENV (RegEx)
- MATHREPL (String)
+ ITEMCMD (RegEx)
+ LISTENV (RegEx)
MATHARRENV (RegEx)
MATHARRREPL (String)
- ARRENV (RegEx)
- COUNTERCMD (RegEx)
+ MATHENV (RegEx)
+ MATHREPL (String)
+ MINWORDSBLOCK (integer)
+ PICTUREENV (RegEx)
This option can be repeated.
@@ -2454,7 +2606,7 @@ format as new.tex but has all changes relative to old.tex marked up or commented
Use of the --packages option disables automatic scanning, so if for any
reason package specific parsing needs to be switched off, use --packages=none.
The following packages trigger special behaviour:
- endfloat hyperref amsmath apacite siunitx cleveref glossaries mhchem chemformula
+ endfloat hyperref amsmath apacite siunitx cleveref glossaries mhchem chemformula/chemmacros
[ Default: scan the preamble for \\usepackage commands to determine
loaded packages.]
@@ -2702,7 +2854,7 @@ B<-s markstyle>
Add code to preamble for selected style for bracketing
commands (e.g. to mark changes in margin). This option defines
C<\DIFaddbegin>, C<\DIFaddend>, C<\DIFdelbegin> and C<\DIFdelend> commands.
-Available styles: C<SAFE MARGINAL COLOR DVIPSCOL ZLABEL ONLYCHANGEDPAGE (LABEL)*>
+Available styles: C<SAFE MARGIN COLOR DVIPSCOL ZLABEL ONLYCHANGEDPAGE (LABEL)*>
[ Default: C<SAFE> ]
* Subtype C<LABEL> is deprecated
@@ -2793,7 +2945,7 @@ Define most of the glossaries commands as safe, protecting them with \mbox'es wh
Treat C<\ce> as a safe command, i.e. it will be highlighted (note that C<\cee> will not be highlighted in equations as this leads to processing errors)
-=item C<chemformula>
+=item C<chemformula> or C<chemmacros>
Treat C<\ch> as a safe command outside equations, i.e. it will be highlighted (note that C<\ch> will not be highlighted in equations as this leads to processing errors)
@@ -2894,23 +3046,27 @@ Set configuration variables. The option can be repeated to set different
variables (as an alternative to the comma-separated list).
Available variables (see below for further explanations):
-C<MINWORDSBLOCK> (integer)
+C<ARRENV> (RegEx)
-C<FLOATENV> (RegEx)
+C<COUNTERCMD> (RegEx)
-C<PICTUREENV> (RegEx)
+C<FLOATENV> (RegEx)
-C<MATHENV> (RegEx)
+C<ITEMCMD> (RegEx)
-C<MATHREPL> (String)
+C<LISTENV> (RegEx)
C<MATHARRENV> (RegEx)
C<MATHARRREPL> (String)
-C<ARRENV> (RegEx)
+C<MATHENV> (RegEx)
-C<COUNTERCMD> (RegEx)
+C<MATHREPL> (String)
+
+C<MINWORDSBLOCK> (integer)
+
+C<PICTUREENV> (RegEx)
=item B<--show-safecmd>
@@ -3184,12 +3340,22 @@ Make no difference between the main text and floats.
=over 10
-=item C<MINWORDSBLOCK>
+=item C<ARRENV>
-Minimum number of tokens required to form an independent block. This value is
-used in the algorithm to detect changes of complete blocks by merging identical text parts of less than C<MINWORDSBLOCK> to the preceding added and discarded parts.
+If a match to C<ARRENV> is found within an inline math environment within a deleted or added block, then the inlined math
+is surrounded by C<\mbox{>...C<}>. This is necessary as underlining does not work within inlined array environments.
-[ Default: 3 ]
+[ Default: C<ARRENV>=S<C<(?:array|[pbvBV]matrix)> >
+
+=item C<COUNTERCMD>
+
+If a command in a deleted block which is also in the textcmd list matches C<COUNTERCMD> then an
+additional command C<\addtocounter{>F<cntcmd>C<}{-1}>, where F<cntcmd> is the matching command, is appended in the diff file such that the numbering in the diff file remains synchronized with the
+numbering in the new file.
+
+[ Default: C<COUNTERCMD>=C<(?:footnote|part|section|subsection> ...
+
+C<|subsubsection|paragraph|subparagraph)> ]
=item C<FLOATENV>
@@ -3199,18 +3365,21 @@ are replaced by their FL variaties.
[ Default: S<C<(?:figure|table|plate)[\w\d*@]*> >]
-=item C<PICTUREENV>
+=item C<ITEMCMD>
-Within environments whose name matches the regular expression in C<PICTUREENV>
-all latexdiff markup is removed (in pathologic cases this might lead to
- inconsistent markup but this situation should be rare).
+Commands representing new item line with list environments.
-[ Default: S<C<(?:picture|DIFnomarkup)[\w\d*@]*> >]
+[ Default: \C<item> ]
+
+=item C<LISTENV>
+
+Environments whose name matches the regular expression in C<LISTENV> are list environments.
+
+[ Default: S<C<(?:itemize|enumerate|description)> >]
=item C<MATHENV>,C<MATHREPL>
-If both \begin and \end for a math environment (environment name matching C<MATHENV>
-or \[ and \])
+If both \begin and \end for a math environment (environment name matching C<MATHENV> or \[ and \])
are within the same deleted block, they are replaced by a \begin and \end commands for C<MATHREPL>
rather than being commented out.
@@ -3222,22 +3391,20 @@ as C<MATHENV>,C<MATHREPL> but for equation arrays
[ Default: C<MATHARRENV>=S<C<eqnarray\*?> >, C<MATHREPL>=S<C<eqnarray> >]
-=item C<ARRENV>
-
-If a match to C<ARRENV> is found within an inline math environment within a deleted or added block, then the inlined math
-is surrounded by C<\mbox{>...C<}>. This is necessary as underlining does not work within inlined array environments.
+=item C<MINWORDSBLOCK>
-[ Default: C<ARRENV>=S<C<(?:array|[pbvBV]matrix)> >
+Minimum number of tokens required to form an independent block. This value is
+used in the algorithm to detect changes of complete blocks by merging identical text parts of less than C<MINWORDSBLOCK> to the preceding added and discarded parts.
-=item C<COUNTERCMD>
+[ Default: 3 ]
-If a command in a deleted block which is also in the textcmd list matches C<COUNTERCMD> then an
-additional command C<\addtocounter{>F<cntcmd>C<}{-1}>, where F<cntcmd> is the matching command, is appended in the diff file such that the numbering in the diff file remains synchronized with the
-numbering in the new file.
+=item C<PICTUREENV>
-[ Default: C<COUNTERCMD>=C<(?:footnote|part|section|subsection> ...
+Within environments whose name matches the regular expression in C<PICTUREENV>
+all latexdiff markup is removed (in pathologic cases this might lead to
+inconsistent markup but this situation should be rare).
-C<|subsubsection|paragraph|subparagraph)> ]
+[ Default: S<C<(?:picture|DIFnomarkup)[\w\d*@]*> >]
=back
@@ -3264,21 +3431,25 @@ For custom packages you can define the commands which need to be protected by C<
Try options C<--math-markup=whole>. If even that fails, you can turn off mark up for equations with C<--math-markup=off>.
-=item How can I just show the pages
+=item How can I just show the pages where changes had been made
Use options -C<-s ZLABEL> (some postprocessing required) or C<-s ONLYCHANGEDPAGE>. C<latexdiff-vc --ps|--pdf> with C<--only-changes> option takes care of
-the post-processing for you (requires zref packages).
+the post-processing for you (requires zref package to be installed).
=back
=head1 BUGS
-Option allow-spaces not implemented entirely consistently. It breaks
+=over 10
+
+=item Option allow-spaces not implemented entirely consistently. It breaks
the rules that number and type of white space does not matter, as
different numbers of inter-argument spaces are treated as significant.
+=back
+
Please submit bug reports using the issue tracker of the github repository page I<https://github.com/ftilmann/latexdiff.git>,
-or send them to I<tilmann -- AT -- gfz-potsdam.de>. Include the serial number of I<latexdiff>
+or send them to I<tilmann -- AT -- gfz-potsdam.de>. Include the version number of I<latexdiff>
(from comments at the top of the source or use B<--version>). If you come across latex
files that are error-free and conform to the specifications set out
above, and whose differencing still does not result in error-free
@@ -3305,7 +3476,7 @@ I<latexdiff-fast> requires the I<diff> command to be present.
=head1 AUTHOR
-Version 1.1.0
+Version 1.1.1
Copyright (C) 2004-2015 Frederik Tilmann
This program is free software; you can redistribute it and/or modify
@@ -3326,7 +3497,7 @@ dashbox
emph
fbox
framebox
-hspace
+hspace\*?
math.*
makebox
mbox
@@ -3536,6 +3707,8 @@ _
AMPERSAND
(SUPER|SUB)SCRIPTNB
(SUPER|SUB)SCRIPT
+SQRT
+SQRTNB
PERCENTAGE
DOLLAR
%%END SAFE COMMANDS
diff --git a/Master/texmf-dist/doc/support/latexdiff/latexdiff-fast b/Master/texmf-dist/doc/support/latexdiff/latexdiff-fast
index 01638677113..24be387b417 100755
--- a/Master/texmf-dist/doc/support/latexdiff/latexdiff-fast
+++ b/Master/texmf-dist/doc/support/latexdiff/latexdiff-fast
@@ -23,7 +23,14 @@
# Detailed usage information at the end of the file
#
# ToDo:
-# DONE
+#
+# Version 1.1.1
+# - patch mhchem: allow ce in equations
+# - flatten now also expands \input etc. in the preamble (but not \usepackage!)
+# - Better support for Japanese ( contributed by github user kshramt )
+# - prevent duplicated verbatim hashes (patch contributed by github user therussianjig, issue #36)
+# - disable deleted label commands (fixes issue #31)
+# - introduce post-processing to reinstate most deleted environments and all needed item commands (fixes issue #1)
#
# Version 1.1.0
# - treat diacritics (\",\', etc) as safe commands
@@ -686,7 +693,7 @@ my ($algodiffversion)=split(/ /,$Algorithm::Diff::VERSION);
my ($versionstring)=<<EOF ;
-This is LATEXDIFF 1.1.0 (Algorithm::Diff $Algorithm::Diff::VERSION, Perl $^V)
+This is LATEXDIFF 1.1.1 (Algorithm::Diff $Algorithm::Diff::VERSION, Perl $^V)
(c) 2004-2015 F J Tilmann
EOF
@@ -699,16 +706,19 @@ my $MATHENV='(?:equation[*]?|displaymath|DOLLARDOLLAR)[*]?' ; # Enviro
my $MATHREPL='displaymath'; # Environment introducing deleted maths blocks
my $MATHARRENV='(?:eqnarray|align|alignat|gather|multline|flalign)[*]?' ; # Environments turning on eqnarray math mode
my $MATHARRREPL='eqnarray*'; # Environment introducing deleted maths blocks
-my $ARRENV='(?:array|[pbvBV]?matrix|smallmatrix|cases|split)'; # Environments making arrays in math mode. The underlining style does not cope well with those - as a result in-text math environments are surrounded by \mbox{ } if any of these commands is used in an inline math block
+my $ARRENV='(?:aligned|array|[pbvBV]?matrix|smallmatrix|cases|split)'; # Environments making arrays in math mode. The underlining style does not cope well with those - as a result in-text math environments are surrounded by \mbox{ } if any of these commands is used in an inline math block
my $COUNTERCMD='(?:footnote|part|chapter|section|subsection|subsubsection|paragraph|subparagraph)'; # textcmds which are associated with a counter
# If any of these commands occur in a deleted block
# they will be succeeded by an \addtocounter{...}{-1}
# for the associated counter such that the overall numbers
# should be the same as in the new file
-my @UNSAFEMATHCMD=('qedhere'); # Commands which are definitely unsafe for marking up (amsmath qedhere only tested to not work with UNDERLINE markup)
+my $LABELCMD='(?:label)'; # matching commands are disabled within deleted blocks - mostly useful for maths mode, as otherwise it would be fine to just not add those to SAFECMDLIST
+my @UNSAFEMATHCMD=('qedhere'); # Commands which are definitely unsafe for marking up in math mode (amsmath qedhere only tested to not work with UNDERLINE markup) (only affects WHOLE and COARSE math markup modes). Note that unlike text mode (or FINE math mode0 deleted unsafe commands are not deleted but simply taken outside \DIFdel
my $MBOXINLINEMATH=0; # if set to 1 then surround marked-up inline maths expression with \mbox ( to get around compatibility
# problems between some maths packages and ulem package
+my $LISTENV='(?:itemize|description|enumerate)'; # list making environments - they will generally be kept
+my $ITEMCMD='item';
# Markup strings
# If at all possible, do not change these as parts of the program
@@ -992,6 +1002,8 @@ foreach $assign ( @config ) {
$assign=~ m/\s*(\w*)\s*=\s*(\S*)\s*$/ or die "Illegal assignment $assign in configuration list (must be variable=value)";
if ( $1 eq "MINWORDSBLOCK" ) { $MINWORDSBLOCK = $2; }
elsif ( $1 eq "FLOATENV" ) { $FLOATENV = $2 ; }
+ elsif ( $1 eq "ITEMCMD" ) { $ITEMCMD = $2 ; }
+ elsif ( $1 eq "LISTENV" ) { $LISTENV = $2 ; }
elsif ( $1 eq "PICTUREENV" ) { $PICTUREENV = $2 ; }
elsif ( $1 eq "MATHENV" ) { $MATHENV = $2 ; }
elsif ( $1 eq "MATHREPL" ) { $MATHREPL = $2 ; }
@@ -1038,15 +1050,17 @@ if ($showtext) {
if ($showconfig) {
print "Configuration variables:\n";
- print "MINWORDSBLOCK=$MINWORDSBLOCK\n";
+ print "ARRENV=$ARRENV\n";
+ print "COUNTERCMD=$COUNTERCMD\n";
print "FLOATENV=$FLOATENV\n";
- print "PICTUREENV=$PICTUREENV\n";
- print "MATHENV=$MATHENV\n";
- print "MATHREPL=$MATHREPL\n";
+ print "ITEMCMD=$ITEMCMD\n";
+ print "LISTENV=$LISTENV\n";
print "MATHARRENV=$MATHARRENV\n";
print "MATHARRREPL=$MATHARRREPL\n";
- print "ARRENV=$ARRENV\n";
- print "COUNTERCMD=$COUNTERCMD\n";
+ print "MATHENV=$MATHENV\n";
+ print "MATHREPL=$MATHREPL\n";
+ print "MINWORDSBLOCK=$MINWORDSBLOCK\n";
+ print "PICTUREENV=$PICTUREENV\n";
}
if ($showconfig || $showtext || $showsafe || $showpreamble) {
exit 0; }
@@ -1075,13 +1089,14 @@ push(@SAFECMDLIST, qr/^QLEFTBRACE$/, qr/^QRIGHTBRACE$/);
# Patterns. These are used by some of the subroutines, too
# I can only define them down here because value of extraspace depends on an option
+
my $pat0 = '(?:[^{}])*';
- my $pat1 = '(?:[^{}]|\{'.$pat0.'\})*';
- my $pat2 = '(?:[^{}]|\{'.$pat1.'\})*';
- my $pat3 = '(?:[^{}]|\{'.$pat2.'\})*';
- my $pat4 = '(?:[^{}]|\{'.$pat3.'\})*';
- my $pat5 = '(?:[^{}]|\{'.$pat4.'\})*';
- my $pat6 = '(?:[^{}]|\{'.$pat5.'\})*';
+ my $pat_n = $pat0;
+# if you get "undefined control sequence MATHBLOCKmath" error, increase the maximum value in this loop
+ for (my $i_pat = 0; $i_pat < 20; ++$i_pat){
+ $pat_n = '(?:[^{}]|\{'.$pat_n.'\})*';
+ }
+
my $brat0 = '(?:[^\[\]]|\\\[|\\\])*';
my $abrat0 = '(?:[^<>])*';
@@ -1095,11 +1110,12 @@ push(@SAFECMDLIST, qr/^QLEFTBRACE$/, qr/^QRIGHTBRACE$/);
# such that a\_b is interpreted as a{\_}b by latex but a{\_b} by perl
my $quotedunderscore='\\\\_';
# word: sequence of letters or accents followed by letter
- my $word='(?:[-\w\d*]|\\\\[\"\'\`~^][A-Za-z\*])+';
+ my $word_ja='\p{Han}+|\p{InHiragana}+|\p{InKatakana}+';
+ my $word='(?:' . $word_ja . '|(?:(?:[-\w\d*]|\\\\[\"\'\`~^][A-Za-z\*])(?!(?:' . $word_ja . ')))+)';
my $cmdleftright='\\\\(?:left|right|[Bb]igg?[lrm]?|middle)\s*(?:[<>()\[\]|]|\\\\(?:[|{}]|\w+))';
- my $cmdoptseq='\\\\[\w\d\*]+'.$extraspace.'(?:(?:<'.$abrat0.'>|\['.$brat0.'\]|\{'. $pat6 . '\}|\(' . $coords .'\))'.$extraspace.')*';
+ my $cmdoptseq='\\\\[\w\d\*]+'.$extraspace.'(?:(?:<'.$abrat0.'>|\['.$brat0.'\]|\{'. $pat_n . '\}|\(' . $coords .'\))'.$extraspace.')*';
my $backslashnl='\\\\\n';
- my $oneletcmd='\\\\.\*?(?:\['.$brat0.'\]|\{'. $pat6 . '\})*';
+ my $oneletcmd='\\\\.\*?(?:\['.$brat0.'\]|\{'. $pat_n . '\})*';
my $math='\$(?:[^$]|\\\$)*?\$|\\\\[(](?:.|\n)*?\\\\[)]';
## the current maths command cannot cope with newline within the math expression
my $comment='%.*?\n';
@@ -1109,10 +1125,10 @@ push(@SAFECMDLIST, qr/^QLEFTBRACE$/, qr/^QRIGHTBRACE$/);
my ($oldfile, $newfile) = @ARGV;
# check for existence of input files
if ( ! -e $oldfile ) {
- die "Input file $oldfile does not exist.";
+ die "Input file $oldfile does not exist";
}
if ( ! -e $newfile ) {
- die "Input file $newfile does not exist.";
+ die "Input file $newfile does not exist";
}
@@ -1156,6 +1172,10 @@ exetime(1);
if ($flatten) {
$oldbody=flatten($oldbody,$oldpreamble,$oldfile,$encoding);
$newbody=flatten($newbody,$newpreamble,$newfile,$encoding);
+ # flatten preamble
+ $oldpreamble=flatten($oldpreamble,$oldpreamble,$oldfile,$encoding);
+ $newpreamble=flatten($newpreamble,$newpreamble,$newfile,$encoding);
+
}
@@ -1283,7 +1303,7 @@ if (defined $packages{"glossaries"} ) {
}
}
-if (defined $packages{"chemformula"} ) {
+if (defined $packages{"chemformula"} or defined $packages{"chemmacros"} ) {
print STDERR "chemformula package detected.\n" if $verbose ;
init_regex_arr_ext(\@SAFECMDLIST,'ch');
push(@UNSAFEMATHCMD,'ch');
@@ -1295,7 +1315,7 @@ if (defined $packages{"chemformula"} ) {
if (defined $packages{"mhchem"} ) {
print STDERR "mhchem package detected.\n" if $verbose ;
init_regex_arr_ext(\@SAFECMDLIST,'ce');
- push(@UNSAFEMATHCMD,'cee');
+ push(@UNSAFEMATHCMD,'ce','cee');
# The next command would be needed to allow highlighting the interior of \cee commands in math environments
# but the redefinitions in chemformula are too deep to make this viable
# push(@MATHTEXTCMDLIST,'cee');
@@ -1339,6 +1359,11 @@ foreach $mboxcmd ( @MBOXCMDLIST ) {
init_regex_arr_ext(\@SAFECMDLIST, $mboxcmd);
}
+# check if \label is in SAFECMDLIST, and if yes replace "label" in $LABELCMD by something that never matches (we hope!)
+if ( iscmd("label",\@SAFECMDLIST,\@SAFECMDEXCL) ) {
+ $LABELCMD=~ s/label/NEVERMATCHLABEL/;
+}
+
print STDERR "Preprocessing body. " if $verbose;
@@ -1353,14 +1378,14 @@ if ( $debug ) {
print RAWDIFF $diffbo;
close(RAWDIFF);
}
-print STDERR "(",exetime()," s)\n","Postprocessing body. \n " if $verbose;
+print STDERR "(",exetime()," s)\n","Postprocessing body. \n" if $verbose;
postprocess($diffbo);
$diffall =join("\n",@diffpreamble) ;
# add visible labels
if (defined($visiblelabel)) {
# Give information right after \begin{document} (or at the beginning of the text for files without preamble
### if \date command is used, add information to \date argument, otherwise give right after \begin{document}
- ### $diffall=~s/(\\date$extraspace(?:\[$brat0\])?$extraspace)\{($pat6)\}/$1\{$2 \\ LATEXDIFF comparison \\ Old: $oldlabel \\ New: $newlabel \}/ or
+ ### $diffall=~s/(\\date$extraspace(?:\[$brat0\])?$extraspace)\{($pat_n)\}/$1\{$2 \\ LATEXDIFF comparison \\ Old: $oldlabel \\ New: $newlabel \}/ or
$diffbo = "\\begin{verbatim}LATEXDIFF comparison\nOld: $oldlabel\nNew: $newlabel\\end{verbatim}\n$diffbo" ;
}
@@ -1451,18 +1476,24 @@ sub read_file_with_encoding {
# %packages=list_packages($preamble)
# scans the arguments for \documentclass,\RequirePackage and \usepackage statements and constructs a hash
# whose keys are the included packages, and whose values are the associated optional arguments
+# if argument of \usepackage or \RequirePackage is comma separated list, treat as different packages
sub list_packages {
my ($preamble)=@_;
my %packages=();
+ my $pkg;
# remove comments
$preamble=~s/(?<!\\)%.*$//mg ;
while ( $preamble =~ m/\\(?:documentclass|usepackage|RequirePackage)(?:\[($brat0)\])?\{(.*?)\}/gs ) {
if (defined($1)) {
- $packages{$2}=$1;
+ foreach $pkg ( split /,/,$2 ) {
+ $packages{$pkg}=$1;
+ }
} else {
- $packages{$2}="";
+ foreach $pkg ( split /,/,$2 ) {
+ $packages{$pkg}="";
+ }
}
}
return (%packages);
@@ -1493,7 +1524,7 @@ sub add_safe_commands {
}
}
- while ( $preamble =~ m/\\(?:new|renew|provide)command\s*{\\(\w*)\}(?:|\[\d*\])\s*\{(${pat6})\}/osg ) {
+ while ( $preamble =~ m/\\(?:new|renew|provide)command\s*{\\(\w*)\}(?:|\[\d*\])\s*\{(${pat_n})\}/osg ) {
my $maybe_to_test = $1;
my $should_be_safe = $2;
my $success = 0;
@@ -1547,7 +1578,7 @@ sub flatten {
print STDERR "DEBUG: includeonly $includeonly\n" if $debug;
# recursively replace \\input and \\include files
- $text=~s/(^(?:[^%\n]|\\%)*)\\input{(.*?)}|\\include{(${includeonly}(?:\.tex)?)}/{
+ 1 while $text=~s/(^(?:[^%\n]|\\%)*)\\input{(.*?)}|\\include{(${includeonly}(?:\.tex)?)}/{
$begline=(defined($1)? $1 : "") ;
$fname = $2 if defined($2) ;
$fname = $3 if defined($3) ;
@@ -1828,7 +1859,7 @@ sub pass1 {
# print STDERR "Unchanged block $cnt, $last1,$last2 \n";
if ($cnt < $MINWORDSBLOCK
&& $cnt==scalar (
- grep { /^$wpat/ || ( /^\\((?:[`'^"~=.]|[\w\d@*]+))((?:\[$brat0\]|\{$pat6\})*)/o
+ grep { /^$wpat/ || ( /^\\((?:[`'^"~=.]|[\w\d@*]+))((?:\[$brat0\]|\{$pat_n\})*)/o
&& iscmd($1,\@SAFECMDLIST,\@SAFECMDEXCL)
&& scalar(@dummy=split(" ",$2))<3 ) }
@$block) ) {
@@ -1960,7 +1991,7 @@ sub extracttextblocks {
for ($i=0;$i< scalar @$block;$i++) {
($token,$index)=@{ $block->[$i] };
# store pure text blocks
- if ($token =~ /$wpat/ || ( $token =~/^\\((?:[`'^"~=.]|[\w\d@\*]+))((?:${extraspace}\[$brat0\]${extraspace}|${extraspace}\{$pat6\})*)/o
+ if ($token =~ /$wpat/ || ( $token =~/^\\((?:[`'^"~=.]|[\w\d@\*]+))((?:${extraspace}\[$brat0\]${extraspace}|${extraspace}\{$pat_n\})*)/o
&& iscmd($1,\@SAFECMDLIST,\@SAFECMDEXCL)
&& !iscmd($1,\@TEXTCMDLIST,\@TEXTCMDEXCL))) {
# we have text or a command which can be treated as text
@@ -2014,7 +2045,7 @@ sub extractcommands {
# $2: \cmd
# $3: last argument
# $4: } + trailing spaces
- if ( ( $token =~ m/^(\\([\w\d\*]+)(?:${extraspace}\[$brat0\]|${extraspace}\{$pat6\})*${extraspace}\{)($pat6)(\}\s*)$/so )
+ if ( ( $token =~ m/^(\\([\w\d\*]+)(?:${extraspace}\[$brat0\]|${extraspace}\{$pat_n\})*${extraspace}\{)($pat_n)(\}\s*)$/so )
&& iscmd($2,\@TEXTCMDLIST,\@TEXTCMDEXCL) ) {
# push(@$retval,[ $2,$index,$1,$3,$4 ]);
($cmd,$open,$mid,$closing) = ($2,$1,$3,$4) ;
@@ -2166,8 +2197,8 @@ sub marktags {
# $2: cmd
# $3: last argument
# $4: } + trailing spaces
- ### pre-0.3 if ( ( $token =~ m/^(\\([\w\d\*]+)(?:\[$brat0\]|\{$pat6\})*\{)($pat6)(\}\s*)$/so )
- if ( ( $word =~ m/^(\\([\w\d\*]+)(?:${extraspace}\[$brat0\]|${extraspace}\{$pat6\})*${extraspace}\{)($pat6)(\}\s*)$/so )
+ ### pre-0.3 if ( ( $token =~ m/^(\\([\w\d\*]+)(?:\[$brat0\]|\{$pat_n\})*\{)($pat_n)(\}\s*)$/so )
+ if ( ( $word =~ m/^(\\([\w\d\*]+)(?:${extraspace}\[$brat0\]|${extraspace}\{$pat_n\})*${extraspace}\{)($pat_n)(\}\s*)$/so )
&& (iscmd($2,\@TEXTCMDLIST,\@TEXTCMDEXCL)|| iscmd($2,\@MATHTEXTCMDLIST,\@MATHTEXTCMDEXCL))
&& ( !$cmdcomment || !iscmd($2,\@CONTEXT2CMDLIST, \@CONTEXT2CMDEXCL) ) ) {
# Condition 1: word is a command? - if yes, $1,$2,.. will be set as above
@@ -2201,7 +2232,6 @@ sub marktags {
# ""
local @SAFECMDLIST=(".*");
local @SAFECMDEXCL=('\\','\\\\',@UNSAFEMATHCMD);
- ### print STDERR "DEBUG: Command $command argtext ",join(",",@argtext),"\n" if $debug;
push(@$retval,$command,marktags("","",$open,$close,"","",$comment,\@argtext)#@argtext
,$closingbracket);
} else {
@@ -2215,6 +2245,7 @@ sub marktags {
push (@$retval,$opencmd) if $cmd==-1 ;
push (@$retval,$close,$opencmd) if $cmd==0 ;
$word =~ s/\n/\n${opencmd}/sg if $cmdcomment ; # if opencmd is a comment, repeat this at the beginning of every line
+ ### print STDERR "MARKTAGS: Add command |$word|\n";
push (@$retval,$word);
$cmd=1;
}
@@ -2231,7 +2262,7 @@ sub marktags {
###print STDERR "DEBUG Mboxsafecmd detected:$word:\n" if $debug ;
push(@$retval,"\\mbox{$AUXCMD\n\\" . $1 . $2 . $3 ."}$AUXCMD\n" );
} else {
- # $word is a normal word or a safe command (not in MBOXCMDLIST
+ # $word is a normal word or a safe command (not in MBOXCMDLIST)
push (@$retval,$word);
}
$cmd=0;
@@ -2244,6 +2275,53 @@ sub marktags {
return @$retval;
}
+#used in preprocess
+sub take_comments_and_enter_from_frac() {
+ ###*************take the \n and % between frac and {}***********
+ ###notice all of the substitution are made none global
+ while( m/\\begin{($MATHENV|$MATHARRENV|SQUAREBRACKET)}(.*?)\\frac(([\s]*%[^\n]*?)*[\r\n|\r|\n])+\{(.*?)\\end{\1}/s ) {
+ ### if there isn't any % or \n in the pattern $2 then there should be an \\end{...} in $2
+ if( $2 !~ m/\\end{$1}/s ) {
+ ### take out % and \n from the next match only (none global)
+ s/\\begin{($MATHENV|$MATHARRENV|SQUAREBRACKET)}(.*?)\\frac(([\s]*%[^\n]*?)*[\r\n|\r|\n])+\{(.*?)\\end{\1}/\\begin{$1}$2\\frac{$5\\end{$1}/s;
+ }
+ else{
+ ###there are no more % and \n in $2, we want to find the next one so we clear the begin-end from the pattern
+ s/\\begin{($MATHENV|$MATHARRENV|SQUAREBRACKET)}(.*?)\\end{\1}/MATHBLOCK$1$2MATHBLOCKEND/s;
+ }
+ }
+ ###cleaning up
+ while( s/MATHBLOCK($MATHENV|$MATHARRENV|SQUAREBRACKET)(.*?)MATHBLOCKEND/\\begin{$1}$2\\end{$1}/s ){}
+ ###*************take the \n and % between frac and {}***********
+
+ ###**********take the \n and % between {} and {} of the frac***************
+ while( m/\\begin\{($MATHENV|$MATHARRENV|SQUAREBRACKET)\}(.*?)\\frac\{(.*?)\\end\{\1\}/s ) {
+ ### if there isn't any more //frac before the first //end in the pattern $2 then there should be an \\end{...} in $2
+ if( $2 !~ m/\\end\{$1\}/s ) {
+ ### from now on CURRFRAC is the frac we are looking at
+ s/\\begin\{($MATHENV|$MATHARRENV|SQUAREBRACKET)\}(.*?)\\frac\{(.*?)\\end\{\1\}/\\begin\{$1\}$2CURRFRAC\{$3\\end\{$1\}/s;
+ while( m/\\begin\{($MATHENV|$MATHARRENV|SQUAREBRACKET)\}(.*?)CURRFRAC\{(.*?)\\end\{\1\}/s ) {
+ if( m/\\begin\{($MATHENV|$MATHARRENV|SQUAREBRACKET)\}(.*?)CURRFRAC\{($pat_n)\}([\s]*(%[^\n]*?)*[\r\n|\r|\n])+[\s]*\{(.*?)\\end{\1}/s ) {
+ s/\\begin\{($MATHENV|$MATHARRENV|SQUAREBRACKET)\}(.*?)CURRFRAC\{($pat_n)\}([\s]*(%[^\n]*?)*[\r\n|\r|\n])+[\s]*\{(.*?)\\end\{\1\}/\\begin\{$1\}$2CURRFRAC\{$3\}\{$6\\end\{$1\}/s;
+ }
+ else { # there is no comment or \n between the two brackets {}{}
+ ### change CURRFRAC to FRACSTART so we can change them all back to //frac{ when we finish
+ s/\\begin{($MATHENV|$MATHARRENV|SQUAREBRACKET)}(.*?)CURRFRAC\{(.*?)\\end{\1}/\\begin{$1}$2FRACSTART\{$3\\end{$1}/s;
+ }
+ }
+ }
+ else{
+ ###there are no more frac in $2, we want to find the next one so we clear the begin-end from the pattern
+ s/\\begin{($MATHENV|$MATHARRENV|SQUAREBRACKET)}(.*?)\\end{\1}/MATHBLOCK$1$2MATHBLOCKEND/s;
+ }
+
+ }
+ ###cleaning up
+ while( s/MATHBLOCK($MATHENV|$MATHARRENV|SQUAREBRACKET)(.*?)MATHBLOCKEND/\\begin{$1}$2\\end{$1}/s ){}
+ s/FRACSTART/\\frac/g;
+ ###***************take the \n and % between {} and {} of the frac*********************
+}
+
# preprocess($string, ..)
# carry out the following pre-processing steps for all arguments:
# 1. Remove leading white-space
@@ -2269,7 +2347,7 @@ sub marktags {
# Returns: leading white space removed in step 1
sub preprocess {
for (@_) {
- # Change \{ to \QLEFTBRACE and \} to \QRIGHTBRACE
+ # Change \{ to \QLEFTBRACE, \} to \QRIGHTBRACE, and \& to \AMPERSAND
s/(?<!\\)\\{/\\QLEFTBRACE /sg;
s/(?<!\\)\\}/\\QRIGHTBRACE /sg;
s/(?<!\\)\\&/\\AMPERSAND /sg;
@@ -2283,11 +2361,14 @@ sub preprocess {
s/(\\verb\*?)(\S)(.*?)\2/"${1}{". tohash(\%verbhash,"${2}${3}${2}") ."}"/esg;
s/\\begin\{(verbatim\*?)\}(.*?)\\end\{\1\}/"\\${1}{". tohash(\%verbhash,"${2}") . "}"/esg;
# Convert _n or _\cmd into \SUBSCRIPTNB{n} or \SUBSCRIPTNB{\cmd} and _{nnn} into \SUBSCRIPT{nn}
- 1 while s/(?<!\\)_([^{\\]|\\\w+)/\\SUBSCRIPTNB{$1}/g ;
- 1 while s/(?<!\\)_{($pat6)}/\\SUBSCRIPT{$1}/g ;
+ 1 while s/(?<!\\)_(\s*([^{\\\s]|\\\w+))/\\SUBSCRIPTNB{$1}/g ;
+ 1 while s/(?<!\\)_(\s*{($pat_n)})/\\SUBSCRIPT$1/g ;
# Convert ^n into \SUPERSCRIPTNB{n} and ^{nnn} into \SUPERSCRIPT{nn}
- 1 while s/(?<!\\)\^([^{\\]|\\\w+)/\\SUPERSCRIPTNB{$1}/g ;
- 1 while s/(?<!\\)\^{($pat6)}/\\SUPERSCRIPT{$1}/g ;
+ 1 while s/(?<!\\)\^(\s*([^{\\\s]|\\\w+))/\\SUPERSCRIPTNB{$1}/g ;
+ 1 while s/(?<!\\)\^(\s*{($pat_n)})/\\SUPERSCRIPT$1/g ;
+ # Convert \sqrt{n} into \SQRT{n} and \sqrt nn into SQRTNB{nn}
+ 1 while s/(?<!\\)\\sqrt(\s*([^{\\\s]|\\\w+))/\\SQRTNB{$1}/g ;
+ 1 while s/(?<!\\)\\sqrt(\s*{($pat_n)})/\\SQRT$1/g ;
# Convert $$ $$ into \begin{DOLLARDOLLAR} \end{DOLLARDOLLAR}
s/\$\$(.*?)\$\$/\\begin{DOLLARDOLLAR}$1\\end{DOLLARDOLLAR}/sg;
# Convert \[ \] into \begin{SQUAREBRACKET} \end{SQUAREBRACKET}
@@ -2300,6 +2381,9 @@ sub preprocess {
# Also convert all array environments into ARRAYBLOCK environments
if ( $mathmarkup != FINE ) {
s/\\begin{($ARRENV)}(.*?)\\end{\1}/\\ARRAYBLOCK$1\{$2\}/sg;
+
+ take_comments_and_enter_from_frac();
+
s/\\begin{($MATHENV|$MATHARRENV|SQUAREBRACKET)}(.*?)\\end{\1}/\\MATHBLOCK$1\{$2\}/sg;
}
# add final token " STOP"
@@ -2317,16 +2401,17 @@ sub tohash {
@arr=unpack('c*',$string);
- foreach $val (@arr) {
- $sum += $i*$val;
- $i++;
- }
- $hstr= "$sum";
- if (defined($hash->{$hstr}) && $string ne $hash->{$hstr}) {
- warn "Repeated hash value for verbatim mode in spite of different content.";
- $hstr="-$hstr";
+ while (1) {
+ foreach $val (@arr) {
+ $sum += $i*$val;
+ $i++;
+ }
+ $hstr= "$sum";
+ last unless (defined($hash->{$hstr}) && $string ne $hash->{$hstr});
+ # else found a duplicate HASH need to repeat for a higher hash value
}
$hash->{$hstr}=$string;
+ ### print STDERR "Hash:$hstr: Content:$string:\n";
return($hstr);
}
@@ -2397,6 +2482,8 @@ sub postprocess {
# second level blocks
my ($begin2,$cnt2,$len2,$eqarrayblock,$mathblock);
+ my (@textparts,@newtextparts,@liststack,$listtype,$listlast);
+
for (@_) {
# change $'s in comments to something harmless
@@ -2479,14 +2566,25 @@ sub postprocess {
# Convert MATHBLOCKmath commands to their uncounted numbers (e.g. convert equation -> displaymath
# (environments defined in $MATHENV will be replaced by $MATHREPL, and environments in $MATHARRENV
# will be replaced by $MATHARRREPL
- $delblock=~ s/\\MATHBLOCK($MATHENV)\{($pat6)\}/\\MATHBLOCK$MATHREPL\{$2\}/sg;
- $delblock=~ s/\\MATHBLOCK($MATHARRENV)\{($pat6)\}/\\MATHBLOCK$MATHARRREPL\{$2\}/sg;
+ $delblock=~ s/\\MATHBLOCK($MATHENV)\{($pat_n)\}/\\MATHBLOCK$MATHREPL\{$2\}/sg;
+ $delblock=~ s/\\MATHBLOCK($MATHARRENV)\{($pat_n)\}/\\MATHBLOCK$MATHARRREPL\{$2\}/sg;
}
+ # Reinstate completely deleted list environments. note that items within the
+ # environment will still be commented out. They will be restored later
+ $delblock=~ s/(\%DIFDELCMD < \s*\\begin\{($LISTENV)\}\s*?(?:\n|$DELCMDCLOSE))(.*?)(\%DIFDELCMD < \s*\\end\{\2\})/{
+ ### # block within the search; replacement environment
+ ### "$1\\begin{$2}$AUXCMD\n". restore_item_commands($3). "\n\\end{$2}$AUXCMD\n$4";
+ "$1\\begin{$2}$AUXCMD\n$3\n\\end{$2}$AUXCMD\n$4";
+ }/esg;
# b.where one of the commands matching $COUNTERCMD is used as a DIFAUXCMD, add a statement
# subtracting one from the respective counter to keep numbering consistent with new file
- $delblock=~ s/\\($COUNTERCMD)((?:${extraspace}\[$brat0\]${extraspace}|${extraspace}\{$pat6\})*\s*${AUXCMD}\n)/\\$1$2\\addtocounter{$1}{-1}${AUXCMD}\n/sg ;
+ $delblock=~ s/\\($COUNTERCMD)((?:${extraspace}\[$brat0\]${extraspace}|${extraspace}\{$pat_n\})*\s*${AUXCMD}\n)/\\$1$2\\addtocounter{$1}{-1}${AUXCMD}\n/sg ;
+
+# bb. disable active labels within deleted blocks (as these are not safe commands, this should normally only
+# happen within deleted maths blocks
+ $delblock=~ s/(\\$LABELCMD(?:${extraspace})\{(?:[^{}])*\}[\t ]*)\n?/${DELCMDOPEN}$1${DELCMDCLOSE}/smg ;
# c. If in-line math mode contains array environment, enclose the whole environment in \mbox'es
@@ -2534,6 +2632,36 @@ sub postprocess {
pos = $begin + length($addblock);
}
+ # Go through whole text, and by counting list environment commands, find out when we are within a list environment.
+ # Within those restore deleted \item commands
+ @textparts=split /(?<!$DELCMDOPEN)(\\(?:begin|end)\{$LISTENV\})/ ;
+ @liststack=();
+ @newtextparts=map {
+ ### print STDERR ":::::::: $_\n";
+ if ( ($listtype) = m/^\\begin\{($LISTENV)\}$/ ) {
+ print STDERR "DEBUG: postprocess \\begin{$listtype}\n" if $debug;
+ push @liststack,$listtype;
+ } elsif ( ($listtype) = m/^\\end\{($LISTENV)\}$/ ) {
+ print STDERR "DEBUG: postprocess \\end{$listtype}\n" if $debug;
+ if (scalar @liststack > 0) {
+ $listlast=pop(@liststack);
+ ($listtype eq $listlast) or warn "Invalid nesting of list environments: $listlast environment closed by \\end{$listtype}.";
+ } else {
+ warn "Invalid nesting of list environments: \\end{$listtype} encountered without matching \\begin{$listtype}.";
+ }
+ } else {
+ print STDERR "DEBUG: postprocess \@liststack=(",join(",",@liststack),")\n" if $debug;
+ if (scalar @liststack > 0 ) {
+ # we are within a list environment and should replace all item commands
+ $_=restore_item_commands($_);
+ }
+ # else: we are outside a list environment and do not need to do anything
+ }
+ $_ } @textparts; # end of map command
+ # replace the main text with the modified version
+ $_= "@newtextparts";
+
+
# Replace MATHMODE environments from step 1a above by the correct Math environment
@@ -2553,12 +2681,12 @@ sub postprocess {
s/\\begin{((?:$MATHENV)|(?:$MATHARRENV)|SQUAREBRACKET)}$AUXCMD\n((?:\s*%.[^\n]*\n)*)\\end{\1}$AUXCMD\n/$2/sg;
} else {
# math modes OFF,WHOLE,COARSE: Convert \MATHBLOCKmath{..} commands back to environments
- s/\\MATHBLOCK($MATHENV|$MATHARRENV|SQUAREBRACKET)\{($pat6)\}/\\begin{$1}$2\\end{$1}/sg;
+ s/\\MATHBLOCK($MATHENV|$MATHARRENV|SQUAREBRACKET)\{($pat_n)\}/\\begin{$1}$2\\end{$1}/sg;
# convert ARRAYBLOCK.. commands back to environments
- s/\\ARRAYBLOCK($ARRENV)\{($pat6)\}/\\begin{$1}$2\\end{$1}/sg;
+ s/\\ARRAYBLOCK($ARRENV)\{($pat_n)\}/\\begin{$1}$2\\end{$1}/sg;
}
# Convert all PICTUREblock{..} commands back to the appropriate environments
- s/\\PICTUREBLOCK($PICTUREENV)\{($pat6)\}/\\begin{$1}$2\\end{$1}/sg;
+ s/\\PICTUREBLOCK($PICTUREENV)\{($pat_n)\}/\\begin{$1}$2\\end{$1}/sg;
#0.5: # Remove all mark up within picture environments
# while ( m/\\begin\{($PICTUREENV)\}.*?\\end\{\1\}/sg ) {
# $cnt=0;
@@ -2567,10 +2695,10 @@ sub postprocess {
# $float=$&;
# $float =~ s/\\DIFaddbegin //g;
# $float =~ s/\\DIFaddend //g;
-# $float =~ s/\\DIFadd\{($pat6)\}/$1/g;
+# $float =~ s/\\DIFadd\{($pat_n)\}/$1/g;
# $float =~ s/\\DIFdelbegin //g;
# $float =~ s/\\DIFdelend //g;
-# $float =~ s/\\DIFdel\{($pat6)\}//g;
+# $float =~ s/\\DIFdel\{($pat_n)\}//g;
# $float =~ s/$DELCMDOPEN.*//g;
# substr($_,$begin,$len)=$float;
# pos = $begin + length($float);
@@ -2633,11 +2761,15 @@ sub postprocess {
# 4. Convert \begin{DOLLARDOLLAR} \end{DOLLARDOLLAR} into $$ $$
s/\\begin\{DOLLARDOLLAR\}(.*?)\\end\{DOLLARDOLLAR\}/\$\$$1\$\$/sg;
# 5. Convert \SUPERSCRIPTNB{n} into ^n and \SUPERSCRIPT{nn} into ^{nnn}
- 1 while s/\\SUPERSCRIPT{($pat6)}/^{$1}/g ;
- 1 while s/\\SUPERSCRIPTNB{($pat0)}/^$1/g ;
+ 1 while s/\\SUPERSCRIPT(\s*{($pat_n)})/^$1/g ;
+ 1 while s/\\SUPERSCRIPTNB{(\s*$pat0)}/^$1/g ;
# Convert \SUBSCRIPNB{n} into _n and \SUBCRIPT{nn} into _{nnn}
- 1 while s/\\SUBSCRIPT{($pat6)}/_{$1}/g ;
- 1 while s/\\SUBSCRIPTNB{($pat0)}/_$1/g ;
+ 1 while s/\\SUBSCRIPT(\s*{($pat_n)})/_$1/g ;
+ 1 while s/\\SUBSCRIPTNB{(\s*$pat0)}/_$1/g ;
+ # Convert \SQRT{n} into \sqrt{n} and \SQRTNB{nn} into \sqrt nn
+ 1 while s/\\SQRT(\s*{($pat_n)})/\\sqrt$1/g ;
+ 1 while s/\\SQRTNB{(\s*$pat0)}/\\sqrt$1/g ;
+
1 while s/(%.*)\\CRIGHTBRACE (.*)$/$1\}$2/mg ;
1 while s/(%.*)\\CLEFTBRACE (.*)$/$1\{$2/mg ;
@@ -2651,6 +2783,24 @@ sub postprocess {
}
}
+# $out = restore_item_commands($listenviron)
+# short helper function for post-process, which restores deleted \item commands in its argument (as DIFAUXCMDs)
+sub restore_item_commands {
+ my ($string)=@_ ;
+ my ($itemarg,@itemargs);
+ $string =~ s/(\%DIFDELCMD < \s*(\\$ITEMCMD)((?:<$abrat0>)?)((?:\[$brat0\])?)\s*?(?:\n|$DELCMDCLOSE))/
+ # if \item has an []argument, then mark up the argument as deleted)
+ if (length($4)>0) {
+ # use substr to exclude square brackets at end points
+ @itemargs=splitlatex(substr($4,1,length($4)-2));
+ $itemarg="[".join("",marktags("","",$DELOPEN,$DELCLOSE,$DELCMDOPEN,$DELCMDCLOSE,$DELCOMMENT,\@itemargs))."]";
+ } else {
+ $itemarg="";
+ }
+ "$1$2$3$itemarg$AUXCMD\n"/sge;
+ return($string);
+}
+
# @auxlines=preprocess_preamble($oldpreamble,$newpreamble);
# pre-process preamble by looking for commands used in \maketitle (title, author, date etc commands)
@@ -2677,7 +2827,7 @@ sub preprocess_preamble {
# resue in a more complex regex
$titlecmd =~ s/[\$\^]//g;
# make sure to not match on comment lines:
- $titlecmdpat=qr/^(?:[^%\n]|\\%)*(\\($titlecmd)$extraspace(?:\[($brat0)\])?(?:\{($pat6)\}))/ms;
+ $titlecmdpat=qr/^(?:[^%\n]|\\%)*(\\($titlecmd)$extraspace(?:\[($brat0)\])?(?:\{($pat_n)\}))/ms;
@oldtitlecommands= ( $$oldpreambleref =~ m/$titlecmdpat/g );
@newtitlecommands= ( $$newpreambleref =~ m/$titlecmdpat/g );
@@ -2905,7 +3055,7 @@ format as new.tex but has all changes relative to old.tex marked up or commented
--subtype=markstyle
-s markstyle Add code to preamble for selected style for bracketing
commands (e.g. to mark changes in margin)
- Available styles: SAFE MARGINAL DVIPSCOL COLOR ZLABEL ONLYCHANGEDPAGE (LABEL)*
+ Available styles: SAFE MARGIN DVIPSCOL COLOR ZLABEL ONLYCHANGEDPAGE (LABEL)*
[ Default: SAFE ]
* LABEL subtype is deprecated
@@ -2996,15 +3146,17 @@ format as new.tex but has all changes relative to old.tex marked up or commented
--config var1=val1,var2=val2,...
-c var1=val1,.. Set configuration variables.
-c configfile Available variables:
- MINWORDSBLOCK (integer)
+ ARRENV (RegEx)
+ COUNTERCMD (RegEx)
FLOATENV (RegEx)
- PICTUREENV (RegEx)
- MATHENV (RegEx)
- MATHREPL (String)
+ ITEMCMD (RegEx)
+ LISTENV (RegEx)
MATHARRENV (RegEx)
MATHARRREPL (String)
- ARRENV (RegEx)
- COUNTERCMD (RegEx)
+ MATHENV (RegEx)
+ MATHREPL (String)
+ MINWORDSBLOCK (integer)
+ PICTUREENV (RegEx)
This option can be repeated.
@@ -3015,7 +3167,7 @@ format as new.tex but has all changes relative to old.tex marked up or commented
Use of the --packages option disables automatic scanning, so if for any
reason package specific parsing needs to be switched off, use --packages=none.
The following packages trigger special behaviour:
- endfloat hyperref amsmath apacite siunitx cleveref glossaries mhchem chemformula
+ endfloat hyperref amsmath apacite siunitx cleveref glossaries mhchem chemformula/chemmacros
[ Default: scan the preamble for \\usepackage commands to determine
loaded packages.]
@@ -3263,7 +3415,7 @@ B<-s markstyle>
Add code to preamble for selected style for bracketing
commands (e.g. to mark changes in margin). This option defines
C<\DIFaddbegin>, C<\DIFaddend>, C<\DIFdelbegin> and C<\DIFdelend> commands.
-Available styles: C<SAFE MARGINAL COLOR DVIPSCOL ZLABEL ONLYCHANGEDPAGE (LABEL)*>
+Available styles: C<SAFE MARGIN COLOR DVIPSCOL ZLABEL ONLYCHANGEDPAGE (LABEL)*>
[ Default: C<SAFE> ]
* Subtype C<LABEL> is deprecated
@@ -3354,7 +3506,7 @@ Define most of the glossaries commands as safe, protecting them with \mbox'es wh
Treat C<\ce> as a safe command, i.e. it will be highlighted (note that C<\cee> will not be highlighted in equations as this leads to processing errors)
-=item C<chemformula>
+=item C<chemformula> or C<chemmacros>
Treat C<\ch> as a safe command outside equations, i.e. it will be highlighted (note that C<\ch> will not be highlighted in equations as this leads to processing errors)
@@ -3455,23 +3607,27 @@ Set configuration variables. The option can be repeated to set different
variables (as an alternative to the comma-separated list).
Available variables (see below for further explanations):
-C<MINWORDSBLOCK> (integer)
+C<ARRENV> (RegEx)
-C<FLOATENV> (RegEx)
+C<COUNTERCMD> (RegEx)
-C<PICTUREENV> (RegEx)
+C<FLOATENV> (RegEx)
-C<MATHENV> (RegEx)
+C<ITEMCMD> (RegEx)
-C<MATHREPL> (String)
+C<LISTENV> (RegEx)
C<MATHARRENV> (RegEx)
C<MATHARRREPL> (String)
-C<ARRENV> (RegEx)
+C<MATHENV> (RegEx)
-C<COUNTERCMD> (RegEx)
+C<MATHREPL> (String)
+
+C<MINWORDSBLOCK> (integer)
+
+C<PICTUREENV> (RegEx)
=item B<--show-safecmd>
@@ -3745,12 +3901,22 @@ Make no difference between the main text and floats.
=over 10
-=item C<MINWORDSBLOCK>
+=item C<ARRENV>
-Minimum number of tokens required to form an independent block. This value is
-used in the algorithm to detect changes of complete blocks by merging identical text parts of less than C<MINWORDSBLOCK> to the preceding added and discarded parts.
+If a match to C<ARRENV> is found within an inline math environment within a deleted or added block, then the inlined math
+is surrounded by C<\mbox{>...C<}>. This is necessary as underlining does not work within inlined array environments.
-[ Default: 3 ]
+[ Default: C<ARRENV>=S<C<(?:array|[pbvBV]matrix)> >
+
+=item C<COUNTERCMD>
+
+If a command in a deleted block which is also in the textcmd list matches C<COUNTERCMD> then an
+additional command C<\addtocounter{>F<cntcmd>C<}{-1}>, where F<cntcmd> is the matching command, is appended in the diff file such that the numbering in the diff file remains synchronized with the
+numbering in the new file.
+
+[ Default: C<COUNTERCMD>=C<(?:footnote|part|section|subsection> ...
+
+C<|subsubsection|paragraph|subparagraph)> ]
=item C<FLOATENV>
@@ -3760,18 +3926,21 @@ are replaced by their FL variaties.
[ Default: S<C<(?:figure|table|plate)[\w\d*@]*> >]
-=item C<PICTUREENV>
+=item C<ITEMCMD>
-Within environments whose name matches the regular expression in C<PICTUREENV>
-all latexdiff markup is removed (in pathologic cases this might lead to
- inconsistent markup but this situation should be rare).
+Commands representing new item line with list environments.
-[ Default: S<C<(?:picture|DIFnomarkup)[\w\d*@]*> >]
+[ Default: \C<item> ]
+
+=item C<LISTENV>
+
+Environments whose name matches the regular expression in C<LISTENV> are list environments.
+
+[ Default: S<C<(?:itemize|enumerate|description)> >]
=item C<MATHENV>,C<MATHREPL>
-If both \begin and \end for a math environment (environment name matching C<MATHENV>
-or \[ and \])
+If both \begin and \end for a math environment (environment name matching C<MATHENV> or \[ and \])
are within the same deleted block, they are replaced by a \begin and \end commands for C<MATHREPL>
rather than being commented out.
@@ -3783,22 +3952,20 @@ as C<MATHENV>,C<MATHREPL> but for equation arrays
[ Default: C<MATHARRENV>=S<C<eqnarray\*?> >, C<MATHREPL>=S<C<eqnarray> >]
-=item C<ARRENV>
-
-If a match to C<ARRENV> is found within an inline math environment within a deleted or added block, then the inlined math
-is surrounded by C<\mbox{>...C<}>. This is necessary as underlining does not work within inlined array environments.
+=item C<MINWORDSBLOCK>
-[ Default: C<ARRENV>=S<C<(?:array|[pbvBV]matrix)> >
+Minimum number of tokens required to form an independent block. This value is
+used in the algorithm to detect changes of complete blocks by merging identical text parts of less than C<MINWORDSBLOCK> to the preceding added and discarded parts.
-=item C<COUNTERCMD>
+[ Default: 3 ]
-If a command in a deleted block which is also in the textcmd list matches C<COUNTERCMD> then an
-additional command C<\addtocounter{>F<cntcmd>C<}{-1}>, where F<cntcmd> is the matching command, is appended in the diff file such that the numbering in the diff file remains synchronized with the
-numbering in the new file.
+=item C<PICTUREENV>
-[ Default: C<COUNTERCMD>=C<(?:footnote|part|section|subsection> ...
+Within environments whose name matches the regular expression in C<PICTUREENV>
+all latexdiff markup is removed (in pathologic cases this might lead to
+inconsistent markup but this situation should be rare).
-C<|subsubsection|paragraph|subparagraph)> ]
+[ Default: S<C<(?:picture|DIFnomarkup)[\w\d*@]*> >]
=back
@@ -3825,21 +3992,25 @@ For custom packages you can define the commands which need to be protected by C<
Try options C<--math-markup=whole>. If even that fails, you can turn off mark up for equations with C<--math-markup=off>.
-=item How can I just show the pages
+=item How can I just show the pages where changes had been made
Use options -C<-s ZLABEL> (some postprocessing required) or C<-s ONLYCHANGEDPAGE>. C<latexdiff-vc --ps|--pdf> with C<--only-changes> option takes care of
-the post-processing for you (requires zref packages).
+the post-processing for you (requires zref package to be installed).
=back
=head1 BUGS
-Option allow-spaces not implemented entirely consistently. It breaks
+=over 10
+
+=item Option allow-spaces not implemented entirely consistently. It breaks
the rules that number and type of white space does not matter, as
different numbers of inter-argument spaces are treated as significant.
+=back
+
Please submit bug reports using the issue tracker of the github repository page I<https://github.com/ftilmann/latexdiff.git>,
-or send them to I<tilmann -- AT -- gfz-potsdam.de>. Include the serial number of I<latexdiff>
+or send them to I<tilmann -- AT -- gfz-potsdam.de>. Include the version number of I<latexdiff>
(from comments at the top of the source or use B<--version>). If you come across latex
files that are error-free and conform to the specifications set out
above, and whose differencing still does not result in error-free
@@ -3866,7 +4037,7 @@ I<latexdiff-fast> requires the I<diff> command to be present.
=head1 AUTHOR
-Version 1.1.0
+Version 1.1.1
Copyright (C) 2004-2015 Frederik Tilmann
This program is free software; you can redistribute it and/or modify
@@ -3887,7 +4058,7 @@ dashbox
emph
fbox
framebox
-hspace
+hspace\*?
math.*
makebox
mbox
@@ -4097,6 +4268,8 @@ _
AMPERSAND
(SUPER|SUB)SCRIPTNB
(SUPER|SUB)SCRIPT
+SQRT
+SQRTNB
PERCENTAGE
DOLLAR
%%END SAFE COMMANDS
diff --git a/Master/texmf-dist/scripts/latexdiff/latexdiff-vc.pl b/Master/texmf-dist/scripts/latexdiff/latexdiff-vc.pl
index 7d954c15ec2..c8d6d3b7c5b 100755
--- a/Master/texmf-dist/scripts/latexdiff/latexdiff-vc.pl
+++ b/Master/texmf-dist/scripts/latexdiff/latexdiff-vc.pl
@@ -25,6 +25,13 @@
#
# Detailed usage information at the end of the file
#
+# TODO/IDEAS: - option to call external pre-processing codes
+#
+# version 1.1.1:
+# - better detection of RCS system
+# - undocumented option --debug/--nodebug to override default setting for debug mode (Default: 0)#
+# - bug fix: --flatten option combined with --pdf caused confusion of old and new file
+#
# version 1.1.0:
#
# - with option --flatten and version control option, checkout the whole tree into a temporary directory
@@ -53,10 +60,13 @@ use strict ;
use warnings ;
my $versionstring=<<EOF ;
-This is LATEXDIFF-VC 1.1.0
+This is LATEXDIFF-VC 1.1.1
(c) 2005-2015 F J Tilmann
EOF
+# output debug and intermediate files, set to 0 in final distribution
+my $debug=0;
+
# Option names
my ($version,$help,$fast,$so,$postscript,$pdf,$onlychanges,$flatten,$force,$dir,$cvs,$rcs,$svn,$git,$hg,$diffcmd,$patchcmd,@revs);
@@ -86,7 +96,11 @@ GetOptions('revision|r:s' => \@revs,
'only-changes' => \$onlychanges,
'flatten:s' => \$flatten,
'version' => \$version,
- 'help|h' => \$help);
+ 'help|h' => \$help,
+ 'debug!' => \$debug);
+
+##print STDERR "DEBUG 1:revs($#revs): " . join(":",@revs) . "\n";
+##print STDERR "DEBUG 1:ARGV($#ARGV): " . join(":",@ARGV) . "\n";
$extracomp = join(" ",grep(/BAR/,@ARGV)); # special latexdiff options requiring additional compilation
@@ -125,12 +139,12 @@ if ( $git ) {
# check whether the first file name or first passed-through option for latexdiff got misinterpreted as an option to an empty -r option
if ( @revs && ( -f $revs[$#revs] || $revs[$#revs] =~ /^-/ ) ) {
- unshift @ARGV,$revs[$#revs];
+ push @ARGV,$revs[$#revs];
$revs[$#revs]="";
}
# check whether the first file name or first passed-through option for latexdiff got misinterpreted as an option to an empty -d option
if ( defined($dir) && ( -f $dir || $dir =~ /^-/ ) ) {
- unshift @ARGV,$dir;
+ push @ARGV,$dir;
$dir="";
}
# check whether the first file name or first passed-through option for latexdiff got misinterpreted as an option to an empty --flatten option
@@ -139,8 +153,7 @@ if ( defined($flatten) && ( -f $flatten || $flatten =~ /^-/ ) ) {
$flatten="";
}
-
-#print "DEBUG: latexdiff-vc command line: ", join(" ",@ARGV), "\n";
+print "DEBUG: PDF $pdf latexdiff-vc command line: ", join(" ",@ARGV), "\n" if $debug;
$file2=pop @ARGV;
( defined($file2) && $file2 =~ /\.(tex|bbl|flt)$/ ) or pod2usage("Must specify at least one tex, bbl or flt file");
@@ -158,7 +171,7 @@ if (! $vc && scalar(@revs)>0 ) {
$vc="GIT";
} elsif ( $0 =~ /-hg$/ ) {
$vc="HG";
- } elsif ( -e "$file2,v" ) {
+ } elsif ( -e "$file2,v" || -d "RCS" ) {
print STDERR "Guess you are using RCS ...\n";
$vc="RCS";
} elsif ( -d ".svn" ) {
@@ -192,7 +205,7 @@ if ( scalar(@revs)>0 ) {
$diffcmd = "rcsdiff -u -r";
$patchcmd = "patch -R -p0";
} elsif ( $vc eq "SVN" ) {
- $diffcmd = "svn diff -r ";
+ $diffcmd = "svn diff --internal-diff -r ";
$patchcmd = "patch -R -p0";
} elsif ( $vc eq "GIT" ) {
$diffcmd = "git diff -r --relative --no-prefix ";
@@ -231,7 +244,7 @@ if ( defined($flatten) ) {
# impose ZLABEL subtype if --only-changes option
if ( $onlychanges ) {
- push @ldoptions, "-s", "ZLABEL" ;
+ push @ldoptions, "-s", "ZLABEL","-f","IDENTICAL" ;
}
if ( scalar(@revs) == 0 ) {
@@ -244,7 +257,7 @@ if ( scalar(@revs) == 0 ) {
if ( $flatten ) {
pod2usage("Only one root file must be given if --flatten option is used with version control") if @files != 1;
$tempdir='.' if ( $flatten eq "keep-intermediate" );
- print "flatten tempdir |$tempdir|";
+ print "flatten tempdir |$tempdir|\n";
if ( $vc eq "SVN" ) {
my (@infoout)=`svn info`;
my (@urlline) = grep(/^URL:/, @infoout);
@@ -277,7 +290,6 @@ if ( ($vc eq "SVN" || $vc eq "CVS") && scalar(@revs)) {
length($revs[0]) > 0 or $revs[0]="HEAD";
}
-#exit ;
# cycle through all files
@@ -352,7 +364,7 @@ while ( $infile=$file2=shift @files ) {
die "Abort ... " ;
}
}
- print "Running $latexdiff\n";
+ print "Running: $latexdiff $options \"$file1\" \"$file2\" > \"$diff\"\n";
unless ( system("$latexdiff $options \"$file1\" \"$file2\" > \"$diff\"") == 0 ) {
print STDERR "Something went wrong in $latexdiff. Deleting $diff and abort\n" ; unlink $diff ; exit(5)
};
@@ -384,44 +396,44 @@ foreach $diff ( @difffiles ) {
}
if ( $pdf | $postscript ) {
- print STDERR "PDF: $pdf Postscript: $postscript cwd $cwd\n";
-
- if ( system("grep -q \'^[^%]*\\\\bibliography\' \"$diff\"") == 0 ) {
- system("$latexcmd --interaction=batchmode \"$diff\"; bibtex \"$diffbase\";");
- push @ptmpfiles, "$diffbase.bbl","$diffbase.bbl" ;
- }
+ print STDERR "PDF: $pdf Postscript: $postscript cwd $cwd\n" if $debug;
- # if special needs, as CHANGEBAR
- if ( $extracomp ) {
- # print "Extracomp\n";
- system("$latexcmd --interaction=batchmode \"$diff\";");
- }
-
- # final compilation
- system("$latexcmd --interaction=batchmode \"$diff\";"); # needed if cross-refs
- system("$latexcmd \"$diff\";"); # final, with possible error messages
-
- if ( $postscript ) {
- my $dvi="$diffbase.dvi";
- my $ps="$diffbase.ps";
- my $ppoption="";
+ if ( system("grep -q \'^[^%]*\\\\bibliography{\' \"$diff\"") == 0 ) {
+ system("$latexcmd --interaction=batchmode \"$diff\"; bibtex \"$diffbase\";");
+ push @ptmpfiles, "$diffbase.bbl","$diffbase.bbl" ;
+ }
- if ( $onlychanges ) {
- $ppoption="-pp ".join(",",findchangedpages("$diffbase.aux"));
+ # if special needs, as CHANGEBAR
+ if ( $extracomp ) {
+ # print "Extracomp\n";
+ system("$latexcmd --interaction=batchmode \"$diff\";");
}
- system("dvips $ppoption -o $ps $dvi");
- push @ptmpfiles, "$diffbase.aux","$diffbase.log",$dvi ;
- print "Generated postscript file $ps\n";
- }
- elsif ( $pdf ) {
- if ( $onlychanges ) {
- my @pages=findchangedpages("$diffbase.aux");
- system ("pdftk \"$diffbase.pdf\" cat " . join(" ",@pages) . " output \"$diffbase-changedpage.pdf\"")==0 or
- die ("Could not execute <pdftk $diffbase.pdf cat " . join(" ",@pages) . " output $diffbase-changedpage.pdf> . Return code: $?");
- move("$diffbase-changedpage.pdf","$diffbase.pdf");
+
+ # final compilation
+ system("$latexcmd --interaction=batchmode \"$diff\";"); # needed if cross-refs
+ system("$latexcmd \"$diff\";"); # final, with possible error messages
+
+ if ( $postscript ) {
+ my $dvi="$diffbase.dvi";
+ my $ps="$diffbase.ps";
+ my $ppoption="";
+
+ if ( $onlychanges ) {
+ $ppoption="-pp ".join(",",findchangedpages("$diffbase.aux"));
+ }
+ system("dvips $ppoption -o $ps $dvi");
+ push @ptmpfiles, "$diffbase.aux","$diffbase.log",$dvi ;
+ print "Generated postscript file $ps\n";
+ } elsif ( $pdf ) {
+ if ( $onlychanges ) {
+ my @pages=findchangedpages("$diffbase.aux");
+ ### print ("Running pdftk \"$diffbase.pdf\" cat " . join(" ",@pages) . " output \"$diffbase-changedpage.pdf\"\n") or
+ system ("pdftk \"$diffbase.pdf\" cat " . join(" ",@pages) . " output \"$diffbase-changedpage.pdf\"")==0 or
+ die ("Could not execute <pdftk $diffbase.pdf cat " . join(" ",@pages) . " output $diffbase-changedpage.pdf> . Return code: $?");
+ move("$diffbase-changedpage.pdf","$diffbase.pdf");
+ }
+ push @ptmpfiles, "$diffbase.aux","$diffbase.log";
}
- push @ptmpfiles, "$diffbase.aux","$diffbase.log";
- }
}
unlink @ptmpfiles;
chdir $cwd;
@@ -464,6 +476,7 @@ sub checkout_dir {
if ( $vc eq "SVN" ) {
system("svn checkout -r $rev $rootdir $dirname")==0 or die "Something went wrong in executing: svn checkout -r $rev $rootdir $dirname";
} elsif ( $vc eq "GIT" ) {
+ $rev="HEAD" if length($rev)==0;
system("git archive --format=tar $rev | ( cd $dirname ; tar -xf -)")==0 or die "Something went wrong in executing: git archive --format=tar $rev | ( cd $dirname ; tar -xf -)";
} elsif ( $vc eq "HG" ) {
system("hg archive --type files -r $rev $dirname")==0 or die "Something went wrong in executing: hg archive --type files -r $rev $dirname";
@@ -509,7 +522,7 @@ B<latexdiff-vc> [ F<latexdiff-options> ] [ F<latexdiff-vc-options> ][ B<--posts
=head1 DESCRIPTION
I<latexdiff-vc> is a wrapper script that applies I<latexdiff> to a
-file, or multiple files under version control (CVS, RCS or SVN), and optionally runs the
+file, or multiple files under version control (git, subversion (SVN), mercurial (hg), CVS, RCS), and optionally runs the
sequence of C<latex> and C<dvips> or C<pdflatex> commands necessary to
produce pdf or postscript output of the difference tex file(s). It can
also be applied to a pair of files to automatise the generation of difference
@@ -524,7 +537,7 @@ file in postscript or pdf format.
Set the version system.
If no version system is specified, latexdiff-vc will venture a guess.
-latexdiff-cvs and latexdiff-rcs are variants of latexdiff-vc which default to
+latexdiff-cvs, latexdiff-rcs etc are variants of latexdiff-vc which default to
the respective versioning system. However, this default can still be overridden using the options above.
=item B<-r>, B<-r> F<rev> or B<--revision>, B<--revision=>F<rev>
@@ -633,11 +646,12 @@ or higher are required.
=head1 BUG REPORTING
Please submit bug reports using the issue tracker of the github repository page I<https://github.com/ftilmann/latexdiff.git>,
-or send them to I<tilmann -- AT -- gfz-potsdam.de>. Include the serial number of I<latexdiff-vc>
+or send them to I<tilmann -- AT -- gfz-potsdam.de>. Include the version number of I<latexdiff-vc>
(option C<--version>).
=head1 AUTHOR
+Version 1.1.1
Copyright (C) 2005-2015 Frederik Tilmann
This program is free software; you can redistribute it and/or modify
diff --git a/Master/texmf-dist/scripts/latexdiff/latexdiff.pl b/Master/texmf-dist/scripts/latexdiff/latexdiff.pl
index 171c24be7ae..697571fd4a0 100755
--- a/Master/texmf-dist/scripts/latexdiff/latexdiff.pl
+++ b/Master/texmf-dist/scripts/latexdiff/latexdiff.pl
@@ -23,7 +23,14 @@
# Detailed usage information at the end of the file
#
# ToDo:
-# DONE
+#
+# Version 1.1.1
+# - patch mhchem: allow ce in equations
+# - flatten now also expands \input etc. in the preamble (but not \usepackage!)
+# - Better support for Japanese ( contributed by github user kshramt )
+# - prevent duplicated verbatim hashes (patch contributed by github user therussianjig, issue #36)
+# - disable deleted label commands (fixes issue #31)
+# - introduce post-processing to reinstate most deleted environments and all needed item commands (fixes issue #1)
#
# Version 1.1.0
# - treat diacritics (\",\', etc) as safe commands
@@ -582,7 +589,7 @@ my ($algodiffversion)=split(/ /,$Algorithm::Diff::VERSION);
my ($versionstring)=<<EOF ;
-This is LATEXDIFF 1.1.0 (Algorithm::Diff $Algorithm::Diff::VERSION, Perl $^V)
+This is LATEXDIFF 1.1.1 (Algorithm::Diff $Algorithm::Diff::VERSION, Perl $^V)
(c) 2004-2015 F J Tilmann
EOF
@@ -595,16 +602,19 @@ my $MATHENV='(?:equation[*]?|displaymath|DOLLARDOLLAR)[*]?' ; # Enviro
my $MATHREPL='displaymath'; # Environment introducing deleted maths blocks
my $MATHARRENV='(?:eqnarray|align|alignat|gather|multline|flalign)[*]?' ; # Environments turning on eqnarray math mode
my $MATHARRREPL='eqnarray*'; # Environment introducing deleted maths blocks
-my $ARRENV='(?:array|[pbvBV]?matrix|smallmatrix|cases|split)'; # Environments making arrays in math mode. The underlining style does not cope well with those - as a result in-text math environments are surrounded by \mbox{ } if any of these commands is used in an inline math block
+my $ARRENV='(?:aligned|array|[pbvBV]?matrix|smallmatrix|cases|split)'; # Environments making arrays in math mode. The underlining style does not cope well with those - as a result in-text math environments are surrounded by \mbox{ } if any of these commands is used in an inline math block
my $COUNTERCMD='(?:footnote|part|chapter|section|subsection|subsubsection|paragraph|subparagraph)'; # textcmds which are associated with a counter
# If any of these commands occur in a deleted block
# they will be succeeded by an \addtocounter{...}{-1}
# for the associated counter such that the overall numbers
# should be the same as in the new file
-my @UNSAFEMATHCMD=('qedhere'); # Commands which are definitely unsafe for marking up (amsmath qedhere only tested to not work with UNDERLINE markup)
+my $LABELCMD='(?:label)'; # matching commands are disabled within deleted blocks - mostly useful for maths mode, as otherwise it would be fine to just not add those to SAFECMDLIST
+my @UNSAFEMATHCMD=('qedhere'); # Commands which are definitely unsafe for marking up in math mode (amsmath qedhere only tested to not work with UNDERLINE markup) (only affects WHOLE and COARSE math markup modes). Note that unlike text mode (or FINE math mode0 deleted unsafe commands are not deleted but simply taken outside \DIFdel
my $MBOXINLINEMATH=0; # if set to 1 then surround marked-up inline maths expression with \mbox ( to get around compatibility
# problems between some maths packages and ulem package
+my $LISTENV='(?:itemize|description|enumerate)'; # list making environments - they will generally be kept
+my $ITEMCMD='item';
# Markup strings
# If at all possible, do not change these as parts of the program
@@ -888,6 +898,8 @@ foreach $assign ( @config ) {
$assign=~ m/\s*(\w*)\s*=\s*(\S*)\s*$/ or die "Illegal assignment $assign in configuration list (must be variable=value)";
if ( $1 eq "MINWORDSBLOCK" ) { $MINWORDSBLOCK = $2; }
elsif ( $1 eq "FLOATENV" ) { $FLOATENV = $2 ; }
+ elsif ( $1 eq "ITEMCMD" ) { $ITEMCMD = $2 ; }
+ elsif ( $1 eq "LISTENV" ) { $LISTENV = $2 ; }
elsif ( $1 eq "PICTUREENV" ) { $PICTUREENV = $2 ; }
elsif ( $1 eq "MATHENV" ) { $MATHENV = $2 ; }
elsif ( $1 eq "MATHREPL" ) { $MATHREPL = $2 ; }
@@ -934,15 +946,17 @@ if ($showtext) {
if ($showconfig) {
print "Configuration variables:\n";
- print "MINWORDSBLOCK=$MINWORDSBLOCK\n";
+ print "ARRENV=$ARRENV\n";
+ print "COUNTERCMD=$COUNTERCMD\n";
print "FLOATENV=$FLOATENV\n";
- print "PICTUREENV=$PICTUREENV\n";
- print "MATHENV=$MATHENV\n";
- print "MATHREPL=$MATHREPL\n";
+ print "ITEMCMD=$ITEMCMD\n";
+ print "LISTENV=$LISTENV\n";
print "MATHARRENV=$MATHARRENV\n";
print "MATHARRREPL=$MATHARRREPL\n";
- print "ARRENV=$ARRENV\n";
- print "COUNTERCMD=$COUNTERCMD\n";
+ print "MATHENV=$MATHENV\n";
+ print "MATHREPL=$MATHREPL\n";
+ print "MINWORDSBLOCK=$MINWORDSBLOCK\n";
+ print "PICTUREENV=$PICTUREENV\n";
}
if ($showconfig || $showtext || $showsafe || $showpreamble) {
exit 0; }
@@ -971,13 +985,14 @@ push(@SAFECMDLIST, qr/^QLEFTBRACE$/, qr/^QRIGHTBRACE$/);
# Patterns. These are used by some of the subroutines, too
# I can only define them down here because value of extraspace depends on an option
+
my $pat0 = '(?:[^{}])*';
- my $pat1 = '(?:[^{}]|\{'.$pat0.'\})*';
- my $pat2 = '(?:[^{}]|\{'.$pat1.'\})*';
- my $pat3 = '(?:[^{}]|\{'.$pat2.'\})*';
- my $pat4 = '(?:[^{}]|\{'.$pat3.'\})*';
- my $pat5 = '(?:[^{}]|\{'.$pat4.'\})*';
- my $pat6 = '(?:[^{}]|\{'.$pat5.'\})*';
+ my $pat_n = $pat0;
+# if you get "undefined control sequence MATHBLOCKmath" error, increase the maximum value in this loop
+ for (my $i_pat = 0; $i_pat < 20; ++$i_pat){
+ $pat_n = '(?:[^{}]|\{'.$pat_n.'\})*';
+ }
+
my $brat0 = '(?:[^\[\]]|\\\[|\\\])*';
my $abrat0 = '(?:[^<>])*';
@@ -991,11 +1006,12 @@ push(@SAFECMDLIST, qr/^QLEFTBRACE$/, qr/^QRIGHTBRACE$/);
# such that a\_b is interpreted as a{\_}b by latex but a{\_b} by perl
my $quotedunderscore='\\\\_';
# word: sequence of letters or accents followed by letter
- my $word='(?:[-\w\d*]|\\\\[\"\'\`~^][A-Za-z\*])+';
+ my $word_ja='\p{Han}+|\p{InHiragana}+|\p{InKatakana}+';
+ my $word='(?:' . $word_ja . '|(?:(?:[-\w\d*]|\\\\[\"\'\`~^][A-Za-z\*])(?!(?:' . $word_ja . ')))+)';
my $cmdleftright='\\\\(?:left|right|[Bb]igg?[lrm]?|middle)\s*(?:[<>()\[\]|]|\\\\(?:[|{}]|\w+))';
- my $cmdoptseq='\\\\[\w\d\*]+'.$extraspace.'(?:(?:<'.$abrat0.'>|\['.$brat0.'\]|\{'. $pat6 . '\}|\(' . $coords .'\))'.$extraspace.')*';
+ my $cmdoptseq='\\\\[\w\d\*]+'.$extraspace.'(?:(?:<'.$abrat0.'>|\['.$brat0.'\]|\{'. $pat_n . '\}|\(' . $coords .'\))'.$extraspace.')*';
my $backslashnl='\\\\\n';
- my $oneletcmd='\\\\.\*?(?:\['.$brat0.'\]|\{'. $pat6 . '\})*';
+ my $oneletcmd='\\\\.\*?(?:\['.$brat0.'\]|\{'. $pat_n . '\})*';
my $math='\$(?:[^$]|\\\$)*?\$|\\\\[(](?:.|\n)*?\\\\[)]';
## the current maths command cannot cope with newline within the math expression
my $comment='%.*?\n';
@@ -1005,10 +1021,10 @@ push(@SAFECMDLIST, qr/^QLEFTBRACE$/, qr/^QRIGHTBRACE$/);
my ($oldfile, $newfile) = @ARGV;
# check for existence of input files
if ( ! -e $oldfile ) {
- die "Input file $oldfile does not exist.";
+ die "Input file $oldfile does not exist";
}
if ( ! -e $newfile ) {
- die "Input file $newfile does not exist.";
+ die "Input file $newfile does not exist";
}
@@ -1052,6 +1068,10 @@ exetime(1);
if ($flatten) {
$oldbody=flatten($oldbody,$oldpreamble,$oldfile,$encoding);
$newbody=flatten($newbody,$newpreamble,$newfile,$encoding);
+ # flatten preamble
+ $oldpreamble=flatten($oldpreamble,$oldpreamble,$oldfile,$encoding);
+ $newpreamble=flatten($newpreamble,$newpreamble,$newfile,$encoding);
+
}
@@ -1179,7 +1199,7 @@ if (defined $packages{"glossaries"} ) {
}
}
-if (defined $packages{"chemformula"} ) {
+if (defined $packages{"chemformula"} or defined $packages{"chemmacros"} ) {
print STDERR "chemformula package detected.\n" if $verbose ;
init_regex_arr_ext(\@SAFECMDLIST,'ch');
push(@UNSAFEMATHCMD,'ch');
@@ -1191,7 +1211,7 @@ if (defined $packages{"chemformula"} ) {
if (defined $packages{"mhchem"} ) {
print STDERR "mhchem package detected.\n" if $verbose ;
init_regex_arr_ext(\@SAFECMDLIST,'ce');
- push(@UNSAFEMATHCMD,'cee');
+ push(@UNSAFEMATHCMD,'ce','cee');
# The next command would be needed to allow highlighting the interior of \cee commands in math environments
# but the redefinitions in chemformula are too deep to make this viable
# push(@MATHTEXTCMDLIST,'cee');
@@ -1235,6 +1255,11 @@ foreach $mboxcmd ( @MBOXCMDLIST ) {
init_regex_arr_ext(\@SAFECMDLIST, $mboxcmd);
}
+# check if \label is in SAFECMDLIST, and if yes replace "label" in $LABELCMD by something that never matches (we hope!)
+if ( iscmd("label",\@SAFECMDLIST,\@SAFECMDEXCL) ) {
+ $LABELCMD=~ s/label/NEVERMATCHLABEL/;
+}
+
print STDERR "Preprocessing body. " if $verbose;
@@ -1249,14 +1274,14 @@ if ( $debug ) {
print RAWDIFF $diffbo;
close(RAWDIFF);
}
-print STDERR "(",exetime()," s)\n","Postprocessing body. \n " if $verbose;
+print STDERR "(",exetime()," s)\n","Postprocessing body. \n" if $verbose;
postprocess($diffbo);
$diffall =join("\n",@diffpreamble) ;
# add visible labels
if (defined($visiblelabel)) {
# Give information right after \begin{document} (or at the beginning of the text for files without preamble
### if \date command is used, add information to \date argument, otherwise give right after \begin{document}
- ### $diffall=~s/(\\date$extraspace(?:\[$brat0\])?$extraspace)\{($pat6)\}/$1\{$2 \\ LATEXDIFF comparison \\ Old: $oldlabel \\ New: $newlabel \}/ or
+ ### $diffall=~s/(\\date$extraspace(?:\[$brat0\])?$extraspace)\{($pat_n)\}/$1\{$2 \\ LATEXDIFF comparison \\ Old: $oldlabel \\ New: $newlabel \}/ or
$diffbo = "\\begin{verbatim}LATEXDIFF comparison\nOld: $oldlabel\nNew: $newlabel\\end{verbatim}\n$diffbo" ;
}
@@ -1347,18 +1372,24 @@ sub read_file_with_encoding {
# %packages=list_packages($preamble)
# scans the arguments for \documentclass,\RequirePackage and \usepackage statements and constructs a hash
# whose keys are the included packages, and whose values are the associated optional arguments
+# if argument of \usepackage or \RequirePackage is comma separated list, treat as different packages
sub list_packages {
my ($preamble)=@_;
my %packages=();
+ my $pkg;
# remove comments
$preamble=~s/(?<!\\)%.*$//mg ;
while ( $preamble =~ m/\\(?:documentclass|usepackage|RequirePackage)(?:\[($brat0)\])?\{(.*?)\}/gs ) {
if (defined($1)) {
- $packages{$2}=$1;
+ foreach $pkg ( split /,/,$2 ) {
+ $packages{$pkg}=$1;
+ }
} else {
- $packages{$2}="";
+ foreach $pkg ( split /,/,$2 ) {
+ $packages{$pkg}="";
+ }
}
}
return (%packages);
@@ -1389,7 +1420,7 @@ sub add_safe_commands {
}
}
- while ( $preamble =~ m/\\(?:new|renew|provide)command\s*{\\(\w*)\}(?:|\[\d*\])\s*\{(${pat6})\}/osg ) {
+ while ( $preamble =~ m/\\(?:new|renew|provide)command\s*{\\(\w*)\}(?:|\[\d*\])\s*\{(${pat_n})\}/osg ) {
my $maybe_to_test = $1;
my $should_be_safe = $2;
my $success = 0;
@@ -1443,7 +1474,7 @@ sub flatten {
print STDERR "DEBUG: includeonly $includeonly\n" if $debug;
# recursively replace \\input and \\include files
- $text=~s/(^(?:[^%\n]|\\%)*)\\input{(.*?)}|\\include{(${includeonly}(?:\.tex)?)}/{
+ 1 while $text=~s/(^(?:[^%\n]|\\%)*)\\input{(.*?)}|\\include{(${includeonly}(?:\.tex)?)}/{
$begline=(defined($1)? $1 : "") ;
$fname = $2 if defined($2) ;
$fname = $3 if defined($3) ;
@@ -1724,7 +1755,7 @@ sub pass1 {
# print STDERR "Unchanged block $cnt, $last1,$last2 \n";
if ($cnt < $MINWORDSBLOCK
&& $cnt==scalar (
- grep { /^$wpat/ || ( /^\\((?:[`'^"~=.]|[\w\d@*]+))((?:\[$brat0\]|\{$pat6\})*)/o
+ grep { /^$wpat/ || ( /^\\((?:[`'^"~=.]|[\w\d@*]+))((?:\[$brat0\]|\{$pat_n\})*)/o
&& iscmd($1,\@SAFECMDLIST,\@SAFECMDEXCL)
&& scalar(@dummy=split(" ",$2))<3 ) }
@$block) ) {
@@ -1856,7 +1887,7 @@ sub extracttextblocks {
for ($i=0;$i< scalar @$block;$i++) {
($token,$index)=@{ $block->[$i] };
# store pure text blocks
- if ($token =~ /$wpat/ || ( $token =~/^\\((?:[`'^"~=.]|[\w\d@\*]+))((?:${extraspace}\[$brat0\]${extraspace}|${extraspace}\{$pat6\})*)/o
+ if ($token =~ /$wpat/ || ( $token =~/^\\((?:[`'^"~=.]|[\w\d@\*]+))((?:${extraspace}\[$brat0\]${extraspace}|${extraspace}\{$pat_n\})*)/o
&& iscmd($1,\@SAFECMDLIST,\@SAFECMDEXCL)
&& !iscmd($1,\@TEXTCMDLIST,\@TEXTCMDEXCL))) {
# we have text or a command which can be treated as text
@@ -1910,7 +1941,7 @@ sub extractcommands {
# $2: \cmd
# $3: last argument
# $4: } + trailing spaces
- if ( ( $token =~ m/^(\\([\w\d\*]+)(?:${extraspace}\[$brat0\]|${extraspace}\{$pat6\})*${extraspace}\{)($pat6)(\}\s*)$/so )
+ if ( ( $token =~ m/^(\\([\w\d\*]+)(?:${extraspace}\[$brat0\]|${extraspace}\{$pat_n\})*${extraspace}\{)($pat_n)(\}\s*)$/so )
&& iscmd($2,\@TEXTCMDLIST,\@TEXTCMDEXCL) ) {
# push(@$retval,[ $2,$index,$1,$3,$4 ]);
($cmd,$open,$mid,$closing) = ($2,$1,$3,$4) ;
@@ -2062,8 +2093,8 @@ sub marktags {
# $2: cmd
# $3: last argument
# $4: } + trailing spaces
- ### pre-0.3 if ( ( $token =~ m/^(\\([\w\d\*]+)(?:\[$brat0\]|\{$pat6\})*\{)($pat6)(\}\s*)$/so )
- if ( ( $word =~ m/^(\\([\w\d\*]+)(?:${extraspace}\[$brat0\]|${extraspace}\{$pat6\})*${extraspace}\{)($pat6)(\}\s*)$/so )
+ ### pre-0.3 if ( ( $token =~ m/^(\\([\w\d\*]+)(?:\[$brat0\]|\{$pat_n\})*\{)($pat_n)(\}\s*)$/so )
+ if ( ( $word =~ m/^(\\([\w\d\*]+)(?:${extraspace}\[$brat0\]|${extraspace}\{$pat_n\})*${extraspace}\{)($pat_n)(\}\s*)$/so )
&& (iscmd($2,\@TEXTCMDLIST,\@TEXTCMDEXCL)|| iscmd($2,\@MATHTEXTCMDLIST,\@MATHTEXTCMDEXCL))
&& ( !$cmdcomment || !iscmd($2,\@CONTEXT2CMDLIST, \@CONTEXT2CMDEXCL) ) ) {
# Condition 1: word is a command? - if yes, $1,$2,.. will be set as above
@@ -2097,7 +2128,6 @@ sub marktags {
# ""
local @SAFECMDLIST=(".*");
local @SAFECMDEXCL=('\\','\\\\',@UNSAFEMATHCMD);
- ### print STDERR "DEBUG: Command $command argtext ",join(",",@argtext),"\n" if $debug;
push(@$retval,$command,marktags("","",$open,$close,"","",$comment,\@argtext)#@argtext
,$closingbracket);
} else {
@@ -2111,6 +2141,7 @@ sub marktags {
push (@$retval,$opencmd) if $cmd==-1 ;
push (@$retval,$close,$opencmd) if $cmd==0 ;
$word =~ s/\n/\n${opencmd}/sg if $cmdcomment ; # if opencmd is a comment, repeat this at the beginning of every line
+ ### print STDERR "MARKTAGS: Add command |$word|\n";
push (@$retval,$word);
$cmd=1;
}
@@ -2127,7 +2158,7 @@ sub marktags {
###print STDERR "DEBUG Mboxsafecmd detected:$word:\n" if $debug ;
push(@$retval,"\\mbox{$AUXCMD\n\\" . $1 . $2 . $3 ."}$AUXCMD\n" );
} else {
- # $word is a normal word or a safe command (not in MBOXCMDLIST
+ # $word is a normal word or a safe command (not in MBOXCMDLIST)
push (@$retval,$word);
}
$cmd=0;
@@ -2140,6 +2171,53 @@ sub marktags {
return @$retval;
}
+#used in preprocess
+sub take_comments_and_enter_from_frac() {
+ ###*************take the \n and % between frac and {}***********
+ ###notice all of the substitution are made none global
+ while( m/\\begin{($MATHENV|$MATHARRENV|SQUAREBRACKET)}(.*?)\\frac(([\s]*%[^\n]*?)*[\r\n|\r|\n])+\{(.*?)\\end{\1}/s ) {
+ ### if there isn't any % or \n in the pattern $2 then there should be an \\end{...} in $2
+ if( $2 !~ m/\\end{$1}/s ) {
+ ### take out % and \n from the next match only (none global)
+ s/\\begin{($MATHENV|$MATHARRENV|SQUAREBRACKET)}(.*?)\\frac(([\s]*%[^\n]*?)*[\r\n|\r|\n])+\{(.*?)\\end{\1}/\\begin{$1}$2\\frac{$5\\end{$1}/s;
+ }
+ else{
+ ###there are no more % and \n in $2, we want to find the next one so we clear the begin-end from the pattern
+ s/\\begin{($MATHENV|$MATHARRENV|SQUAREBRACKET)}(.*?)\\end{\1}/MATHBLOCK$1$2MATHBLOCKEND/s;
+ }
+ }
+ ###cleaning up
+ while( s/MATHBLOCK($MATHENV|$MATHARRENV|SQUAREBRACKET)(.*?)MATHBLOCKEND/\\begin{$1}$2\\end{$1}/s ){}
+ ###*************take the \n and % between frac and {}***********
+
+ ###**********take the \n and % between {} and {} of the frac***************
+ while( m/\\begin\{($MATHENV|$MATHARRENV|SQUAREBRACKET)\}(.*?)\\frac\{(.*?)\\end\{\1\}/s ) {
+ ### if there isn't any more //frac before the first //end in the pattern $2 then there should be an \\end{...} in $2
+ if( $2 !~ m/\\end\{$1\}/s ) {
+ ### from now on CURRFRAC is the frac we are looking at
+ s/\\begin\{($MATHENV|$MATHARRENV|SQUAREBRACKET)\}(.*?)\\frac\{(.*?)\\end\{\1\}/\\begin\{$1\}$2CURRFRAC\{$3\\end\{$1\}/s;
+ while( m/\\begin\{($MATHENV|$MATHARRENV|SQUAREBRACKET)\}(.*?)CURRFRAC\{(.*?)\\end\{\1\}/s ) {
+ if( m/\\begin\{($MATHENV|$MATHARRENV|SQUAREBRACKET)\}(.*?)CURRFRAC\{($pat_n)\}([\s]*(%[^\n]*?)*[\r\n|\r|\n])+[\s]*\{(.*?)\\end{\1}/s ) {
+ s/\\begin\{($MATHENV|$MATHARRENV|SQUAREBRACKET)\}(.*?)CURRFRAC\{($pat_n)\}([\s]*(%[^\n]*?)*[\r\n|\r|\n])+[\s]*\{(.*?)\\end\{\1\}/\\begin\{$1\}$2CURRFRAC\{$3\}\{$6\\end\{$1\}/s;
+ }
+ else { # there is no comment or \n between the two brackets {}{}
+ ### change CURRFRAC to FRACSTART so we can change them all back to //frac{ when we finish
+ s/\\begin{($MATHENV|$MATHARRENV|SQUAREBRACKET)}(.*?)CURRFRAC\{(.*?)\\end{\1}/\\begin{$1}$2FRACSTART\{$3\\end{$1}/s;
+ }
+ }
+ }
+ else{
+ ###there are no more frac in $2, we want to find the next one so we clear the begin-end from the pattern
+ s/\\begin{($MATHENV|$MATHARRENV|SQUAREBRACKET)}(.*?)\\end{\1}/MATHBLOCK$1$2MATHBLOCKEND/s;
+ }
+
+ }
+ ###cleaning up
+ while( s/MATHBLOCK($MATHENV|$MATHARRENV|SQUAREBRACKET)(.*?)MATHBLOCKEND/\\begin{$1}$2\\end{$1}/s ){}
+ s/FRACSTART/\\frac/g;
+ ###***************take the \n and % between {} and {} of the frac*********************
+}
+
# preprocess($string, ..)
# carry out the following pre-processing steps for all arguments:
# 1. Remove leading white-space
@@ -2165,7 +2243,7 @@ sub marktags {
# Returns: leading white space removed in step 1
sub preprocess {
for (@_) {
- # Change \{ to \QLEFTBRACE and \} to \QRIGHTBRACE
+ # Change \{ to \QLEFTBRACE, \} to \QRIGHTBRACE, and \& to \AMPERSAND
s/(?<!\\)\\{/\\QLEFTBRACE /sg;
s/(?<!\\)\\}/\\QRIGHTBRACE /sg;
s/(?<!\\)\\&/\\AMPERSAND /sg;
@@ -2179,11 +2257,14 @@ sub preprocess {
s/(\\verb\*?)(\S)(.*?)\2/"${1}{". tohash(\%verbhash,"${2}${3}${2}") ."}"/esg;
s/\\begin\{(verbatim\*?)\}(.*?)\\end\{\1\}/"\\${1}{". tohash(\%verbhash,"${2}") . "}"/esg;
# Convert _n or _\cmd into \SUBSCRIPTNB{n} or \SUBSCRIPTNB{\cmd} and _{nnn} into \SUBSCRIPT{nn}
- 1 while s/(?<!\\)_([^{\\]|\\\w+)/\\SUBSCRIPTNB{$1}/g ;
- 1 while s/(?<!\\)_{($pat6)}/\\SUBSCRIPT{$1}/g ;
+ 1 while s/(?<!\\)_(\s*([^{\\\s]|\\\w+))/\\SUBSCRIPTNB{$1}/g ;
+ 1 while s/(?<!\\)_(\s*{($pat_n)})/\\SUBSCRIPT$1/g ;
# Convert ^n into \SUPERSCRIPTNB{n} and ^{nnn} into \SUPERSCRIPT{nn}
- 1 while s/(?<!\\)\^([^{\\]|\\\w+)/\\SUPERSCRIPTNB{$1}/g ;
- 1 while s/(?<!\\)\^{($pat6)}/\\SUPERSCRIPT{$1}/g ;
+ 1 while s/(?<!\\)\^(\s*([^{\\\s]|\\\w+))/\\SUPERSCRIPTNB{$1}/g ;
+ 1 while s/(?<!\\)\^(\s*{($pat_n)})/\\SUPERSCRIPT$1/g ;
+ # Convert \sqrt{n} into \SQRT{n} and \sqrt nn into SQRTNB{nn}
+ 1 while s/(?<!\\)\\sqrt(\s*([^{\\\s]|\\\w+))/\\SQRTNB{$1}/g ;
+ 1 while s/(?<!\\)\\sqrt(\s*{($pat_n)})/\\SQRT$1/g ;
# Convert $$ $$ into \begin{DOLLARDOLLAR} \end{DOLLARDOLLAR}
s/\$\$(.*?)\$\$/\\begin{DOLLARDOLLAR}$1\\end{DOLLARDOLLAR}/sg;
# Convert \[ \] into \begin{SQUAREBRACKET} \end{SQUAREBRACKET}
@@ -2196,6 +2277,9 @@ sub preprocess {
# Also convert all array environments into ARRAYBLOCK environments
if ( $mathmarkup != FINE ) {
s/\\begin{($ARRENV)}(.*?)\\end{\1}/\\ARRAYBLOCK$1\{$2\}/sg;
+
+ take_comments_and_enter_from_frac();
+
s/\\begin{($MATHENV|$MATHARRENV|SQUAREBRACKET)}(.*?)\\end{\1}/\\MATHBLOCK$1\{$2\}/sg;
}
# add final token " STOP"
@@ -2213,16 +2297,17 @@ sub tohash {
@arr=unpack('c*',$string);
- foreach $val (@arr) {
- $sum += $i*$val;
- $i++;
- }
- $hstr= "$sum";
- if (defined($hash->{$hstr}) && $string ne $hash->{$hstr}) {
- warn "Repeated hash value for verbatim mode in spite of different content.";
- $hstr="-$hstr";
+ while (1) {
+ foreach $val (@arr) {
+ $sum += $i*$val;
+ $i++;
+ }
+ $hstr= "$sum";
+ last unless (defined($hash->{$hstr}) && $string ne $hash->{$hstr});
+ # else found a duplicate HASH need to repeat for a higher hash value
}
$hash->{$hstr}=$string;
+ ### print STDERR "Hash:$hstr: Content:$string:\n";
return($hstr);
}
@@ -2293,6 +2378,8 @@ sub postprocess {
# second level blocks
my ($begin2,$cnt2,$len2,$eqarrayblock,$mathblock);
+ my (@textparts,@newtextparts,@liststack,$listtype,$listlast);
+
for (@_) {
# change $'s in comments to something harmless
@@ -2375,14 +2462,25 @@ sub postprocess {
# Convert MATHBLOCKmath commands to their uncounted numbers (e.g. convert equation -> displaymath
# (environments defined in $MATHENV will be replaced by $MATHREPL, and environments in $MATHARRENV
# will be replaced by $MATHARRREPL
- $delblock=~ s/\\MATHBLOCK($MATHENV)\{($pat6)\}/\\MATHBLOCK$MATHREPL\{$2\}/sg;
- $delblock=~ s/\\MATHBLOCK($MATHARRENV)\{($pat6)\}/\\MATHBLOCK$MATHARRREPL\{$2\}/sg;
+ $delblock=~ s/\\MATHBLOCK($MATHENV)\{($pat_n)\}/\\MATHBLOCK$MATHREPL\{$2\}/sg;
+ $delblock=~ s/\\MATHBLOCK($MATHARRENV)\{($pat_n)\}/\\MATHBLOCK$MATHARRREPL\{$2\}/sg;
}
+ # Reinstate completely deleted list environments. note that items within the
+ # environment will still be commented out. They will be restored later
+ $delblock=~ s/(\%DIFDELCMD < \s*\\begin\{($LISTENV)\}\s*?(?:\n|$DELCMDCLOSE))(.*?)(\%DIFDELCMD < \s*\\end\{\2\})/{
+ ### # block within the search; replacement environment
+ ### "$1\\begin{$2}$AUXCMD\n". restore_item_commands($3). "\n\\end{$2}$AUXCMD\n$4";
+ "$1\\begin{$2}$AUXCMD\n$3\n\\end{$2}$AUXCMD\n$4";
+ }/esg;
# b.where one of the commands matching $COUNTERCMD is used as a DIFAUXCMD, add a statement
# subtracting one from the respective counter to keep numbering consistent with new file
- $delblock=~ s/\\($COUNTERCMD)((?:${extraspace}\[$brat0\]${extraspace}|${extraspace}\{$pat6\})*\s*${AUXCMD}\n)/\\$1$2\\addtocounter{$1}{-1}${AUXCMD}\n/sg ;
+ $delblock=~ s/\\($COUNTERCMD)((?:${extraspace}\[$brat0\]${extraspace}|${extraspace}\{$pat_n\})*\s*${AUXCMD}\n)/\\$1$2\\addtocounter{$1}{-1}${AUXCMD}\n/sg ;
+
+# bb. disable active labels within deleted blocks (as these are not safe commands, this should normally only
+# happen within deleted maths blocks
+ $delblock=~ s/(\\$LABELCMD(?:${extraspace})\{(?:[^{}])*\}[\t ]*)\n?/${DELCMDOPEN}$1${DELCMDCLOSE}/smg ;
# c. If in-line math mode contains array environment, enclose the whole environment in \mbox'es
@@ -2430,6 +2528,36 @@ sub postprocess {
pos = $begin + length($addblock);
}
+ # Go through whole text, and by counting list environment commands, find out when we are within a list environment.
+ # Within those restore deleted \item commands
+ @textparts=split /(?<!$DELCMDOPEN)(\\(?:begin|end)\{$LISTENV\})/ ;
+ @liststack=();
+ @newtextparts=map {
+ ### print STDERR ":::::::: $_\n";
+ if ( ($listtype) = m/^\\begin\{($LISTENV)\}$/ ) {
+ print STDERR "DEBUG: postprocess \\begin{$listtype}\n" if $debug;
+ push @liststack,$listtype;
+ } elsif ( ($listtype) = m/^\\end\{($LISTENV)\}$/ ) {
+ print STDERR "DEBUG: postprocess \\end{$listtype}\n" if $debug;
+ if (scalar @liststack > 0) {
+ $listlast=pop(@liststack);
+ ($listtype eq $listlast) or warn "Invalid nesting of list environments: $listlast environment closed by \\end{$listtype}.";
+ } else {
+ warn "Invalid nesting of list environments: \\end{$listtype} encountered without matching \\begin{$listtype}.";
+ }
+ } else {
+ print STDERR "DEBUG: postprocess \@liststack=(",join(",",@liststack),")\n" if $debug;
+ if (scalar @liststack > 0 ) {
+ # we are within a list environment and should replace all item commands
+ $_=restore_item_commands($_);
+ }
+ # else: we are outside a list environment and do not need to do anything
+ }
+ $_ } @textparts; # end of map command
+ # replace the main text with the modified version
+ $_= "@newtextparts";
+
+
# Replace MATHMODE environments from step 1a above by the correct Math environment
@@ -2449,12 +2577,12 @@ sub postprocess {
s/\\begin{((?:$MATHENV)|(?:$MATHARRENV)|SQUAREBRACKET)}$AUXCMD\n((?:\s*%.[^\n]*\n)*)\\end{\1}$AUXCMD\n/$2/sg;
} else {
# math modes OFF,WHOLE,COARSE: Convert \MATHBLOCKmath{..} commands back to environments
- s/\\MATHBLOCK($MATHENV|$MATHARRENV|SQUAREBRACKET)\{($pat6)\}/\\begin{$1}$2\\end{$1}/sg;
+ s/\\MATHBLOCK($MATHENV|$MATHARRENV|SQUAREBRACKET)\{($pat_n)\}/\\begin{$1}$2\\end{$1}/sg;
# convert ARRAYBLOCK.. commands back to environments
- s/\\ARRAYBLOCK($ARRENV)\{($pat6)\}/\\begin{$1}$2\\end{$1}/sg;
+ s/\\ARRAYBLOCK($ARRENV)\{($pat_n)\}/\\begin{$1}$2\\end{$1}/sg;
}
# Convert all PICTUREblock{..} commands back to the appropriate environments
- s/\\PICTUREBLOCK($PICTUREENV)\{($pat6)\}/\\begin{$1}$2\\end{$1}/sg;
+ s/\\PICTUREBLOCK($PICTUREENV)\{($pat_n)\}/\\begin{$1}$2\\end{$1}/sg;
#0.5: # Remove all mark up within picture environments
# while ( m/\\begin\{($PICTUREENV)\}.*?\\end\{\1\}/sg ) {
# $cnt=0;
@@ -2463,10 +2591,10 @@ sub postprocess {
# $float=$&;
# $float =~ s/\\DIFaddbegin //g;
# $float =~ s/\\DIFaddend //g;
-# $float =~ s/\\DIFadd\{($pat6)\}/$1/g;
+# $float =~ s/\\DIFadd\{($pat_n)\}/$1/g;
# $float =~ s/\\DIFdelbegin //g;
# $float =~ s/\\DIFdelend //g;
-# $float =~ s/\\DIFdel\{($pat6)\}//g;
+# $float =~ s/\\DIFdel\{($pat_n)\}//g;
# $float =~ s/$DELCMDOPEN.*//g;
# substr($_,$begin,$len)=$float;
# pos = $begin + length($float);
@@ -2529,11 +2657,15 @@ sub postprocess {
# 4. Convert \begin{DOLLARDOLLAR} \end{DOLLARDOLLAR} into $$ $$
s/\\begin\{DOLLARDOLLAR\}(.*?)\\end\{DOLLARDOLLAR\}/\$\$$1\$\$/sg;
# 5. Convert \SUPERSCRIPTNB{n} into ^n and \SUPERSCRIPT{nn} into ^{nnn}
- 1 while s/\\SUPERSCRIPT{($pat6)}/^{$1}/g ;
- 1 while s/\\SUPERSCRIPTNB{($pat0)}/^$1/g ;
+ 1 while s/\\SUPERSCRIPT(\s*{($pat_n)})/^$1/g ;
+ 1 while s/\\SUPERSCRIPTNB{(\s*$pat0)}/^$1/g ;
# Convert \SUBSCRIPNB{n} into _n and \SUBCRIPT{nn} into _{nnn}
- 1 while s/\\SUBSCRIPT{($pat6)}/_{$1}/g ;
- 1 while s/\\SUBSCRIPTNB{($pat0)}/_$1/g ;
+ 1 while s/\\SUBSCRIPT(\s*{($pat_n)})/_$1/g ;
+ 1 while s/\\SUBSCRIPTNB{(\s*$pat0)}/_$1/g ;
+ # Convert \SQRT{n} into \sqrt{n} and \SQRTNB{nn} into \sqrt nn
+ 1 while s/\\SQRT(\s*{($pat_n)})/\\sqrt$1/g ;
+ 1 while s/\\SQRTNB{(\s*$pat0)}/\\sqrt$1/g ;
+
1 while s/(%.*)\\CRIGHTBRACE (.*)$/$1\}$2/mg ;
1 while s/(%.*)\\CLEFTBRACE (.*)$/$1\{$2/mg ;
@@ -2547,6 +2679,24 @@ sub postprocess {
}
}
+# $out = restore_item_commands($listenviron)
+# short helper function for post-process, which restores deleted \item commands in its argument (as DIFAUXCMDs)
+sub restore_item_commands {
+ my ($string)=@_ ;
+ my ($itemarg,@itemargs);
+ $string =~ s/(\%DIFDELCMD < \s*(\\$ITEMCMD)((?:<$abrat0>)?)((?:\[$brat0\])?)\s*?(?:\n|$DELCMDCLOSE))/
+ # if \item has an []argument, then mark up the argument as deleted)
+ if (length($4)>0) {
+ # use substr to exclude square brackets at end points
+ @itemargs=splitlatex(substr($4,1,length($4)-2));
+ $itemarg="[".join("",marktags("","",$DELOPEN,$DELCLOSE,$DELCMDOPEN,$DELCMDCLOSE,$DELCOMMENT,\@itemargs))."]";
+ } else {
+ $itemarg="";
+ }
+ "$1$2$3$itemarg$AUXCMD\n"/sge;
+ return($string);
+}
+
# @auxlines=preprocess_preamble($oldpreamble,$newpreamble);
# pre-process preamble by looking for commands used in \maketitle (title, author, date etc commands)
@@ -2573,7 +2723,7 @@ sub preprocess_preamble {
# resue in a more complex regex
$titlecmd =~ s/[\$\^]//g;
# make sure to not match on comment lines:
- $titlecmdpat=qr/^(?:[^%\n]|\\%)*(\\($titlecmd)$extraspace(?:\[($brat0)\])?(?:\{($pat6)\}))/ms;
+ $titlecmdpat=qr/^(?:[^%\n]|\\%)*(\\($titlecmd)$extraspace(?:\[($brat0)\])?(?:\{($pat_n)\}))/ms;
@oldtitlecommands= ( $$oldpreambleref =~ m/$titlecmdpat/g );
@newtitlecommands= ( $$newpreambleref =~ m/$titlecmdpat/g );
@@ -2801,7 +2951,7 @@ format as new.tex but has all changes relative to old.tex marked up or commented
--subtype=markstyle
-s markstyle Add code to preamble for selected style for bracketing
commands (e.g. to mark changes in margin)
- Available styles: SAFE MARGINAL DVIPSCOL COLOR ZLABEL ONLYCHANGEDPAGE (LABEL)*
+ Available styles: SAFE MARGIN DVIPSCOL COLOR ZLABEL ONLYCHANGEDPAGE (LABEL)*
[ Default: SAFE ]
* LABEL subtype is deprecated
@@ -2892,15 +3042,17 @@ format as new.tex but has all changes relative to old.tex marked up or commented
--config var1=val1,var2=val2,...
-c var1=val1,.. Set configuration variables.
-c configfile Available variables:
- MINWORDSBLOCK (integer)
+ ARRENV (RegEx)
+ COUNTERCMD (RegEx)
FLOATENV (RegEx)
- PICTUREENV (RegEx)
- MATHENV (RegEx)
- MATHREPL (String)
+ ITEMCMD (RegEx)
+ LISTENV (RegEx)
MATHARRENV (RegEx)
MATHARRREPL (String)
- ARRENV (RegEx)
- COUNTERCMD (RegEx)
+ MATHENV (RegEx)
+ MATHREPL (String)
+ MINWORDSBLOCK (integer)
+ PICTUREENV (RegEx)
This option can be repeated.
@@ -2911,7 +3063,7 @@ format as new.tex but has all changes relative to old.tex marked up or commented
Use of the --packages option disables automatic scanning, so if for any
reason package specific parsing needs to be switched off, use --packages=none.
The following packages trigger special behaviour:
- endfloat hyperref amsmath apacite siunitx cleveref glossaries mhchem chemformula
+ endfloat hyperref amsmath apacite siunitx cleveref glossaries mhchem chemformula/chemmacros
[ Default: scan the preamble for \\usepackage commands to determine
loaded packages.]
@@ -3159,7 +3311,7 @@ B<-s markstyle>
Add code to preamble for selected style for bracketing
commands (e.g. to mark changes in margin). This option defines
C<\DIFaddbegin>, C<\DIFaddend>, C<\DIFdelbegin> and C<\DIFdelend> commands.
-Available styles: C<SAFE MARGINAL COLOR DVIPSCOL ZLABEL ONLYCHANGEDPAGE (LABEL)*>
+Available styles: C<SAFE MARGIN COLOR DVIPSCOL ZLABEL ONLYCHANGEDPAGE (LABEL)*>
[ Default: C<SAFE> ]
* Subtype C<LABEL> is deprecated
@@ -3250,7 +3402,7 @@ Define most of the glossaries commands as safe, protecting them with \mbox'es wh
Treat C<\ce> as a safe command, i.e. it will be highlighted (note that C<\cee> will not be highlighted in equations as this leads to processing errors)
-=item C<chemformula>
+=item C<chemformula> or C<chemmacros>
Treat C<\ch> as a safe command outside equations, i.e. it will be highlighted (note that C<\ch> will not be highlighted in equations as this leads to processing errors)
@@ -3351,23 +3503,27 @@ Set configuration variables. The option can be repeated to set different
variables (as an alternative to the comma-separated list).
Available variables (see below for further explanations):
-C<MINWORDSBLOCK> (integer)
+C<ARRENV> (RegEx)
-C<FLOATENV> (RegEx)
+C<COUNTERCMD> (RegEx)
-C<PICTUREENV> (RegEx)
+C<FLOATENV> (RegEx)
-C<MATHENV> (RegEx)
+C<ITEMCMD> (RegEx)
-C<MATHREPL> (String)
+C<LISTENV> (RegEx)
C<MATHARRENV> (RegEx)
C<MATHARRREPL> (String)
-C<ARRENV> (RegEx)
+C<MATHENV> (RegEx)
-C<COUNTERCMD> (RegEx)
+C<MATHREPL> (String)
+
+C<MINWORDSBLOCK> (integer)
+
+C<PICTUREENV> (RegEx)
=item B<--show-safecmd>
@@ -3641,12 +3797,22 @@ Make no difference between the main text and floats.
=over 10
-=item C<MINWORDSBLOCK>
+=item C<ARRENV>
-Minimum number of tokens required to form an independent block. This value is
-used in the algorithm to detect changes of complete blocks by merging identical text parts of less than C<MINWORDSBLOCK> to the preceding added and discarded parts.
+If a match to C<ARRENV> is found within an inline math environment within a deleted or added block, then the inlined math
+is surrounded by C<\mbox{>...C<}>. This is necessary as underlining does not work within inlined array environments.
-[ Default: 3 ]
+[ Default: C<ARRENV>=S<C<(?:array|[pbvBV]matrix)> >
+
+=item C<COUNTERCMD>
+
+If a command in a deleted block which is also in the textcmd list matches C<COUNTERCMD> then an
+additional command C<\addtocounter{>F<cntcmd>C<}{-1}>, where F<cntcmd> is the matching command, is appended in the diff file such that the numbering in the diff file remains synchronized with the
+numbering in the new file.
+
+[ Default: C<COUNTERCMD>=C<(?:footnote|part|section|subsection> ...
+
+C<|subsubsection|paragraph|subparagraph)> ]
=item C<FLOATENV>
@@ -3656,18 +3822,21 @@ are replaced by their FL variaties.
[ Default: S<C<(?:figure|table|plate)[\w\d*@]*> >]
-=item C<PICTUREENV>
+=item C<ITEMCMD>
-Within environments whose name matches the regular expression in C<PICTUREENV>
-all latexdiff markup is removed (in pathologic cases this might lead to
- inconsistent markup but this situation should be rare).
+Commands representing new item line with list environments.
-[ Default: S<C<(?:picture|DIFnomarkup)[\w\d*@]*> >]
+[ Default: \C<item> ]
+
+=item C<LISTENV>
+
+Environments whose name matches the regular expression in C<LISTENV> are list environments.
+
+[ Default: S<C<(?:itemize|enumerate|description)> >]
=item C<MATHENV>,C<MATHREPL>
-If both \begin and \end for a math environment (environment name matching C<MATHENV>
-or \[ and \])
+If both \begin and \end for a math environment (environment name matching C<MATHENV> or \[ and \])
are within the same deleted block, they are replaced by a \begin and \end commands for C<MATHREPL>
rather than being commented out.
@@ -3679,22 +3848,20 @@ as C<MATHENV>,C<MATHREPL> but for equation arrays
[ Default: C<MATHARRENV>=S<C<eqnarray\*?> >, C<MATHREPL>=S<C<eqnarray> >]
-=item C<ARRENV>
-
-If a match to C<ARRENV> is found within an inline math environment within a deleted or added block, then the inlined math
-is surrounded by C<\mbox{>...C<}>. This is necessary as underlining does not work within inlined array environments.
+=item C<MINWORDSBLOCK>
-[ Default: C<ARRENV>=S<C<(?:array|[pbvBV]matrix)> >
+Minimum number of tokens required to form an independent block. This value is
+used in the algorithm to detect changes of complete blocks by merging identical text parts of less than C<MINWORDSBLOCK> to the preceding added and discarded parts.
-=item C<COUNTERCMD>
+[ Default: 3 ]
-If a command in a deleted block which is also in the textcmd list matches C<COUNTERCMD> then an
-additional command C<\addtocounter{>F<cntcmd>C<}{-1}>, where F<cntcmd> is the matching command, is appended in the diff file such that the numbering in the diff file remains synchronized with the
-numbering in the new file.
+=item C<PICTUREENV>
-[ Default: C<COUNTERCMD>=C<(?:footnote|part|section|subsection> ...
+Within environments whose name matches the regular expression in C<PICTUREENV>
+all latexdiff markup is removed (in pathologic cases this might lead to
+inconsistent markup but this situation should be rare).
-C<|subsubsection|paragraph|subparagraph)> ]
+[ Default: S<C<(?:picture|DIFnomarkup)[\w\d*@]*> >]
=back
@@ -3721,21 +3888,25 @@ For custom packages you can define the commands which need to be protected by C<
Try options C<--math-markup=whole>. If even that fails, you can turn off mark up for equations with C<--math-markup=off>.
-=item How can I just show the pages
+=item How can I just show the pages where changes had been made
Use options -C<-s ZLABEL> (some postprocessing required) or C<-s ONLYCHANGEDPAGE>. C<latexdiff-vc --ps|--pdf> with C<--only-changes> option takes care of
-the post-processing for you (requires zref packages).
+the post-processing for you (requires zref package to be installed).
=back
=head1 BUGS
-Option allow-spaces not implemented entirely consistently. It breaks
+=over 10
+
+=item Option allow-spaces not implemented entirely consistently. It breaks
the rules that number and type of white space does not matter, as
different numbers of inter-argument spaces are treated as significant.
+=back
+
Please submit bug reports using the issue tracker of the github repository page I<https://github.com/ftilmann/latexdiff.git>,
-or send them to I<tilmann -- AT -- gfz-potsdam.de>. Include the serial number of I<latexdiff>
+or send them to I<tilmann -- AT -- gfz-potsdam.de>. Include the version number of I<latexdiff>
(from comments at the top of the source or use B<--version>). If you come across latex
files that are error-free and conform to the specifications set out
above, and whose differencing still does not result in error-free
@@ -3762,7 +3933,7 @@ I<latexdiff-fast> requires the I<diff> command to be present.
=head1 AUTHOR
-Version 1.1.0
+Version 1.1.1
Copyright (C) 2004-2015 Frederik Tilmann
This program is free software; you can redistribute it and/or modify
@@ -3783,7 +3954,7 @@ dashbox
emph
fbox
framebox
-hspace
+hspace\*?
math.*
makebox
mbox
@@ -3993,6 +4164,8 @@ _
AMPERSAND
(SUPER|SUB)SCRIPTNB
(SUPER|SUB)SCRIPT
+SQRT
+SQRTNB
PERCENTAGE
DOLLAR
%%END SAFE COMMANDS