summaryrefslogtreecommitdiff
path: root/Master/texmf-dist/tex/latex/grfpaste/grfpaste.sty
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2006-01-12 23:56:33 +0000
committerKarl Berry <karl@freefriends.org>2006-01-12 23:56:33 +0000
commit208543ff201eaa2c17be3467fa1031bd122f81a8 (patch)
tree81e11d677cc3f066e67de001f20bd90ca3d9d3ca /Master/texmf-dist/tex/latex/grfpaste/grfpaste.sty
parent6e31f432876146d354c50ca38d787fe9700d723e (diff)
grfpaste
git-svn-id: svn://tug.org/texlive/trunk@962 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/latex/grfpaste/grfpaste.sty')
-rw-r--r--Master/texmf-dist/tex/latex/grfpaste/grfpaste.sty238
1 files changed, 238 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/latex/grfpaste/grfpaste.sty b/Master/texmf-dist/tex/latex/grfpaste/grfpaste.sty
new file mode 100644
index 00000000000..76a116b3e65
--- /dev/null
+++ b/Master/texmf-dist/tex/latex/grfpaste/grfpaste.sty
@@ -0,0 +1,238 @@
+
+
+%%% LaTeX support for TeXplorators / M. Spivak dvipaste program
+%%% Copyright 1997 David Carlisle
+
+
+% This program can redistributed and/or modified under the terms
+% of the LaTeX Project Public License Distributed from CTAN
+% archives in directory macros/latex/base/lppl.txt; either
+% version 1 of the License, or (at your option) any later version.
+
+%%% Usage notes in the file dvipaste.txt
+
+
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{grfpaste}
+ [1997/07/18 v0.2 dvipaste LaTeX graphics style (DPC)]
+
+% 1997/07/17 v0.1
+% 1997/07/18 v0.2 add ref system.
+
+% To include previously prepared dvi fragments, use
+% \usepackage{grfpaste}
+% and include the graphics with \includegraphics{file.dvi}
+% or \includegraphics[num=5]{file.dvi}
+%
+% To make a file that produces suitable fragments, use
+% \usepackage[write]{grfpaste}
+% and mark each fragment with \sendout{....}
+%
+\DeclareOption{write}{\let\sendout\relax}
+\DeclareOption{writepages}{\let\sendout\relax\let\GP@sendout\@empty}
+\DeclareOption{include}{%
+ \def\sendout#1{\PackageError{grfpaste}{Use write option}{}}}
+\DeclareOption{defpaste}{\def\paste#1#2{\includegraphics[num=#2]{#1}}}
+\DeclareOption*{\PassOptionsToPackage{\CurrentOption}{graphicx}}
+\ExecuteOptions{include}
+\ProcessOptions
+\RequirePackage{graphicx}
+
+\ifx\sendout\relax
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Marking DVI Sections For Inclusion In Other Files
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Size information will be written in to a file filename.dat
+% which is opened now and closed at the end of the run.
+
+\newwrite\writedata@
+\immediate\openout\writedata@=\jobname.dat
+%\AtEndDocument{\immediate\closeout\writedata@}
+
+% The format of the .dat file is identical to that written by
+% dvipaste.tex, the format of the dvi file is compatible.
+% dvipaste uses a more complicated scheme that uses a custom output
+% routine and then \eject each section, however I can't see why
+% \sendout can not just \shipout the box directly, so that is what
+% this version does.
+
+\def\sendout{\@testopt\GP@sendout{}}
+
+\ifx\GP@sendout\@empty
+
+\def\GP@sendout[#1]#2{\PackageError{grfpaste}{write pages
+ only}{}}
+
+\let\GP@shipout\shipout
+\def\shipout{\global\setbox\xxx}
+\newbox\xxx
+\let\GP@outputpage\@outputpage
+\def\@outputpage{%
+ \GP@outputpage
+ \immediate\write\writedata@
+ {\the\ht\xxx\space\the\dp\xxx\space\the\wd\xxx}%
+ {\let\protect\noexpand
+ \advance\c@page\m@ne
+ \GP@shipout\hbox{%
+ \special{beginpaste:}%
+ \wd\xxx\z@
+ \box\xxx
+ \special{endpaste:}%
+ }%
+ }}
+
+\else
+
+\long\def\GP@sendout[#1]#2{%
+ \sbox\z@{#2}%
+ \immediate\write\writedata@
+ {\the\ht\z@\space\the\dp\z@\space\the\wd\z@
+ \ifx\box#1\box\else\space\@percentchar#1\fi}%
+ \shipout\vbox{%
+ \vskip\ht\z@
+ \special{beginpaste:}%
+ \ht\z@\z@\dp\z@\z@\wd\z@\z@
+ \noindent\box\z@
+ \special{endpaste:}%
+% the original had this rule, but seems not to be needed.
+% \smash{\vrule \@height1sp\@width1sp\@depth\z@}%
+ \@@par
+ \vskip2pc%
+ \hbox{\normalfont File [\jobname], \#\number\c@page}}%
+ \stepcounter{page}}
+
+\fi
+
+\else
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+% Including DVI Sections Into The Current File
+%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+% Graphics will be able to include dvi file segments, reading size
+% info from .dat files (compatible with dvipast.tex for plain tex)
+
+\DeclareGraphicsRule{.dvi}{dvi}{.dat}{}
+
+% Add .dvi to the default list of extensions.
+
+\g@addto@macro\Gin@extensions{,.dvi}
+
+
+% dvipaste allows multiple dvi fragments to be included from the
+% same file. Add a new key num= (defaulting to 1) which says
+% which bit to include. Maintaining numbers if you have a lot of
+% fragments is inconvenient so may use symbolic references
+% instead of number.
+% ref=xxx refers to a fragment marked with the label xxx by use
+% of an optional argument \sendout[xxx]{......} to \sendout.
+% If \sendout is used with such an optional argument
+% the fragment may be included either by number or by label.
+% (The numeric form must be used if the fragment is included using
+% dvipaste.tex's \paste command.)
+
+
+\define@key{Gin}{num}{\def\Gin@num{#1}}
+\define@key{Gin}{ref}{\def\Gin@ref{#1 }}
+\setkeys{Gin}{num=1,ref=}
+
+% Unlike other graphics formats, which only have natural height and
+% width, dvipaste fragments are TeX boxes, with depth as well.
+% add a new key to set the depth (for cases where you don't want to
+% use a .dat file).
+
+\define@key{Gin}{natdepth}{%
+ \Gin@defaultbp\@tempaa{#1}%
+ \Gin@nat@depth\@tempaa bp\relax}
+
+% Ah. Don't look too carefully. The internal command \Gin@setfile
+% in the kernel of the graphics package was not expecting this, and
+% explicitly sets the depth of the graphic box to zero, so patch that
+% to make it set it to the new \Gin@req@depth macro.
+%
+% pulls apart the macro at \dp\z@\z@ and then puts it all back together
+% again.
+
+\def\@tempa#1\dp\z@\z@#2!{%
+ \def\Gin@setfile##1##2##3{%
+ #1%
+ \dp\z@\Gin@req@depth
+ #2}}
+\expandafter\@tempa\Gin@setfile{#1}{#2}{#3}!
+
+% Scaling is not currently supported, so natural depth and
+% required depth are the same.
+
+\def\Gin@req@depth{\Gin@nat@depth}
+
+\newdimen\Gin@nat@depth
+
+
+% For each new file type the graphics package needs two functions.
+% \Gread@<type> defines how to read the size information.
+% \Ginclude@type defines how to set the actual box and specials.
+% These functions are pretty similar to the code in dvipaste.tex
+
+% as in the dvipaste.tex version, the size information for
+% all the fragments in a single dvi file is saved in a macro
+% so the file only needs to be read once.
+
+\def\Gread@dvi#1{%
+ \expandafter\let\expandafter\@tempb\csname Gread@#1\endcsname
+ \ifx\@tempb\relax
+ \let\@tempb\@empty
+ \let\do\relax
+ \immediate\openin\@inputcheck#1 %
+ \catcode`\%9\relax
+ \ifeof\@inputcheck
+ \@latex@error{File `#1' not found}\@ehc
+ \else
+ \Gread@true
+ \loop
+ \read\@inputcheck to\@tempa
+ \ifeof\@inputcheck
+ \Gread@false
+ \else
+ \xdef\@tempb{\@tempb\do\@tempa\relax}%
+ \fi
+ \ifGread@
+ \repeat
+ \immediate\closein\@inputcheck
+ \fi
+ \global\expandafter\let\csname Gread@#1\endcsname\@tempb
+ \fi
+%
+% Temporarily set \do to count up to the required fragment number
+% and then grab the size info. Then execute the list (in \@tempb).
+ \count@\z@
+ \Gread@false
+ \def\do##1 ##2 ##3 ##4\relax{%
+ \advance\count@\@ne
+ \def\@tempa{##4}%
+ \ifx\@tempa\Gin@ref
+ \edef\Gin@num{\the\count@}%
+ \fi
+ \ifnum\Gin@num=\count@
+ \Gread@true
+ \def\Gin@llx{0}%
+ \let\Gin@lly\Gin@llx
+ \Gin@defaultbp\Gin@urx{##3}%
+ \Gin@defaultbp\Gin@ury{##1}%
+ \Gin@nat@depth##2\relax
+ \fi}%
+ \@tempb
+ \let\do\noexpand}
+
+\def\Ginclude@dvi#1{%
+ \ifGread@
+ \dimen@\Gin@nat@height
+ \advance\dimen@\Gin@nat@depth
+ \hbox{\special{dvipaste: \Gin@base\space\Gin@num}%
+ \lower\Gin@nat@depth\vbox to\dimen@{\hbox to\Gin@nat@width{}\vfil}}%
+ \else
+ \Gin@nosize{\Gin@base[\Gin@num]}%
+ \fi}
+
+
+\fi
+