xfig
or JPdraw
can
create pictures with both LaTeX and Postscript information, but
need three different files: one for the internal format, one
with LaTeX, and one with Postscript data.) At the same time, it is
also an Encapsulated Postscript file, and can be included by
other packages that can handle this EPS-format. You might
wonder how all this is done.
Here is an example of an Ipe file, containing two text objects, one minipage object, and a polygon with six segments.
As you can see, after some initial balderdash, an Ipe file essentially consists of a single%!PS-Adobe-2.0 EPSF-1.2 %%Creator: Ipe 5.0 %%BoundingBox: 205 345 394 454 %%EndComments {\catcode37=9\def\IPEdummy{({{)}} pop %%}\makeatletter\let\@notdefinable\relax %%\def\IPEc#1[#2]#3{\newcommand{#1}[#2]{#3}\ignorespaces}\@ifundefined %%{selectfont}{\let\selectfont\relax\def\fontsize#1#2{}}{}\makeatother %%\IPEc\IPEput[4]{\put(0,0){\special{psfile=\IPEfile}}} %%\IPEc\IPEmp[2]{\minipage[t]{#1bp}#2\special{color pop}\endminipage} %%\IPEc\IPEtext[1]{\makebox(0,0)[lb]{#1\special{color pop}}} %%\IPEc\IPEfs[1]{\IPEcolfs{0 0 0}{#1}} %%\IPEc\IPEcolfs[2]{\dimen0=#2pt\fontsize{#2}{1.2\dimen0}\selectfont %%\special{color push rgb #1}} %%\IPEc\IPEsize[2]{\unitlength1bp\ignorespaces} %%\IPEsize{187}{106} %%\begin{picture}(187,106)(206,346) %%\IPEput{205}{345}{394}{454} %%\put(214,430){\IPEtext{\IPEfs{10}$s_0$}} %%\put(302,446){\IPEtext{\IPEfs{10}\rm this is the top vertex}} %%\put(306,398){\IPEmp{35}{\IPEfs{10}\rm inside a %%box life %%is nice}} %%\end{picture}\endinput} %% Ipe postscript prologue /IpeDict 60 dict def IpeDict begin /origmatrix matrix currentmatrix def /sg {setgray} bind def /sc {setrgbcolor} bind def /ss {0 setdash setlinewidth} bind def ... more Postscript definitions end end %% Ipe prologue end IpeDict begin 326 406 translate % Preamble 1 %%\documentclass[a4paper]{article} % Group % Line % ss 0 1.2 [] ss np % # 6 -120 -60 mt 60 -60 lt 60 -20 lt -20 32 lt -40 -20 lt -100 20 lt cl % cl % fi 0.8 sg fi % End % Text % xy -112 24 % sk 0 % f 3 10 % s s_0 % End % Text % xy -24 40 % sk 0 % f 0 10 % s this is the top vertex % End % Text % xy -20 -8 % bb 35.0094 30.85 % sk 0 % f 0 10 % s inside a % s box life % s is nice % End % End end %% of Ipe figure
picture
environment. This
environment is hidden behind percent signs, the comment character in
Postscript. This makes it possible to use the same file as a
Postscript file--the Postscript interpreter does not see this part at
all.
The magic sits in the line
{\catcode37=9\def\IPEdummy{({{)}} popWhen the Postscript interpreter interprets this line, it has no effect. But when LaTeX reads it, it turns off the `%'-character--from that moment on, all percent signs will simply be ignored. This explains how LaTeX manages to look at the
picture
environment.
The next few lines define some commands used in the environment
itself. They can be customized to scale the figure, or to adapt to a
different dvi-to-Postscript converter. The command
\IPEsize
, for instance, was mentioned
before. It is given the
actual size of the picture
, and is responsible to set
unitlength
, IPEscale
, and IPEwidth
. The next
lines of the file contain the actual picture
environment. It
contains several entries placed with \put
. The first
entry is the magic one. It places a box containing a
\special
which includes the Ipe file again when the
DVI-file is converted to Postscript, and at that time it will
be interpreted as a Postscript file. The \Ipe
command saves the file name of the file in macro \IPEfile
, where
it is re-used by \IPEput
. Therefore, as long as you run
LaTeX and dvips
in the same directory, you don't have to
worry about incorrect absolute path names.
The rest of the picture
environment contains \put
entries for the text objects. \IPEtext
makes a box and
interprets its argument in LaTeX's LR-mode. \IPEmp
makes a minipage with the given width, and interprets its argument in
paragraph mode. The \IPEfs
macro calls the
\IPEcolfs
macro discussed before.
LaTeX reads the file up to the \endinput
command,
where it returns to the surrounding LaTeX document. Therefore it
will not encounter the Postscript information, which comes later in
the file.
The rest of the file contains Postscript data. First
comes a series of definitions, constituting the Postscript dictionary
IpeDict
. These are the Postscript commands necessary to
interpret the body of the Ipe file. Interspersed with the
Postscript data there are the keywords that Ipe uses to read back
the file itself, see ipe
input.
To summarize: an Ipe file contains both LaTeX and Postscript
information, and is actually read twice in the process of
converting a LaTeX document to a Postscript file, once by LaTeX,
and then again by dvips
.