1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267
|
<HTML>
<!--
***********************************************************************
FUNNELWEB MANUAL WEB PAGE
=========================
Copyright (c) Ross N. Williams 1992,1999. All rights reserved.
Permission is granted to redistribute and use this manual in
any medium, with or without modification, provided that all
notices (including, without limitation, the copyright
notice, this permission notice, any record of modification,
and all legal notices) are preserved on all copies, that all
modifications are clearly marked, and that modified versions
are not represented as the original version unless all the
modifications since the manual's original release by Ross N.
Williams (www.ross.net) consist of translations or other
transformations that alter only the manual's form, not its
content. THIS MANUAL IS PROVIDED "AS IS" AND WITHOUT ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, WITHOUT
LIMITATION, THE IMPLIED WARRANTIES OF MERCHANTIBILITY AND
FITNESS FOR A PARTICULAR PURPOSE. TO THE EXTENT PERMITTED BY
LAW THERE IS ABSOLUTELY NO WARRANTY.
***********************************************************************
-->
<HEAD>
<TITLE>6.6 Documents That Share Text</TITLE>
<STYLE TYPE="text/css"> <!-- A {text-decoration: none} // --> </STYLE>
</HEAD>
<BODY BACKGROUND="binary/background.gif"
BGCOLOR="#FFFFFF"
TEXT="#000000"
VLINK="#660000"
LINK="#FF0000"
ALINK="#CC0000">
<TABLE WIDTH="490">
<TR>
<TD WIDTH="130" VALIGN="top">
<IMG SRC="binary/d_clear.gif" ALT="" WIDTH="130" HEIGHT="1"><BR>
<FONT SIZE="2">
<BR>
<A HREF="http://www.ross.net/"
TARGET="rosshome"
onClick="window.open('','rosshome','location,status,menubar,scrollbars,resizable',false).focus(); return true;"
>
<IMG SRC="binary/rossnet_logo.gif"
WIDTH="64" HEIGHT="32"
BORDER="0" ALT="RossNet"
HSPACE="0" VSPACE="1"></A><BR>
<BR>
<A HREF="../index.shtml"
TARGET="funnelweb"
onClick="window.open('','funnelweb','location,status,menubar,scrollbars,resizable',false).focus(); return true;"
>
<IMG SRC="binary/linklogo.gif"
WIDTH="64" HEIGHT="32"
BORDER="0" ALT="FunnelWeb"
HSPACE="0" VSPACE="1"></A><BR>
<BR>
<TABLE CELLSPACING=0 CELLPADDING=0 BORDER=0><TR><TD BGCOLOR="#000000">
<A HREF="../reference/index.html"
TARGET="funnelwebreference"
onClick="window.open('','funnelwebreference','location,status,menubar,scrollbars,resizable',false).focus(); return true;"
><FONT COLOR="#FFFFFF"><B>Reference</B></FONT></A><BR>
<BR>
<A HREF="../developer/index.html"
TARGET="funnelwebdeveloper"
onClick="window.open('','funnelwebdeveloper','location,status,menubar,scrollbars,resizable',false).focus(); return true;"
><FONT COLOR="#FFFFFF"><B>Developer</B></FONT></A><BR>
<BR>
<A HREF="index.html"><FONT COLOR="#FFFFFF"><B>Tutorial</B></FONT></A><BR>
<A HREF="intro.html"><FONT COLOR="#FFFFFF">1 Introduction</FONT></A><BR>
<A HREF="macro.html"><FONT COLOR="#FFFFFF">2 Macros</FONT></A><BR>
<A HREF="type.html"><FONT COLOR="#FFFFFF">3 Typesetting</FONT></A><BR>
<A HREF="example.html"><FONT COLOR="#FFFFFF">4 Example</FONT></A><BR>
<A HREF="hints.html"><FONT COLOR="#FFFFFF">5 Hints</FONT></A><BR>
<A HREF="examples.html"><FONT COLOR="#FFFFFF">6 Examples</FONT></A><BR>
<A HREF="web.html"><FONT COLOR="#FFFFFF">7 Webmaking</FONT></A><BR>
<BR>
<A HREF="search.html"><FONT COLOR="#FFFFFF"><B>SEARCH</B></FONT></A><BR>
</FONT>
</TD></TR></TABLE>
</TD>
<TD WIDTH="360" VALIGN="top">
<FONT SIZE="3">
<A HREF="../reference/index.html"><IMG SRC="binary/title.gif"
WIDTH="302" HEIGHT="24"
BORDER="0" ALT="FunnelWeb Tutorial Manual"
HSPACE="0" VSPACE="0"></A>
<P><FONT SIZE="5">6.6 Documents That Share Text</FONT><BR>
<P>FunnelWeb is very useful when preparing multiple
documents that must share large slabs of identical text that
are being constantly modified.
<P>For example someone preparing two slightly different
user manuals for two slightly different audiences might want
the manuals to share large slabs of text, while still
allowing differences between them. The following example
shows how this can be done. The code is cluttered, but this
clutter would not be a problem if the lumps of text were
moderately large.
<P>
<PRE>
@O@<manual1.txt@>==@{@<M1@>@+@}
@O@<manual2.txt@>==@{@<M2@>@+@}
@$@<M1@>+=@{@<T1@>@}
@$@<M2@>+=@{@<T1@>@}
@$@<T1@>@M==@{@-
First lump of text shared by both documents.@+@}
@$@<M1@>+=@{Text for first document@+@}
@$@<M2@>+=@{Text for second document@+@}
@$@<M1@>+=@{@<T2@>@}
@$@<M2@>+=@{@<T2@>@}
@$@<T2@>@M==@{@-
Second lump of text shared by both documents.@+@}
</PRE>
<P>An alternative approach, which might work better in
situations where there are many small differences between
the two documents rather than a few large ones, is to define
a macro with two arguments, one for each product file
document. Write the document from top to bottom, but place
all stretches that differ between the two documents in a
macro call.
<P>
<PRE>
@! Set the definition of @#D to
@! @1 to create the shareholders report.
@! @2 to create the customers report.
@$@#D@(@2@)@M==@{@1@}
@O@<report.txt@>==@{@-
ANNUAL REPORT TO @#D@(Shareholders@,Customers@)
=================@#D@(============@,=========@)
This has been a very good year for The Very Big
Corporation of America. With your help, we have
been able to successfully
@#D@(@"screw the customers
for every cent they have@"@,
@"knock the shareholders into
submission to bring you lower prices@"@).
With gross earnings approaching six trillion
dollars, we have been able to
@#D@(@"increase dividends@"@,
@"lower prices@"@).
We expect to have an even better year next year.
@}
</PRE>
<P>One application where text sharing can be particularly
useful is in the preparation of computer
documentation containing
examples. For example, a book describing a new programming
language might be full of examples of small programs written
in the language which the user might want to try without
having to type them all in. The "default" approach
of keeping a copy of the examples in the text of the book
and another copy in separate files is cumbersome and error
prone, because both files have to be updated whenever an
example is changed. A more sophisticated approach is to
store each example in a separate file, and then use the
"include file" facility of the word processor to
include each example in the text. This is a better solution,
but suffers from a few drawbacks. First, when editing the
book in a word processor, the examples in the book will not
be directly accessible or visible. To see an example, the
writer would have to open the file containing the example in
a separate window. This could become tedious if the text
contained many examples, as many texts do. Furthermore,
there is a risk that some example files will be included in
the wrong place. Second, because the book is dependent on
the included files, the book will end up consisting of a
directory of a hundred or more files instead of just a few.
<P>An alternative solution is to construct a single
FunnelWeb <SAMP>.fw</SAMP> file that, when processed, produces
both the book file and the example files. This solution
assumes that the book consists of a text file containing
commands for a typesetter such as TeX.
<PRE>
@O@<Book.tex@>==@{@#B@}
@$@#B+=@{@-
The first step to learning the object oriented
AdaCgol++ language is to examine a hello world
program.
\start{verbatim}
@<Ex1@>
\finish{verbatim}
@}
@$@<Ex1@>==@{@-
read iopack@+Enter !World~! !Hello~! ex pr flu X[1]@}
@O@<Ex1.c@>==@{@<Ex1@>@}
@$@#B+=@{@-
To understand the program, think of the execution
state as a plate of cheese...
@}
</PRE>
<P>Most of the file will consist of part
definitions of the additive macro <SAMP>@#B</SAMP>.
The definition is "broken" to allow a
macro definition, wherever an example appears.
<P>The example above is a little messy because
FunnelWeb does not allow macros connected to
product files to be called, and it does not have
text expressions that write to an product file as
well as evaluating to text. Nevertheless, it
presents a fairly clean solution to the problem of
keeping the example programs in a computing text
up to date.
<P>
<TABLE WIDTH="100%">
<TR>
<TD ALIGN="left" VALIGN="bottom"><A HREF="examples_comments.html"><IMG SRC="binary/fw_left.gif" HEIGHT="32" WIDTH="32" BORDER="0" ALT="Prev"></A></TD>
<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>
<TD ALIGN="right" VALIGN="bottom"><A HREF="examples_generics.html"><IMG SRC="binary/fw_right.gif" HEIGHT="32" WIDTH="32" BORDER="0" ALT="Next"></A></TD>
</TR>
</TABLE>
<HR>
<FONT SIZE="2">
<A HREF="mailto:webmaster@ross.net">Webmaster</A>
<A HREF="copyright.html">Copyright © Ross N. Williams 1992,1999. All rights reserved.</A><BR>
</FONT>
</FONT>
</TD>
</TR>
</TABLE>
</BODY>
<!-- *********************************************************************** -->
<!-- End Of A FunnelWeb Manual Web Page (www.ross.net/funnelweb/) -->
<!-- *********************************************************************** -->
</HTML>
|