summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Build/source/texk/texlive/linked_scripts/Makefile.am1
-rw-r--r--Build/source/texk/texlive/linked_scripts/texdirflatten/texdirflatten293
-rw-r--r--Master/texmf-dist/doc/latex/texdirflatten/README43
-rw-r--r--Master/texmf-dist/doc/latex/texdirflatten/texdirflatten293
-rw-r--r--Master/texmf/doc/man/man1/texdirflatten.1176
-rwxr-xr-xMaster/tlpkg/bin/tlpkg-ctan-check2
-rwxr-xr-xMaster/tlpkg/libexec/ctan2tds2
-rw-r--r--Master/tlpkg/tlpsrc/collection-binextra.tlpsrc1
-rw-r--r--Master/tlpkg/tlpsrc/texdirflatten.tlpsrc2
9 files changed, 812 insertions, 1 deletions
diff --git a/Build/source/texk/texlive/linked_scripts/Makefile.am b/Build/source/texk/texlive/linked_scripts/Makefile.am
index d527ab3cf3c..963df8bd689 100644
--- a/Build/source/texk/texlive/linked_scripts/Makefile.am
+++ b/Build/source/texk/texlive/linked_scripts/Makefile.am
@@ -80,6 +80,7 @@ nobase_dist_script_SCRIPTS = \
splitindex/perl/splitindex.pl \
svn-multi/svn-multi.pl \
texcount/TeXcount.pl \
+ texdirflatten/texdirflatten \
texloganalyser/texloganalyser \
thumbpdf/thumbpdf.pl \
vpe/vpe.pl
diff --git a/Build/source/texk/texlive/linked_scripts/texdirflatten/texdirflatten b/Build/source/texk/texlive/linked_scripts/texdirflatten/texdirflatten
new file mode 100644
index 00000000000..c43b489f18e
--- /dev/null
+++ b/Build/source/texk/texlive/linked_scripts/texdirflatten/texdirflatten
@@ -0,0 +1,293 @@
+#! /usr/bin/perl
+
+=pod
+
+=head1 NAME
+
+B<texdirflatten> - Collects all components of a (La)TeX file in a
+single output directory -- i.e., flattens its hierarchy.
+
+=head1 SYNOPSIS
+
+texdirflatten -f input.tex [-o outputdir]
+
+=head1 DESCRIPTION
+
+It parses the source file, following its included children (La)TeX
+files recursively, to collect together its components, such as
+graphics and BiBTeX bibliography files in different directories.
+
+=for comment
+Run without parameters to see usage.
+
+=head1 OPTIONS
+
+=over
+
+=item B<-f> I<input.tex>
+
+Specifies input (La)TeX file.
+
+=item B<-o> I<outputdir>
+
+Directory to collect all files. B<texdirflatten> will copy each source
+file, graphics and bibliography file to this directory. It will be
+created if it is unexistent. If unspecified, it defaults to C<flat/>.
+
+=back
+
+=head1 EXAMPLES
+
+The following example scans C<manuscript.tex> in the current directory
+and gathers it and all its components in the C<submit_01/> directory:
+
+ $ texdirflatten -f manuscript.tex -o submit_01
+
+=head1 CAVEATS
+
+Please take backups before running this command. No warranties
+whatsoever provided.
+
+=head1 BUGS
+
+Bug reports and patches are welcome.
+
+=head1 AUTHOR
+
+Cengiz Gunay <cengique<AT>users.sf.net>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyleft 2003-2009, Cengiz Gunay
+
+This library is free software; you may redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
+
+# $Id: texdirflatten,v 1.1 2009/04/17 14:15:39 cengiz Exp $
+
+# TODO:
+#
+# - parse BIBINPUTS environment variable and search figures and such
+# there as well.
+
+package texdirflatten;
+
+use Getopt::Long qw(GetOptions);
+use Pod::Usage;
+use strict;
+
+# Global
+my $outputdir = "flat";
+my $file;
+my $help;
+
+# parse helpers
+my %texfiles;
+
+# GetOpt::Long::
+my $result = GetOptions ("output|o=s" => \$outputdir,
+ "file|f=s" => \$file,
+ "help|?" => \$help );
+
+
+#print "help: $help, file: $file\n";
+
+#print "poop: " . popfile('slkjs/lkjlsjd/saa.abc');
+#{
+# print ;
+#}
+
+pod2usage( -section => "SYNOPSIS") if ($file eq "" || $help);
+
+system "mkdir $outputdir" if (not -d $outputdir);
+
+# start recursing
+parseTeX($file, "");
+
+sub parseTeX {
+ my $file = shift;
+ my $inputdir = shift;
+
+ my @flats;
+ my @longs;
+ my $popped;
+
+ open my $FILE, $file or die "Cannot find file to read $file\n";
+ my $outfile = "$outputdir/" . popfile($file);
+ open my $COPY, ">$outfile" or die "Cannot write file $outfile\n";
+
+ # Read to whole file first, and then scan for regexps
+ my $contents = "";
+ while(<$FILE>) {
+ $contents = $contents . $_;
+ }
+ close $FILE;
+
+ # Look for graphics include statement
+ if ($contents =~ /\\input\@path{{([^}]*)}}/) {
+ $inputdir = $1;
+ print "Found input directory: $inputdir\n";
+ }
+
+ # Default value
+ #$inputdir = './' if (-z $inputdir);
+
+ # three cases: graphics, inputs and bibs
+
+ # an \includegraphics statement
+ @flats = ();
+ @longs = ();
+
+ $contents =~
+ s/\\includegraphics(\[[^\]]*\])?\{([^}]*)\}/"\\includegraphics" . $1 .
+ "{" . ($popped = popfile($2) and push @longs, $2 and push @flats,$popped and $popped) . "}"/egm;
+
+ if ($#flats > -1) {
+ my ($long, $flat);
+
+ foreach $long (@longs) {
+ $flat = shift @flats;
+ print "Found graphics: '$long'\n";
+
+ # convert LyX directory dots
+ $long =~ s/\\lyxdot /./g;
+
+ my $epsfile = $inputdir . $long;
+
+ if (system("cp $epsfile.eps $outputdir/$flat.eps") != 0) {
+ print "Cannot find $epsfile.eps!\n";
+ # if from figures dir, copy the EPS file as well
+ if ($long =~ /figures\//) {
+ $epsfile = $inputdir . $long;
+ } else {
+ $epsfile = $inputdir . '../figures/' . $long;
+ }
+
+ if (system("cp $epsfile.eps $outputdir/$flat.eps") != 0) {
+ print "Cannot find $epsfile.eps!\n";
+ if (system("cp $epsfile.pstex $outputdir/$flat.eps") != 0) {
+ die "Cannot find figure file '$epsfile'";
+ } else {
+ print "Found: '$epsfile.pstex'\n";
+ }
+ }
+ } else {
+ print "Found: '$epsfile.pstex'\n";
+ }
+
+ }
+ my $long = $2;
+
+ }
+
+ # an \input or \include statement
+ @flats = ();
+ @longs = ();
+ $contents =~
+ s/\\(input|include){([^}]*)}/"\\${1}{" .
+ ($popped = popfile($2) and push @longs, $2 and push @flats,$popped and $popped) . "}"/egm;
+
+ if ($#flats > 0) {
+ #print "Found " . scalar @longs . " items on line: '@flats'.\n";
+
+ my ($long, $flat);
+
+ foreach $long (@longs) {
+ $flat = shift @flats;
+ print "Found Input/Include: '$long'\n";
+ # recurse to parse that tex file unless it's done already
+
+ if (not exists $texfiles{$flat}) {
+ if (! -r $long ) {
+ if (-r $inputdir . $long) {
+ $long = $inputdir . $long;
+ } elsif (-r "$long.tex") {
+ $long .= '.tex';
+ }
+ }
+ $texfiles{$flat} = $long;
+ parseTeX($long, $inputdir); #later
+
+ }
+ }
+ }
+
+ replacebibs(\$contents, $inputdir);
+ #print "Writing to \"$outfile\"\n" .
+ # "----------------------------------------\n" .
+ # "$contents\n" .
+ # "----------------------------------------\n";
+
+ # write to flat copy
+ print $COPY $contents;
+
+
+ close $COPY;
+
+}
+
+# Return everything after the last /
+sub popfile {
+ my $file = shift (@_);
+
+ my @a = split /\//, $file;
+
+ #print "Popping $file... split: @a ($#a), pop: " . pop(@a) . "\n";
+ pop @a;
+}
+
+# get the bibliography files
+sub replacebibs {
+ my ($contentsref, $inputdir) = @_;
+ #my $contents = $$contentsref;
+ my $popped;
+
+ #print "bib contents: $contents\n";
+
+ local @::flats = ();
+ local @::longs = ();
+ local @::refs;
+
+ $" = ','; # set list item separator
+ # search for \bibliography statements
+ $$contentsref =~
+ s/\\bibliography(\[[^\]]*\])? {
+ (?{ @::refs = (); #print "Found bibliography!\n"; #initialize ref list
+ }) (?: \s* ([^}, ]+)(?=[,}]),?
+ (?{ # for each word do:
+ #local (@_flats, @_longs, @_refs);
+ #print "Word: \"$+\", ";
+ $popped = popfile($+); push @::longs, $+;
+ push @::flats,$popped; push @::refs, $popped;
+ }) )+ \s* }
+ (?{ #print "\n+++ $#::flats; $#::refs; $#::longs\n";
+ #push @::flats, @_flats; push @longs, @_longs; push @refs, @_refs;
+ #print "Refs: @::refs\n";
+ })/"\\bibliography$1" . "{@::refs}"/egmx;# &&
+ #print "bib contents: $$contentsref\n";
+ #print "\n*** $#::flats; $#::refs; $#::longs\n";
+ $" = ' '; # restore list item separator
+
+ if ($#::flats > 0) {
+ #print "Found " . scalar @::longs . " items on line: '@::flats'.\n";
+
+ my ($long, $flat);
+
+ foreach $long (@::longs) {
+ $flat = shift @::flats;
+ print "Found bib. file: '$long'\n";
+ # recurse to parse that tex file unless it's done already
+
+ # convert LyX directory dots
+ $long =~ s/\\lyxdot /./g;
+
+ my $bibfile = $inputdir . $long;
+
+ if (system("cp $bibfile.bib $outputdir/$flat.bib") != 0) {
+ die "Cannot find $bibfile.bib!\n";
+ }
+ }
+ }
+}
diff --git a/Master/texmf-dist/doc/latex/texdirflatten/README b/Master/texmf-dist/doc/latex/texdirflatten/README
new file mode 100644
index 00000000000..41568bcd9d3
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/texdirflatten/README
@@ -0,0 +1,43 @@
+NAME
+ texdirflatten - Collects all components of a (La)TeX file in a single
+ output directory -- i.e., flattens its hierarchy.
+
+SYNOPSIS
+ texdirflatten -f input.tex [-o outputdir]
+
+DESCRIPTION
+ It parses the source file, following its included children (La)TeX files
+ recursively, to collect together its components, such as graphics and
+ BiBTeX bibliography files in different directories.
+
+OPTIONS
+ -f *input.tex*
+ Specifies input (La)TeX file.
+
+ -o *outputdir*
+ Directory to collect all files. texdirflatten will copy each source
+ file, graphics and bibliography file to this directory. It will be
+ created if it is unexistent. If unspecified, it defaults to "flat/".
+
+EXAMPLES
+ The following example scans "manuscript.tex" in the current directory
+ and gathers it and all its components in the "submit_01/" directory:
+
+ $ texdirflatten -f manuscript.tex -o submit_01
+
+CAVEATS
+ Please take backups before running this command. No warranties
+ whatsoever provided.
+
+BUGS
+ Bug reports and patches are welcome.
+
+AUTHOR
+ Cengiz Gunay <cengique<AT>users.sf.net>
+
+COPYRIGHT AND LICENSE
+ Copyleft 2003-2009, Cengiz Gunay
+
+ This library is free software; you may redistribute it and/or modify it
+ under the same terms as Perl itself.
+
diff --git a/Master/texmf-dist/doc/latex/texdirflatten/texdirflatten b/Master/texmf-dist/doc/latex/texdirflatten/texdirflatten
new file mode 100644
index 00000000000..c43b489f18e
--- /dev/null
+++ b/Master/texmf-dist/doc/latex/texdirflatten/texdirflatten
@@ -0,0 +1,293 @@
+#! /usr/bin/perl
+
+=pod
+
+=head1 NAME
+
+B<texdirflatten> - Collects all components of a (La)TeX file in a
+single output directory -- i.e., flattens its hierarchy.
+
+=head1 SYNOPSIS
+
+texdirflatten -f input.tex [-o outputdir]
+
+=head1 DESCRIPTION
+
+It parses the source file, following its included children (La)TeX
+files recursively, to collect together its components, such as
+graphics and BiBTeX bibliography files in different directories.
+
+=for comment
+Run without parameters to see usage.
+
+=head1 OPTIONS
+
+=over
+
+=item B<-f> I<input.tex>
+
+Specifies input (La)TeX file.
+
+=item B<-o> I<outputdir>
+
+Directory to collect all files. B<texdirflatten> will copy each source
+file, graphics and bibliography file to this directory. It will be
+created if it is unexistent. If unspecified, it defaults to C<flat/>.
+
+=back
+
+=head1 EXAMPLES
+
+The following example scans C<manuscript.tex> in the current directory
+and gathers it and all its components in the C<submit_01/> directory:
+
+ $ texdirflatten -f manuscript.tex -o submit_01
+
+=head1 CAVEATS
+
+Please take backups before running this command. No warranties
+whatsoever provided.
+
+=head1 BUGS
+
+Bug reports and patches are welcome.
+
+=head1 AUTHOR
+
+Cengiz Gunay <cengique<AT>users.sf.net>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyleft 2003-2009, Cengiz Gunay
+
+This library is free software; you may redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
+
+# $Id: texdirflatten,v 1.1 2009/04/17 14:15:39 cengiz Exp $
+
+# TODO:
+#
+# - parse BIBINPUTS environment variable and search figures and such
+# there as well.
+
+package texdirflatten;
+
+use Getopt::Long qw(GetOptions);
+use Pod::Usage;
+use strict;
+
+# Global
+my $outputdir = "flat";
+my $file;
+my $help;
+
+# parse helpers
+my %texfiles;
+
+# GetOpt::Long::
+my $result = GetOptions ("output|o=s" => \$outputdir,
+ "file|f=s" => \$file,
+ "help|?" => \$help );
+
+
+#print "help: $help, file: $file\n";
+
+#print "poop: " . popfile('slkjs/lkjlsjd/saa.abc');
+#{
+# print ;
+#}
+
+pod2usage( -section => "SYNOPSIS") if ($file eq "" || $help);
+
+system "mkdir $outputdir" if (not -d $outputdir);
+
+# start recursing
+parseTeX($file, "");
+
+sub parseTeX {
+ my $file = shift;
+ my $inputdir = shift;
+
+ my @flats;
+ my @longs;
+ my $popped;
+
+ open my $FILE, $file or die "Cannot find file to read $file\n";
+ my $outfile = "$outputdir/" . popfile($file);
+ open my $COPY, ">$outfile" or die "Cannot write file $outfile\n";
+
+ # Read to whole file first, and then scan for regexps
+ my $contents = "";
+ while(<$FILE>) {
+ $contents = $contents . $_;
+ }
+ close $FILE;
+
+ # Look for graphics include statement
+ if ($contents =~ /\\input\@path{{([^}]*)}}/) {
+ $inputdir = $1;
+ print "Found input directory: $inputdir\n";
+ }
+
+ # Default value
+ #$inputdir = './' if (-z $inputdir);
+
+ # three cases: graphics, inputs and bibs
+
+ # an \includegraphics statement
+ @flats = ();
+ @longs = ();
+
+ $contents =~
+ s/\\includegraphics(\[[^\]]*\])?\{([^}]*)\}/"\\includegraphics" . $1 .
+ "{" . ($popped = popfile($2) and push @longs, $2 and push @flats,$popped and $popped) . "}"/egm;
+
+ if ($#flats > -1) {
+ my ($long, $flat);
+
+ foreach $long (@longs) {
+ $flat = shift @flats;
+ print "Found graphics: '$long'\n";
+
+ # convert LyX directory dots
+ $long =~ s/\\lyxdot /./g;
+
+ my $epsfile = $inputdir . $long;
+
+ if (system("cp $epsfile.eps $outputdir/$flat.eps") != 0) {
+ print "Cannot find $epsfile.eps!\n";
+ # if from figures dir, copy the EPS file as well
+ if ($long =~ /figures\//) {
+ $epsfile = $inputdir . $long;
+ } else {
+ $epsfile = $inputdir . '../figures/' . $long;
+ }
+
+ if (system("cp $epsfile.eps $outputdir/$flat.eps") != 0) {
+ print "Cannot find $epsfile.eps!\n";
+ if (system("cp $epsfile.pstex $outputdir/$flat.eps") != 0) {
+ die "Cannot find figure file '$epsfile'";
+ } else {
+ print "Found: '$epsfile.pstex'\n";
+ }
+ }
+ } else {
+ print "Found: '$epsfile.pstex'\n";
+ }
+
+ }
+ my $long = $2;
+
+ }
+
+ # an \input or \include statement
+ @flats = ();
+ @longs = ();
+ $contents =~
+ s/\\(input|include){([^}]*)}/"\\${1}{" .
+ ($popped = popfile($2) and push @longs, $2 and push @flats,$popped and $popped) . "}"/egm;
+
+ if ($#flats > 0) {
+ #print "Found " . scalar @longs . " items on line: '@flats'.\n";
+
+ my ($long, $flat);
+
+ foreach $long (@longs) {
+ $flat = shift @flats;
+ print "Found Input/Include: '$long'\n";
+ # recurse to parse that tex file unless it's done already
+
+ if (not exists $texfiles{$flat}) {
+ if (! -r $long ) {
+ if (-r $inputdir . $long) {
+ $long = $inputdir . $long;
+ } elsif (-r "$long.tex") {
+ $long .= '.tex';
+ }
+ }
+ $texfiles{$flat} = $long;
+ parseTeX($long, $inputdir); #later
+
+ }
+ }
+ }
+
+ replacebibs(\$contents, $inputdir);
+ #print "Writing to \"$outfile\"\n" .
+ # "----------------------------------------\n" .
+ # "$contents\n" .
+ # "----------------------------------------\n";
+
+ # write to flat copy
+ print $COPY $contents;
+
+
+ close $COPY;
+
+}
+
+# Return everything after the last /
+sub popfile {
+ my $file = shift (@_);
+
+ my @a = split /\//, $file;
+
+ #print "Popping $file... split: @a ($#a), pop: " . pop(@a) . "\n";
+ pop @a;
+}
+
+# get the bibliography files
+sub replacebibs {
+ my ($contentsref, $inputdir) = @_;
+ #my $contents = $$contentsref;
+ my $popped;
+
+ #print "bib contents: $contents\n";
+
+ local @::flats = ();
+ local @::longs = ();
+ local @::refs;
+
+ $" = ','; # set list item separator
+ # search for \bibliography statements
+ $$contentsref =~
+ s/\\bibliography(\[[^\]]*\])? {
+ (?{ @::refs = (); #print "Found bibliography!\n"; #initialize ref list
+ }) (?: \s* ([^}, ]+)(?=[,}]),?
+ (?{ # for each word do:
+ #local (@_flats, @_longs, @_refs);
+ #print "Word: \"$+\", ";
+ $popped = popfile($+); push @::longs, $+;
+ push @::flats,$popped; push @::refs, $popped;
+ }) )+ \s* }
+ (?{ #print "\n+++ $#::flats; $#::refs; $#::longs\n";
+ #push @::flats, @_flats; push @longs, @_longs; push @refs, @_refs;
+ #print "Refs: @::refs\n";
+ })/"\\bibliography$1" . "{@::refs}"/egmx;# &&
+ #print "bib contents: $$contentsref\n";
+ #print "\n*** $#::flats; $#::refs; $#::longs\n";
+ $" = ' '; # restore list item separator
+
+ if ($#::flats > 0) {
+ #print "Found " . scalar @::longs . " items on line: '@::flats'.\n";
+
+ my ($long, $flat);
+
+ foreach $long (@::longs) {
+ $flat = shift @::flats;
+ print "Found bib. file: '$long'\n";
+ # recurse to parse that tex file unless it's done already
+
+ # convert LyX directory dots
+ $long =~ s/\\lyxdot /./g;
+
+ my $bibfile = $inputdir . $long;
+
+ if (system("cp $bibfile.bib $outputdir/$flat.bib") != 0) {
+ die "Cannot find $bibfile.bib!\n";
+ }
+ }
+ }
+}
diff --git a/Master/texmf/doc/man/man1/texdirflatten.1 b/Master/texmf/doc/man/man1/texdirflatten.1
new file mode 100644
index 00000000000..0da2a4fa74f
--- /dev/null
+++ b/Master/texmf/doc/man/man1/texdirflatten.1
@@ -0,0 +1,176 @@
+.\" Automatically generated by Pod::Man 2.1801 (Pod::Simple 3.05)
+.\"
+.\" Standard preamble:
+.\" ========================================================================
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\" Set up some character translations and predefined strings. \*(-- will
+.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
+.\" double quote, and \*(R" will give a right double quote. \*(C+ will
+.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
+.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
+.\" nothing in troff, for use with C<>.
+.tr \(*W-
+.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
+.ie n \{\
+. ds -- \(*W-
+. ds PI pi
+. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
+. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
+. ds L" ""
+. ds R" ""
+. ds C` ""
+. ds C' ""
+'br\}
+.el\{\
+. ds -- \|\(em\|
+. ds PI \(*p
+. ds L" ``
+. ds R" ''
+'br\}
+.\"
+.\" Escape single quotes in literal strings from groff's Unicode transform.
+.ie \n(.g .ds Aq \(aq
+.el .ds Aq '
+.\"
+.\" If the F register is turned on, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
+.\" entries marked with X<> in POD. Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.ie \nF \{\
+. de IX
+. tm Index:\\$1\t\\n%\t"\\$2"
+..
+. nr % 0
+. rr F
+.\}
+.el \{\
+. de IX
+..
+.\}
+.\"
+.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
+.\" Fear. Run. Save yourself. No user-serviceable parts.
+. \" fudge factors for nroff and troff
+.if n \{\
+. ds #H 0
+. ds #V .8m
+. ds #F .3m
+. ds #[ \f1
+. ds #] \fP
+.\}
+.if t \{\
+. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
+. ds #V .6m
+. ds #F 0
+. ds #[ \&
+. ds #] \&
+.\}
+. \" simple accents for nroff and troff
+.if n \{\
+. ds ' \&
+. ds ` \&
+. ds ^ \&
+. ds , \&
+. ds ~ ~
+. ds /
+.\}
+.if t \{\
+. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
+. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
+. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
+. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
+. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
+. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
+.\}
+. \" troff and (daisy-wheel) nroff accents
+.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
+.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
+.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
+.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
+.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
+.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
+.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
+.ds ae a\h'-(\w'a'u*4/10)'e
+.ds Ae A\h'-(\w'A'u*4/10)'E
+. \" corrections for vroff
+.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
+.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
+. \" for low resolution devices (crt and lpr)
+.if \n(.H>23 .if \n(.V>19 \
+\{\
+. ds : e
+. ds 8 ss
+. ds o a
+. ds d- d\h'-1'\(ga
+. ds D- D\h'-1'\(hy
+. ds th \o'bp'
+. ds Th \o'LP'
+. ds ae ae
+. ds Ae AE
+.\}
+.rm #[ #] #H #V #F C
+.\" ========================================================================
+.\"
+.IX Title "TEXDIRFLATTEN 1"
+.TH TEXDIRFLATTEN 1 "2009-04-17" "perl v5.10.0" "User Contributed Perl Documentation"
+.\" For nroff, turn off justification. Always turn off hyphenation; it makes
+.\" way too many mistakes in technical documents.
+.if n .ad l
+.nh
+.SH "NAME"
+\&\fBtexdirflatten\fR \- Collects all components of a (La)TeX file in a
+single output directory \*(-- i.e., flattens its hierarchy.
+.SH "SYNOPSIS"
+.IX Header "SYNOPSIS"
+texdirflatten \-f input.tex [\-o outputdir]
+.SH "DESCRIPTION"
+.IX Header "DESCRIPTION"
+It parses the source file, following its included children (La)TeX
+files recursively, to collect together its components, such as
+graphics and BiBTeX bibliography files in different directories.
+.SH "OPTIONS"
+.IX Header "OPTIONS"
+.IP "\fB\-f\fR \fIinput.tex\fR" 4
+.IX Item "-f input.tex"
+Specifies input (La)TeX file.
+.IP "\fB\-o\fR \fIoutputdir\fR" 4
+.IX Item "-o outputdir"
+Directory to collect all files. \fBtexdirflatten\fR will copy each source
+file, graphics and bibliography file to this directory. It will be
+created if it is unexistent. If unspecified, it defaults to \f(CW\*(C`flat/\*(C'\fR.
+.SH "EXAMPLES"
+.IX Header "EXAMPLES"
+The following example scans \f(CW\*(C`manuscript.tex\*(C'\fR in the current directory
+and gathers it and all its components in the \f(CW\*(C`submit_01/\*(C'\fR directory:
+.PP
+.Vb 1
+\& $ texdirflatten \-f manuscript.tex \-o submit_01
+.Ve
+.SH "CAVEATS"
+.IX Header "CAVEATS"
+Please take backups before running this command. No warranties
+whatsoever provided.
+.SH "BUGS"
+.IX Header "BUGS"
+Bug reports and patches are welcome.
+.SH "AUTHOR"
+.IX Header "AUTHOR"
+Cengiz Gunay <cengique<\s-1AT\s0>users.sf.net>
+.SH "COPYRIGHT AND LICENSE"
+.IX Header "COPYRIGHT AND LICENSE"
+Copyleft 2003\-2009, Cengiz Gunay
+.PP
+This library is free software; you may redistribute it and/or modify
+it under the same terms as Perl itself.
diff --git a/Master/tlpkg/bin/tlpkg-ctan-check b/Master/tlpkg/bin/tlpkg-ctan-check
index cb209ea98cb..9638176c03c 100755
--- a/Master/tlpkg/bin/tlpkg-ctan-check
+++ b/Master/tlpkg/bin/tlpkg-ctan-check
@@ -218,7 +218,7 @@ my @WorkingTLP = qw(
tamethebeast tdclock tdsfrmath
ted templates-fenn templates-sommer tengwarscript
tensor termcal termlist teubner tex-ewd tex-gyre texcount
- texilikecover texloganalyser texmate texments
+ texdirflatten texilikecover texloganalyser texmate texments
texpower texshade
textcase textfit textopo textpath textpos
theoremref thesis-titlepage-fhac
diff --git a/Master/tlpkg/libexec/ctan2tds b/Master/tlpkg/libexec/ctan2tds
index e9edb48591e..9466ac973e1 100755
--- a/Master/tlpkg/libexec/ctan2tds
+++ b/Master/tlpkg/libexec/ctan2tds
@@ -1441,6 +1441,7 @@ $standardxmt='\.xmt';
'purifyeps' => 'purifyeps$',
'svn-multi' => 'svn-multi\.pl$',
'texcount' => '\.pl$',
+ 'texdirflatten' => 'texdirflatten\$',
'texloganalyser' => 'texloganalyser',
'vpe' => '\.pl$',
);
@@ -1449,6 +1450,7 @@ $standardxmt='\.xmt';
%specialmans = (
'pkfix-helper' => 'pkfix-helper.1',
'purifyeps' => 'purifyeps.1',
+ 'texdirflatten' => 'texdirflatten.1',
);
diff --git a/Master/tlpkg/tlpsrc/collection-binextra.tlpsrc b/Master/tlpkg/tlpsrc/collection-binextra.tlpsrc
index baaa2cc18f4..06af9ac5950 100644
--- a/Master/tlpkg/tlpsrc/collection-binextra.tlpsrc
+++ b/Master/tlpkg/tlpsrc/collection-binextra.tlpsrc
@@ -38,5 +38,6 @@ depend pkfix-helper
depend purifyeps
depend synctex
depend texcount
+depend texdirflatten
depend texloganalyser
depend xindy
diff --git a/Master/tlpkg/tlpsrc/texdirflatten.tlpsrc b/Master/tlpkg/tlpsrc/texdirflatten.tlpsrc
new file mode 100644
index 00000000000..e60f4d26b22
--- /dev/null
+++ b/Master/tlpkg/tlpsrc/texdirflatten.tlpsrc
@@ -0,0 +1,2 @@
+name texdirflatten
+category Package