summaryrefslogtreecommitdiff
path: root/support/texdirflatten
diff options
context:
space:
mode:
authorNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
committerNorbert Preining <norbert@preining.info>2019-09-02 13:46:59 +0900
commite0c6872cf40896c7be36b11dcc744620f10adf1d (patch)
tree60335e10d2f4354b0674ec22d7b53f0f8abee672 /support/texdirflatten
Initial commit
Diffstat (limited to 'support/texdirflatten')
-rw-r--r--support/texdirflatten/README74
-rwxr-xr-xsupport/texdirflatten/texdirflatten411
-rw-r--r--support/texdirflatten/texdirflatten.1216
3 files changed, 701 insertions, 0 deletions
diff --git a/support/texdirflatten/README b/support/texdirflatten/README
new file mode 100644
index 0000000000..840dd0454f
--- /dev/null
+++ b/support/texdirflatten/README
@@ -0,0 +1,74 @@
+NAME
+ texdirflatten - Collects all components of a (La)TeX file in a single
+ output directory -- i.e., flattens its hierarchy.
+
+SYNOPSIS
+ texdirflatten [-1|--onetex] [-f|--file input.tex] [-o outputdir]
+ [--imgexts .ext1,.ext2,...] [--debug] [-V|--version] [-?|--help]
+
+DESCRIPTION
+ This Perl script parses a LaTeX file recursively, scanning all child
+ files, and collects details of any included and other data files, such
+ as graphics and BiBTeX bibliography files. These component files, are
+ then all put into a single directory (thus "flattening" the document's
+ directory tree). This is useful in distributing manuscripts to
+ collaborators or in submitting to journals.
+
+OPTIONS
+ --file, -f *input.tex*
+ Specifies input (La)TeX file.
+
+ --onetex, -1
+ If specified, produces a single TeX file by expanding all \input and
+ \include commands in place.
+
+ --output, -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/".
+
+ --imgexts *.ext1,.ext2[,...]*
+ Prepends to the prioritized list of image extensions to search when
+ trying to find the image to copy to output folder. The first file
+ with the extension found will be copied and search stopped. Default
+ order is "", ".eps", ".pdf", ".pstex" (note that it includes files
+ with no extension). If using pdflatex, one may want to add PDF
+ before EPS with "--imgexts .pdf". Don't forget the dot before the
+ extension!
+
+ --debug
+ Enables copious amounts of debugging output - useful if something is
+ going wrong.
+
+ --version, -V
+ Displays the current version number and the usage and exits.
+
+ --help, -?
+ Show this manual page.
+
+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.
+
+ You may need to run "epstopdf" on EPS files if you are using "pdflatex":
+
+ $ for i in *.eps; do epstopdf $i; done
+
+BUGS
+ Bug reports and patches are welcome.
+
+AUTHOR
+ Cengiz Gunay <cengique<AT>users.sf.net>
+
+COPYRIGHT AND LICENSE
+ Copyleft 2003-2017, 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/support/texdirflatten/texdirflatten b/support/texdirflatten/texdirflatten
new file mode 100755
index 0000000000..e820e182a4
--- /dev/null
+++ b/support/texdirflatten/texdirflatten
@@ -0,0 +1,411 @@
+#! /usr/bin/env perl
+
+# Use:
+# $ perldoc texdirflatten
+# to see embedded documentation. Alternatively, you can create manual
+# or HTML pages using pod2man and pod2html.
+
+=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 [-1|--onetex] [-f|--file input.tex] [-o outputdir]
+ [--imgexts .ext1,.ext2,...] [--debug] [-V|--version] [-?|--help]
+
+=head1 DESCRIPTION
+
+This Perl script parses a LaTeX file recursively, scanning all child
+files, and collects details of any included and other data files, such
+as graphics and BiBTeX bibliography files. These component files, are
+then all put into a single directory (thus "flattening" the document's
+directory tree). This is useful in distributing manuscripts to
+collaborators or in submitting to journals.
+
+=for comment
+Run without parameters to see usage.
+
+=head1 OPTIONS
+
+=over
+
+=item B<--file>, B<-f> I<input.tex>
+
+Specifies input (La)TeX file.
+
+=item B<--onetex>, B<-1>
+
+If specified, produces a single TeX file by expanding all \input and
+\include commands in place.
+
+=item B<--output>, 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/>.
+
+=item B<--imgexts> I<.ext1,.ext2[,...]>
+
+Prepends to the prioritized list of image extensions to search when
+trying to find the image to copy to output folder. The first file with
+the extension found will be copied and search stopped. Default order
+is C<"", ".eps", ".pdf", ".pstex"> (note that it includes files with
+no extension). If using pdflatex, one may want to add PDF before EPS
+with C<--imgexts .pdf>. Don't forget the dot before the extension!
+
+=item B<--debug>
+
+Enables copious amounts of debugging output - useful if something is going wrong.
+
+=item B<--version>, B<-V>
+
+Displays the current version number and the usage and exits.
+
+=item B<--help>, B<-?>
+
+Show this manual page.
+
+=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.
+
+You may need to run C<epstopdf> on EPS files if you are using C<pdflatex>:
+
+ $ for i in *.eps; do epstopdf $i; done
+
+=head1 BUGS
+
+Bug reports and patches are welcome.
+
+=head1 AUTHOR
+
+Cengiz Gunay <cengique<AT>users.sf.net>
+
+=head1 COPYRIGHT AND LICENSE
+
+Copyleft 2003-2017, Cengiz Gunay
+
+This library is free software; you may redistribute it and/or modify
+it under the same terms as Perl itself.
+
+=cut
+
+# TODO:
+# - parse BIBINPUTS environment variable and search figures and such
+# there as well.
+# - also copy bibtex style file
+
+package texdirflatten;
+
+use Getopt::Long qw(GetOptions);
+use Pod::Usage;
+use strict;
+use warnings;
+use re 'eval';
+
+# Global
+my $outputdir = "flat"; # Output directory
+my $file = ""; # File to read
+my @imgexts = ("", ".eps", ".pdf", ".pstex"); # Ordered list of image extensions to search and copy
+my $imgexts_pre; # Prepend to @imgexts
+my $onetex = 0; # Indicates all input and include commands be expanded
+my $version = "1.3"; # 2017-02-02
+my $DEBUG = 0; # Enable debugging output
+my $help;
+
+# parse helpers
+my %texfiles;
+
+# GetOpt::Long::
+my $result = GetOptions ("output|o=s" => \$outputdir,
+ "onetex|1" => \$onetex,
+ "file|f=s" => \$file,
+ "imgexts=s" => \$imgexts_pre,
+ "debug" => \$DEBUG,
+ "version|V" => sub { print "texdirflatten version $version\n";
+ pod2usage( -section => "SYNOPSIS"); },
+ "help|?" => \$help );
+
+# regexp for none or an even number of backslashes (\):
+my $unescaped =
+ '(?<! \\\\)(?(?= \\\\) (?: \\\\\\\\)* )?';
+
+# counter for files translated (like LyX does)
+$::filecount = 0;
+
+pod2usage( -verbose => 2 ) if ($help);
+
+pod2usage( -section => "SYNOPSIS") if ($file eq "");
+
+if ($imgexts_pre) {
+ unshift(@imgexts, split(/,/, $imgexts_pre));
+ print "imgexts: ". join(",", @imgexts) . "\n" if $DEBUG;
+}
+
+system "mkdir $outputdir" if (not -d $outputdir);
+
+# start recursing
+parseTeX($file, "", popfile($file), 0);
+
+sub parseTeX {
+ my $file = shift;
+ my $inputdir = shift;
+ my $outfile = "$outputdir/" . shift;
+ my $level = shift;
+
+ # Add a proper TeX suffix if it's missing
+ $outfile .= '.tex' if ! ($outfile =~ /\.tex\s*$/i );
+
+ my @flats;
+ my @longs;
+ my $popped;
+
+ open my $FILE, $file or die "Cannot find file to read $file\n";
+
+ # Read to whole file first, and then scan for regexps
+ my $contents = "";
+ while(<$FILE>) {
+ $contents = $contents . $_;
+ }
+ close $FILE;
+
+ ## First, remove comments so that input commands inside are ignored.
+ # Also remove trailing newline and all whitespace at the beginning
+ # of the following line like TeX does it. Only for %'s following
+ # the proper backslash pattern.
+ $contents =~ s/( $unescaped )\%.*?\n[ \t]*/$1/gx;
+
+ # Look for graphics include statement
+ if ($contents =~ /\\input\@path\{\{([^}]*)\}\}/) {
+ $inputdir = $1;
+ print "Found input directory: $inputdir\n" if $DEBUG;
+ }
+
+ print "Parsing '$file' in directory '$inputdir'\n";
+
+ # Default value
+ #$inputdir = './' if (-z $inputdir);
+
+ # three cases: graphics, inputs and bibs
+
+ # an \includegraphics statement
+ @::flats = ();
+ @::longs = ();
+ #$::popped = "";
+
+ $contents =~
+ s/\\includegraphics(\[[^\]]*\])?\{([^}]*)\}
+ (?{ $::popped = flattenfilename($2);
+ push @::longs, $2; push @::flats, $::popped })
+ /\\includegraphics$1\{$::popped\}/gmx;
+
+ if ($#::flats > -1) {
+ my ($long, $flat);
+
+ foreach $long (@::longs) {
+ $flat = shift @::flats;
+
+ # convert LyX directory dots
+ $long =~ s/\\lyxdot /./g;
+ $flat =~ s/\\lyxdot /./g;
+
+ print "Looking for graphics: '$long'\n" if $DEBUG;
+
+ my @dirs = ("", "$inputdir", $inputdir . '../figures/');
+
+ seekfile($long, $flat, \@imgexts,
+ ["", "$inputdir", $inputdir . '../figures/']);
+
+ }
+ }
+
+ # Must do bibs before input commands because, when expanded, they
+ # add new bibs inside.
+ replacebibs(\$contents, $inputdir);
+
+ # an \input or \include statement
+ @flats = ();
+ @longs = ();
+ $contents =~
+ s/\\(input|include)\{([^}]*)\}/"\\${1}\{" .
+ ($popped = flattenfilename($2) and push @longs, $2 and push @flats,$popped and $popped)
+ . "\}"/egm;
+
+ if ($#flats > -1) {
+ #print "Found " . scalar @longs . " items on line: '@flats'.\n";
+
+ my ($long, $flat);
+
+ foreach $long (@longs) {
+ $flat = shift @flats;
+ print "Found Input/Include: '$long'\n" if $DEBUG;
+ # 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;
+ my $newcontents = parseTeX($long, basedir($long), $flat, $level + 1); #later
+ if ( $onetex ) {
+ # If specified, expand inclusion directives
+ die "Failed to find input/include to expand for '$flat'!\n"
+ if (! ( $contents =~
+ s/\\(input|include) \{ \Q$flat\E \}
+ (?{ print "===Found \\$1\{$flat\} to expand.\n" if $DEBUG; })
+ / ($1 eq 'include' ? "\\clearpage\n" : '') . "$newcontents"/gxem ) );
+ }
+ }
+ }
+ }
+
+ #print "Writing to \"$outfile\"\n" .
+ # "----------------------------------------\n" .
+ # "$contents\n" .
+ # "----------------------------------------\n";
+
+ if (! $onetex || $level == 0) { # do output at zero recurse level
+ # open flat output file
+ open my $COPY, ">$outfile" or die "Cannot write file $outfile\n";
+
+ # write to flat copy
+ print $COPY $contents;
+
+ close $COPY;
+ } else {
+ return $contents;
+ }
+}
+
+# Look for file to copy
+sub seekfile {
+ my ($file, $dest, $exts, $dirs) = @_;
+ my @exts = @$exts;
+ my @dirs = @$dirs;
+
+ OUT: foreach my $dir (@dirs) {
+ foreach my $ext (@exts) {
+ my $tryfile = "$dir$file$ext";
+ if (-r $tryfile) {
+ # add the extension to $dest only if it hasn't have any dots
+ #(! ($dest =~ /\./)) ? $ext : ""; => better not to have this
+ my $dext = $ext;
+
+ if (system("cp $tryfile $outputdir/$dest$dext") != 0) {
+ die "Cannot copy $tryfile!\n";
+ }
+ # If we found it, then get out of the loop
+ print "Copied: '$tryfile' (ext: $ext) -> '$dest$dext'\n" if $DEBUG;
+ last OUT;
+ }
+ }
+ }
+}
+
+# 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;
+}
+
+# Make a new file by flattening directory names
+sub flattenfilename {
+ local $_ = shift;
+
+ # convert slashes to pluses, dots to Xs
+ tr|/|+|;
+ tr|\.|X|;
+
+ # add a unique number at the beginning so files don't start with a
+ # dot
+ $_ = sprintf("%03d_", ++$::filecount) . "$_";
+
+ print "===Flattened file to '$_'\n" if $DEBUG;
+
+ return $_;
+}
+
+sub basedir {
+ my $file = shift (@_);
+
+ my @a = split /\//, $file;
+
+ #print "Popping $file... split: @a ($#a), pop: " . pop(@a) . "\n";
+ pop @a; # remove file part
+ my $basedir = join('/', @a); # combine the rest with /'s
+ $basedir .= '/' if (! $basedir =~ /^$/); # add a trailing / if not empty
+ $basedir;
+}
+
+# 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 = flattenfilename($+); 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 > -1) {
+ #print "Found " . scalar @::longs . " items on line: '@::flats'.\n";
+
+ my ($long, $flat);
+
+ foreach $long (@::longs) {
+ $flat = shift @::flats;
+ print "Found bib. file: '$long'\n" if $DEBUG;
+ # recurse to parse that tex file unless it's done already
+
+ # convert LyX directory dots
+ $long =~ s/\\lyxdot /./g;
+
+ seekfile($long, "$flat", [".bib"],
+ ["", "$inputdir"]);
+ }
+ }
+}
diff --git a/support/texdirflatten/texdirflatten.1 b/support/texdirflatten/texdirflatten.1
new file mode 100644
index 0000000000..53778fe4c9
--- /dev/null
+++ b/support/texdirflatten/texdirflatten.1
@@ -0,0 +1,216 @@
+.\" Automatically generated by Pod::Man 2.28 (Pod::Simple 3.29)
+.\"
+.\" Standard preamble:
+.\" ========================================================================
+.de Sp \" Vertical space (when we can't use .PP)
+.if t .sp .5v
+.if n .sp
+..
+.de Vb \" Begin verbatim text
+.ft CW
+.nf
+.ne \\$1
+..
+.de Ve \" End verbatim text
+.ft R
+.fi
+..
+.\" Set up some character translations and predefined strings. \*(-- will
+.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
+.\" double quote, and \*(R" will give a right double quote. \*(C+ will
+.\" give a nicer C++. Capital omega is used to do unbreakable dashes and
+.\" therefore won't be available. \*(C` and \*(C' expand to `' in nroff,
+.\" nothing in troff, for use with C<>.
+.tr \(*W-
+.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
+.ie n \{\
+. ds -- \(*W-
+. ds PI pi
+. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
+. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
+. ds L" ""
+. ds R" ""
+. ds C` ""
+. ds C' ""
+'br\}
+.el\{\
+. ds -- \|\(em\|
+. ds PI \(*p
+. ds L" ``
+. ds R" ''
+. ds C`
+. ds C'
+'br\}
+.\"
+.\" Escape single quotes in literal strings from groff's Unicode transform.
+.ie \n(.g .ds Aq \(aq
+.el .ds Aq '
+.\"
+.\" If the F register is turned on, we'll generate index entries on stderr for
+.\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index
+.\" entries marked with X<> in POD. Of course, you'll have to process the
+.\" output yourself in some meaningful fashion.
+.\"
+.\" Avoid warning from groff about undefined register 'F'.
+.de IX
+..
+.nr rF 0
+.if \n(.g .if rF .nr rF 1
+.if (\n(rF:(\n(.g==0)) \{
+. if \nF \{
+. de IX
+. tm Index:\\$1\t\\n%\t"\\$2"
+..
+. if !\nF==2 \{
+. nr % 0
+. nr F 2
+. \}
+. \}
+.\}
+.rr rF
+.\"
+.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
+.\" Fear. Run. Save yourself. No user-serviceable parts.
+. \" fudge factors for nroff and troff
+.if n \{\
+. ds #H 0
+. ds #V .8m
+. ds #F .3m
+. ds #[ \f1
+. ds #] \fP
+.\}
+.if t \{\
+. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
+. ds #V .6m
+. ds #F 0
+. ds #[ \&
+. ds #] \&
+.\}
+. \" simple accents for nroff and troff
+.if n \{\
+. ds ' \&
+. ds ` \&
+. ds ^ \&
+. ds , \&
+. ds ~ ~
+. ds /
+.\}
+.if t \{\
+. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
+. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
+. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
+. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
+. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
+. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
+.\}
+. \" troff and (daisy-wheel) nroff accents
+.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
+.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
+.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
+.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
+.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
+.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
+.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
+.ds ae a\h'-(\w'a'u*4/10)'e
+.ds Ae A\h'-(\w'A'u*4/10)'E
+. \" corrections for vroff
+.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
+.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
+. \" for low resolution devices (crt and lpr)
+.if \n(.H>23 .if \n(.V>19 \
+\{\
+. ds : e
+. ds 8 ss
+. ds o a
+. ds d- d\h'-1'\(ga
+. ds D- D\h'-1'\(hy
+. ds th \o'bp'
+. ds Th \o'LP'
+. ds ae ae
+. ds Ae AE
+.\}
+.rm #[ #] #H #V #F C
+.\" ========================================================================
+.\"
+.IX Title "TEXDIRFLATTEN 1"
+.TH TEXDIRFLATTEN 1 "2017-07-03" "texdirflatten-v1.3" "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"
+texdirflatten \- Collects all components of a (La)TeX file in a
+single output directory \-\- i.e., flattens its hierarchy.
+.SH "SYNOPSIS"
+.IX Header "SYNOPSIS"
+texdirflatten [\-1|\-\-onetex] [\-f|\-\-file input.tex] [\-o outputdir]
+ [\-\-imgexts .ext1,.ext2,...] [\-\-debug] [\-V|\-\-version] [\-?|\-\-help]
+.SH "DESCRIPTION"
+.IX Header "DESCRIPTION"
+This Perl script parses a LaTeX file recursively, scanning all child
+files, and collects details of any included and other data files, such
+as graphics and BiBTeX bibliography files. These component files, are
+then all put into a single directory (thus \*(L"flattening\*(R" the document's
+directory tree). This is useful in distributing manuscripts to
+collaborators or in submitting to journals.
+.SH "OPTIONS"
+.IX Header "OPTIONS"
+.IP "\fB\-\-file\fR, \fB\-f\fR \fIinput.tex\fR" 4
+.IX Item "--file, -f input.tex"
+Specifies input (La)TeX file.
+.IP "\fB\-\-onetex\fR, \fB\-1\fR" 4
+.IX Item "--onetex, -1"
+If specified, produces a single TeX file by expanding all \einput and
+\&\einclude commands in place.
+.IP "\fB\-\-output\fR, \fB\-o\fR \fIoutputdir\fR" 4
+.IX Item "--output, -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.
+.IP "\fB\-\-imgexts\fR \fI.ext1,.ext2[,...]\fR" 4
+.IX Item "--imgexts .ext1,.ext2[,...]"
+Prepends to the prioritized list of image extensions to search when
+trying to find the image to copy to output folder. The first file with
+the extension found will be copied and search stopped. Default order
+is \f(CW"", ".eps", ".pdf", ".pstex"\fR (note that it includes files with
+no extension). If using pdflatex, one may want to add \s-1PDF\s0 before \s-1EPS\s0
+with \f(CW\*(C`\-\-imgexts .pdf\*(C'\fR. Don't forget the dot before the extension!
+.IP "\fB\-\-debug\fR" 4
+.IX Item "--debug"
+Enables copious amounts of debugging output \- useful if something is going wrong.
+.IP "\fB\-\-version\fR, \fB\-V\fR" 4
+.IX Item "--version, -V"
+Displays the current version number and the usage and exits.
+.IP "\fB\-\-help\fR, \fB\-?\fR" 4
+.IX Item "--help, -?"
+Show this manual page.
+.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.
+.PP
+You may need to run \f(CW\*(C`epstopdf\*(C'\fR on \s-1EPS\s0 files if you are using \f(CW\*(C`pdflatex\*(C'\fR:
+.PP
+.Vb 1
+\& $ for i in *.eps; do epstopdf $i; done
+.Ve
+.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\-2017, Cengiz Gunay
+.PP
+This library is free software; you may redistribute it and/or modify
+it under the same terms as Perl itself.