4
***********************************************************************
5
FUNNELWEB MANUAL WEB PAGE
6
=========================
7
Copyright (c) Ross N. Williams 1992,1999. All rights reserved.
9
Permission is granted to redistribute and use this manual in
10
any medium, with or without modification, provided that all
11
notices (including, without limitation, the copyright
12
notice, this permission notice, any record of modification,
13
and all legal notices) are preserved on all copies, that all
14
modifications are clearly marked, and that modified versions
15
are not represented as the original version unless all the
16
modifications since the manual's original release by Ross N.
17
Williams (www.ross.net) consist of translations or other
18
transformations that alter only the manual's form, not its
19
content. THIS MANUAL IS PROVIDED "AS IS" AND WITHOUT ANY
20
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
21
LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND
22
FITNESS FOR A PARTICULAR PURPOSE. TO THE EXTENT PERMITTED BY
23
LAW THERE IS ABSOLUTELY NO WARRANTY.
25
***********************************************************************
29
<TITLE>6.1 Analyzing the Monster Postscript Header File</TITLE>
30
<STYLE TYPE="text/css"> <!-- A {text-decoration: none} // --> </STYLE>
32
<BODY BACKGROUND="binary/background.gif"
41
<TD WIDTH="130" VALIGN="top">
42
<IMG SRC="binary/d_clear.gif" ALT="" WIDTH="130" HEIGHT="1"><BR>
47
<A HREF="http://www.ross.net/"
49
onClick="window.open('','rosshome','location,status,menubar,scrollbars,resizable',false).focus(); return true;"
51
<IMG SRC="binary/rossnet_logo.gif"
52
WIDTH="64" HEIGHT="32"
53
BORDER="0" ALT="RossNet"
54
HSPACE="0" VSPACE="1"></A><BR>
57
<A HREF="../index.shtml"
59
onClick="window.open('','funnelweb','location,status,menubar,scrollbars,resizable',false).focus(); return true;"
61
<IMG SRC="binary/linklogo.gif"
62
WIDTH="64" HEIGHT="32"
63
BORDER="0" ALT="FunnelWeb"
64
HSPACE="0" VSPACE="1"></A><BR>
66
<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0><TR><TD BGCOLOR="#000000">
67
<A HREF="../reference/index.html"
68
TARGET="funnelwebreference"
69
onClick="window.open('','funnelwebreference','location,status,menubar,scrollbars,resizable',false).focus(); return true;"
70
><FONT COLOR="#FFFFFF"><B>Reference</B></FONT></A><BR>
72
<A HREF="../developer/index.html"
73
TARGET="funnelwebdeveloper"
74
onClick="window.open('','funnelwebdeveloper','location,status,menubar,scrollbars,resizable',false).focus(); return true;"
75
><FONT COLOR="#FFFFFF"><B>Developer</B></FONT></A><BR>
77
<A HREF="index.html"><FONT COLOR="#FFFFFF"><B>Tutorial</B></FONT></A><BR>
78
<A HREF="intro.html"><FONT COLOR="#FFFFFF">1 Introduction</FONT></A><BR>
79
<A HREF="macro.html"><FONT COLOR="#FFFFFF">2 Macros</FONT></A><BR>
80
<A HREF="type.html"><FONT COLOR="#FFFFFF">3 Typesetting</FONT></A><BR>
81
<A HREF="example.html"><FONT COLOR="#FFFFFF">4 Example</FONT></A><BR>
82
<A HREF="hints.html"><FONT COLOR="#FFFFFF">5 Hints</FONT></A><BR>
83
<A HREF="examples.html"><FONT COLOR="#FFFFFF">6 Examples</FONT></A><BR>
84
<A HREF="web.html"><FONT COLOR="#FFFFFF">7 Webmaking</FONT></A><BR>
87
<A HREF="search.html"><FONT COLOR="#FFFFFF"><B>SEARCH</B></FONT></A><BR>
93
<TD WIDTH="360" VALIGN="top">
97
<A HREF="../reference/index.html"><IMG SRC="binary/title.gif"
98
WIDTH="302" HEIGHT="24"
99
BORDER="0" ALT="FunnelWeb Tutorial Manual"
100
HSPACE="0" VSPACE="0"></A>
101
<P><FONT SIZE="5">6.1 Analyzing the Monster Postscript Header File</FONT><BR>
106
<P>During my Ph.D. candidature, I determined at one point
107
that it would be very desirable to automatically insert
108
diagrams from the <I>MacDraw</I> program
109
on my Macintosh into TeX <SAMP>insert</SAMP>ions in
110
my thesis. This would allow diagrams to
111
float around with the text and be printed automatically
112
rather than having to be printed separately and stuck in
113
with real glue. On the face of it, the problem seemed
114
inherently solvable, as the Macintosh could
115
generate PostScript for each diagram and
116
this PostScript could presumably be inserted into the
117
PostScript generated using TeX.
119
<P>The only trouble was that the Macintosh PostScript code
120
for the diagrams relied on an Apple PostScript header
121
file. This meant that the
122
header file had to be included at the start of the TeX
123
PostScript if the inserted PostScript for the diagrams was
124
to work. Unfortunately, merely including the header file at
125
the top didn't work, and it turned out that a rather
126
detailed analysis of some parts of the Apple header file was
127
required in order to perform the necessary surgery on the
128
header file to make it work. This analysis was severely
129
aggravated by the fact that the PostScript header file was
130
virtually unreadable. Basically it was about 50K of
131
interwoven definitions, that looked as if it had been run
132
through a word processor. There was no way that the code
133
could be understood clearly without some kind of
134
reformatting. Two other aspects of the problem further
135
complicated the analysis:
140
<LI> The definitions of interest (i.e. the ones causing
141
the problems) were scattered throughout the heaeder file.
143
<LI> Many definitions could not be moved within the
144
header file. For one or more
145
reasons (e.g. to keep a definition within the activation of
146
a particular dictionary <SAMP>begin</SAMP> and <SAMP>end</SAMP>)
147
it would have been unwise to move the definitions of
148
interest to the same point in the file.
152
<P>In fact the file was so messy and complicated that, as
153
a rule, it had to be handled with kid gloves. It would have
154
been unwise to re-arrange the definitions or to insert
157
<P>To my surprise, FunnelWeb provided an unexpected
158
solution to the problem. First I replaced all occurrences of
159
the <SAMP>@</SAMP> in the header file with <SAMP>@@</SAMP>.
160
Second, I placed the entire header file in a FunnelWeb macro
161
definition connected to a product file. I then processed the
162
file and checked to make sure that the product file was
163
identical to the original file. By doing all this I had
164
placed the header file under FunnelWeb control. I then left
165
the macro definition largely untouched, but replaced the
166
PostScript definitions of interest with FunnelWeb macro
167
calls, moving the actual PostScript definitions into
168
FunnelWeb macro definitions at the end of the FunnelWeb
173
@O@<LaserHeader.ps@>==@{@-
174
Unreadable Postscript code
175
@<Print routine@>
176
Unreadable Postscript code
177
@<Zap routine@>
178
Unreadable Postscript code
181
@A This routine looks as if it does this, but really is
182
does that, blah, blah blah.
184
@$@<Print routine@>==@{@-
185
/print { push pop pop push turn around
186
and jump up and down and print it} def
189
@A This routine zaps the...
191
@$@<Zap routine@>==@{@-
192
/zap { push pop pop push turn around and
193
jump up and down and print it} def
197
<P>Use of FunnelWeb meant that I was able to pluck out the
198
definitions of interest (a very small part of the whole
199
file) and collect them as a group at the end of the file
200
where they could be studied. Because each definition was
201
safely contained in a macro, it was possible to write a
202
detailed commentary of each routine without fear of
203
affecting the final PostScript code in any way at all. Once
204
this analysis was completed, it was possible to perform
205
surgery on the offending PostScript definitions in an
206
extremely controlled way. In particular, the FunnelWeb input
207
file served as a repository for all the different versions
208
of particular routines that were tried in order to get the
209
definitions to work. A new (<STRONG>Z</STRONG>ero) macro was created for
210
each version of each definition, and a commentary of how it
211
performed added above it.
213
<P>This case demonstrates that FunnelWeb is an extremely
214
powerful tool for dissecting and documenting cryptic text
215
files. Through the use of
216
macros, particular parts of the file can be isolated and
217
discussed without affecting the final product file in any
218
way. In the example above, only a small part of the file was
219
analysed, the rest being left as a blob, but in the general
220
case, a cryptic text file could be inserted into FunnelWeb
221
and then incrementally dissected (and possibly modified)
222
until the result is a fully documented literate program.
223
That this can be done without affecting the actual product
224
file demonstrates the high degree of descriptive control
225
that FunnelWeb provides.
231
<TD ALIGN="left" VALIGN="bottom"><A HREF="examples.html"><IMG SRC="binary/fw_up.gif" HEIGHT="32" WIDTH="32" BORDER="0" ALT="Up"></A></TD>
232
<TD ALIGN="center" VALIGN="bottom"><A HREF="examples.html"><IMG SRC="binary/fw_up.gif" HEIGHT="32" WIDTH="32" BORDER="0" ALT="Up"></A></TD>
233
<TD ALIGN="right" VALIGN="bottom"><A HREF="examples_adt.html"><IMG SRC="binary/fw_right.gif" HEIGHT="32" WIDTH="32" BORDER="0" ALT="Next"></A></TD>
241
<A HREF="mailto:webmaster@ross.net">Webmaster</A>
242
<A HREF="copyright.html">Copyright © Ross N. Williams 1992,1999. All rights reserved.</A><BR>
253
<!-- *********************************************************************** -->
254
<!-- End Of A FunnelWeb Manual Web Page (www.ross.net/funnelweb/) -->
255
<!-- *********************************************************************** -->