summaryrefslogtreecommitdiff
path: root/doc/sbase/dist/fmt_latex2e.pl
diff options
context:
space:
mode:
Diffstat (limited to 'doc/sbase/dist/fmt_latex2e.pl')
-rw-r--r--doc/sbase/dist/fmt_latex2e.pl394
1 files changed, 359 insertions, 35 deletions
diff --git a/doc/sbase/dist/fmt_latex2e.pl b/doc/sbase/dist/fmt_latex2e.pl
index 03b07f56..1f121743 100644
--- a/doc/sbase/dist/fmt_latex2e.pl
+++ b/doc/sbase/dist/fmt_latex2e.pl
@@ -7,12 +7,15 @@
#
# © Copyright 1996, Cees de Groot
#
-package SGMLTools::fmt_latex2e;
+# Support for PDF files: added by Juan Jose Amor, January 2000
+# © Copyright 2000, Juan Jose Amor
+#
+package LinuxDocTools::fmt_latex2e;
use strict;
-use SGMLTools::CharEnts;
-use SGMLTools::Vars;
-use SGMLTools::Lang;
+use LinuxDocTools::CharEnts;
+use LinuxDocTools::Vars;
+use LinuxDocTools::Lang;
use File::Copy;
@@ -24,23 +27,48 @@ $latex2e->{HELP} = <<EOF;
EOF
$latex2e->{OPTIONS} = [
{ option => "output", type => "l",
- 'values' => [ "dvi", "tex", "ps" ], short => "o" },
+ 'values' => [ "dvi", "tex", "ps", "pdf" ], short => "o" },
{ option => "bibtex", type => "f", short => "b" },
{ option => "makeindex", type => "f", short => "m" },
{ option => "pagenumber", type => "i", short => "n" },
- { option => "quick", type => "f", short => "q" }
+ { option => "quick", type => "f", short => "q" },
+ { option => "dvips", type => "l",
+ 'values' => [ "dvips", "dvi2ps", "jdvi2kps" ], short => "s" },
+ { option => "latex", type => "l",
+ 'values' => [ "latex", "hlatexp", "platex", "jlatex" ], short => "x" }
];
-$latex2e->{output} = "dvi";
+$latex2e->{output} = "tex";
$latex2e->{pagenumber} = 1;
$latex2e->{quick} = 0;
$latex2e->{bibtex} = 0;
$latex2e->{makeindex} = 0;
+$latex2e->{latex} = "unknown";
+$latex2e->{dvips} = "unknown";
+$Formats{$latex2e->{NAME}} = $latex2e;
+
$latex2e->{preNSGMLS} = sub {
$global->{NsgmlsOpts} .= " -ifmttex ";
-};
-$Formats{$latex2e->{NAME}} = $latex2e;
+ # for Japanese jlatex users
+ if ($global->{language} eq "ja" && $latex2e->{latex} eq "unknown") {
+ $latex2e->{latex} = "jlatex";
+ $latex2e->{dvips} = "dvi2ps";
+ # for Japanese platex users
+ # $latex2e->{latex} = "platex";
+ # $latex2e->{dvips} = "dvips";
+ }
+
+ # for Korean users
+ if ($global->{language} eq "ko" && $latex2e->{latex} eq "unknown") {
+ $latex2e->{latex} = "hlatexp";
+ }
+ # default process command
+ $latex2e->{latex} = "latex" if ($latex2e->{latex} eq "unknown");
+ $latex2e->{dvips} = "dvips" if ($latex2e->{dvips} eq "unknown");
+
+ $global->{NsgmlsPrePipe} = "cat $global->{file} ";
+};
# extra `\\' here for standard `nsgmls' output
my %latex2e_escapes;
@@ -59,6 +87,7 @@ $latex2e_escapes{'<'} = '{$<$}'; # wouldn't happen, but that's what'd be
$latex2e_escapes{'|'} = '{$|$}';
my $in_verb;
+my $remove_comment; # added 2000 Jan 25 by t.sano
# passed to `parse_data' below in latex2e_preASP
my $latex2e_escape = sub {
@@ -95,13 +124,22 @@ $latex2e->{preASP} = sub
# a VERB or CODE environment or not
$in_verb = 0;
+ # switch to remove empty line from TeX source or not, depending
+ # on whether we're in a HEADING or ABSTRACT environment or not
+ $remove_comment = 0;
+
while (<$infile>)
{
if (/^-/)
{
my ($str) = $';
chop ($str);
- print $outfile "-" . parse_data ($str, $char_maps, $latex2e_escape) . "\n";
+ $_ = parse_data ($str, $char_maps, $latex2e_escape);
+ if ($remove_comment)
+ {
+ s/(\s+\\n)+//;
+ }
+ print $outfile "-" . $_ . "\n";
}
elsif (/^A/)
{
@@ -111,9 +149,12 @@ $latex2e->{preASP} = sub
if ($type eq "CDATA")
{
# CDATA attributes get translated also
- if ($name eq "URL" or $name eq "ID")
+ if ($name eq "URL" or $name eq "ID" or $name eq "CA")
{
# URL for url.sty is a kind of verbatim...
+ # CA is used in "tabular" element.
+ # Thanks to Evgeny Stambulchik, he posted this fix
+ # on sgml-tools list. 2000 May 17, t.sano
my $old_verb = $in_verb;
$in_verb = 1;
$value = parse_data ($value, $ascii_char_maps,
@@ -141,6 +182,19 @@ $latex2e->{preASP} = sub
$in_verb = 0;
$char_maps = $tex_char_maps;
}
+ elsif (/^\((HEADING|ABSTRACT)/)
+ {
+ print $outfile $_;
+ # empty lines (comment in sgml source) do harm
+ # in HEADING or ABSTRACT
+ $remove_comment = 1;
+ }
+ elsif (/^\)(HEADING|ABSTRACT)/)
+ {
+ print $outfile $_;
+ # leaving HEADING or ABSTRACT section
+ $remove_comment = 0;
+ }
else
{
print $outfile $_;
@@ -148,6 +202,24 @@ $latex2e->{preASP} = sub
}
};
+# return the string of the name of the macro for urldef
+sub latex2e_defnam($)
+{
+ my ($num) = @_;
+
+ if ($num > 26*26*26) {
+ die "Too many URLs!\n";
+ }
+
+ my $anum = ord("a");
+
+ my $defnam = chr ($anum + ($num / 26 / 26)) .
+ chr ($anum + ($num / 26 % 26)) .
+ chr ($anum + ($num % 26));
+
+ return ($defnam);
+};
+
#
# Take the sgmlsasp output, and make something
# useful from it.
@@ -156,29 +228,117 @@ $latex2e->{postASP} = sub
{
my $infile = shift;
my $filename = $global->{filename};
- $ENV{TEXINPUTS} .= ":$main::LibDir";
+ my $tmplatexdir = $global->{tmpbase} . "-latex-" . $$ . ".dir";
+ my $tmplatexnam = $tmplatexdir . "/" . $filename;
+ my @epsfiles = ();
+ my @texlines = ();
+ my @urldefines = ();
+ my @urlnames = ();
+ my $urlnum = 0;
+ my $tmpepsf;
+ my $saved_umask = umask;
+ $ENV{TEXINPUTS} .= ":$main::DataDir";
+
+ umask 0077;
+ mkdir ($tmplatexdir, 0700) || return -1;
#
- # Set the correct \documentclass options. The if statement is just
- # a small optimization.
+ # check epsfile is specified in source file
+ # check nameurl specified in source file
+ #
+ {
+ my $epsf;
+ open SGMLFILE, "<$filename.sgml";
+ while (<SGMLFILE>)
+ {
+ # for epsfile
+ if ( s/^\s*<eps\s+file=(.*)>/$1/ )
+ {
+ s/\s+angle=.*//;
+ s/\s+height=.*//;
+ s/\"//g;
+ $epsf = $_;
+ chop ( $epsf );
+ push @epsfiles, $epsf;
+ }
+ if ($latex2e->{output} eq "pdf")
+ {
+ if ( s/^\s*<img\s+src=(.*)>/$1/ )
+ {
+ s/\"//g;
+ $epsf = $_;
+ chop ( $epsf );
+ push @epsfiles, $epsf;
+ }
+ }
+ }
+ close SGMLFILE;
+ }
+ {
+ my $urlid;
+ my $urlnam;
+ my $urldef;
+ while (<$infile>)
+ {
+ push @texlines, $_;
+ # for nameurl
+ if ( /\\nameurl/ )
+ {
+ ($urlid, $urlnam) = ($_ =~ /\\nameurl{(.*)}{(.*)}/);
+ print $urlnum . ": " . $urlid . "\n" if ( $global->{debug} );
+
+ $urldef = latex2e_defnam($urlnum) . "url";
+ s/\\nameurl{.*}{.*}/{\\em $urlnam} {\\tt \\$urldef}/;
+ push @urlnames, $_;
+ push @urldefines, "\\urldef{\\$urldef} \\url{$urlid}\n";
+ $urlnum++;
+ }
+ }
+ close $infile;
+ }
+
+ open OUTFILE, ">$tmplatexnam.tex";
+ #
+ # Set the correct \documentclass options.
#
- if ($global->{language} ne "en" ||
- $global->{papersize} ne "a4" ||
- $latex2e->{pagenumber} != 1 ||
- $global->{pass} ne "" ||
- $latex2e->{makeindex})
{
my $langlit = ISO2English ($global->{language});
$langlit = ($langlit eq 'english') ? "" : ",$langlit";
my $replace = $global->{papersize} . 'paper' . $langlit;
- open OUTFILE, ">$filename.tex";
- while (<$infile>)
+ my $hlatexopt = "";
+ $global->{charset} = "nippon" if ($global->{language} eq "ja");
+ $global->{charset} = "euc-kr" if ($global->{language} eq "ko");
+ $replace = $global->{papersize} . 'paper' if ($global->{charset} eq "nippon") || ($global->{charset} eq "euc-kr");
+ while (defined($texlines[0]))
{
+ $_ = shift @texlines;
if (/^\\documentclass/)
{
- s/\\documentclass\[.*\]/\\documentclass\[$replace\]/;
+ if ($global->{language} ne "en" ||
+ $global->{papersize} ne "a4")
+ {
+ s/\\documentclass\[.*\]/\\documentclass\[$replace\]/;
+ }
+ if ($global->{charset} eq "nippon") {
+ if ($latex2e->{latex} eq "platex") {
+ s/{article}/{jarticle}/;
+ } elsif ($latex2e->{latex} eq "jlatex") {
+ s/{article}/{j-article}/;
+ }
+ }
$_ = $_ . "\\makeindex\n" if ($latex2e->{makeindex});
- }
+ }
+ if (/^\\usepackage.epsfig/ && ($global->{charset} eq "euc-kr"))
+ {
+ $hlatexopt = "[noautojosa]" if ($latex2e->{latex} eq "hlatexp");
+ $_ = $_ . "\\usepackage" . "$hlatexopt" . "{hangul}\n"
+ }
+ if ((/\\usepackage.t1enc/) &&
+ (($global->{charset} eq "nippon") ||
+ ($global->{charset} eq "euc-kr")))
+ {
+ s/^/%%/;
+ }
if (/%end-preamble/)
{
if ($latex2e->{pagenumber})
@@ -192,20 +352,45 @@ $latex2e->{postASP} = sub
}
$_ = $_ . $global->{pass} . "\n" if ($global->{pass});
}
+ if (/\\nameurl/ && $latex2e->{output} ne "pdf")
+ {
+ $_ = shift @urlnames;
+ }
print OUTFILE;
+ if (/%end-preamble/)
+ {
+ if ($urlnum && $latex2e->{output} ne "pdf")
+ {
+ while (defined($urldefines[0]))
+ {
+ $_ = shift @urldefines;
+ print OUTFILE;
+ }
+ }
+ }
}
- close OUTFILE;
- }
- else
- {
- copy ($infile, "$filename.tex");
}
+ close OUTFILE;
#
# LaTeX, dvips, and assorted cleanups.
#
if ($latex2e->{output} eq "tex")
{
+# comment out, because this backup action is not documented yet.
+#
+# if ( -e "$filename.tex" ) {
+# rename ("$filename.tex", "$filename.tex.back");
+# }
+
+ umask $saved_umask;
+ copy ("$tmplatexnam.tex", "$filename.tex");
+ if ( ! $global->{debug} )
+ {
+ unlink ("$tmplatexnam.tex");
+ rmdir ($tmplatexdir) || return -1;
+ }
+
return 0;
}
@@ -215,30 +400,169 @@ $latex2e->{postASP} = sub
# references have been resolved. This avoids large numbers of
# spurious warnings.
#
- my ($latexcommand) = "latex '\\nonstopmode\\input{$filename.tex}'";
+ my $current_dir;
+ chop ($current_dir = `pwd`);
+ print $current_dir . "\n" if ( $global->{debug} );
+
+ #
+ # copy epsfiles specified in tex file
+ #
+ for my $epsf ( @epsfiles )
+ {
+ $tmpepsf = $tmplatexdir . "/" . $epsf;
+ print $epsf . " " . $tmpepsf . "\n" if ( $global->{debug} );
+ copy ("$epsf", "$tmpepsf") or die "can not copy graphics\n";
+ }
+
+ #
+ # go to the temporary directory
+ chdir ($tmplatexdir);
+
+ my ($latexcommand) = "$latex2e->{latex} '\\nonstopmode\\input{$filename.tex}'";
+
+ #
+ # We run pdflatex instead of latex if user selected pdf output
+ #
+ if ($latex2e->{output} eq "pdf")
+ {
+ $latexcommand = "pdflatex '\\nonstopmode\\input{$filename.tex}'";
+ }
+
+ #
+ # run hlatex if hlatexp is used
+ # for pdf: how about status?(for hlatex and hlatexp)
+ #
+ if ($latex2e->{latex} eq "hlatexp")
+ {
+ #$latex2e->{output} = "ps" if ($latex2e->{output} eq "pdf");
+ $latexcommand = "hlatex '\\nonstopmode\\input{$filename.tex}'";
+ }
+
+ #
+ # We use jlatex for Japanese encoded (euc-jp) characters.
+ # pdf support for Japanese are not yet. use ps for the time being.
+ #
+ if ($global->{charset} eq "nippon")
+ {
+ $latex2e->{output} = "ps" if ($latex2e->{output} eq "pdf");
+ $latexcommand = "$latex2e->{latex} '\\nonstopmode\\input{$filename.tex}'"
+ }
my ($suppress) = $latex2e->{quick} ? "" : ' >/dev/null';
system $latexcommand . $suppress || die "LaTeX problem\n";
$latex2e->{bibtex} && system "bibtex $filename.tex";
$latex2e->{quick} || system $latexcommand . ' >/dev/null';
$latex2e->{quick} || system $latexcommand;
- if ($global->{debug} == 0)
+ if ( ! $global->{debug} )
{
- my @suffixes = qw(log blg aux toc lof lot dlog bbl);
+ my @suffixes = qw(log blg aux toc lof lot dlog bbl out);
for my $suf (@suffixes)
{
- unlink "$filename.$suf";
+ unlink "$tmplatexnam.$suf";
}
}
+ #
+ # go back to the working directory
+ chdir ($current_dir);
+ #
+ # output dvi file
if ($latex2e->{output} eq "dvi")
{
- $global->{debug} || unlink "$filename.tex";
+# comment out, because this backup action is not documented yet.
+#
+# if ( -e "$filename.dvi" )
+# {
+# rename ("$filename.dvi", "$filename.dvi.back");
+# }
+ umask $saved_umask;
+ copy ("$tmplatexnam.dvi", "$filename.dvi");
+ if ( $global->{debug} )
+ {
+ print "Temporary files are in $tmplatexdir\n";
+ print "Please check there and remove them manually.\n";
+ } else {
+ unlink ("$tmplatexnam.tex", "$tmplatexnam.dvi");
+ for my $epsf ( @epsfiles )
+ {
+ $tmpepsf = $tmplatexdir . "/" . $epsf;
+ print $tmpepsf . "\n" if ( $global->{debug} );
+ unlink ("$tmpepsf");
+ }
+ rmdir ($tmplatexdir) || return -1;
+ }
+ return 0;
+ }
+ #
+ # output pdf file
+ if ($latex2e->{output} eq "pdf")
+ {
+# comment out, because this backup action is not documented yet.
+#
+# if ( -e "$filename.pdf" )
+# {
+# rename ("$filename.pdf", "$filename.pdf.back");
+# }
+ umask $saved_umask;
+ copy ("$tmplatexnam.pdf", "$filename.pdf");
+ if ( $global->{debug} )
+ {
+ print "Temporary files are in $tmplatexdir\n";
+ print "Please check there and remove them manually.\n";
+ } else {
+ unlink ("$tmplatexnam.tex", "$tmplatexnam.pdf");
+ for my $epsf ( @epsfiles )
+ {
+ $tmpepsf = $tmplatexdir . "/" . $epsf;
+ print $tmpepsf . "\n" if ( $global->{debug} );
+ unlink ("$tmpepsf");
+ }
+ rmdir ($tmplatexdir) || return -1;
+ }
return 0;
}
- `dvips -q -t $global->{papersize} -o $filename.ps $filename.dvi`;
- $global->{debug} || unlink ("$filename.dvi", "$filename.tex");
+ #
+ # convert dvi into ps using dvips command
+ chdir ($tmplatexdir);
+ if ($latex2e->{dvips} eq "dvi2ps")
+ {
+ `dvi2ps -q -o $global->{papersize} -c $tmplatexnam.ps $filename.dvi`;
+ }
+ elsif ($latex2e->{dvips} eq "jdvi2kps")
+ {
+ `jdvi2kps -q -pa $global->{papersize} -o $tmplatexnam.ps $filename.dvi`;
+ }
+ else
+ {
+ `dvips -R -q -t $global->{papersize} -o $tmplatexnam.ps $filename.dvi`;
+ }
+
+ chdir ($current_dir);
+# comment out, because this backup action is not documented yet.
+#
+# if ( -e "$filename.ps" )
+# {
+# rename ("$filename.ps", "$filename.ps.back");
+# }
+ umask $saved_umask;
+ copy ("$tmplatexnam.ps", "$filename.ps");
+ unlink ("$tmplatexnam.ps");
+ if ( $global->{debug} )
+ {
+ print "Temporary files are in $tmplatexdir\n";
+ print "Please check there and remove them manually.\n";
+ } else {
+ unlink ("$tmplatexnam.tex", "$tmplatexnam.dvi", "$tmplatexnam.ps");
+ for my $epsf ( @epsfiles )
+ {
+ $tmpepsf = $tmplatexdir . "/" . $epsf;
+ print $tmpepsf . "\n" if ( $global->{debug} );
+ unlink ("$tmpepsf");
+ }
+ rmdir ($tmplatexdir) || return -1;
+ }
return 0;
+
};
1;