summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormstsirkin <mstsirkin@0c8fb4dd-22a2-4bb5-bc14-6c75a5f43652>2015-10-21 14:19:35 +0000
committermstsirkin <mstsirkin@0c8fb4dd-22a2-4bb5-bc14-6c75a5f43652>2015-10-21 14:19:35 +0000
commitcff819e3c64b19873746fdeb4307d3e6f0a66ff2 (patch)
tree81fb67b8ae27a69515de4cf07233f743cea8c34c
parent3d96d1607efab99a484e73a1b15a71c350fbe7cb (diff)
Revert: makediff: cleanup using begingroup/endgroup
This reverts commit commit ef519a86f046d1be22f82f32d845653a850c21dd Author: mstsirkin <mstsirkin@0c8fb4dd-22a2-4bb5-bc14-6c75a5f43652> Date: Thu Jun 26 16:50:13 2014 +0000 makediff: cleanup using begingroup/endgroup This seemed like a good idea originally: replace perl hacks with tex hacks. However adding \begingroup and \endgroup within macros used by latex-diff breaks its assumption that these are low level tex and can be used in arbitrary situations, e.g. cross the boundaries of environments, use mis-matching begin and end instructions (DIFaddbegin with DIFaddendFL), etc. Let's go back to the original work-around: commit b665b3165b454b98c782617e37a128b53b56c89c Author: mstsirkin <mstsirkin@0c8fb4dd-22a2-4bb5-bc14-6c75a5f43652> Date: Thu Jun 26 12:34:38 2014 +0000 work around xetex bug Too many \color directives produce corrupted output and this warning: WARNING ** Color stack overflow. Just ignore. Use script to reduce # of these directives. Signed-off-by: Michael S. Tsirkin <mst@redhat.com> git-svn-id: https://tools.oasis-open.org/version-control/svn/virtio/branches/v1.0@545 0c8fb4dd-22a2-4bb5-bc14-6c75a5f43652
-rw-r--r--diffpreamble.tex11
-rw-r--r--fixupdiff.pl74
2 files changed, 24 insertions, 61 deletions
diff --git a/diffpreamble.tex b/diffpreamble.tex
index 9b5b7e5..f7b5cec 100644
--- a/diffpreamble.tex
+++ b/diffpreamble.tex
@@ -8,10 +8,13 @@
%DIF COLOR PREAMBLE
\RequirePackage{color}
-\providecommand{\DIFaddbegin}{\begingroup\color{green}\hypersetup{linkcolor=green,urlcolor=green}}
-\providecommand{\DIFaddend}{\hypersetup{linkcolor=blue,urlcolor=blue}\endgroup}
-\providecommand{\DIFdelbegin}{\begingroup\color{red}\hypersetup{linkcolor=red,urlcolor=red}}
-\providecommand{\DIFdelend}{\hypersetup{linkcolor=blue,urlcolor=blue}\endgroup}
+\providecommand{\DIFaddbegin}{\protect\color{green}\hypersetup{linkcolor=green,urlcolor=green}}
+\providecommand{\DIFaddend}{\protect\color{black}\hypersetup{linkcolor=blue,urlcolor=blue}}
+\providecommand{\DIFdelbegin}{\protect\color{red}\hypersetup{linkcolor=red,urlcolor=red}}
+\providecommand{\DIFdelend}{\protect\color{black}\hypersetup{linkcolor=blue,urlcolor=blue}}
+\providecommand{\DIFaddtext}[1]{\textcolor{blue}{\sf #1}}
+\providecommand{\DIFdeltext}[1]{\textcolor{red}{\footnotesize \sout{#1}}}
+
%DIF END COLOR PREAMBLE
\providecommand{\DIFaddtext}[1]{\textcolor{green}{\sf #1}}
\providecommand{\DIFdeltext}[1]{\textcolor{red}{\footnotesize \sout{#1}}}
diff --git a/fixupdiff.pl b/fixupdiff.pl
index e557e2b..5c82526 100644
--- a/fixupdiff.pl
+++ b/fixupdiff.pl
@@ -1,6 +1,7 @@
-my $bufferdiff="";
-my $diff="";
-my $buffer="";
+use strict;
+
+my $lstlisting=0;
+
while (<>) {
my $line = $_;
if (m/%DIFDELCMD\s+<\s+\\begin{lstlisting}/) {
@@ -15,60 +16,19 @@ while (<>) {
}
#print "%FIXED BY RULE 1\n";
}
- #In section headings, replace begin/end with begin/endFL,
- #but be careful in case some tag spills over to the next
- #line
- if (m/\\(section|subsection|subsubsection|paragraph)/ and m/DIF/) {
- my @list = split(/(\\DIF(?:add|del)(?:begin|end)(?:FL)?)/, $line, -1);
- #if there's only one tag, don't touch it:
- #matching one is on the other line
- if ($#list >= 5) {
- #if first tag is end, don't touch it - matching
- #begin is on the previous line
- if ($list[1] =~ m/begin$/) {
- $list[1] .= "FL";
- }
- #if last tag is begin, don't touch it - matching
- #end is on the next line
- if ($list[$#list - 1] =~ m/end$/) {
- $list[$#list - 1] .= "FL";
- }
- }
- for (my $i = 3; $i <= $#list - 3; $i += 2) {
- if (not $list[$i] =~ m/FL$/) {
- $list[$i] .= "FL";
- }
- }
- $line = join("", @list);
- #print "%FIXED BY RULE 2\n";
- }
- #detect where we have DIFbegin/end cross
- #enumerate/itemize environments and fix up
- if (m/\\DIF(?:add|del)(?:begin|end)/) {
- my @list = split(/(\\DIF(?:add|del)(?:begin|end)(?:FL)?)/, $line, -1);
- $diff = $list[$#list - 1];
- if ($diff =~ m/begin/) {
- $diff =~ s/begin/end/;
- } else {
- $diff = "";
- }
- }
- if ($diff ne "" and m/\\(?:begin|end){(?:enumerate|itemize)}$/ and not m/\\DIF/) {
- $buffer = $line;
- $bufferdiff = $diff;
- $line = "";
- #print "%BUFFERED BY RULE 3: $bufferdiff\n";
- }
- if ($buffer ne "" and $line ne "") {
- if (m/^(\\DIF(?:add|del)end(?:FL)?)/ and $bufferdiff ne $1) {
- $line =~ s/^(\\DIF(?:add|del)end(?:FL)?)//;
- $buffer =~ s/(\\(?:begin|end){(?:enumerate|itemize)})$/$bufferdiff$1/;
- #print "%FIXED BY RULE 3: $bufferdiff\n";
- }
- print $buffer;
- $buffer = "";
- $bufferdiff = "";
- }
+
+ # Too many \color directives (generated by DIFdel/addbegin/end)
+ # confuse xetex, producing errors:
+ # WARNING ** Color stack overflow. Just ignore.
+ # and resulting in corrupted color in output.
+ # As a work-around, detect cases where it's safe, and replace \color with
+ # \textcolor.
+ # As a result, number of \color directives goes does sufficiently
+ # enough to avoid the overflow error.
+
+ s/\\DIFdelbegin \\DIFdel{([^}]*)}\\DIFdelend/\\DIFdeltext{$1}/;
+ s/\\DIFaddbegin \\DIFadd{([^}]*)}\\DIFaddend/\\DIFaddtext{$1}/;
+
print $line;
if (m/%DIFDELCMD\s+<\s+\\end{lstlisting}/) {
print "}\n";