diff options
author | Norbert Preining <preining@logic.at> | 2007-12-12 08:04:29 +0000 |
---|---|---|
committer | Norbert Preining <preining@logic.at> | 2007-12-12 08:04:29 +0000 |
commit | 5b8032cb4ddc1d209cdd00c675f0c1c170b80f02 (patch) | |
tree | 0d76052c1032f37e7f2a212bdfed53b54a606d86 | |
parent | da4daf1b676263905e7f04bb64e9878508c1ee97 (diff) |
update perltex script
git-svn-id: svn://tug.org/texlive/trunk@5763 c570f23f-e606-0410-a88d-b1316a301751
-rwxr-xr-x | Master/bin/alpha-linux/perltex | 117 | ||||
-rwxr-xr-x | Master/bin/hppa-hpux/perltex | 117 | ||||
-rwxr-xr-x | Master/bin/i386-darwin/perltex | 117 | ||||
-rwxr-xr-x | Master/bin/i386-freebsd/perltex | 117 | ||||
-rwxr-xr-x | Master/bin/i386-linux/perltex | 29 | ||||
-rwxr-xr-x | Master/bin/i386-openbsd/perltex | 117 | ||||
-rwxr-xr-x | Master/bin/i386-solaris/perltex | 117 | ||||
-rwxr-xr-x | Master/bin/mips-irix/perltex | 117 | ||||
-rwxr-xr-x | Master/bin/powerpc-aix/perltex | 117 | ||||
-rwxr-xr-x | Master/bin/powerpc-darwin/perltex | 117 | ||||
-rwxr-xr-x | Master/bin/powerpc-linux/perltex | 117 | ||||
-rwxr-xr-x | Master/bin/sparc-linux/perltex | 117 | ||||
-rwxr-xr-x | Master/bin/sparc-solaris/perltex | 117 | ||||
-rwxr-xr-x | Master/bin/x86_64-linux/perltex | 117 |
14 files changed, 1330 insertions, 220 deletions
diff --git a/Master/bin/alpha-linux/perltex b/Master/bin/alpha-linux/perltex index dd8dda2804b..9c85ef94500 100755 --- a/Master/bin/alpha-linux/perltex +++ b/Master/bin/alpha-linux/perltex @@ -15,7 +15,7 @@ # # This is a generated file. # -# Copyright (C) 2006, Scott Pakin <scott+pt@pakin.org> +# Copyright (C) 2007 Scott Pakin <scott+pt@pakin.org> # # This file may be distributed and/or modified under the conditions # of the LaTeX Project Public License, either version 1.3c of this @@ -37,30 +37,39 @@ use Opcode; use Getopt::Long; use Pod::Usage; use File::Basename; +use Fcntl; use POSIX; use warnings; use strict; my $latexprog; my $runsafely = 1; my @permittedops; +my $usepipe = 1; my $progname = basename $0; my $jobname = "texput"; -my @latexcmdline; my $toperl; my $fromperl; my $toflag; my $fromflag; my $doneflag; my $logfile; +my $pipe; +my @latexcmdline; +my $styfile; +my @macroexpansions; my $sandbox = new Safe; my $sandbox_eval; my $latexpid; +my $pipestring = "\%\%\%\%\% Generated by $progname\n\\endinput\n"; $latexprog = $ENV{"PERLTEX"} || "latex"; Getopt::Long::Configure("require_order", "pass_through"); -GetOptions("help" => sub {pod2usage(-verbose => 1)}, - "latex=s" => \$latexprog, - "safe!" => \$runsafely, - "permit=s" => \@permittedops) || pod2usage(2); +GetOptions("help" => sub {pod2usage(-verbose => 1)}, + "latex=s" => \$latexprog, + "safe!" => \$runsafely, + "pipe!" => \$usepipe, + "synctext=s" => \$pipestring, + "makesty" => sub {$styfile = "noperltex.sty"}, + "permit=s" => \@permittedops) || pod2usage(2); @latexcmdline = @ARGV; my $firstcmd = 0; for ($firstcmd=0; $firstcmd<=$#latexcmdline; $firstcmd++) { @@ -83,19 +92,30 @@ $toflag = $jobname . ".tfpl"; $fromflag = $jobname . ".ffpl"; $doneflag = $jobname . ".dfpl"; $logfile = $jobname . ".lgpl"; +$pipe = $jobname . ".pipe"; $latexcmdline[$firstcmd] = - sprintf '\makeatletter' . '\def%s{%s}' x 6 . '\makeatother%s', + sprintf '\makeatletter' . '\def%s{%s}' x 7 . '\makeatother%s', '\plmac@tag', $separator, '\plmac@tofile', $toperl, '\plmac@fromfile', $fromperl, '\plmac@toflag', $toflag, '\plmac@fromflag', $fromflag, '\plmac@doneflag', $doneflag, + '\plmac@pipe', $pipe, $latexcmdline[$firstcmd]; -foreach my $file ($toperl, $fromperl, $toflag, $fromflag, $doneflag) { +foreach my $file ($toperl, $fromperl, $toflag, $fromflag, $doneflag, $pipe) { unlink $file while -e $file; } open (LOGFILE, ">$logfile") || die "open(\"$logfile\"): $!\n"; +if (defined $styfile) { + open (STYFILE, ">$styfile") || die "open(\"$styfile\"): $!\n"; +} +if (!$usepipe || !eval {mkfifo($pipe, 0600)}) { + sysopen PIPE, $pipe, O_WRONLY|O_CREAT, 0755; + print PIPE $pipestring; + close PIPE; + $usepipe = 0; +} defined ($latexpid = fork) || die "fork: $!\n"; unshift @latexcmdline, $latexprog; if (!$latexpid) { @@ -116,7 +136,7 @@ while (1) { sleep 0; if (waitpid($latexpid, &WNOHANG)==-1) { foreach my $file ($toperl, $fromperl, $toflag, - $fromflag, $doneflag) { + $fromflag, $doneflag, $pipe) { unlink $file while -e $file; } undef $latexpid; @@ -173,7 +193,7 @@ while (1) { print LOGFILE "# ===> $warningmsg\n\n"; } } - $result="" if !$result || $optag eq "RUN"; + $result = "" if !$result || $optag eq "RUN"; if ($@) { my $msg = $@; $msg =~ s/at \(eval \d+\) line \d+\W+//; @@ -202,6 +222,7 @@ while (1) { $helpstring =~ s/\. /.\\space\\space /g; $result .= "{$helpstring}"; } + push @macroexpansions, $result if defined $styfile && $optag eq "USE"; print LOGFILE "%" x 30, " LATEX RESULT ", "%" x 30, "\n"; print LOGFILE $result, "\n\n"; $result .= '\endinput'; @@ -213,10 +234,18 @@ while (1) { unlink $doneflag while -e $doneflag; open (FROMFLAG, ">$fromflag") || die "open($fromflag): $!\n"; close FROMFLAG; + if (open (PIPE, ">$pipe")) { + print PIPE $pipestring; + close PIPE; + } $awaitexists->($toperl); unlink $fromflag while -e $fromflag; open (DONEFLAG, ">$doneflag") || die "open($doneflag): $!\n"; close DONEFLAG; + if (open (PIPE, ">$pipe")) { + print PIPE $pipestring; + close PIPE; + } } END { close LOGFILE; @@ -224,6 +253,46 @@ END { kill (9, $latexpid); exit 1; } + + if (defined $styfile) { + print STYFILE <<"STYFILEHEADER1"; +\\NeedsTeXFormat{LaTeX2e}[1999/12/01] +\\ProvidesPackage{noperltex} + [2007/09/29 v1.4 Perl-free version of PerlTeX specific to $jobname.tex] +STYFILEHEADER1 + ; + print STYFILE <<'STYFILEHEADER2'; +\RequirePackage{filecontents} + +\let\noperltex@PackageError=\PackageError +\renewcommand{\PackageError}[3]{} +\RequirePackage{perltex} +\let\PackageError=\noperltex@PackageError + +\newcount\plmac@macro@invocation@num +\gdef\plmac@show@placeholder#1#2\@empty{% + \ifx#1U\relax + \endgroup + \advance\plmac@macro@invocation@num by 1\relax + \global\plmac@macro@invocation@num=\plmac@macro@invocation@num + \input{noperltex-\the\plmac@macro@invocation@num.tex}% + \else + \endgroup + \fi +} +STYFILEHEADER2 + ; + foreach my $e (0 .. $#macroexpansions) { + print STYFILE "\n"; + printf STYFILE "%% Invocation #%d\n", 1+$e; + printf STYFILE "\\begin{filecontents}{noperltex-%d.tex}\n", 1+$e; + print STYFILE $macroexpansions[$e], "\\endinput\n"; + print STYFILE "\\end{filecontents}\n"; + } + print STYFILE "\\endinput\n"; + close STYFILE; + } + exit 0; } @@ -240,6 +309,7 @@ perltex [B<--latex>=I<program>] [B<-->[B<no>]B<safe>] [B<--permit>=I<feature>] +[B<--makesty>] [I<latex options>] =head1 DESCRIPTION @@ -280,21 +350,32 @@ B<pdflatex> instead of ordinary B<latex>. =item B<-->[B<no>]B<safe> -Enable or disable sandboxing. With the default of C<--safe>, +Enable or disable sandboxing. With the default of B<--safe>, B<perltex> executes the code from a C<\perlnewcommand> or C<\perlrenewcommand> macro within a protected environment that prohibits ``unsafe'' operations such as accessing files or executing -external programs. Specifying C<--nosafe> gives the LaTeX document +external programs. Specifying B<--nosafe> gives the LaTeX document I<carte blanche> to execute any arbitrary Perl code, including that which can harm the user's files. See L<Safe> for more information. =item B<--permit>=I<feature> -Permit particular Perl operations to be performed. The C<--permit> +Permit particular Perl operations to be performed. The B<--permit> option, which can be specified more than once on the command line, enables finer-grained control over the B<perltex> sandbox. See L<Opcode> for more information. +=item B<--makesty> + +Generate a LaTeX style file called F<noperltex.sty>. Replacing the +document's C<\usepackage{perltex}> line with C<\usepackage{noperltex}> +produces the same output but does not require PerlTeX, making the +document suitable for distribution to people who do not have PerlTeX +installed. The disadvantage is that F<noperltex.sty> is specific to +the document that produced it. Any changes to the document's PerlTeX +macro definitions or macro invocations necessitates rerunning +B<perltex> with the B<--makesty> option. + =back These options are then followed by whatever options are normally @@ -308,7 +389,7 @@ In its simplest form, B<perltex> is run just like B<latex>: perltex myfile.tex -To use B<pdflatex> instead of regular B<latex>, use the C<--latex> +To use B<pdflatex> instead of regular B<latex>, use the B<--latex> option: perltex --latex=pdflatex myfile.tex @@ -316,7 +397,7 @@ option: If LaTeX gives a ``C<trapped by operation mask>'' error and you trust the F<.tex> file you're trying to compile not to execute malicious Perl code (e.g., because you wrote it yourself), you can disable -B<perltex>'s safety mechansisms with C<--nosafe>: +B<perltex>'s safety mechansisms with B<--nosafe>: perltex --nosafe myfile.tex @@ -337,7 +418,7 @@ B<perltex> honors the following environment variables: Specify the filename of the LaTeX compiler. The LaTeX compiler defaults to ``C<latex>''. The C<PERLTEX> environment variable -overrides this default, and the C<--latex> command-line option (see +overrides this default, and the B<--latex> command-line option (see L</OPTIONS>) overrides that. =back @@ -376,6 +457,10 @@ valid data ``flag'' file whose existence indicates that F<jobname.ffpl> has been deleted +=item F<noperltex-#.tex> + +file generated by F<noperltex.sty> for each PerlTeX macro invocation + =back =head1 NOTES diff --git a/Master/bin/hppa-hpux/perltex b/Master/bin/hppa-hpux/perltex index dd8dda2804b..9c85ef94500 100755 --- a/Master/bin/hppa-hpux/perltex +++ b/Master/bin/hppa-hpux/perltex @@ -15,7 +15,7 @@ # # This is a generated file. # -# Copyright (C) 2006, Scott Pakin <scott+pt@pakin.org> +# Copyright (C) 2007 Scott Pakin <scott+pt@pakin.org> # # This file may be distributed and/or modified under the conditions # of the LaTeX Project Public License, either version 1.3c of this @@ -37,30 +37,39 @@ use Opcode; use Getopt::Long; use Pod::Usage; use File::Basename; +use Fcntl; use POSIX; use warnings; use strict; my $latexprog; my $runsafely = 1; my @permittedops; +my $usepipe = 1; my $progname = basename $0; my $jobname = "texput"; -my @latexcmdline; my $toperl; my $fromperl; my $toflag; my $fromflag; my $doneflag; my $logfile; +my $pipe; +my @latexcmdline; +my $styfile; +my @macroexpansions; my $sandbox = new Safe; my $sandbox_eval; my $latexpid; +my $pipestring = "\%\%\%\%\% Generated by $progname\n\\endinput\n"; $latexprog = $ENV{"PERLTEX"} || "latex"; Getopt::Long::Configure("require_order", "pass_through"); -GetOptions("help" => sub {pod2usage(-verbose => 1)}, - "latex=s" => \$latexprog, - "safe!" => \$runsafely, - "permit=s" => \@permittedops) || pod2usage(2); +GetOptions("help" => sub {pod2usage(-verbose => 1)}, + "latex=s" => \$latexprog, + "safe!" => \$runsafely, + "pipe!" => \$usepipe, + "synctext=s" => \$pipestring, + "makesty" => sub {$styfile = "noperltex.sty"}, + "permit=s" => \@permittedops) || pod2usage(2); @latexcmdline = @ARGV; my $firstcmd = 0; for ($firstcmd=0; $firstcmd<=$#latexcmdline; $firstcmd++) { @@ -83,19 +92,30 @@ $toflag = $jobname . ".tfpl"; $fromflag = $jobname . ".ffpl"; $doneflag = $jobname . ".dfpl"; $logfile = $jobname . ".lgpl"; +$pipe = $jobname . ".pipe"; $latexcmdline[$firstcmd] = - sprintf '\makeatletter' . '\def%s{%s}' x 6 . '\makeatother%s', + sprintf '\makeatletter' . '\def%s{%s}' x 7 . '\makeatother%s', '\plmac@tag', $separator, '\plmac@tofile', $toperl, '\plmac@fromfile', $fromperl, '\plmac@toflag', $toflag, '\plmac@fromflag', $fromflag, '\plmac@doneflag', $doneflag, + '\plmac@pipe', $pipe, $latexcmdline[$firstcmd]; -foreach my $file ($toperl, $fromperl, $toflag, $fromflag, $doneflag) { +foreach my $file ($toperl, $fromperl, $toflag, $fromflag, $doneflag, $pipe) { unlink $file while -e $file; } open (LOGFILE, ">$logfile") || die "open(\"$logfile\"): $!\n"; +if (defined $styfile) { + open (STYFILE, ">$styfile") || die "open(\"$styfile\"): $!\n"; +} +if (!$usepipe || !eval {mkfifo($pipe, 0600)}) { + sysopen PIPE, $pipe, O_WRONLY|O_CREAT, 0755; + print PIPE $pipestring; + close PIPE; + $usepipe = 0; +} defined ($latexpid = fork) || die "fork: $!\n"; unshift @latexcmdline, $latexprog; if (!$latexpid) { @@ -116,7 +136,7 @@ while (1) { sleep 0; if (waitpid($latexpid, &WNOHANG)==-1) { foreach my $file ($toperl, $fromperl, $toflag, - $fromflag, $doneflag) { + $fromflag, $doneflag, $pipe) { unlink $file while -e $file; } undef $latexpid; @@ -173,7 +193,7 @@ while (1) { print LOGFILE "# ===> $warningmsg\n\n"; } } - $result="" if !$result || $optag eq "RUN"; + $result = "" if !$result || $optag eq "RUN"; if ($@) { my $msg = $@; $msg =~ s/at \(eval \d+\) line \d+\W+//; @@ -202,6 +222,7 @@ while (1) { $helpstring =~ s/\. /.\\space\\space /g; $result .= "{$helpstring}"; } + push @macroexpansions, $result if defined $styfile && $optag eq "USE"; print LOGFILE "%" x 30, " LATEX RESULT ", "%" x 30, "\n"; print LOGFILE $result, "\n\n"; $result .= '\endinput'; @@ -213,10 +234,18 @@ while (1) { unlink $doneflag while -e $doneflag; open (FROMFLAG, ">$fromflag") || die "open($fromflag): $!\n"; close FROMFLAG; + if (open (PIPE, ">$pipe")) { + print PIPE $pipestring; + close PIPE; + } $awaitexists->($toperl); unlink $fromflag while -e $fromflag; open (DONEFLAG, ">$doneflag") || die "open($doneflag): $!\n"; close DONEFLAG; + if (open (PIPE, ">$pipe")) { + print PIPE $pipestring; + close PIPE; + } } END { close LOGFILE; @@ -224,6 +253,46 @@ END { kill (9, $latexpid); exit 1; } + + if (defined $styfile) { + print STYFILE <<"STYFILEHEADER1"; +\\NeedsTeXFormat{LaTeX2e}[1999/12/01] +\\ProvidesPackage{noperltex} + [2007/09/29 v1.4 Perl-free version of PerlTeX specific to $jobname.tex] +STYFILEHEADER1 + ; + print STYFILE <<'STYFILEHEADER2'; +\RequirePackage{filecontents} + +\let\noperltex@PackageError=\PackageError +\renewcommand{\PackageError}[3]{} +\RequirePackage{perltex} +\let\PackageError=\noperltex@PackageError + +\newcount\plmac@macro@invocation@num +\gdef\plmac@show@placeholder#1#2\@empty{% + \ifx#1U\relax + \endgroup + \advance\plmac@macro@invocation@num by 1\relax + \global\plmac@macro@invocation@num=\plmac@macro@invocation@num + \input{noperltex-\the\plmac@macro@invocation@num.tex}% + \else + \endgroup + \fi +} +STYFILEHEADER2 + ; + foreach my $e (0 .. $#macroexpansions) { + print STYFILE "\n"; + printf STYFILE "%% Invocation #%d\n", 1+$e; + printf STYFILE "\\begin{filecontents}{noperltex-%d.tex}\n", 1+$e; + print STYFILE $macroexpansions[$e], "\\endinput\n"; + print STYFILE "\\end{filecontents}\n"; + } + print STYFILE "\\endinput\n"; + close STYFILE; + } + exit 0; } @@ -240,6 +309,7 @@ perltex [B<--latex>=I<program>] [B<-->[B<no>]B<safe>] [B<--permit>=I<feature>] +[B<--makesty>] [I<latex options>] =head1 DESCRIPTION @@ -280,21 +350,32 @@ B<pdflatex> instead of ordinary B<latex>. =item B<-->[B<no>]B<safe> -Enable or disable sandboxing. With the default of C<--safe>, +Enable or disable sandboxing. With the default of B<--safe>, B<perltex> executes the code from a C<\perlnewcommand> or C<\perlrenewcommand> macro within a protected environment that prohibits ``unsafe'' operations such as accessing files or executing -external programs. Specifying C<--nosafe> gives the LaTeX document +external programs. Specifying B<--nosafe> gives the LaTeX document I<carte blanche> to execute any arbitrary Perl code, including that which can harm the user's files. See L<Safe> for more information. =item B<--permit>=I<feature> -Permit particular Perl operations to be performed. The C<--permit> +Permit particular Perl operations to be performed. The B<--permit> option, which can be specified more than once on the command line, enables finer-grained control over the B<perltex> sandbox. See L<Opcode> for more information. +=item B<--makesty> + +Generate a LaTeX style file called F<noperltex.sty>. Replacing the +document's C<\usepackage{perltex}> line with C<\usepackage{noperltex}> +produces the same output but does not require PerlTeX, making the +document suitable for distribution to people who do not have PerlTeX +installed. The disadvantage is that F<noperltex.sty> is specific to +the document that produced it. Any changes to the document's PerlTeX +macro definitions or macro invocations necessitates rerunning +B<perltex> with the B<--makesty> option. + =back These options are then followed by whatever options are normally @@ -308,7 +389,7 @@ In its simplest form, B<perltex> is run just like B<latex>: perltex myfile.tex -To use B<pdflatex> instead of regular B<latex>, use the C<--latex> +To use B<pdflatex> instead of regular B<latex>, use the B<--latex> option: perltex --latex=pdflatex myfile.tex @@ -316,7 +397,7 @@ option: If LaTeX gives a ``C<trapped by operation mask>'' error and you trust the F<.tex> file you're trying to compile not to execute malicious Perl code (e.g., because you wrote it yourself), you can disable -B<perltex>'s safety mechansisms with C<--nosafe>: +B<perltex>'s safety mechansisms with B<--nosafe>: perltex --nosafe myfile.tex @@ -337,7 +418,7 @@ B<perltex> honors the following environment variables: Specify the filename of the LaTeX compiler. The LaTeX compiler defaults to ``C<latex>''. The C<PERLTEX> environment variable -overrides this default, and the C<--latex> command-line option (see +overrides this default, and the B<--latex> command-line option (see L</OPTIONS>) overrides that. =back @@ -376,6 +457,10 @@ valid data ``flag'' file whose existence indicates that F<jobname.ffpl> has been deleted +=item F<noperltex-#.tex> + +file generated by F<noperltex.sty> for each PerlTeX macro invocation + =back =head1 NOTES diff --git a/Master/bin/i386-darwin/perltex b/Master/bin/i386-darwin/perltex index dd8dda2804b..9c85ef94500 100755 --- a/Master/bin/i386-darwin/perltex +++ b/Master/bin/i386-darwin/perltex @@ -15,7 +15,7 @@ # # This is a generated file. # -# Copyright (C) 2006, Scott Pakin <scott+pt@pakin.org> +# Copyright (C) 2007 Scott Pakin <scott+pt@pakin.org> # # This file may be distributed and/or modified under the conditions # of the LaTeX Project Public License, either version 1.3c of this @@ -37,30 +37,39 @@ use Opcode; use Getopt::Long; use Pod::Usage; use File::Basename; +use Fcntl; use POSIX; use warnings; use strict; my $latexprog; my $runsafely = 1; my @permittedops; +my $usepipe = 1; my $progname = basename $0; my $jobname = "texput"; -my @latexcmdline; my $toperl; my $fromperl; my $toflag; my $fromflag; my $doneflag; my $logfile; +my $pipe; +my @latexcmdline; +my $styfile; +my @macroexpansions; my $sandbox = new Safe; my $sandbox_eval; my $latexpid; +my $pipestring = "\%\%\%\%\% Generated by $progname\n\\endinput\n"; $latexprog = $ENV{"PERLTEX"} || "latex"; Getopt::Long::Configure("require_order", "pass_through"); -GetOptions("help" => sub {pod2usage(-verbose => 1)}, - "latex=s" => \$latexprog, - "safe!" => \$runsafely, - "permit=s" => \@permittedops) || pod2usage(2); +GetOptions("help" => sub {pod2usage(-verbose => 1)}, + "latex=s" => \$latexprog, + "safe!" => \$runsafely, + "pipe!" => \$usepipe, + "synctext=s" => \$pipestring, + "makesty" => sub {$styfile = "noperltex.sty"}, + "permit=s" => \@permittedops) || pod2usage(2); @latexcmdline = @ARGV; my $firstcmd = 0; for ($firstcmd=0; $firstcmd<=$#latexcmdline; $firstcmd++) { @@ -83,19 +92,30 @@ $toflag = $jobname . ".tfpl"; $fromflag = $jobname . ".ffpl"; $doneflag = $jobname . ".dfpl"; $logfile = $jobname . ".lgpl"; +$pipe = $jobname . ".pipe"; $latexcmdline[$firstcmd] = - sprintf '\makeatletter' . '\def%s{%s}' x 6 . '\makeatother%s', + sprintf '\makeatletter' . '\def%s{%s}' x 7 . '\makeatother%s', '\plmac@tag', $separator, '\plmac@tofile', $toperl, '\plmac@fromfile', $fromperl, '\plmac@toflag', $toflag, '\plmac@fromflag', $fromflag, '\plmac@doneflag', $doneflag, + '\plmac@pipe', $pipe, $latexcmdline[$firstcmd]; -foreach my $file ($toperl, $fromperl, $toflag, $fromflag, $doneflag) { +foreach my $file ($toperl, $fromperl, $toflag, $fromflag, $doneflag, $pipe) { unlink $file while -e $file; } open (LOGFILE, ">$logfile") || die "open(\"$logfile\"): $!\n"; +if (defined $styfile) { + open (STYFILE, ">$styfile") || die "open(\"$styfile\"): $!\n"; +} +if (!$usepipe || !eval {mkfifo($pipe, 0600)}) { + sysopen PIPE, $pipe, O_WRONLY|O_CREAT, 0755; + print PIPE $pipestring; + close PIPE; + $usepipe = 0; +} defined ($latexpid = fork) || die "fork: $!\n"; unshift @latexcmdline, $latexprog; if (!$latexpid) { @@ -116,7 +136,7 @@ while (1) { sleep 0; if (waitpid($latexpid, &WNOHANG)==-1) { foreach my $file ($toperl, $fromperl, $toflag, - $fromflag, $doneflag) { + $fromflag, $doneflag, $pipe) { unlink $file while -e $file; } undef $latexpid; @@ -173,7 +193,7 @@ while (1) { print LOGFILE "# ===> $warningmsg\n\n"; } } - $result="" if !$result || $optag eq "RUN"; + $result = "" if !$result || $optag eq "RUN"; if ($@) { my $msg = $@; $msg =~ s/at \(eval \d+\) line \d+\W+//; @@ -202,6 +222,7 @@ while (1) { $helpstring =~ s/\. /.\\space\\space /g; $result .= "{$helpstring}"; } + push @macroexpansions, $result if defined $styfile && $optag eq "USE"; print LOGFILE "%" x 30, " LATEX RESULT ", "%" x 30, "\n"; print LOGFILE $result, "\n\n"; $result .= '\endinput'; @@ -213,10 +234,18 @@ while (1) { unlink $doneflag while -e $doneflag; open (FROMFLAG, ">$fromflag") || die "open($fromflag): $!\n"; close FROMFLAG; + if (open (PIPE, ">$pipe")) { + print PIPE $pipestring; + close PIPE; + } $awaitexists->($toperl); unlink $fromflag while -e $fromflag; open (DONEFLAG, ">$doneflag") || die "open($doneflag): $!\n"; close DONEFLAG; + if (open (PIPE, ">$pipe")) { + print PIPE $pipestring; + close PIPE; + } } END { close LOGFILE; @@ -224,6 +253,46 @@ END { kill (9, $latexpid); exit 1; } + + if (defined $styfile) { + print STYFILE <<"STYFILEHEADER1"; +\\NeedsTeXFormat{LaTeX2e}[1999/12/01] +\\ProvidesPackage{noperltex} + [2007/09/29 v1.4 Perl-free version of PerlTeX specific to $jobname.tex] +STYFILEHEADER1 + ; + print STYFILE <<'STYFILEHEADER2'; +\RequirePackage{filecontents} + +\let\noperltex@PackageError=\PackageError +\renewcommand{\PackageError}[3]{} +\RequirePackage{perltex} +\let\PackageError=\noperltex@PackageError + +\newcount\plmac@macro@invocation@num +\gdef\plmac@show@placeholder#1#2\@empty{% + \ifx#1U\relax + \endgroup + \advance\plmac@macro@invocation@num by 1\relax + \global\plmac@macro@invocation@num=\plmac@macro@invocation@num + \input{noperltex-\the\plmac@macro@invocation@num.tex}% + \else + \endgroup + \fi +} +STYFILEHEADER2 + ; + foreach my $e (0 .. $#macroexpansions) { + print STYFILE "\n"; + printf STYFILE "%% Invocation #%d\n", 1+$e; + printf STYFILE "\\begin{filecontents}{noperltex-%d.tex}\n", 1+$e; + print STYFILE $macroexpansions[$e], "\\endinput\n"; + print STYFILE "\\end{filecontents}\n"; + } + print STYFILE "\\endinput\n"; + close STYFILE; + } + exit 0; } @@ -240,6 +309,7 @@ perltex [B<--latex>=I<program>] [B<-->[B<no>]B<safe>] [B<--permit>=I<feature>] +[B<--makesty>] [I<latex options>] =head1 DESCRIPTION @@ -280,21 +350,32 @@ B<pdflatex> instead of ordinary B<latex>. =item B<-->[B<no>]B<safe> -Enable or disable sandboxing. With the default of C<--safe>, +Enable or disable sandboxing. With the default of B<--safe>, B<perltex> executes the code from a C<\perlnewcommand> or C<\perlrenewcommand> macro within a protected environment that prohibits ``unsafe'' operations such as accessing files or executing -external programs. Specifying C<--nosafe> gives the LaTeX document +external programs. Specifying B<--nosafe> gives the LaTeX document I<carte blanche> to execute any arbitrary Perl code, including that which can harm the user's files. See L<Safe> for more information. =item B<--permit>=I<feature> -Permit particular Perl operations to be performed. The C<--permit> +Permit particular Perl operations to be performed. The B<--permit> option, which can be specified more than once on the command line, enables finer-grained control over the B<perltex> sandbox. See L<Opcode> for more information. +=item B<--makesty> + +Generate a LaTeX style file called F<noperltex.sty>. Replacing the +document's C<\usepackage{perltex}> line with C<\usepackage{noperltex}> +produces the same output but does not require PerlTeX, making the +document suitable for distribution to people who do not have PerlTeX +installed. The disadvantage is that F<noperltex.sty> is specific to +the document that produced it. Any changes to the document's PerlTeX +macro definitions or macro invocations necessitates rerunning +B<perltex> with the B<--makesty> option. + =back These options are then followed by whatever options are normally @@ -308,7 +389,7 @@ In its simplest form, B<perltex> is run just like B<latex>: perltex myfile.tex -To use B<pdflatex> instead of regular B<latex>, use the C<--latex> +To use B<pdflatex> instead of regular B<latex>, use the B<--latex> option: perltex --latex=pdflatex myfile.tex @@ -316,7 +397,7 @@ option: If LaTeX gives a ``C<trapped by operation mask>'' error and you trust the F<.tex> file you're trying to compile not to execute malicious Perl code (e.g., because you wrote it yourself), you can disable -B<perltex>'s safety mechansisms with C<--nosafe>: +B<perltex>'s safety mechansisms with B<--nosafe>: perltex --nosafe myfile.tex @@ -337,7 +418,7 @@ B<perltex> honors the following environment variables: Specify the filename of the LaTeX compiler. The LaTeX compiler defaults to ``C<latex>''. The C<PERLTEX> environment variable -overrides this default, and the C<--latex> command-line option (see +overrides this default, and the B<--latex> command-line option (see L</OPTIONS>) overrides that. =back @@ -376,6 +457,10 @@ valid data ``flag'' file whose existence indicates that F<jobname.ffpl> has been deleted +=item F<noperltex-#.tex> + +file generated by F<noperltex.sty> for each PerlTeX macro invocation + =back =head1 NOTES diff --git a/Master/bin/i386-freebsd/perltex b/Master/bin/i386-freebsd/perltex index dd8dda2804b..9c85ef94500 100755 --- a/Master/bin/i386-freebsd/perltex +++ b/Master/bin/i386-freebsd/perltex @@ -15,7 +15,7 @@ # # This is a generated file. # -# Copyright (C) 2006, Scott Pakin <scott+pt@pakin.org> +# Copyright (C) 2007 Scott Pakin <scott+pt@pakin.org> # # This file may be distributed and/or modified under the conditions # of the LaTeX Project Public License, either version 1.3c of this @@ -37,30 +37,39 @@ use Opcode; use Getopt::Long; use Pod::Usage; use File::Basename; +use Fcntl; use POSIX; use warnings; use strict; my $latexprog; my $runsafely = 1; my @permittedops; +my $usepipe = 1; my $progname = basename $0; my $jobname = "texput"; -my @latexcmdline; my $toperl; my $fromperl; my $toflag; my $fromflag; my $doneflag; my $logfile; +my $pipe; +my @latexcmdline; +my $styfile; +my @macroexpansions; my $sandbox = new Safe; my $sandbox_eval; my $latexpid; +my $pipestring = "\%\%\%\%\% Generated by $progname\n\\endinput\n"; $latexprog = $ENV{"PERLTEX"} || "latex"; Getopt::Long::Configure("require_order", "pass_through"); -GetOptions("help" => sub {pod2usage(-verbose => 1)}, - "latex=s" => \$latexprog, - "safe!" => \$runsafely, - "permit=s" => \@permittedops) || pod2usage(2); +GetOptions("help" => sub {pod2usage(-verbose => 1)}, + "latex=s" => \$latexprog, + "safe!" => \$runsafely, + "pipe!" => \$usepipe, + "synctext=s" => \$pipestring, + "makesty" => sub {$styfile = "noperltex.sty"}, + "permit=s" => \@permittedops) || pod2usage(2); @latexcmdline = @ARGV; my $firstcmd = 0; for ($firstcmd=0; $firstcmd<=$#latexcmdline; $firstcmd++) { @@ -83,19 +92,30 @@ $toflag = $jobname . ".tfpl"; $fromflag = $jobname . ".ffpl"; $doneflag = $jobname . ".dfpl"; $logfile = $jobname . ".lgpl"; +$pipe = $jobname . ".pipe"; $latexcmdline[$firstcmd] = - sprintf '\makeatletter' . '\def%s{%s}' x 6 . '\makeatother%s', + sprintf '\makeatletter' . '\def%s{%s}' x 7 . '\makeatother%s', '\plmac@tag', $separator, '\plmac@tofile', $toperl, '\plmac@fromfile', $fromperl, '\plmac@toflag', $toflag, '\plmac@fromflag', $fromflag, '\plmac@doneflag', $doneflag, + '\plmac@pipe', $pipe, $latexcmdline[$firstcmd]; -foreach my $file ($toperl, $fromperl, $toflag, $fromflag, $doneflag) { +foreach my $file ($toperl, $fromperl, $toflag, $fromflag, $doneflag, $pipe) { unlink $file while -e $file; } open (LOGFILE, ">$logfile") || die "open(\"$logfile\"): $!\n"; +if (defined $styfile) { + open (STYFILE, ">$styfile") || die "open(\"$styfile\"): $!\n"; +} +if (!$usepipe || !eval {mkfifo($pipe, 0600)}) { + sysopen PIPE, $pipe, O_WRONLY|O_CREAT, 0755; + print PIPE $pipestring; + close PIPE; + $usepipe = 0; +} defined ($latexpid = fork) || die "fork: $!\n"; unshift @latexcmdline, $latexprog; if (!$latexpid) { @@ -116,7 +136,7 @@ while (1) { sleep 0; if (waitpid($latexpid, &WNOHANG)==-1) { foreach my $file ($toperl, $fromperl, $toflag, - $fromflag, $doneflag) { + $fromflag, $doneflag, $pipe) { unlink $file while -e $file; } undef $latexpid; @@ -173,7 +193,7 @@ while (1) { print LOGFILE "# ===> $warningmsg\n\n"; } } - $result="" if !$result || $optag eq "RUN"; + $result = "" if !$result || $optag eq "RUN"; if ($@) { my $msg = $@; $msg =~ s/at \(eval \d+\) line \d+\W+//; @@ -202,6 +222,7 @@ while (1) { $helpstring =~ s/\. /.\\space\\space /g; $result .= "{$helpstring}"; } + push @macroexpansions, $result if defined $styfile && $optag eq "USE"; print LOGFILE "%" x 30, " LATEX RESULT ", "%" x 30, "\n"; print LOGFILE $result, "\n\n"; $result .= '\endinput'; @@ -213,10 +234,18 @@ while (1) { unlink $doneflag while -e $doneflag; open (FROMFLAG, ">$fromflag") || die "open($fromflag): $!\n"; close FROMFLAG; + if (open (PIPE, ">$pipe")) { + print PIPE $pipestring; + close PIPE; + } $awaitexists->($toperl); unlink $fromflag while -e $fromflag; open (DONEFLAG, ">$doneflag") || die "open($doneflag): $!\n"; close DONEFLAG; + if (open (PIPE, ">$pipe")) { + print PIPE $pipestring; + close PIPE; + } } END { close LOGFILE; @@ -224,6 +253,46 @@ END { kill (9, $latexpid); exit 1; } + + if (defined $styfile) { + print STYFILE <<"STYFILEHEADER1"; +\\NeedsTeXFormat{LaTeX2e}[1999/12/01] +\\ProvidesPackage{noperltex} + [2007/09/29 v1.4 Perl-free version of PerlTeX specific to $jobname.tex] +STYFILEHEADER1 + ; + print STYFILE <<'STYFILEHEADER2'; +\RequirePackage{filecontents} + +\let\noperltex@PackageError=\PackageError +\renewcommand{\PackageError}[3]{} +\RequirePackage{perltex} +\let\PackageError=\noperltex@PackageError + +\newcount\plmac@macro@invocation@num +\gdef\plmac@show@placeholder#1#2\@empty{% + \ifx#1U\relax + \endgroup + \advance\plmac@macro@invocation@num by 1\relax + \global\plmac@macro@invocation@num=\plmac@macro@invocation@num + \input{noperltex-\the\plmac@macro@invocation@num.tex}% + \else + \endgroup + \fi +} +STYFILEHEADER2 + ; + foreach my $e (0 .. $#macroexpansions) { + print STYFILE "\n"; + printf STYFILE "%% Invocation #%d\n", 1+$e; + printf STYFILE "\\begin{filecontents}{noperltex-%d.tex}\n", 1+$e; + print STYFILE $macroexpansions[$e], "\\endinput\n"; + print STYFILE "\\end{filecontents}\n"; + } + print STYFILE "\\endinput\n"; + close STYFILE; + } + exit 0; } @@ -240,6 +309,7 @@ perltex [B<--latex>=I<program>] [B<-->[B<no>]B<safe>] [B<--permit>=I<feature>] +[B<--makesty>] [I<latex options>] =head1 DESCRIPTION @@ -280,21 +350,32 @@ B<pdflatex> instead of ordinary B<latex>. =item B<-->[B<no>]B<safe> -Enable or disable sandboxing. With the default of C<--safe>, +Enable or disable sandboxing. With the default of B<--safe>, B<perltex> executes the code from a C<\perlnewcommand> or C<\perlrenewcommand> macro within a protected environment that prohibits ``unsafe'' operations such as accessing files or executing -external programs. Specifying C<--nosafe> gives the LaTeX document +external programs. Specifying B<--nosafe> gives the LaTeX document I<carte blanche> to execute any arbitrary Perl code, including that which can harm the user's files. See L<Safe> for more information. =item B<--permit>=I<feature> -Permit particular Perl operations to be performed. The C<--permit> +Permit particular Perl operations to be performed. The B<--permit> option, which can be specified more than once on the command line, enables finer-grained control over the B<perltex> sandbox. See L<Opcode> for more information. +=item B<--makesty> + +Generate a LaTeX style file called F<noperltex.sty>. Replacing the +document's C<\usepackage{perltex}> line with C<\usepackage{noperltex}> +produces the same output but does not require PerlTeX, making the +document suitable for distribution to people who do not have PerlTeX +installed. The disadvantage is that F<noperltex.sty> is specific to +the document that produced it. Any changes to the document's PerlTeX +macro definitions or macro invocations necessitates rerunning +B<perltex> with the B<--makesty> option. + =back These options are then followed by whatever options are normally @@ -308,7 +389,7 @@ In its simplest form, B<perltex> is run just like B<latex>: perltex myfile.tex -To use B<pdflatex> instead of regular B<latex>, use the C<--latex> +To use B<pdflatex> instead of regular B<latex>, use the B<--latex> option: perltex --latex=pdflatex myfile.tex @@ -316,7 +397,7 @@ option: If LaTeX gives a ``C<trapped by operation mask>'' error and you trust the F<.tex> file you're trying to compile not to execute malicious Perl code (e.g., because you wrote it yourself), you can disable -B<perltex>'s safety mechansisms with C<--nosafe>: +B<perltex>'s safety mechansisms with B<--nosafe>: perltex --nosafe myfile.tex @@ -337,7 +418,7 @@ B<perltex> honors the following environment variables: Specify the filename of the LaTeX compiler. The LaTeX compiler defaults to ``C<latex>''. The C<PERLTEX> environment variable -overrides this default, and the C<--latex> command-line option (see +overrides this default, and the B<--latex> command-line option (see L</OPTIONS>) overrides that. =back @@ -376,6 +457,10 @@ valid data ``flag'' file whose existence indicates that F<jobname.ffpl> has been deleted +=item F<noperltex-#.tex> + +file generated by F<noperltex.sty> for each PerlTeX macro invocation + =back =head1 NOTES diff --git a/Master/bin/i386-linux/perltex b/Master/bin/i386-linux/perltex index 52b14ef394f..9c85ef94500 100755 --- a/Master/bin/i386-linux/perltex +++ b/Master/bin/i386-linux/perltex @@ -44,9 +44,9 @@ use strict; my $latexprog; my $runsafely = 1; my @permittedops; +my $usepipe = 1; my $progname = basename $0; my $jobname = "texput"; -my @latexcmdline; my $toperl; my $fromperl; my $toflag; @@ -54,18 +54,22 @@ my $fromflag; my $doneflag; my $logfile; my $pipe; +my @latexcmdline; my $styfile; my @macroexpansions; my $sandbox = new Safe; my $sandbox_eval; my $latexpid; +my $pipestring = "\%\%\%\%\% Generated by $progname\n\\endinput\n"; $latexprog = $ENV{"PERLTEX"} || "latex"; Getopt::Long::Configure("require_order", "pass_through"); -GetOptions("help" => sub {pod2usage(-verbose => 1)}, - "latex=s" => \$latexprog, - "safe!" => \$runsafely, - "makesty" => sub {$styfile = "noperltex.sty"}, - "permit=s" => \@permittedops) || pod2usage(2); +GetOptions("help" => sub {pod2usage(-verbose => 1)}, + "latex=s" => \$latexprog, + "safe!" => \$runsafely, + "pipe!" => \$usepipe, + "synctext=s" => \$pipestring, + "makesty" => sub {$styfile = "noperltex.sty"}, + "permit=s" => \@permittedops) || pod2usage(2); @latexcmdline = @ARGV; my $firstcmd = 0; for ($firstcmd=0; $firstcmd<=$#latexcmdline; $firstcmd++) { @@ -106,10 +110,11 @@ open (LOGFILE, ">$logfile") || die "open(\"$logfile\"): $!\n"; if (defined $styfile) { open (STYFILE, ">$styfile") || die "open(\"$styfile\"): $!\n"; } -if (!eval {mkfifo($pipe, 0600)}) { +if (!$usepipe || !eval {mkfifo($pipe, 0600)}) { sysopen PIPE, $pipe, O_WRONLY|O_CREAT, 0755; - print PIPE "\\endinput\n"; + print PIPE $pipestring; close PIPE; + $usepipe = 0; } defined ($latexpid = fork) || die "fork: $!\n"; unshift @latexcmdline, $latexprog; @@ -230,16 +235,16 @@ while (1) { open (FROMFLAG, ">$fromflag") || die "open($fromflag): $!\n"; close FROMFLAG; if (open (PIPE, ">$pipe")) { -print PIPE "\\endinput\n"; -close PIPE; + print PIPE $pipestring; + close PIPE; } $awaitexists->($toperl); unlink $fromflag while -e $fromflag; open (DONEFLAG, ">$doneflag") || die "open($doneflag): $!\n"; close DONEFLAG; if (open (PIPE, ">$pipe")) { -print PIPE "\\endinput\n"; -close PIPE; + print PIPE $pipestring; + close PIPE; } } END { diff --git a/Master/bin/i386-openbsd/perltex b/Master/bin/i386-openbsd/perltex index dd8dda2804b..9c85ef94500 100755 --- a/Master/bin/i386-openbsd/perltex +++ b/Master/bin/i386-openbsd/perltex @@ -15,7 +15,7 @@ # # This is a generated file. # -# Copyright (C) 2006, Scott Pakin <scott+pt@pakin.org> +# Copyright (C) 2007 Scott Pakin <scott+pt@pakin.org> # # This file may be distributed and/or modified under the conditions # of the LaTeX Project Public License, either version 1.3c of this @@ -37,30 +37,39 @@ use Opcode; use Getopt::Long; use Pod::Usage; use File::Basename; +use Fcntl; use POSIX; use warnings; use strict; my $latexprog; my $runsafely = 1; my @permittedops; +my $usepipe = 1; my $progname = basename $0; my $jobname = "texput"; -my @latexcmdline; my $toperl; my $fromperl; my $toflag; my $fromflag; my $doneflag; my $logfile; +my $pipe; +my @latexcmdline; +my $styfile; +my @macroexpansions; my $sandbox = new Safe; my $sandbox_eval; my $latexpid; +my $pipestring = "\%\%\%\%\% Generated by $progname\n\\endinput\n"; $latexprog = $ENV{"PERLTEX"} || "latex"; Getopt::Long::Configure("require_order", "pass_through"); -GetOptions("help" => sub {pod2usage(-verbose => 1)}, - "latex=s" => \$latexprog, - "safe!" => \$runsafely, - "permit=s" => \@permittedops) || pod2usage(2); +GetOptions("help" => sub {pod2usage(-verbose => 1)}, + "latex=s" => \$latexprog, + "safe!" => \$runsafely, + "pipe!" => \$usepipe, + "synctext=s" => \$pipestring, + "makesty" => sub {$styfile = "noperltex.sty"}, + "permit=s" => \@permittedops) || pod2usage(2); @latexcmdline = @ARGV; my $firstcmd = 0; for ($firstcmd=0; $firstcmd<=$#latexcmdline; $firstcmd++) { @@ -83,19 +92,30 @@ $toflag = $jobname . ".tfpl"; $fromflag = $jobname . ".ffpl"; $doneflag = $jobname . ".dfpl"; $logfile = $jobname . ".lgpl"; +$pipe = $jobname . ".pipe"; $latexcmdline[$firstcmd] = - sprintf '\makeatletter' . '\def%s{%s}' x 6 . '\makeatother%s', + sprintf '\makeatletter' . '\def%s{%s}' x 7 . '\makeatother%s', '\plmac@tag', $separator, '\plmac@tofile', $toperl, '\plmac@fromfile', $fromperl, '\plmac@toflag', $toflag, '\plmac@fromflag', $fromflag, '\plmac@doneflag', $doneflag, + '\plmac@pipe', $pipe, $latexcmdline[$firstcmd]; -foreach my $file ($toperl, $fromperl, $toflag, $fromflag, $doneflag) { +foreach my $file ($toperl, $fromperl, $toflag, $fromflag, $doneflag, $pipe) { unlink $file while -e $file; } open (LOGFILE, ">$logfile") || die "open(\"$logfile\"): $!\n"; +if (defined $styfile) { + open (STYFILE, ">$styfile") || die "open(\"$styfile\"): $!\n"; +} +if (!$usepipe || !eval {mkfifo($pipe, 0600)}) { + sysopen PIPE, $pipe, O_WRONLY|O_CREAT, 0755; + print PIPE $pipestring; + close PIPE; + $usepipe = 0; +} defined ($latexpid = fork) || die "fork: $!\n"; unshift @latexcmdline, $latexprog; if (!$latexpid) { @@ -116,7 +136,7 @@ while (1) { sleep 0; if (waitpid($latexpid, &WNOHANG)==-1) { foreach my $file ($toperl, $fromperl, $toflag, - $fromflag, $doneflag) { + $fromflag, $doneflag, $pipe) { unlink $file while -e $file; } undef $latexpid; @@ -173,7 +193,7 @@ while (1) { print LOGFILE "# ===> $warningmsg\n\n"; } } - $result="" if !$result || $optag eq "RUN"; + $result = "" if !$result || $optag eq "RUN"; if ($@) { my $msg = $@; $msg =~ s/at \(eval \d+\) line \d+\W+//; @@ -202,6 +222,7 @@ while (1) { $helpstring =~ s/\. /.\\space\\space /g; $result .= "{$helpstring}"; } + push @macroexpansions, $result if defined $styfile && $optag eq "USE"; print LOGFILE "%" x 30, " LATEX RESULT ", "%" x 30, "\n"; print LOGFILE $result, "\n\n"; $result .= '\endinput'; @@ -213,10 +234,18 @@ while (1) { unlink $doneflag while -e $doneflag; open (FROMFLAG, ">$fromflag") || die "open($fromflag): $!\n"; close FROMFLAG; + if (open (PIPE, ">$pipe")) { + print PIPE $pipestring; + close PIPE; + } $awaitexists->($toperl); unlink $fromflag while -e $fromflag; open (DONEFLAG, ">$doneflag") || die "open($doneflag): $!\n"; close DONEFLAG; + if (open (PIPE, ">$pipe")) { + print PIPE $pipestring; + close PIPE; + } } END { close LOGFILE; @@ -224,6 +253,46 @@ END { kill (9, $latexpid); exit 1; } + + if (defined $styfile) { + print STYFILE <<"STYFILEHEADER1"; +\\NeedsTeXFormat{LaTeX2e}[1999/12/01] +\\ProvidesPackage{noperltex} + [2007/09/29 v1.4 Perl-free version of PerlTeX specific to $jobname.tex] +STYFILEHEADER1 + ; + print STYFILE <<'STYFILEHEADER2'; +\RequirePackage{filecontents} + +\let\noperltex@PackageError=\PackageError +\renewcommand{\PackageError}[3]{} +\RequirePackage{perltex} +\let\PackageError=\noperltex@PackageError + +\newcount\plmac@macro@invocation@num +\gdef\plmac@show@placeholder#1#2\@empty{% + \ifx#1U\relax + \endgroup + \advance\plmac@macro@invocation@num by 1\relax + \global\plmac@macro@invocation@num=\plmac@macro@invocation@num + \input{noperltex-\the\plmac@macro@invocation@num.tex}% + \else + \endgroup + \fi +} +STYFILEHEADER2 + ; + foreach my $e (0 .. $#macroexpansions) { + print STYFILE "\n"; + printf STYFILE "%% Invocation #%d\n", 1+$e; + printf STYFILE "\\begin{filecontents}{noperltex-%d.tex}\n", 1+$e; + print STYFILE $macroexpansions[$e], "\\endinput\n"; + print STYFILE "\\end{filecontents}\n"; + } + print STYFILE "\\endinput\n"; + close STYFILE; + } + exit 0; } @@ -240,6 +309,7 @@ perltex [B<--latex>=I<program>] [B<-->[B<no>]B<safe>] [B<--permit>=I<feature>] +[B<--makesty>] [I<latex options>] =head1 DESCRIPTION @@ -280,21 +350,32 @@ B<pdflatex> instead of ordinary B<latex>. =item B<-->[B<no>]B<safe> -Enable or disable sandboxing. With the default of C<--safe>, +Enable or disable sandboxing. With the default of B<--safe>, B<perltex> executes the code from a C<\perlnewcommand> or C<\perlrenewcommand> macro within a protected environment that prohibits ``unsafe'' operations such as accessing files or executing -external programs. Specifying C<--nosafe> gives the LaTeX document +external programs. Specifying B<--nosafe> gives the LaTeX document I<carte blanche> to execute any arbitrary Perl code, including that which can harm the user's files. See L<Safe> for more information. =item B<--permit>=I<feature> -Permit particular Perl operations to be performed. The C<--permit> +Permit particular Perl operations to be performed. The B<--permit> option, which can be specified more than once on the command line, enables finer-grained control over the B<perltex> sandbox. See L<Opcode> for more information. +=item B<--makesty> + +Generate a LaTeX style file called F<noperltex.sty>. Replacing the +document's C<\usepackage{perltex}> line with C<\usepackage{noperltex}> +produces the same output but does not require PerlTeX, making the +document suitable for distribution to people who do not have PerlTeX +installed. The disadvantage is that F<noperltex.sty> is specific to +the document that produced it. Any changes to the document's PerlTeX +macro definitions or macro invocations necessitates rerunning +B<perltex> with the B<--makesty> option. + =back These options are then followed by whatever options are normally @@ -308,7 +389,7 @@ In its simplest form, B<perltex> is run just like B<latex>: perltex myfile.tex -To use B<pdflatex> instead of regular B<latex>, use the C<--latex> +To use B<pdflatex> instead of regular B<latex>, use the B<--latex> option: perltex --latex=pdflatex myfile.tex @@ -316,7 +397,7 @@ option: If LaTeX gives a ``C<trapped by operation mask>'' error and you trust the F<.tex> file you're trying to compile not to execute malicious Perl code (e.g., because you wrote it yourself), you can disable -B<perltex>'s safety mechansisms with C<--nosafe>: +B<perltex>'s safety mechansisms with B<--nosafe>: perltex --nosafe myfile.tex @@ -337,7 +418,7 @@ B<perltex> honors the following environment variables: Specify the filename of the LaTeX compiler. The LaTeX compiler defaults to ``C<latex>''. The C<PERLTEX> environment variable -overrides this default, and the C<--latex> command-line option (see +overrides this default, and the B<--latex> command-line option (see L</OPTIONS>) overrides that. =back @@ -376,6 +457,10 @@ valid data ``flag'' file whose existence indicates that F<jobname.ffpl> has been deleted +=item F<noperltex-#.tex> + +file generated by F<noperltex.sty> for each PerlTeX macro invocation + =back =head1 NOTES diff --git a/Master/bin/i386-solaris/perltex b/Master/bin/i386-solaris/perltex index dd8dda2804b..9c85ef94500 100755 --- a/Master/bin/i386-solaris/perltex +++ b/Master/bin/i386-solaris/perltex @@ -15,7 +15,7 @@ # # This is a generated file. # -# Copyright (C) 2006, Scott Pakin <scott+pt@pakin.org> +# Copyright (C) 2007 Scott Pakin <scott+pt@pakin.org> # # This file may be distributed and/or modified under the conditions # of the LaTeX Project Public License, either version 1.3c of this @@ -37,30 +37,39 @@ use Opcode; use Getopt::Long; use Pod::Usage; use File::Basename; +use Fcntl; use POSIX; use warnings; use strict; my $latexprog; my $runsafely = 1; my @permittedops; +my $usepipe = 1; my $progname = basename $0; my $jobname = "texput"; -my @latexcmdline; my $toperl; my $fromperl; my $toflag; my $fromflag; my $doneflag; my $logfile; +my $pipe; +my @latexcmdline; +my $styfile; +my @macroexpansions; my $sandbox = new Safe; my $sandbox_eval; my $latexpid; +my $pipestring = "\%\%\%\%\% Generated by $progname\n\\endinput\n"; $latexprog = $ENV{"PERLTEX"} || "latex"; Getopt::Long::Configure("require_order", "pass_through"); -GetOptions("help" => sub {pod2usage(-verbose => 1)}, - "latex=s" => \$latexprog, - "safe!" => \$runsafely, - "permit=s" => \@permittedops) || pod2usage(2); +GetOptions("help" => sub {pod2usage(-verbose => 1)}, + "latex=s" => \$latexprog, + "safe!" => \$runsafely, + "pipe!" => \$usepipe, + "synctext=s" => \$pipestring, + "makesty" => sub {$styfile = "noperltex.sty"}, + "permit=s" => \@permittedops) || pod2usage(2); @latexcmdline = @ARGV; my $firstcmd = 0; for ($firstcmd=0; $firstcmd<=$#latexcmdline; $firstcmd++) { @@ -83,19 +92,30 @@ $toflag = $jobname . ".tfpl"; $fromflag = $jobname . ".ffpl"; $doneflag = $jobname . ".dfpl"; $logfile = $jobname . ".lgpl"; +$pipe = $jobname . ".pipe"; $latexcmdline[$firstcmd] = - sprintf '\makeatletter' . '\def%s{%s}' x 6 . '\makeatother%s', + sprintf '\makeatletter' . '\def%s{%s}' x 7 . '\makeatother%s', '\plmac@tag', $separator, '\plmac@tofile', $toperl, '\plmac@fromfile', $fromperl, '\plmac@toflag', $toflag, '\plmac@fromflag', $fromflag, '\plmac@doneflag', $doneflag, + '\plmac@pipe', $pipe, $latexcmdline[$firstcmd]; -foreach my $file ($toperl, $fromperl, $toflag, $fromflag, $doneflag) { +foreach my $file ($toperl, $fromperl, $toflag, $fromflag, $doneflag, $pipe) { unlink $file while -e $file; } open (LOGFILE, ">$logfile") || die "open(\"$logfile\"): $!\n"; +if (defined $styfile) { + open (STYFILE, ">$styfile") || die "open(\"$styfile\"): $!\n"; +} +if (!$usepipe || !eval {mkfifo($pipe, 0600)}) { + sysopen PIPE, $pipe, O_WRONLY|O_CREAT, 0755; + print PIPE $pipestring; + close PIPE; + $usepipe = 0; +} defined ($latexpid = fork) || die "fork: $!\n"; unshift @latexcmdline, $latexprog; if (!$latexpid) { @@ -116,7 +136,7 @@ while (1) { sleep 0; if (waitpid($latexpid, &WNOHANG)==-1) { foreach my $file ($toperl, $fromperl, $toflag, - $fromflag, $doneflag) { + $fromflag, $doneflag, $pipe) { unlink $file while -e $file; } undef $latexpid; @@ -173,7 +193,7 @@ while (1) { print LOGFILE "# ===> $warningmsg\n\n"; } } - $result="" if !$result || $optag eq "RUN"; + $result = "" if !$result || $optag eq "RUN"; if ($@) { my $msg = $@; $msg =~ s/at \(eval \d+\) line \d+\W+//; @@ -202,6 +222,7 @@ while (1) { $helpstring =~ s/\. /.\\space\\space /g; $result .= "{$helpstring}"; } + push @macroexpansions, $result if defined $styfile && $optag eq "USE"; print LOGFILE "%" x 30, " LATEX RESULT ", "%" x 30, "\n"; print LOGFILE $result, "\n\n"; $result .= '\endinput'; @@ -213,10 +234,18 @@ while (1) { unlink $doneflag while -e $doneflag; open (FROMFLAG, ">$fromflag") || die "open($fromflag): $!\n"; close FROMFLAG; + if (open (PIPE, ">$pipe")) { + print PIPE $pipestring; + close PIPE; + } $awaitexists->($toperl); unlink $fromflag while -e $fromflag; open (DONEFLAG, ">$doneflag") || die "open($doneflag): $!\n"; close DONEFLAG; + if (open (PIPE, ">$pipe")) { + print PIPE $pipestring; + close PIPE; + } } END { close LOGFILE; @@ -224,6 +253,46 @@ END { kill (9, $latexpid); exit 1; } + + if (defined $styfile) { + print STYFILE <<"STYFILEHEADER1"; +\\NeedsTeXFormat{LaTeX2e}[1999/12/01] +\\ProvidesPackage{noperltex} + [2007/09/29 v1.4 Perl-free version of PerlTeX specific to $jobname.tex] +STYFILEHEADER1 + ; + print STYFILE <<'STYFILEHEADER2'; +\RequirePackage{filecontents} + +\let\noperltex@PackageError=\PackageError +\renewcommand{\PackageError}[3]{} +\RequirePackage{perltex} +\let\PackageError=\noperltex@PackageError + +\newcount\plmac@macro@invocation@num +\gdef\plmac@show@placeholder#1#2\@empty{% + \ifx#1U\relax + \endgroup + \advance\plmac@macro@invocation@num by 1\relax + \global\plmac@macro@invocation@num=\plmac@macro@invocation@num + \input{noperltex-\the\plmac@macro@invocation@num.tex}% + \else + \endgroup + \fi +} +STYFILEHEADER2 + ; + foreach my $e (0 .. $#macroexpansions) { + print STYFILE "\n"; + printf STYFILE "%% Invocation #%d\n", 1+$e; + printf STYFILE "\\begin{filecontents}{noperltex-%d.tex}\n", 1+$e; + print STYFILE $macroexpansions[$e], "\\endinput\n"; + print STYFILE "\\end{filecontents}\n"; + } + print STYFILE "\\endinput\n"; + close STYFILE; + } + exit 0; } @@ -240,6 +309,7 @@ perltex [B<--latex>=I<program>] [B<-->[B<no>]B<safe>] [B<--permit>=I<feature>] +[B<--makesty>] [I<latex options>] =head1 DESCRIPTION @@ -280,21 +350,32 @@ B<pdflatex> instead of ordinary B<latex>. =item B<-->[B<no>]B<safe> -Enable or disable sandboxing. With the default of C<--safe>, +Enable or disable sandboxing. With the default of B<--safe>, B<perltex> executes the code from a C<\perlnewcommand> or C<\perlrenewcommand> macro within a protected environment that prohibits ``unsafe'' operations such as accessing files or executing -external programs. Specifying C<--nosafe> gives the LaTeX document +external programs. Specifying B<--nosafe> gives the LaTeX document I<carte blanche> to execute any arbitrary Perl code, including that which can harm the user's files. See L<Safe> for more information. =item B<--permit>=I<feature> -Permit particular Perl operations to be performed. The C<--permit> +Permit particular Perl operations to be performed. The B<--permit> option, which can be specified more than once on the command line, enables finer-grained control over the B<perltex> sandbox. See L<Opcode> for more information. +=item B<--makesty> + +Generate a LaTeX style file called F<noperltex.sty>. Replacing the +document's C<\usepackage{perltex}> line with C<\usepackage{noperltex}> +produces the same output but does not require PerlTeX, making the +document suitable for distribution to people who do not have PerlTeX +installed. The disadvantage is that F<noperltex.sty> is specific to +the document that produced it. Any changes to the document's PerlTeX +macro definitions or macro invocations necessitates rerunning +B<perltex> with the B<--makesty> option. + =back These options are then followed by whatever options are normally @@ -308,7 +389,7 @@ In its simplest form, B<perltex> is run just like B<latex>: perltex myfile.tex -To use B<pdflatex> instead of regular B<latex>, use the C<--latex> +To use B<pdflatex> instead of regular B<latex>, use the B<--latex> option: perltex --latex=pdflatex myfile.tex @@ -316,7 +397,7 @@ option: If LaTeX gives a ``C<trapped by operation mask>'' error and you trust the F<.tex> file you're trying to compile not to execute malicious Perl code (e.g., because you wrote it yourself), you can disable -B<perltex>'s safety mechansisms with C<--nosafe>: +B<perltex>'s safety mechansisms with B<--nosafe>: perltex --nosafe myfile.tex @@ -337,7 +418,7 @@ B<perltex> honors the following environment variables: Specify the filename of the LaTeX compiler. The LaTeX compiler defaults to ``C<latex>''. The C<PERLTEX> environment variable -overrides this default, and the C<--latex> command-line option (see +overrides this default, and the B<--latex> command-line option (see L</OPTIONS>) overrides that. =back @@ -376,6 +457,10 @@ valid data ``flag'' file whose existence indicates that F<jobname.ffpl> has been deleted +=item F<noperltex-#.tex> + +file generated by F<noperltex.sty> for each PerlTeX macro invocation + =back =head1 NOTES diff --git a/Master/bin/mips-irix/perltex b/Master/bin/mips-irix/perltex index dd8dda2804b..9c85ef94500 100755 --- a/Master/bin/mips-irix/perltex +++ b/Master/bin/mips-irix/perltex @@ -15,7 +15,7 @@ # # This is a generated file. # -# Copyright (C) 2006, Scott Pakin <scott+pt@pakin.org> +# Copyright (C) 2007 Scott Pakin <scott+pt@pakin.org> # # This file may be distributed and/or modified under the conditions # of the LaTeX Project Public License, either version 1.3c of this @@ -37,30 +37,39 @@ use Opcode; use Getopt::Long; use Pod::Usage; use File::Basename; +use Fcntl; use POSIX; use warnings; use strict; my $latexprog; my $runsafely = 1; my @permittedops; +my $usepipe = 1; my $progname = basename $0; my $jobname = "texput"; -my @latexcmdline; my $toperl; my $fromperl; my $toflag; my $fromflag; my $doneflag; my $logfile; +my $pipe; +my @latexcmdline; +my $styfile; +my @macroexpansions; my $sandbox = new Safe; my $sandbox_eval; my $latexpid; +my $pipestring = "\%\%\%\%\% Generated by $progname\n\\endinput\n"; $latexprog = $ENV{"PERLTEX"} || "latex"; Getopt::Long::Configure("require_order", "pass_through"); -GetOptions("help" => sub {pod2usage(-verbose => 1)}, - "latex=s" => \$latexprog, - "safe!" => \$runsafely, - "permit=s" => \@permittedops) || pod2usage(2); +GetOptions("help" => sub {pod2usage(-verbose => 1)}, + "latex=s" => \$latexprog, + "safe!" => \$runsafely, + "pipe!" => \$usepipe, + "synctext=s" => \$pipestring, + "makesty" => sub {$styfile = "noperltex.sty"}, + "permit=s" => \@permittedops) || pod2usage(2); @latexcmdline = @ARGV; my $firstcmd = 0; for ($firstcmd=0; $firstcmd<=$#latexcmdline; $firstcmd++) { @@ -83,19 +92,30 @@ $toflag = $jobname . ".tfpl"; $fromflag = $jobname . ".ffpl"; $doneflag = $jobname . ".dfpl"; $logfile = $jobname . ".lgpl"; +$pipe = $jobname . ".pipe"; $latexcmdline[$firstcmd] = - sprintf '\makeatletter' . '\def%s{%s}' x 6 . '\makeatother%s', + sprintf '\makeatletter' . '\def%s{%s}' x 7 . '\makeatother%s', '\plmac@tag', $separator, '\plmac@tofile', $toperl, '\plmac@fromfile', $fromperl, '\plmac@toflag', $toflag, '\plmac@fromflag', $fromflag, '\plmac@doneflag', $doneflag, + '\plmac@pipe', $pipe, $latexcmdline[$firstcmd]; -foreach my $file ($toperl, $fromperl, $toflag, $fromflag, $doneflag) { +foreach my $file ($toperl, $fromperl, $toflag, $fromflag, $doneflag, $pipe) { unlink $file while -e $file; } open (LOGFILE, ">$logfile") || die "open(\"$logfile\"): $!\n"; +if (defined $styfile) { + open (STYFILE, ">$styfile") || die "open(\"$styfile\"): $!\n"; +} +if (!$usepipe || !eval {mkfifo($pipe, 0600)}) { + sysopen PIPE, $pipe, O_WRONLY|O_CREAT, 0755; + print PIPE $pipestring; + close PIPE; + $usepipe = 0; +} defined ($latexpid = fork) || die "fork: $!\n"; unshift @latexcmdline, $latexprog; if (!$latexpid) { @@ -116,7 +136,7 @@ while (1) { sleep 0; if (waitpid($latexpid, &WNOHANG)==-1) { foreach my $file ($toperl, $fromperl, $toflag, - $fromflag, $doneflag) { + $fromflag, $doneflag, $pipe) { unlink $file while -e $file; } undef $latexpid; @@ -173,7 +193,7 @@ while (1) { print LOGFILE "# ===> $warningmsg\n\n"; } } - $result="" if !$result || $optag eq "RUN"; + $result = "" if !$result || $optag eq "RUN"; if ($@) { my $msg = $@; $msg =~ s/at \(eval \d+\) line \d+\W+//; @@ -202,6 +222,7 @@ while (1) { $helpstring =~ s/\. /.\\space\\space /g; $result .= "{$helpstring}"; } + push @macroexpansions, $result if defined $styfile && $optag eq "USE"; print LOGFILE "%" x 30, " LATEX RESULT ", "%" x 30, "\n"; print LOGFILE $result, "\n\n"; $result .= '\endinput'; @@ -213,10 +234,18 @@ while (1) { unlink $doneflag while -e $doneflag; open (FROMFLAG, ">$fromflag") || die "open($fromflag): $!\n"; close FROMFLAG; + if (open (PIPE, ">$pipe")) { + print PIPE $pipestring; + close PIPE; + } $awaitexists->($toperl); unlink $fromflag while -e $fromflag; open (DONEFLAG, ">$doneflag") || die "open($doneflag): $!\n"; close DONEFLAG; + if (open (PIPE, ">$pipe")) { + print PIPE $pipestring; + close PIPE; + } } END { close LOGFILE; @@ -224,6 +253,46 @@ END { kill (9, $latexpid); exit 1; } + + if (defined $styfile) { + print STYFILE <<"STYFILEHEADER1"; +\\NeedsTeXFormat{LaTeX2e}[1999/12/01] +\\ProvidesPackage{noperltex} + [2007/09/29 v1.4 Perl-free version of PerlTeX specific to $jobname.tex] +STYFILEHEADER1 + ; + print STYFILE <<'STYFILEHEADER2'; +\RequirePackage{filecontents} + +\let\noperltex@PackageError=\PackageError +\renewcommand{\PackageError}[3]{} +\RequirePackage{perltex} +\let\PackageError=\noperltex@PackageError + +\newcount\plmac@macro@invocation@num +\gdef\plmac@show@placeholder#1#2\@empty{% + \ifx#1U\relax + \endgroup + \advance\plmac@macro@invocation@num by 1\relax + \global\plmac@macro@invocation@num=\plmac@macro@invocation@num + \input{noperltex-\the\plmac@macro@invocation@num.tex}% + \else + \endgroup + \fi +} +STYFILEHEADER2 + ; + foreach my $e (0 .. $#macroexpansions) { + print STYFILE "\n"; + printf STYFILE "%% Invocation #%d\n", 1+$e; + printf STYFILE "\\begin{filecontents}{noperltex-%d.tex}\n", 1+$e; + print STYFILE $macroexpansions[$e], "\\endinput\n"; + print STYFILE "\\end{filecontents}\n"; + } + print STYFILE "\\endinput\n"; + close STYFILE; + } + exit 0; } @@ -240,6 +309,7 @@ perltex [B<--latex>=I<program>] [B<-->[B<no>]B<safe>] [B<--permit>=I<feature>] +[B<--makesty>] [I<latex options>] =head1 DESCRIPTION @@ -280,21 +350,32 @@ B<pdflatex> instead of ordinary B<latex>. =item B<-->[B<no>]B<safe> -Enable or disable sandboxing. With the default of C<--safe>, +Enable or disable sandboxing. With the default of B<--safe>, B<perltex> executes the code from a C<\perlnewcommand> or C<\perlrenewcommand> macro within a protected environment that prohibits ``unsafe'' operations such as accessing files or executing -external programs. Specifying C<--nosafe> gives the LaTeX document +external programs. Specifying B<--nosafe> gives the LaTeX document I<carte blanche> to execute any arbitrary Perl code, including that which can harm the user's files. See L<Safe> for more information. =item B<--permit>=I<feature> -Permit particular Perl operations to be performed. The C<--permit> +Permit particular Perl operations to be performed. The B<--permit> option, which can be specified more than once on the command line, enables finer-grained control over the B<perltex> sandbox. See L<Opcode> for more information. +=item B<--makesty> + +Generate a LaTeX style file called F<noperltex.sty>. Replacing the +document's C<\usepackage{perltex}> line with C<\usepackage{noperltex}> +produces the same output but does not require PerlTeX, making the +document suitable for distribution to people who do not have PerlTeX +installed. The disadvantage is that F<noperltex.sty> is specific to +the document that produced it. Any changes to the document's PerlTeX +macro definitions or macro invocations necessitates rerunning +B<perltex> with the B<--makesty> option. + =back These options are then followed by whatever options are normally @@ -308,7 +389,7 @@ In its simplest form, B<perltex> is run just like B<latex>: perltex myfile.tex -To use B<pdflatex> instead of regular B<latex>, use the C<--latex> +To use B<pdflatex> instead of regular B<latex>, use the B<--latex> option: perltex --latex=pdflatex myfile.tex @@ -316,7 +397,7 @@ option: If LaTeX gives a ``C<trapped by operation mask>'' error and you trust the F<.tex> file you're trying to compile not to execute malicious Perl code (e.g., because you wrote it yourself), you can disable -B<perltex>'s safety mechansisms with C<--nosafe>: +B<perltex>'s safety mechansisms with B<--nosafe>: perltex --nosafe myfile.tex @@ -337,7 +418,7 @@ B<perltex> honors the following environment variables: Specify the filename of the LaTeX compiler. The LaTeX compiler defaults to ``C<latex>''. The C<PERLTEX> environment variable -overrides this default, and the C<--latex> command-line option (see +overrides this default, and the B<--latex> command-line option (see L</OPTIONS>) overrides that. =back @@ -376,6 +457,10 @@ valid data ``flag'' file whose existence indicates that F<jobname.ffpl> has been deleted +=item F<noperltex-#.tex> + +file generated by F<noperltex.sty> for each PerlTeX macro invocation + =back =head1 NOTES diff --git a/Master/bin/powerpc-aix/perltex b/Master/bin/powerpc-aix/perltex index dd8dda2804b..9c85ef94500 100755 --- a/Master/bin/powerpc-aix/perltex +++ b/Master/bin/powerpc-aix/perltex @@ -15,7 +15,7 @@ # # This is a generated file. # -# Copyright (C) 2006, Scott Pakin <scott+pt@pakin.org> +# Copyright (C) 2007 Scott Pakin <scott+pt@pakin.org> # # This file may be distributed and/or modified under the conditions # of the LaTeX Project Public License, either version 1.3c of this @@ -37,30 +37,39 @@ use Opcode; use Getopt::Long; use Pod::Usage; use File::Basename; +use Fcntl; use POSIX; use warnings; use strict; my $latexprog; my $runsafely = 1; my @permittedops; +my $usepipe = 1; my $progname = basename $0; my $jobname = "texput"; -my @latexcmdline; my $toperl; my $fromperl; my $toflag; my $fromflag; my $doneflag; my $logfile; +my $pipe; +my @latexcmdline; +my $styfile; +my @macroexpansions; my $sandbox = new Safe; my $sandbox_eval; my $latexpid; +my $pipestring = "\%\%\%\%\% Generated by $progname\n\\endinput\n"; $latexprog = $ENV{"PERLTEX"} || "latex"; Getopt::Long::Configure("require_order", "pass_through"); -GetOptions("help" => sub {pod2usage(-verbose => 1)}, - "latex=s" => \$latexprog, - "safe!" => \$runsafely, - "permit=s" => \@permittedops) || pod2usage(2); +GetOptions("help" => sub {pod2usage(-verbose => 1)}, + "latex=s" => \$latexprog, + "safe!" => \$runsafely, + "pipe!" => \$usepipe, + "synctext=s" => \$pipestring, + "makesty" => sub {$styfile = "noperltex.sty"}, + "permit=s" => \@permittedops) || pod2usage(2); @latexcmdline = @ARGV; my $firstcmd = 0; for ($firstcmd=0; $firstcmd<=$#latexcmdline; $firstcmd++) { @@ -83,19 +92,30 @@ $toflag = $jobname . ".tfpl"; $fromflag = $jobname . ".ffpl"; $doneflag = $jobname . ".dfpl"; $logfile = $jobname . ".lgpl"; +$pipe = $jobname . ".pipe"; $latexcmdline[$firstcmd] = - sprintf '\makeatletter' . '\def%s{%s}' x 6 . '\makeatother%s', + sprintf '\makeatletter' . '\def%s{%s}' x 7 . '\makeatother%s', '\plmac@tag', $separator, '\plmac@tofile', $toperl, '\plmac@fromfile', $fromperl, '\plmac@toflag', $toflag, '\plmac@fromflag', $fromflag, '\plmac@doneflag', $doneflag, + '\plmac@pipe', $pipe, $latexcmdline[$firstcmd]; -foreach my $file ($toperl, $fromperl, $toflag, $fromflag, $doneflag) { +foreach my $file ($toperl, $fromperl, $toflag, $fromflag, $doneflag, $pipe) { unlink $file while -e $file; } open (LOGFILE, ">$logfile") || die "open(\"$logfile\"): $!\n"; +if (defined $styfile) { + open (STYFILE, ">$styfile") || die "open(\"$styfile\"): $!\n"; +} +if (!$usepipe || !eval {mkfifo($pipe, 0600)}) { + sysopen PIPE, $pipe, O_WRONLY|O_CREAT, 0755; + print PIPE $pipestring; + close PIPE; + $usepipe = 0; +} defined ($latexpid = fork) || die "fork: $!\n"; unshift @latexcmdline, $latexprog; if (!$latexpid) { @@ -116,7 +136,7 @@ while (1) { sleep 0; if (waitpid($latexpid, &WNOHANG)==-1) { foreach my $file ($toperl, $fromperl, $toflag, - $fromflag, $doneflag) { + $fromflag, $doneflag, $pipe) { unlink $file while -e $file; } undef $latexpid; @@ -173,7 +193,7 @@ while (1) { print LOGFILE "# ===> $warningmsg\n\n"; } } - $result="" if !$result || $optag eq "RUN"; + $result = "" if !$result || $optag eq "RUN"; if ($@) { my $msg = $@; $msg =~ s/at \(eval \d+\) line \d+\W+//; @@ -202,6 +222,7 @@ while (1) { $helpstring =~ s/\. /.\\space\\space /g; $result .= "{$helpstring}"; } + push @macroexpansions, $result if defined $styfile && $optag eq "USE"; print LOGFILE "%" x 30, " LATEX RESULT ", "%" x 30, "\n"; print LOGFILE $result, "\n\n"; $result .= '\endinput'; @@ -213,10 +234,18 @@ while (1) { unlink $doneflag while -e $doneflag; open (FROMFLAG, ">$fromflag") || die "open($fromflag): $!\n"; close FROMFLAG; + if (open (PIPE, ">$pipe")) { + print PIPE $pipestring; + close PIPE; + } $awaitexists->($toperl); unlink $fromflag while -e $fromflag; open (DONEFLAG, ">$doneflag") || die "open($doneflag): $!\n"; close DONEFLAG; + if (open (PIPE, ">$pipe")) { + print PIPE $pipestring; + close PIPE; + } } END { close LOGFILE; @@ -224,6 +253,46 @@ END { kill (9, $latexpid); exit 1; } + + if (defined $styfile) { + print STYFILE <<"STYFILEHEADER1"; +\\NeedsTeXFormat{LaTeX2e}[1999/12/01] +\\ProvidesPackage{noperltex} + [2007/09/29 v1.4 Perl-free version of PerlTeX specific to $jobname.tex] +STYFILEHEADER1 + ; + print STYFILE <<'STYFILEHEADER2'; +\RequirePackage{filecontents} + +\let\noperltex@PackageError=\PackageError +\renewcommand{\PackageError}[3]{} +\RequirePackage{perltex} +\let\PackageError=\noperltex@PackageError + +\newcount\plmac@macro@invocation@num +\gdef\plmac@show@placeholder#1#2\@empty{% + \ifx#1U\relax + \endgroup + \advance\plmac@macro@invocation@num by 1\relax + \global\plmac@macro@invocation@num=\plmac@macro@invocation@num + \input{noperltex-\the\plmac@macro@invocation@num.tex}% + \else + \endgroup + \fi +} +STYFILEHEADER2 + ; + foreach my $e (0 .. $#macroexpansions) { + print STYFILE "\n"; + printf STYFILE "%% Invocation #%d\n", 1+$e; + printf STYFILE "\\begin{filecontents}{noperltex-%d.tex}\n", 1+$e; + print STYFILE $macroexpansions[$e], "\\endinput\n"; + print STYFILE "\\end{filecontents}\n"; + } + print STYFILE "\\endinput\n"; + close STYFILE; + } + exit 0; } @@ -240,6 +309,7 @@ perltex [B<--latex>=I<program>] [B<-->[B<no>]B<safe>] [B<--permit>=I<feature>] +[B<--makesty>] [I<latex options>] =head1 DESCRIPTION @@ -280,21 +350,32 @@ B<pdflatex> instead of ordinary B<latex>. =item B<-->[B<no>]B<safe> -Enable or disable sandboxing. With the default of C<--safe>, +Enable or disable sandboxing. With the default of B<--safe>, B<perltex> executes the code from a C<\perlnewcommand> or C<\perlrenewcommand> macro within a protected environment that prohibits ``unsafe'' operations such as accessing files or executing -external programs. Specifying C<--nosafe> gives the LaTeX document +external programs. Specifying B<--nosafe> gives the LaTeX document I<carte blanche> to execute any arbitrary Perl code, including that which can harm the user's files. See L<Safe> for more information. =item B<--permit>=I<feature> -Permit particular Perl operations to be performed. The C<--permit> +Permit particular Perl operations to be performed. The B<--permit> option, which can be specified more than once on the command line, enables finer-grained control over the B<perltex> sandbox. See L<Opcode> for more information. +=item B<--makesty> + +Generate a LaTeX style file called F<noperltex.sty>. Replacing the +document's C<\usepackage{perltex}> line with C<\usepackage{noperltex}> +produces the same output but does not require PerlTeX, making the +document suitable for distribution to people who do not have PerlTeX +installed. The disadvantage is that F<noperltex.sty> is specific to +the document that produced it. Any changes to the document's PerlTeX +macro definitions or macro invocations necessitates rerunning +B<perltex> with the B<--makesty> option. + =back These options are then followed by whatever options are normally @@ -308,7 +389,7 @@ In its simplest form, B<perltex> is run just like B<latex>: perltex myfile.tex -To use B<pdflatex> instead of regular B<latex>, use the C<--latex> +To use B<pdflatex> instead of regular B<latex>, use the B<--latex> option: perltex --latex=pdflatex myfile.tex @@ -316,7 +397,7 @@ option: If LaTeX gives a ``C<trapped by operation mask>'' error and you trust the F<.tex> file you're trying to compile not to execute malicious Perl code (e.g., because you wrote it yourself), you can disable -B<perltex>'s safety mechansisms with C<--nosafe>: +B<perltex>'s safety mechansisms with B<--nosafe>: perltex --nosafe myfile.tex @@ -337,7 +418,7 @@ B<perltex> honors the following environment variables: Specify the filename of the LaTeX compiler. The LaTeX compiler defaults to ``C<latex>''. The C<PERLTEX> environment variable -overrides this default, and the C<--latex> command-line option (see +overrides this default, and the B<--latex> command-line option (see L</OPTIONS>) overrides that. =back @@ -376,6 +457,10 @@ valid data ``flag'' file whose existence indicates that F<jobname.ffpl> has been deleted +=item F<noperltex-#.tex> + +file generated by F<noperltex.sty> for each PerlTeX macro invocation + =back =head1 NOTES diff --git a/Master/bin/powerpc-darwin/perltex b/Master/bin/powerpc-darwin/perltex index dd8dda2804b..9c85ef94500 100755 --- a/Master/bin/powerpc-darwin/perltex +++ b/Master/bin/powerpc-darwin/perltex @@ -15,7 +15,7 @@ # # This is a generated file. # -# Copyright (C) 2006, Scott Pakin <scott+pt@pakin.org> +# Copyright (C) 2007 Scott Pakin <scott+pt@pakin.org> # # This file may be distributed and/or modified under the conditions # of the LaTeX Project Public License, either version 1.3c of this @@ -37,30 +37,39 @@ use Opcode; use Getopt::Long; use Pod::Usage; use File::Basename; +use Fcntl; use POSIX; use warnings; use strict; my $latexprog; my $runsafely = 1; my @permittedops; +my $usepipe = 1; my $progname = basename $0; my $jobname = "texput"; -my @latexcmdline; my $toperl; my $fromperl; my $toflag; my $fromflag; my $doneflag; my $logfile; +my $pipe; +my @latexcmdline; +my $styfile; +my @macroexpansions; my $sandbox = new Safe; my $sandbox_eval; my $latexpid; +my $pipestring = "\%\%\%\%\% Generated by $progname\n\\endinput\n"; $latexprog = $ENV{"PERLTEX"} || "latex"; Getopt::Long::Configure("require_order", "pass_through"); -GetOptions("help" => sub {pod2usage(-verbose => 1)}, - "latex=s" => \$latexprog, - "safe!" => \$runsafely, - "permit=s" => \@permittedops) || pod2usage(2); +GetOptions("help" => sub {pod2usage(-verbose => 1)}, + "latex=s" => \$latexprog, + "safe!" => \$runsafely, + "pipe!" => \$usepipe, + "synctext=s" => \$pipestring, + "makesty" => sub {$styfile = "noperltex.sty"}, + "permit=s" => \@permittedops) || pod2usage(2); @latexcmdline = @ARGV; my $firstcmd = 0; for ($firstcmd=0; $firstcmd<=$#latexcmdline; $firstcmd++) { @@ -83,19 +92,30 @@ $toflag = $jobname . ".tfpl"; $fromflag = $jobname . ".ffpl"; $doneflag = $jobname . ".dfpl"; $logfile = $jobname . ".lgpl"; +$pipe = $jobname . ".pipe"; $latexcmdline[$firstcmd] = - sprintf '\makeatletter' . '\def%s{%s}' x 6 . '\makeatother%s', + sprintf '\makeatletter' . '\def%s{%s}' x 7 . '\makeatother%s', '\plmac@tag', $separator, '\plmac@tofile', $toperl, '\plmac@fromfile', $fromperl, '\plmac@toflag', $toflag, '\plmac@fromflag', $fromflag, '\plmac@doneflag', $doneflag, + '\plmac@pipe', $pipe, $latexcmdline[$firstcmd]; -foreach my $file ($toperl, $fromperl, $toflag, $fromflag, $doneflag) { +foreach my $file ($toperl, $fromperl, $toflag, $fromflag, $doneflag, $pipe) { unlink $file while -e $file; } open (LOGFILE, ">$logfile") || die "open(\"$logfile\"): $!\n"; +if (defined $styfile) { + open (STYFILE, ">$styfile") || die "open(\"$styfile\"): $!\n"; +} +if (!$usepipe || !eval {mkfifo($pipe, 0600)}) { + sysopen PIPE, $pipe, O_WRONLY|O_CREAT, 0755; + print PIPE $pipestring; + close PIPE; + $usepipe = 0; +} defined ($latexpid = fork) || die "fork: $!\n"; unshift @latexcmdline, $latexprog; if (!$latexpid) { @@ -116,7 +136,7 @@ while (1) { sleep 0; if (waitpid($latexpid, &WNOHANG)==-1) { foreach my $file ($toperl, $fromperl, $toflag, - $fromflag, $doneflag) { + $fromflag, $doneflag, $pipe) { unlink $file while -e $file; } undef $latexpid; @@ -173,7 +193,7 @@ while (1) { print LOGFILE "# ===> $warningmsg\n\n"; } } - $result="" if !$result || $optag eq "RUN"; + $result = "" if !$result || $optag eq "RUN"; if ($@) { my $msg = $@; $msg =~ s/at \(eval \d+\) line \d+\W+//; @@ -202,6 +222,7 @@ while (1) { $helpstring =~ s/\. /.\\space\\space /g; $result .= "{$helpstring}"; } + push @macroexpansions, $result if defined $styfile && $optag eq "USE"; print LOGFILE "%" x 30, " LATEX RESULT ", "%" x 30, "\n"; print LOGFILE $result, "\n\n"; $result .= '\endinput'; @@ -213,10 +234,18 @@ while (1) { unlink $doneflag while -e $doneflag; open (FROMFLAG, ">$fromflag") || die "open($fromflag): $!\n"; close FROMFLAG; + if (open (PIPE, ">$pipe")) { + print PIPE $pipestring; + close PIPE; + } $awaitexists->($toperl); unlink $fromflag while -e $fromflag; open (DONEFLAG, ">$doneflag") || die "open($doneflag): $!\n"; close DONEFLAG; + if (open (PIPE, ">$pipe")) { + print PIPE $pipestring; + close PIPE; + } } END { close LOGFILE; @@ -224,6 +253,46 @@ END { kill (9, $latexpid); exit 1; } + + if (defined $styfile) { + print STYFILE <<"STYFILEHEADER1"; +\\NeedsTeXFormat{LaTeX2e}[1999/12/01] +\\ProvidesPackage{noperltex} + [2007/09/29 v1.4 Perl-free version of PerlTeX specific to $jobname.tex] +STYFILEHEADER1 + ; + print STYFILE <<'STYFILEHEADER2'; +\RequirePackage{filecontents} + +\let\noperltex@PackageError=\PackageError +\renewcommand{\PackageError}[3]{} +\RequirePackage{perltex} +\let\PackageError=\noperltex@PackageError + +\newcount\plmac@macro@invocation@num +\gdef\plmac@show@placeholder#1#2\@empty{% + \ifx#1U\relax + \endgroup + \advance\plmac@macro@invocation@num by 1\relax + \global\plmac@macro@invocation@num=\plmac@macro@invocation@num + \input{noperltex-\the\plmac@macro@invocation@num.tex}% + \else + \endgroup + \fi +} +STYFILEHEADER2 + ; + foreach my $e (0 .. $#macroexpansions) { + print STYFILE "\n"; + printf STYFILE "%% Invocation #%d\n", 1+$e; + printf STYFILE "\\begin{filecontents}{noperltex-%d.tex}\n", 1+$e; + print STYFILE $macroexpansions[$e], "\\endinput\n"; + print STYFILE "\\end{filecontents}\n"; + } + print STYFILE "\\endinput\n"; + close STYFILE; + } + exit 0; } @@ -240,6 +309,7 @@ perltex [B<--latex>=I<program>] [B<-->[B<no>]B<safe>] [B<--permit>=I<feature>] +[B<--makesty>] [I<latex options>] =head1 DESCRIPTION @@ -280,21 +350,32 @@ B<pdflatex> instead of ordinary B<latex>. =item B<-->[B<no>]B<safe> -Enable or disable sandboxing. With the default of C<--safe>, +Enable or disable sandboxing. With the default of B<--safe>, B<perltex> executes the code from a C<\perlnewcommand> or C<\perlrenewcommand> macro within a protected environment that prohibits ``unsafe'' operations such as accessing files or executing -external programs. Specifying C<--nosafe> gives the LaTeX document +external programs. Specifying B<--nosafe> gives the LaTeX document I<carte blanche> to execute any arbitrary Perl code, including that which can harm the user's files. See L<Safe> for more information. =item B<--permit>=I<feature> -Permit particular Perl operations to be performed. The C<--permit> +Permit particular Perl operations to be performed. The B<--permit> option, which can be specified more than once on the command line, enables finer-grained control over the B<perltex> sandbox. See L<Opcode> for more information. +=item B<--makesty> + +Generate a LaTeX style file called F<noperltex.sty>. Replacing the +document's C<\usepackage{perltex}> line with C<\usepackage{noperltex}> +produces the same output but does not require PerlTeX, making the +document suitable for distribution to people who do not have PerlTeX +installed. The disadvantage is that F<noperltex.sty> is specific to +the document that produced it. Any changes to the document's PerlTeX +macro definitions or macro invocations necessitates rerunning +B<perltex> with the B<--makesty> option. + =back These options are then followed by whatever options are normally @@ -308,7 +389,7 @@ In its simplest form, B<perltex> is run just like B<latex>: perltex myfile.tex -To use B<pdflatex> instead of regular B<latex>, use the C<--latex> +To use B<pdflatex> instead of regular B<latex>, use the B<--latex> option: perltex --latex=pdflatex myfile.tex @@ -316,7 +397,7 @@ option: If LaTeX gives a ``C<trapped by operation mask>'' error and you trust the F<.tex> file you're trying to compile not to execute malicious Perl code (e.g., because you wrote it yourself), you can disable -B<perltex>'s safety mechansisms with C<--nosafe>: +B<perltex>'s safety mechansisms with B<--nosafe>: perltex --nosafe myfile.tex @@ -337,7 +418,7 @@ B<perltex> honors the following environment variables: Specify the filename of the LaTeX compiler. The LaTeX compiler defaults to ``C<latex>''. The C<PERLTEX> environment variable -overrides this default, and the C<--latex> command-line option (see +overrides this default, and the B<--latex> command-line option (see L</OPTIONS>) overrides that. =back @@ -376,6 +457,10 @@ valid data ``flag'' file whose existence indicates that F<jobname.ffpl> has been deleted +=item F<noperltex-#.tex> + +file generated by F<noperltex.sty> for each PerlTeX macro invocation + =back =head1 NOTES diff --git a/Master/bin/powerpc-linux/perltex b/Master/bin/powerpc-linux/perltex index dd8dda2804b..9c85ef94500 100755 --- a/Master/bin/powerpc-linux/perltex +++ b/Master/bin/powerpc-linux/perltex @@ -15,7 +15,7 @@ # # This is a generated file. # -# Copyright (C) 2006, Scott Pakin <scott+pt@pakin.org> +# Copyright (C) 2007 Scott Pakin <scott+pt@pakin.org> # # This file may be distributed and/or modified under the conditions # of the LaTeX Project Public License, either version 1.3c of this @@ -37,30 +37,39 @@ use Opcode; use Getopt::Long; use Pod::Usage; use File::Basename; +use Fcntl; use POSIX; use warnings; use strict; my $latexprog; my $runsafely = 1; my @permittedops; +my $usepipe = 1; my $progname = basename $0; my $jobname = "texput"; -my @latexcmdline; my $toperl; my $fromperl; my $toflag; my $fromflag; my $doneflag; my $logfile; +my $pipe; +my @latexcmdline; +my $styfile; +my @macroexpansions; my $sandbox = new Safe; my $sandbox_eval; my $latexpid; +my $pipestring = "\%\%\%\%\% Generated by $progname\n\\endinput\n"; $latexprog = $ENV{"PERLTEX"} || "latex"; Getopt::Long::Configure("require_order", "pass_through"); -GetOptions("help" => sub {pod2usage(-verbose => 1)}, - "latex=s" => \$latexprog, - "safe!" => \$runsafely, - "permit=s" => \@permittedops) || pod2usage(2); +GetOptions("help" => sub {pod2usage(-verbose => 1)}, + "latex=s" => \$latexprog, + "safe!" => \$runsafely, + "pipe!" => \$usepipe, + "synctext=s" => \$pipestring, + "makesty" => sub {$styfile = "noperltex.sty"}, + "permit=s" => \@permittedops) || pod2usage(2); @latexcmdline = @ARGV; my $firstcmd = 0; for ($firstcmd=0; $firstcmd<=$#latexcmdline; $firstcmd++) { @@ -83,19 +92,30 @@ $toflag = $jobname . ".tfpl"; $fromflag = $jobname . ".ffpl"; $doneflag = $jobname . ".dfpl"; $logfile = $jobname . ".lgpl"; +$pipe = $jobname . ".pipe"; $latexcmdline[$firstcmd] = - sprintf '\makeatletter' . '\def%s{%s}' x 6 . '\makeatother%s', + sprintf '\makeatletter' . '\def%s{%s}' x 7 . '\makeatother%s', '\plmac@tag', $separator, '\plmac@tofile', $toperl, '\plmac@fromfile', $fromperl, '\plmac@toflag', $toflag, '\plmac@fromflag', $fromflag, '\plmac@doneflag', $doneflag, + '\plmac@pipe', $pipe, $latexcmdline[$firstcmd]; -foreach my $file ($toperl, $fromperl, $toflag, $fromflag, $doneflag) { +foreach my $file ($toperl, $fromperl, $toflag, $fromflag, $doneflag, $pipe) { unlink $file while -e $file; } open (LOGFILE, ">$logfile") || die "open(\"$logfile\"): $!\n"; +if (defined $styfile) { + open (STYFILE, ">$styfile") || die "open(\"$styfile\"): $!\n"; +} +if (!$usepipe || !eval {mkfifo($pipe, 0600)}) { + sysopen PIPE, $pipe, O_WRONLY|O_CREAT, 0755; + print PIPE $pipestring; + close PIPE; + $usepipe = 0; +} defined ($latexpid = fork) || die "fork: $!\n"; unshift @latexcmdline, $latexprog; if (!$latexpid) { @@ -116,7 +136,7 @@ while (1) { sleep 0; if (waitpid($latexpid, &WNOHANG)==-1) { foreach my $file ($toperl, $fromperl, $toflag, - $fromflag, $doneflag) { + $fromflag, $doneflag, $pipe) { unlink $file while -e $file; } undef $latexpid; @@ -173,7 +193,7 @@ while (1) { print LOGFILE "# ===> $warningmsg\n\n"; } } - $result="" if !$result || $optag eq "RUN"; + $result = "" if !$result || $optag eq "RUN"; if ($@) { my $msg = $@; $msg =~ s/at \(eval \d+\) line \d+\W+//; @@ -202,6 +222,7 @@ while (1) { $helpstring =~ s/\. /.\\space\\space /g; $result .= "{$helpstring}"; } + push @macroexpansions, $result if defined $styfile && $optag eq "USE"; print LOGFILE "%" x 30, " LATEX RESULT ", "%" x 30, "\n"; print LOGFILE $result, "\n\n"; $result .= '\endinput'; @@ -213,10 +234,18 @@ while (1) { unlink $doneflag while -e $doneflag; open (FROMFLAG, ">$fromflag") || die "open($fromflag): $!\n"; close FROMFLAG; + if (open (PIPE, ">$pipe")) { + print PIPE $pipestring; + close PIPE; + } $awaitexists->($toperl); unlink $fromflag while -e $fromflag; open (DONEFLAG, ">$doneflag") || die "open($doneflag): $!\n"; close DONEFLAG; + if (open (PIPE, ">$pipe")) { + print PIPE $pipestring; + close PIPE; + } } END { close LOGFILE; @@ -224,6 +253,46 @@ END { kill (9, $latexpid); exit 1; } + + if (defined $styfile) { + print STYFILE <<"STYFILEHEADER1"; +\\NeedsTeXFormat{LaTeX2e}[1999/12/01] +\\ProvidesPackage{noperltex} + [2007/09/29 v1.4 Perl-free version of PerlTeX specific to $jobname.tex] +STYFILEHEADER1 + ; + print STYFILE <<'STYFILEHEADER2'; +\RequirePackage{filecontents} + +\let\noperltex@PackageError=\PackageError +\renewcommand{\PackageError}[3]{} +\RequirePackage{perltex} +\let\PackageError=\noperltex@PackageError + +\newcount\plmac@macro@invocation@num +\gdef\plmac@show@placeholder#1#2\@empty{% + \ifx#1U\relax + \endgroup + \advance\plmac@macro@invocation@num by 1\relax + \global\plmac@macro@invocation@num=\plmac@macro@invocation@num + \input{noperltex-\the\plmac@macro@invocation@num.tex}% + \else + \endgroup + \fi +} +STYFILEHEADER2 + ; + foreach my $e (0 .. $#macroexpansions) { + print STYFILE "\n"; + printf STYFILE "%% Invocation #%d\n", 1+$e; + printf STYFILE "\\begin{filecontents}{noperltex-%d.tex}\n", 1+$e; + print STYFILE $macroexpansions[$e], "\\endinput\n"; + print STYFILE "\\end{filecontents}\n"; + } + print STYFILE "\\endinput\n"; + close STYFILE; + } + exit 0; } @@ -240,6 +309,7 @@ perltex [B<--latex>=I<program>] [B<-->[B<no>]B<safe>] [B<--permit>=I<feature>] +[B<--makesty>] [I<latex options>] =head1 DESCRIPTION @@ -280,21 +350,32 @@ B<pdflatex> instead of ordinary B<latex>. =item B<-->[B<no>]B<safe> -Enable or disable sandboxing. With the default of C<--safe>, +Enable or disable sandboxing. With the default of B<--safe>, B<perltex> executes the code from a C<\perlnewcommand> or C<\perlrenewcommand> macro within a protected environment that prohibits ``unsafe'' operations such as accessing files or executing -external programs. Specifying C<--nosafe> gives the LaTeX document +external programs. Specifying B<--nosafe> gives the LaTeX document I<carte blanche> to execute any arbitrary Perl code, including that which can harm the user's files. See L<Safe> for more information. =item B<--permit>=I<feature> -Permit particular Perl operations to be performed. The C<--permit> +Permit particular Perl operations to be performed. The B<--permit> option, which can be specified more than once on the command line, enables finer-grained control over the B<perltex> sandbox. See L<Opcode> for more information. +=item B<--makesty> + +Generate a LaTeX style file called F<noperltex.sty>. Replacing the +document's C<\usepackage{perltex}> line with C<\usepackage{noperltex}> +produces the same output but does not require PerlTeX, making the +document suitable for distribution to people who do not have PerlTeX +installed. The disadvantage is that F<noperltex.sty> is specific to +the document that produced it. Any changes to the document's PerlTeX +macro definitions or macro invocations necessitates rerunning +B<perltex> with the B<--makesty> option. + =back These options are then followed by whatever options are normally @@ -308,7 +389,7 @@ In its simplest form, B<perltex> is run just like B<latex>: perltex myfile.tex -To use B<pdflatex> instead of regular B<latex>, use the C<--latex> +To use B<pdflatex> instead of regular B<latex>, use the B<--latex> option: perltex --latex=pdflatex myfile.tex @@ -316,7 +397,7 @@ option: If LaTeX gives a ``C<trapped by operation mask>'' error and you trust the F<.tex> file you're trying to compile not to execute malicious Perl code (e.g., because you wrote it yourself), you can disable -B<perltex>'s safety mechansisms with C<--nosafe>: +B<perltex>'s safety mechansisms with B<--nosafe>: perltex --nosafe myfile.tex @@ -337,7 +418,7 @@ B<perltex> honors the following environment variables: Specify the filename of the LaTeX compiler. The LaTeX compiler defaults to ``C<latex>''. The C<PERLTEX> environment variable -overrides this default, and the C<--latex> command-line option (see +overrides this default, and the B<--latex> command-line option (see L</OPTIONS>) overrides that. =back @@ -376,6 +457,10 @@ valid data ``flag'' file whose existence indicates that F<jobname.ffpl> has been deleted +=item F<noperltex-#.tex> + +file generated by F<noperltex.sty> for each PerlTeX macro invocation + =back =head1 NOTES diff --git a/Master/bin/sparc-linux/perltex b/Master/bin/sparc-linux/perltex index dd8dda2804b..9c85ef94500 100755 --- a/Master/bin/sparc-linux/perltex +++ b/Master/bin/sparc-linux/perltex @@ -15,7 +15,7 @@ # # This is a generated file. # -# Copyright (C) 2006, Scott Pakin <scott+pt@pakin.org> +# Copyright (C) 2007 Scott Pakin <scott+pt@pakin.org> # # This file may be distributed and/or modified under the conditions # of the LaTeX Project Public License, either version 1.3c of this @@ -37,30 +37,39 @@ use Opcode; use Getopt::Long; use Pod::Usage; use File::Basename; +use Fcntl; use POSIX; use warnings; use strict; my $latexprog; my $runsafely = 1; my @permittedops; +my $usepipe = 1; my $progname = basename $0; my $jobname = "texput"; -my @latexcmdline; my $toperl; my $fromperl; my $toflag; my $fromflag; my $doneflag; my $logfile; +my $pipe; +my @latexcmdline; +my $styfile; +my @macroexpansions; my $sandbox = new Safe; my $sandbox_eval; my $latexpid; +my $pipestring = "\%\%\%\%\% Generated by $progname\n\\endinput\n"; $latexprog = $ENV{"PERLTEX"} || "latex"; Getopt::Long::Configure("require_order", "pass_through"); -GetOptions("help" => sub {pod2usage(-verbose => 1)}, - "latex=s" => \$latexprog, - "safe!" => \$runsafely, - "permit=s" => \@permittedops) || pod2usage(2); +GetOptions("help" => sub {pod2usage(-verbose => 1)}, + "latex=s" => \$latexprog, + "safe!" => \$runsafely, + "pipe!" => \$usepipe, + "synctext=s" => \$pipestring, + "makesty" => sub {$styfile = "noperltex.sty"}, + "permit=s" => \@permittedops) || pod2usage(2); @latexcmdline = @ARGV; my $firstcmd = 0; for ($firstcmd=0; $firstcmd<=$#latexcmdline; $firstcmd++) { @@ -83,19 +92,30 @@ $toflag = $jobname . ".tfpl"; $fromflag = $jobname . ".ffpl"; $doneflag = $jobname . ".dfpl"; $logfile = $jobname . ".lgpl"; +$pipe = $jobname . ".pipe"; $latexcmdline[$firstcmd] = - sprintf '\makeatletter' . '\def%s{%s}' x 6 . '\makeatother%s', + sprintf '\makeatletter' . '\def%s{%s}' x 7 . '\makeatother%s', '\plmac@tag', $separator, '\plmac@tofile', $toperl, '\plmac@fromfile', $fromperl, '\plmac@toflag', $toflag, '\plmac@fromflag', $fromflag, '\plmac@doneflag', $doneflag, + '\plmac@pipe', $pipe, $latexcmdline[$firstcmd]; -foreach my $file ($toperl, $fromperl, $toflag, $fromflag, $doneflag) { +foreach my $file ($toperl, $fromperl, $toflag, $fromflag, $doneflag, $pipe) { unlink $file while -e $file; } open (LOGFILE, ">$logfile") || die "open(\"$logfile\"): $!\n"; +if (defined $styfile) { + open (STYFILE, ">$styfile") || die "open(\"$styfile\"): $!\n"; +} +if (!$usepipe || !eval {mkfifo($pipe, 0600)}) { + sysopen PIPE, $pipe, O_WRONLY|O_CREAT, 0755; + print PIPE $pipestring; + close PIPE; + $usepipe = 0; +} defined ($latexpid = fork) || die "fork: $!\n"; unshift @latexcmdline, $latexprog; if (!$latexpid) { @@ -116,7 +136,7 @@ while (1) { sleep 0; if (waitpid($latexpid, &WNOHANG)==-1) { foreach my $file ($toperl, $fromperl, $toflag, - $fromflag, $doneflag) { + $fromflag, $doneflag, $pipe) { unlink $file while -e $file; } undef $latexpid; @@ -173,7 +193,7 @@ while (1) { print LOGFILE "# ===> $warningmsg\n\n"; } } - $result="" if !$result || $optag eq "RUN"; + $result = "" if !$result || $optag eq "RUN"; if ($@) { my $msg = $@; $msg =~ s/at \(eval \d+\) line \d+\W+//; @@ -202,6 +222,7 @@ while (1) { $helpstring =~ s/\. /.\\space\\space /g; $result .= "{$helpstring}"; } + push @macroexpansions, $result if defined $styfile && $optag eq "USE"; print LOGFILE "%" x 30, " LATEX RESULT ", "%" x 30, "\n"; print LOGFILE $result, "\n\n"; $result .= '\endinput'; @@ -213,10 +234,18 @@ while (1) { unlink $doneflag while -e $doneflag; open (FROMFLAG, ">$fromflag") || die "open($fromflag): $!\n"; close FROMFLAG; + if (open (PIPE, ">$pipe")) { + print PIPE $pipestring; + close PIPE; + } $awaitexists->($toperl); unlink $fromflag while -e $fromflag; open (DONEFLAG, ">$doneflag") || die "open($doneflag): $!\n"; close DONEFLAG; + if (open (PIPE, ">$pipe")) { + print PIPE $pipestring; + close PIPE; + } } END { close LOGFILE; @@ -224,6 +253,46 @@ END { kill (9, $latexpid); exit 1; } + + if (defined $styfile) { + print STYFILE <<"STYFILEHEADER1"; +\\NeedsTeXFormat{LaTeX2e}[1999/12/01] +\\ProvidesPackage{noperltex} + [2007/09/29 v1.4 Perl-free version of PerlTeX specific to $jobname.tex] +STYFILEHEADER1 + ; + print STYFILE <<'STYFILEHEADER2'; +\RequirePackage{filecontents} + +\let\noperltex@PackageError=\PackageError +\renewcommand{\PackageError}[3]{} +\RequirePackage{perltex} +\let\PackageError=\noperltex@PackageError + +\newcount\plmac@macro@invocation@num +\gdef\plmac@show@placeholder#1#2\@empty{% + \ifx#1U\relax + \endgroup + \advance\plmac@macro@invocation@num by 1\relax + \global\plmac@macro@invocation@num=\plmac@macro@invocation@num + \input{noperltex-\the\plmac@macro@invocation@num.tex}% + \else + \endgroup + \fi +} +STYFILEHEADER2 + ; + foreach my $e (0 .. $#macroexpansions) { + print STYFILE "\n"; + printf STYFILE "%% Invocation #%d\n", 1+$e; + printf STYFILE "\\begin{filecontents}{noperltex-%d.tex}\n", 1+$e; + print STYFILE $macroexpansions[$e], "\\endinput\n"; + print STYFILE "\\end{filecontents}\n"; + } + print STYFILE "\\endinput\n"; + close STYFILE; + } + exit 0; } @@ -240,6 +309,7 @@ perltex [B<--latex>=I<program>] [B<-->[B<no>]B<safe>] [B<--permit>=I<feature>] +[B<--makesty>] [I<latex options>] =head1 DESCRIPTION @@ -280,21 +350,32 @@ B<pdflatex> instead of ordinary B<latex>. =item B<-->[B<no>]B<safe> -Enable or disable sandboxing. With the default of C<--safe>, +Enable or disable sandboxing. With the default of B<--safe>, B<perltex> executes the code from a C<\perlnewcommand> or C<\perlrenewcommand> macro within a protected environment that prohibits ``unsafe'' operations such as accessing files or executing -external programs. Specifying C<--nosafe> gives the LaTeX document +external programs. Specifying B<--nosafe> gives the LaTeX document I<carte blanche> to execute any arbitrary Perl code, including that which can harm the user's files. See L<Safe> for more information. =item B<--permit>=I<feature> -Permit particular Perl operations to be performed. The C<--permit> +Permit particular Perl operations to be performed. The B<--permit> option, which can be specified more than once on the command line, enables finer-grained control over the B<perltex> sandbox. See L<Opcode> for more information. +=item B<--makesty> + +Generate a LaTeX style file called F<noperltex.sty>. Replacing the +document's C<\usepackage{perltex}> line with C<\usepackage{noperltex}> +produces the same output but does not require PerlTeX, making the +document suitable for distribution to people who do not have PerlTeX +installed. The disadvantage is that F<noperltex.sty> is specific to +the document that produced it. Any changes to the document's PerlTeX +macro definitions or macro invocations necessitates rerunning +B<perltex> with the B<--makesty> option. + =back These options are then followed by whatever options are normally @@ -308,7 +389,7 @@ In its simplest form, B<perltex> is run just like B<latex>: perltex myfile.tex -To use B<pdflatex> instead of regular B<latex>, use the C<--latex> +To use B<pdflatex> instead of regular B<latex>, use the B<--latex> option: perltex --latex=pdflatex myfile.tex @@ -316,7 +397,7 @@ option: If LaTeX gives a ``C<trapped by operation mask>'' error and you trust the F<.tex> file you're trying to compile not to execute malicious Perl code (e.g., because you wrote it yourself), you can disable -B<perltex>'s safety mechansisms with C<--nosafe>: +B<perltex>'s safety mechansisms with B<--nosafe>: perltex --nosafe myfile.tex @@ -337,7 +418,7 @@ B<perltex> honors the following environment variables: Specify the filename of the LaTeX compiler. The LaTeX compiler defaults to ``C<latex>''. The C<PERLTEX> environment variable -overrides this default, and the C<--latex> command-line option (see +overrides this default, and the B<--latex> command-line option (see L</OPTIONS>) overrides that. =back @@ -376,6 +457,10 @@ valid data ``flag'' file whose existence indicates that F<jobname.ffpl> has been deleted +=item F<noperltex-#.tex> + +file generated by F<noperltex.sty> for each PerlTeX macro invocation + =back =head1 NOTES diff --git a/Master/bin/sparc-solaris/perltex b/Master/bin/sparc-solaris/perltex index dd8dda2804b..9c85ef94500 100755 --- a/Master/bin/sparc-solaris/perltex +++ b/Master/bin/sparc-solaris/perltex @@ -15,7 +15,7 @@ # # This is a generated file. # -# Copyright (C) 2006, Scott Pakin <scott+pt@pakin.org> +# Copyright (C) 2007 Scott Pakin <scott+pt@pakin.org> # # This file may be distributed and/or modified under the conditions # of the LaTeX Project Public License, either version 1.3c of this @@ -37,30 +37,39 @@ use Opcode; use Getopt::Long; use Pod::Usage; use File::Basename; +use Fcntl; use POSIX; use warnings; use strict; my $latexprog; my $runsafely = 1; my @permittedops; +my $usepipe = 1; my $progname = basename $0; my $jobname = "texput"; -my @latexcmdline; my $toperl; my $fromperl; my $toflag; my $fromflag; my $doneflag; my $logfile; +my $pipe; +my @latexcmdline; +my $styfile; +my @macroexpansions; my $sandbox = new Safe; my $sandbox_eval; my $latexpid; +my $pipestring = "\%\%\%\%\% Generated by $progname\n\\endinput\n"; $latexprog = $ENV{"PERLTEX"} || "latex"; Getopt::Long::Configure("require_order", "pass_through"); -GetOptions("help" => sub {pod2usage(-verbose => 1)}, - "latex=s" => \$latexprog, - "safe!" => \$runsafely, - "permit=s" => \@permittedops) || pod2usage(2); +GetOptions("help" => sub {pod2usage(-verbose => 1)}, + "latex=s" => \$latexprog, + "safe!" => \$runsafely, + "pipe!" => \$usepipe, + "synctext=s" => \$pipestring, + "makesty" => sub {$styfile = "noperltex.sty"}, + "permit=s" => \@permittedops) || pod2usage(2); @latexcmdline = @ARGV; my $firstcmd = 0; for ($firstcmd=0; $firstcmd<=$#latexcmdline; $firstcmd++) { @@ -83,19 +92,30 @@ $toflag = $jobname . ".tfpl"; $fromflag = $jobname . ".ffpl"; $doneflag = $jobname . ".dfpl"; $logfile = $jobname . ".lgpl"; +$pipe = $jobname . ".pipe"; $latexcmdline[$firstcmd] = - sprintf '\makeatletter' . '\def%s{%s}' x 6 . '\makeatother%s', + sprintf '\makeatletter' . '\def%s{%s}' x 7 . '\makeatother%s', '\plmac@tag', $separator, '\plmac@tofile', $toperl, '\plmac@fromfile', $fromperl, '\plmac@toflag', $toflag, '\plmac@fromflag', $fromflag, '\plmac@doneflag', $doneflag, + '\plmac@pipe', $pipe, $latexcmdline[$firstcmd]; -foreach my $file ($toperl, $fromperl, $toflag, $fromflag, $doneflag) { +foreach my $file ($toperl, $fromperl, $toflag, $fromflag, $doneflag, $pipe) { unlink $file while -e $file; } open (LOGFILE, ">$logfile") || die "open(\"$logfile\"): $!\n"; +if (defined $styfile) { + open (STYFILE, ">$styfile") || die "open(\"$styfile\"): $!\n"; +} +if (!$usepipe || !eval {mkfifo($pipe, 0600)}) { + sysopen PIPE, $pipe, O_WRONLY|O_CREAT, 0755; + print PIPE $pipestring; + close PIPE; + $usepipe = 0; +} defined ($latexpid = fork) || die "fork: $!\n"; unshift @latexcmdline, $latexprog; if (!$latexpid) { @@ -116,7 +136,7 @@ while (1) { sleep 0; if (waitpid($latexpid, &WNOHANG)==-1) { foreach my $file ($toperl, $fromperl, $toflag, - $fromflag, $doneflag) { + $fromflag, $doneflag, $pipe) { unlink $file while -e $file; } undef $latexpid; @@ -173,7 +193,7 @@ while (1) { print LOGFILE "# ===> $warningmsg\n\n"; } } - $result="" if !$result || $optag eq "RUN"; + $result = "" if !$result || $optag eq "RUN"; if ($@) { my $msg = $@; $msg =~ s/at \(eval \d+\) line \d+\W+//; @@ -202,6 +222,7 @@ while (1) { $helpstring =~ s/\. /.\\space\\space /g; $result .= "{$helpstring}"; } + push @macroexpansions, $result if defined $styfile && $optag eq "USE"; print LOGFILE "%" x 30, " LATEX RESULT ", "%" x 30, "\n"; print LOGFILE $result, "\n\n"; $result .= '\endinput'; @@ -213,10 +234,18 @@ while (1) { unlink $doneflag while -e $doneflag; open (FROMFLAG, ">$fromflag") || die "open($fromflag): $!\n"; close FROMFLAG; + if (open (PIPE, ">$pipe")) { + print PIPE $pipestring; + close PIPE; + } $awaitexists->($toperl); unlink $fromflag while -e $fromflag; open (DONEFLAG, ">$doneflag") || die "open($doneflag): $!\n"; close DONEFLAG; + if (open (PIPE, ">$pipe")) { + print PIPE $pipestring; + close PIPE; + } } END { close LOGFILE; @@ -224,6 +253,46 @@ END { kill (9, $latexpid); exit 1; } + + if (defined $styfile) { + print STYFILE <<"STYFILEHEADER1"; +\\NeedsTeXFormat{LaTeX2e}[1999/12/01] +\\ProvidesPackage{noperltex} + [2007/09/29 v1.4 Perl-free version of PerlTeX specific to $jobname.tex] +STYFILEHEADER1 + ; + print STYFILE <<'STYFILEHEADER2'; +\RequirePackage{filecontents} + +\let\noperltex@PackageError=\PackageError +\renewcommand{\PackageError}[3]{} +\RequirePackage{perltex} +\let\PackageError=\noperltex@PackageError + +\newcount\plmac@macro@invocation@num +\gdef\plmac@show@placeholder#1#2\@empty{% + \ifx#1U\relax + \endgroup + \advance\plmac@macro@invocation@num by 1\relax + \global\plmac@macro@invocation@num=\plmac@macro@invocation@num + \input{noperltex-\the\plmac@macro@invocation@num.tex}% + \else + \endgroup + \fi +} +STYFILEHEADER2 + ; + foreach my $e (0 .. $#macroexpansions) { + print STYFILE "\n"; + printf STYFILE "%% Invocation #%d\n", 1+$e; + printf STYFILE "\\begin{filecontents}{noperltex-%d.tex}\n", 1+$e; + print STYFILE $macroexpansions[$e], "\\endinput\n"; + print STYFILE "\\end{filecontents}\n"; + } + print STYFILE "\\endinput\n"; + close STYFILE; + } + exit 0; } @@ -240,6 +309,7 @@ perltex [B<--latex>=I<program>] [B<-->[B<no>]B<safe>] [B<--permit>=I<feature>] +[B<--makesty>] [I<latex options>] =head1 DESCRIPTION @@ -280,21 +350,32 @@ B<pdflatex> instead of ordinary B<latex>. =item B<-->[B<no>]B<safe> -Enable or disable sandboxing. With the default of C<--safe>, +Enable or disable sandboxing. With the default of B<--safe>, B<perltex> executes the code from a C<\perlnewcommand> or C<\perlrenewcommand> macro within a protected environment that prohibits ``unsafe'' operations such as accessing files or executing -external programs. Specifying C<--nosafe> gives the LaTeX document +external programs. Specifying B<--nosafe> gives the LaTeX document I<carte blanche> to execute any arbitrary Perl code, including that which can harm the user's files. See L<Safe> for more information. =item B<--permit>=I<feature> -Permit particular Perl operations to be performed. The C<--permit> +Permit particular Perl operations to be performed. The B<--permit> option, which can be specified more than once on the command line, enables finer-grained control over the B<perltex> sandbox. See L<Opcode> for more information. +=item B<--makesty> + +Generate a LaTeX style file called F<noperltex.sty>. Replacing the +document's C<\usepackage{perltex}> line with C<\usepackage{noperltex}> +produces the same output but does not require PerlTeX, making the +document suitable for distribution to people who do not have PerlTeX +installed. The disadvantage is that F<noperltex.sty> is specific to +the document that produced it. Any changes to the document's PerlTeX +macro definitions or macro invocations necessitates rerunning +B<perltex> with the B<--makesty> option. + =back These options are then followed by whatever options are normally @@ -308,7 +389,7 @@ In its simplest form, B<perltex> is run just like B<latex>: perltex myfile.tex -To use B<pdflatex> instead of regular B<latex>, use the C<--latex> +To use B<pdflatex> instead of regular B<latex>, use the B<--latex> option: perltex --latex=pdflatex myfile.tex @@ -316,7 +397,7 @@ option: If LaTeX gives a ``C<trapped by operation mask>'' error and you trust the F<.tex> file you're trying to compile not to execute malicious Perl code (e.g., because you wrote it yourself), you can disable -B<perltex>'s safety mechansisms with C<--nosafe>: +B<perltex>'s safety mechansisms with B<--nosafe>: perltex --nosafe myfile.tex @@ -337,7 +418,7 @@ B<perltex> honors the following environment variables: Specify the filename of the LaTeX compiler. The LaTeX compiler defaults to ``C<latex>''. The C<PERLTEX> environment variable -overrides this default, and the C<--latex> command-line option (see +overrides this default, and the B<--latex> command-line option (see L</OPTIONS>) overrides that. =back @@ -376,6 +457,10 @@ valid data ``flag'' file whose existence indicates that F<jobname.ffpl> has been deleted +=item F<noperltex-#.tex> + +file generated by F<noperltex.sty> for each PerlTeX macro invocation + =back =head1 NOTES diff --git a/Master/bin/x86_64-linux/perltex b/Master/bin/x86_64-linux/perltex index dd8dda2804b..9c85ef94500 100755 --- a/Master/bin/x86_64-linux/perltex +++ b/Master/bin/x86_64-linux/perltex @@ -15,7 +15,7 @@ # # This is a generated file. # -# Copyright (C) 2006, Scott Pakin <scott+pt@pakin.org> +# Copyright (C) 2007 Scott Pakin <scott+pt@pakin.org> # # This file may be distributed and/or modified under the conditions # of the LaTeX Project Public License, either version 1.3c of this @@ -37,30 +37,39 @@ use Opcode; use Getopt::Long; use Pod::Usage; use File::Basename; +use Fcntl; use POSIX; use warnings; use strict; my $latexprog; my $runsafely = 1; my @permittedops; +my $usepipe = 1; my $progname = basename $0; my $jobname = "texput"; -my @latexcmdline; my $toperl; my $fromperl; my $toflag; my $fromflag; my $doneflag; my $logfile; +my $pipe; +my @latexcmdline; +my $styfile; +my @macroexpansions; my $sandbox = new Safe; my $sandbox_eval; my $latexpid; +my $pipestring = "\%\%\%\%\% Generated by $progname\n\\endinput\n"; $latexprog = $ENV{"PERLTEX"} || "latex"; Getopt::Long::Configure("require_order", "pass_through"); -GetOptions("help" => sub {pod2usage(-verbose => 1)}, - "latex=s" => \$latexprog, - "safe!" => \$runsafely, - "permit=s" => \@permittedops) || pod2usage(2); +GetOptions("help" => sub {pod2usage(-verbose => 1)}, + "latex=s" => \$latexprog, + "safe!" => \$runsafely, + "pipe!" => \$usepipe, + "synctext=s" => \$pipestring, + "makesty" => sub {$styfile = "noperltex.sty"}, + "permit=s" => \@permittedops) || pod2usage(2); @latexcmdline = @ARGV; my $firstcmd = 0; for ($firstcmd=0; $firstcmd<=$#latexcmdline; $firstcmd++) { @@ -83,19 +92,30 @@ $toflag = $jobname . ".tfpl"; $fromflag = $jobname . ".ffpl"; $doneflag = $jobname . ".dfpl"; $logfile = $jobname . ".lgpl"; +$pipe = $jobname . ".pipe"; $latexcmdline[$firstcmd] = - sprintf '\makeatletter' . '\def%s{%s}' x 6 . '\makeatother%s', + sprintf '\makeatletter' . '\def%s{%s}' x 7 . '\makeatother%s', '\plmac@tag', $separator, '\plmac@tofile', $toperl, '\plmac@fromfile', $fromperl, '\plmac@toflag', $toflag, '\plmac@fromflag', $fromflag, '\plmac@doneflag', $doneflag, + '\plmac@pipe', $pipe, $latexcmdline[$firstcmd]; -foreach my $file ($toperl, $fromperl, $toflag, $fromflag, $doneflag) { +foreach my $file ($toperl, $fromperl, $toflag, $fromflag, $doneflag, $pipe) { unlink $file while -e $file; } open (LOGFILE, ">$logfile") || die "open(\"$logfile\"): $!\n"; +if (defined $styfile) { + open (STYFILE, ">$styfile") || die "open(\"$styfile\"): $!\n"; +} +if (!$usepipe || !eval {mkfifo($pipe, 0600)}) { + sysopen PIPE, $pipe, O_WRONLY|O_CREAT, 0755; + print PIPE $pipestring; + close PIPE; + $usepipe = 0; +} defined ($latexpid = fork) || die "fork: $!\n"; unshift @latexcmdline, $latexprog; if (!$latexpid) { @@ -116,7 +136,7 @@ while (1) { sleep 0; if (waitpid($latexpid, &WNOHANG)==-1) { foreach my $file ($toperl, $fromperl, $toflag, - $fromflag, $doneflag) { + $fromflag, $doneflag, $pipe) { unlink $file while -e $file; } undef $latexpid; @@ -173,7 +193,7 @@ while (1) { print LOGFILE "# ===> $warningmsg\n\n"; } } - $result="" if !$result || $optag eq "RUN"; + $result = "" if !$result || $optag eq "RUN"; if ($@) { my $msg = $@; $msg =~ s/at \(eval \d+\) line \d+\W+//; @@ -202,6 +222,7 @@ while (1) { $helpstring =~ s/\. /.\\space\\space /g; $result .= "{$helpstring}"; } + push @macroexpansions, $result if defined $styfile && $optag eq "USE"; print LOGFILE "%" x 30, " LATEX RESULT ", "%" x 30, "\n"; print LOGFILE $result, "\n\n"; $result .= '\endinput'; @@ -213,10 +234,18 @@ while (1) { unlink $doneflag while -e $doneflag; open (FROMFLAG, ">$fromflag") || die "open($fromflag): $!\n"; close FROMFLAG; + if (open (PIPE, ">$pipe")) { + print PIPE $pipestring; + close PIPE; + } $awaitexists->($toperl); unlink $fromflag while -e $fromflag; open (DONEFLAG, ">$doneflag") || die "open($doneflag): $!\n"; close DONEFLAG; + if (open (PIPE, ">$pipe")) { + print PIPE $pipestring; + close PIPE; + } } END { close LOGFILE; @@ -224,6 +253,46 @@ END { kill (9, $latexpid); exit 1; } + + if (defined $styfile) { + print STYFILE <<"STYFILEHEADER1"; +\\NeedsTeXFormat{LaTeX2e}[1999/12/01] +\\ProvidesPackage{noperltex} + [2007/09/29 v1.4 Perl-free version of PerlTeX specific to $jobname.tex] +STYFILEHEADER1 + ; + print STYFILE <<'STYFILEHEADER2'; +\RequirePackage{filecontents} + +\let\noperltex@PackageError=\PackageError +\renewcommand{\PackageError}[3]{} +\RequirePackage{perltex} +\let\PackageError=\noperltex@PackageError + +\newcount\plmac@macro@invocation@num +\gdef\plmac@show@placeholder#1#2\@empty{% + \ifx#1U\relax + \endgroup + \advance\plmac@macro@invocation@num by 1\relax + \global\plmac@macro@invocation@num=\plmac@macro@invocation@num + \input{noperltex-\the\plmac@macro@invocation@num.tex}% + \else + \endgroup + \fi +} +STYFILEHEADER2 + ; + foreach my $e (0 .. $#macroexpansions) { + print STYFILE "\n"; + printf STYFILE "%% Invocation #%d\n", 1+$e; + printf STYFILE "\\begin{filecontents}{noperltex-%d.tex}\n", 1+$e; + print STYFILE $macroexpansions[$e], "\\endinput\n"; + print STYFILE "\\end{filecontents}\n"; + } + print STYFILE "\\endinput\n"; + close STYFILE; + } + exit 0; } @@ -240,6 +309,7 @@ perltex [B<--latex>=I<program>] [B<-->[B<no>]B<safe>] [B<--permit>=I<feature>] +[B<--makesty>] [I<latex options>] =head1 DESCRIPTION @@ -280,21 +350,32 @@ B<pdflatex> instead of ordinary B<latex>. =item B<-->[B<no>]B<safe> -Enable or disable sandboxing. With the default of C<--safe>, +Enable or disable sandboxing. With the default of B<--safe>, B<perltex> executes the code from a C<\perlnewcommand> or C<\perlrenewcommand> macro within a protected environment that prohibits ``unsafe'' operations such as accessing files or executing -external programs. Specifying C<--nosafe> gives the LaTeX document +external programs. Specifying B<--nosafe> gives the LaTeX document I<carte blanche> to execute any arbitrary Perl code, including that which can harm the user's files. See L<Safe> for more information. =item B<--permit>=I<feature> -Permit particular Perl operations to be performed. The C<--permit> +Permit particular Perl operations to be performed. The B<--permit> option, which can be specified more than once on the command line, enables finer-grained control over the B<perltex> sandbox. See L<Opcode> for more information. +=item B<--makesty> + +Generate a LaTeX style file called F<noperltex.sty>. Replacing the +document's C<\usepackage{perltex}> line with C<\usepackage{noperltex}> +produces the same output but does not require PerlTeX, making the +document suitable for distribution to people who do not have PerlTeX +installed. The disadvantage is that F<noperltex.sty> is specific to +the document that produced it. Any changes to the document's PerlTeX +macro definitions or macro invocations necessitates rerunning +B<perltex> with the B<--makesty> option. + =back These options are then followed by whatever options are normally @@ -308,7 +389,7 @@ In its simplest form, B<perltex> is run just like B<latex>: perltex myfile.tex -To use B<pdflatex> instead of regular B<latex>, use the C<--latex> +To use B<pdflatex> instead of regular B<latex>, use the B<--latex> option: perltex --latex=pdflatex myfile.tex @@ -316,7 +397,7 @@ option: If LaTeX gives a ``C<trapped by operation mask>'' error and you trust the F<.tex> file you're trying to compile not to execute malicious Perl code (e.g., because you wrote it yourself), you can disable -B<perltex>'s safety mechansisms with C<--nosafe>: +B<perltex>'s safety mechansisms with B<--nosafe>: perltex --nosafe myfile.tex @@ -337,7 +418,7 @@ B<perltex> honors the following environment variables: Specify the filename of the LaTeX compiler. The LaTeX compiler defaults to ``C<latex>''. The C<PERLTEX> environment variable -overrides this default, and the C<--latex> command-line option (see +overrides this default, and the B<--latex> command-line option (see L</OPTIONS>) overrides that. =back @@ -376,6 +457,10 @@ valid data ``flag'' file whose existence indicates that F<jobname.ffpl> has been deleted +=item F<noperltex-#.tex> + +file generated by F<noperltex.sty> for each PerlTeX macro invocation + =back =head1 NOTES |