************************************************************************** FPLOT Version 2.35 January 30, 2000 Michael C. Ring ringx004@tc.umn.edu Latest release will be available at http://tc.umn.edu/~ringx004 ************************************************************************** * * * Copyright (C) 1997 - 2000 Michael C. Ring * * * * This software is Freeware. * * * * Permission to use, copy, and distribute this software and its * * documentation for any purpose with or without fee is hereby granted, * * provided that the above copyright notice appear in all copies and * * that both that copyright notice and this permission notice appear * * in supporting documentation. * * * * Permission to modify the software is granted, but not the right to * * distribute the modified code. Modifications are to be distributed * * as patches to released version. * * * * This software is provided "as is" without express or implied warranty. * ************************************************************************** The files created during extraction are as follows : FILE DESC -------------------------------------------- README This file. README.PS This file in Postscript format HISTORY.TXT Brief history of the program FPLOT.H ----+ GLOB.H +-- Header files PROTO.H ----+ FPLOT.C ----+ FPCMD.C | FPSET.C +-- C Source Files FPOUT.C | FPLIB.C ----+ FPLOT.EXE MS-DOS Executable MULTIPLT.C C Source File MULTIPLT.EXE MS-DOS Executable MKDOS.BAT Build batch file for DOS using Microsoft C MKDOSGCC.BAT Build batch file for DOS using GCC MKUNIX Build script for generic Unix FPLOT.1 ----+ FPLOT-1.PS +-- Unix man pages with postscript versions MULTIPLT.1 | MULTI-1.PS ----+ CMD.ALL Sample command file, *ALL* options listed here CMD.2 ----+ CMD.3 | CMD.4 +-- Sample command files CMD.5 | CMD.6 ----+ DATA.1 ----+ DATA.2 | DATA.3 +-- Sample data files DATA.4 | DATA.5 | DATA.6 ----+ ************************************************************************** TABLE OF CONTENTS ------------------- 1 Introduction 1.1 Program Installation 2 Running the Samples 3 FPLOT Parsing Rules 4 Commands (Reset, Set, Data, Plot) 5 Data File Format 6 Line Styles and Symbols used 7 Points of Interest 8 MULTIPLT 9 Closing ************************************************************************** 1 INTRODUCTION Why was this program written? This is a good question since there are many plotting programs available. GNUPLOT is actually one I use very frequently. It is very powerful and it can plot practically anything you throw at it. It supports numerous printers and terminal types also. If you really want a super powerful plotting program, GNUPLOT is it. However, GNUPLOT doesn't do two things which I like/need: 1) You can't go directly from ASCII data to a plot on the command line. You can load a command file : gnuplot loadfile where loadfile is an ASCII file containing a list of commands and the last line in this command file might be plot "datafile" But as far as I know, you can't directly go from "datafile" to a plot file. FPLOT can do this. For DOS : program_that_outputs_ascii_data | fplot -r -- > LPT1 For UNIX : program_that_outputs_ascii_data | fplot -r -- | lp -dprinter The arguments used in fplot will be described later in this file. 2) I sometimes need to plot many, many data points (> 100,000) This usually isn't a problem under UNIX, but I use DOS sometimes and the DOS version of GNUPLOT simply runs out of RAM with this many data points. Actually on my DOS system, GNUPLOT can only plot 2700-3000 data points. FPLOT can read any number of data points since it doesn't store the data samples in RAM, it simply re-reads the data file if it needs to. This obviously takes longer but there are no limitations. One of my test files contained 1,000,000 data points. It took 15 minutes to create the postscript file and another 8 to get a printout, but it did it under DOS. As of now, FPLOT only supports postscript printers. I have hooks in the code to support other printers, namely Epson FX/LQ and HPGL. If there is sufficient demand for other printers, I will add them at a later time. The program is only about 5000 lines of C code and it has been tested under MS-DOS, HP-UX, Sun, and Linux systems. These are the systems I have access to. If anyone ports this to another OS, please send me the build file and any changes that were needed to the source code. There will not be any Windows versions since this is, inherently, a command line utility program. The C code is really quite ordinary, I think it should port to other OS's without too much difficulty. Even though I have been writing C code for many years, this is my first attempt at postscript code. Drawing graphs is actually a simple process. All you are really doing is drawing short line segments together with some text added for the title, axis labels, etc. I found Peter J. Weingartner's "A First Guide to Postscript" on the net. I used his document and samples from gnuplot and other postscript programs to generate my postscript code. I have a feeling some of the postscript code may not be as efficient/clear as it could be, but it does work. I did not use any operators that were not in Peter's document since I wanted to guarantee that all the postscript code met Adobe's 1.0 spec. This would enable my program to work even with 'older' printers. I will welcome any input that makes the postscript code cleaner and/or more efficient. I chose postscript output for three reasons. 1) My workplace and my home have postscript printers, 2) Since postscript is straight ASCII, it works really nice in pipes, and 3) It is fairly easy to post-process postscript output to put multiple plots on one sheet of paper. The program 'multiplt' will put multiple plots (up to 9!) on 1 page. As an added bonus, multiplt will also work with GNUPLOT (assuming postscript output) files as well as FPLOT. See section 8 for more details. I will attempt to distribute FPLOT under 2 file names. Both archives will contain the exact same files, except that they will have the correct end-of-line terminator for the ASCII files. The DOS archive will be named fplot$$$.zip and the Unix archive will be named fplot-$.$$.tar.gz where $$$ will be an indicator of the program version. The latest version of FPLOT will be available on my (very plain) web page. See location at the top. The file 'history.txt' will detail the updates made for each release. The new features are listed there as well as what version the features appeared in. FPLOT can plot an infinite number of Y ranges. The latest feature of the program allows a 'line break' in the data. If a blank line (or just a comment line) is found in the data, the current line segment is completed and then a new line segment will be generated starting with the first data line after the line break. By using multiple line breaks, any number of Y ranges can be plotted. 1.1 PROGRAM INSTALLATION DOS : Simply copy FPLOT.EXE and MULTIPLT.EXE to somewhere in your path. It is now ready. The programs were built with Microsoft C 8.00c. You can re-build FPLOT and MULTIPLT by running the batch file 'mkdos'. It also can be built by MSC 5.1 but you will need to delete the /Oce arguments. MSC 5.1 does not understand these optimization flags. I do not have access to MSC 6 or 7 so I'm not sure what the commands would be, though I think they would be quite similiar. If you have GCC for DOS, the batch file 'mkdosgcc' will build FPLOT and MULTIPLT. If you would like 32 bit versions of the programs (as built by GCC), let me know and I can send them to you. UNIX: Run the mkunix script. This should work for most unix systems. It works on HP-UX, Sun, and Linux. I assumed the compiler will be GCC. If you do not have gcc on your system, substitute the correct name to invoke your compiler, probably 'cc'. These scripts will build 'fplot' and 'multiplt'. After the programs are built, copy them to somewhere in your path. /usr/local/bin is usually a good one since everyone can use it there, but usually only the root user has write privleges in that directory. ************************************************************************** 2 RUNNING THE SAMPLES See section 3 for the parsing rules and section 4 for the 'set' commands. Command Commentary ------- ---------- (1) fplot -r data.1 >output.ps The -r option tells fplot that we are processing a raw data file and not a command file. The postscript output will be redirected to 'output.ps' (2) DOS: fplot -r data.2 > LPT1 Send plot directly to printer on LPT1 UNIX: fplot -r data.2 | lp -dprinter Send plot to printer named 'printer' (3) DOS: type data.2 | fplot -r -- >LPT1 The -- filename tells fplot to take input from stdin instead of a file. The -- argument must be the last one on the fplot command line. UNIX: cat data.2 | fplot -r -- | lp[r] (4) DOS: fplot cmd.2 > LPT1 Read in command file 'cmd.2', generate fplot cmd.3 > LPT1 the plot and send it to LPT1. Ditto fplot cmd.4 > LPT1 for command file 'cmd.3', 'cmd.4', fplot cmd.6 > LPT1 and 'cmd.6'. UNIX: fplot cmd.2 | lp -dprinter fplot cmd.3 | lp fplot cmd.4 | lp fplot cmd.6 | lp (5) DOS: type cmd.5 | fplot -- > LPT1 Take in command file 'cmd.5' from stdin and send the plot to LPT1. UNIX: cat cmd.5 | fplot -- | lp (6) DOS: type cmd.all | fplot -- > LPT1 Take in command file 'cmd.all' from stdin and send the plot to LPT1. Also UNIX: shows how to embed data in the command cat cmd.all | fplot -- | lp file. FPLOT assumes you want to process a 'command' file. The -r command line option is used to process a RAW data file. This file just has the numbers you want to plot in it. A filename of '--' will process stdin instead of a file. ************************************************************************** 3 FPLOT PARSING RULES FPLOT parses the data files and command files into 'fields.' The term 'fields' means that FPLOT will split an input line into 'obvious' fields or columns of data. 1) The delimiters for FPLOT are spaces, commas, and tabs. 2) Any text within double quotes will be treated as one field. 2A) Any text WITHOUT double quotes will be treated as individual fields, each 'word' is one field. 3) A field beginning with a '#' will be treated as a comment. 4) Any text after a '#' on the line will be treated as a comment. Examples : FPLOT finds : 7.4, 9.1, -12.0e+7 3 fields 0.2, "text in field 2", QQ 3 fields 0.2, bad text in field 2, QQ 7 fields (see 2A) 3.321E-8 5.6709 -12.765 0 0.43 5 fields 3.321E-8 5.6709 -12.765 C 0.43 5 fields 3.321E-8,5.6709,-12.765,C,0.43 5 fields set papersize 8.5,11 # adjust papersize 4 fields set title "GRAPH TITLE" #comments after a '#' 3 fields #only a comment here 0 fields ************************************************************************** 4 COMMANDS (RESET, PLOT, DATA, SET) o) The sample file 'cmd.all' has every supported command in it. You can use this as a template for creating new command files. o) Blank lines and lines beginning with a '#' are comment lines. Any text after a '#' on a line is considered a comment also. o) Commands may be in uppercase or lowercase. o) Keywords shall be separated by 1 or more spaces, tabs, or commas. o) Any text entries should be in double quotes : set xlabel "Frequency (KHz)" set title "This is the Graph's Title" o) Since the program can plot two Y-ranges independently, specifying Y commands are either: set y1... or set y1multiplier 2.0 set y1label "Velocity (mph)" set y2... set y2range autorange set y2offset -3.5 The '1' is optional for all set y1... commands. The examples above could be set ymultiplier 2.0 set ylabel "Velocity (mph)" If you are only plotting 1 Y range, leaving the '1' off of set commands will probably be more clear. However, if you are plotting 2 Y ranges, having the '1' will probably help. Choose whichever makes more sense to you. Note that when plotting more than 2 Y-ranges, Y ranges 1 and 3-N will use the parameters as specified for the Y1 range. The Y2 range will use the parameters as specified for the Y2 range. The only exception is that if 3 or more ranges are being plotted, the Y2 range will be forced to be the same as the other Y ranges. ---------------------------------------------------------------------------- reset defaults This is the only allowed reset command. It can be used to reset to a known state. It will typically be used between many plots in the same command file. Example : reset defaults set ... set ... set ... set outputfile "data1.ps" plot "datafile.1" # # reset defaults # known start-up state set ... set ... set ... set outputfile "data2.ps" plot "datafile.2" # # reset defaults # known start-up state set ... set ... set ... set outputfile "data3.ps" plot "datafile.3" # ---------------------------------------------------------------------------- plot "filename" Plot the data in 'filename' using the rules from plot "/tmp/filename" previous 'set' commands. plot "C:\data\filename" ---------------------------------------------------------------------------- The 'data' command allows you to embed your data in the command file. Put the data between the commands 'data start' and 'data stop'. When data stop ===OR=== end of file is found, the plot will be generated. 'data stop' is only necessary if you want to continue with additional plots in the same command file. Line breaks may be used here also to achieve more Y ranges. See section 5, Data File Format. set ... set ... set ... data start 3.2 1.2 5.3 9.3 3.32 0.9 4.7 11.2 3.4 -0.2 3.2 12.9 # line break here 3.53 -2.8 2.52 13.4 3.6 -4.7 7.3E-1 17.3 3.717 -7.36 -2.73 19.2 3.8 -9.1 -4.21 23.04 data stop ---------------------------------------------------------------------------- NOTE : The following 'SET' command are in alphabetical order, except for the commands that are related. ---------------------------------------------------------------------------- set coordinates label001 inches This command specifies the label2 plotcoordinates coordinate system used to position label128 inches the 128 labels. 'inches' will use the physical dimensions of the page labelall inches to specify label placement. 'plotcoordinates' will position the labels in the graph's coordinate system. See the 'set label' command below. Use 'labelall' to set all 128 at once. The default coordinate system is 'inches'. ---------------------------------------------------------------------------- set fielddefinition x,6 Tells fplot which fields contain the data. set fielddefinition y,8 (y and y1 are synonyms). The example here : set fielddefinition y1,8 set fielddefinition y2,0 Field 6 will contain the X axis data Field 8 will contain the Y axis data We will not be plotting a Y2 range (== 0) set fielddefinition ##,0 y1 through y12 may be substituted for '##'. This allows the fields for all 12 Y ranges to be specified. The defaults are all 0. If they are ALL 0, fplot will determine how to plot the data based on the following : 1 field of data found, Plot a single Y range 2 fields , Plot an X,Y data pair 3 fields , Field 1 is X data, Fields 2,3 are Y1,Y2. 4 fields , Field 1 is X data, Fields 2,3,4 are Y1,Y2,Y3. 5 fields , Field 1 is X data, Fields 2,3,4,5 are Y1,Y2,Y3,Y4. etc. If you have 2 fields of data and you want to plot 2 Y ranges and have X be the number of samples in the file (the default would be an X,Y data pair), do : set fielddefinition x,0 set fielddefinition y1,1 set fielddefinition y2,2 Specifying any 'fielddefinition' to non-zero will tell fplot to bypass the routine to determine how to plot the data. fplot assumes you have specified exactly which fields are used and how you want them used. If 13 fields are found, field 1 will be the X data and fields 2-13 will be the data for the 12 Y ranges. If 14 or more fields are found, fields >= 14 will be ignored and fplot will treat the file as if 13 fields were found. ---------------------------------------------------------------------------- Specify the font size for each label. set fontsize title 14.0 Floating point is allowed! (i.e. 12.75) xlabel 14.0 ylabel 14.0 The 4 major labels default to 14 point. y1label 14.0 y & y1 are the same. y2label 14.0 set fontsize label1 10.0 Floating point is allowed! label$$$ 10.0 '$$$' may be 1-128. label128 10.0 These 128 labels default to 10 point. labelall 8.5 Set ALL 128 at once. ---------------------------------------------------------------------------- set graphborders .5 1.3 .8 2 Left, Top, Right, Bottom in inches 1 1 1 1 The default is 1 inch borders on all 4 sides. ---------------------------------------------------------------------------- set graphtype points There are 3 styles to choose from. Draw just linesandpoints 'points', just 'lines' or both. The default lines is 'lines'. ---------------------------------------------------------------------------- set gridlines off Turn the grid lines on, off, or have a small ticks tick mark near the numbers. The default is on on. ---------------------------------------------------------------------------- There are 128 labels you can position anywhere on the page. IF 'INCHES' IS THE COORDINATE SYSTEM: (see above) The first number (X position) is horizontal inches from the left edge of the page. The second number (Y position) is vertical inches from the bottom of the page. 'center' may be used to center the label in the middle of the page. 'rightjustify' may be used to place the label against the right hand edge of the plot, allowing for 0.5 inches from the edge of the page. 'center' and 'rightjustify' assume a 0 deg rotation for the label. Note that 'leftjustify' is not needed since a simple constant will suffice, i.e. 0.5 inches. IF 'PLOTCOORDINATES' IS THE COORDINATE SYSTEM: (see above) The first number is scaled to the 'X' axis scaling of the plot being generated. The second number is scaled to the 'Y' axis scaling of the plot being generated. The first Y range (y1range) is used for the label Y coordinates. The defaults are all labels off. set label10 rightjustify, 8.20, "M. Ring 9-30-99" set label53 2.7, 5.4, "Extra label 53 at 2.7, 5.4" set label96 1.7, 2.4, "Extra label 96 at 1.7, 2.4" set label71 center, 4.4, "Extra label 71 horizontally centered" set label113 rightjustify, 1.6, "Right Justify Extra label 113" set label$$$ 2, 3, "label text" # '$$$' may be from 1-128 ---------------------------------------------------------------------------- set outputfile "data.ps" Specify the output file name. The default is stdout. ---------------------------------------------------------------------------- set outputformat hpgl2 Only postscript is supported now. Specifying set outputformat epsonlq the others will terminate fplot with an error set outputformat epsonfx message. set outputformat postscript ---------------------------------------------------------------------------- set papersize 8.5, 11.0 Set the width and length in inches. 8.5x11 is the default. ---------------------------------------------------------------------------- set pointsizescale 0.85 Set the relative size of the 'points' when plotting 'points' or 'linesandpoints'. < 1.0 = smaller > 1.0 = larger 1.0 = default This command is useful when plotting many, many data points in a scatter plot. ---------------------------------------------------------------------------- Specify the rotation angle for each label. set rotation label1 0.0 Rotate each label by the number of degrees set rotate label2 -90 specified. The rotation may be from -180 to 180 label$$$ 10.0 '$$$' may be 1-128. label128 22.1 These 128 labels default to zero degrees. labelall 90.0 Set ALL 128 at once. A positive rotation is counter-clockwise. A negative rotation is clockwise. ---------------------------------------------------------------------------- set skipfactor 50 Plot every 51st data point (plot 1, skip 50, plot 1, skip 50, etc.) The default is 0, don't skip any points. ---------------------------------------------------------------------------- set title "=== Graph Title ===" set xlabel "+++ X Axis Label +++" set ylabel "Y Axis Label" set y1label "Y1 Axis Label" set y2label "((( Y2 Axis Label )))" These 4 labels are used to label the title and each of the axis's as desired. The defaults for these 4 labels are off. ---------------------------------------------------------------------------- set usesamples 100, 200 If you have a data file with many, many points in it, but you only care about samples 100 through 200, you can specify to only use this small range. The default is to use all the data points. Note: these numbers are not tied to the X axis scale, i.e. they are not when X=100 to X=200. They are LINES 100-200 in the data file. ---------------------------------------------------------------------------- set xaxisscale log Set X axis to be linear or log scale. set xaxisscale linear The default is linear. ---------------------------------------------------------------------------- set xmultiplier 1.0 Rescale any axis as desired. set ymultiplier 1.0 set y1multiplier 1.0 The default multipliers are 1.0. set y2multiplier 1.0 set xoffset 0.0 The default offsets are 0.0. set yoffset 0.0 set y1offset 0.0 set y2offset 0.0 This can be used to re-scale some input data as follows : plotted-data = data-file-data * multiplier + offset. For example, let's assume we want to plot the national debt vs. years and our data file looks like : (these numbers are completely imaginary and are for demonstration purposes only!) 1900 7.80E+8 1910 8.42E+8 1920 9.72E+8 1930 1.03E+9 1940 2.33E+9 1950 4.09E+9 1960 5.82E+9 1970 6.17E+9 1980 8.49E+9 1990 1.16E+10 and our Y-label is set ylabel "National Debt in Dollars" We could be more friendly by doing : set ymultiplier 1.0E-9 set ylabel "National Debt in Billions of Dollars" Another example : Our data file has 1 field of data : 5.02 ----+ 5.01 | 5.04 | . | total of 200 data points . | . | 5.17 ----+ Our X axis labels will be in data samples, 1-200. Let's assume we know that these 200 samples were in fact time period 10.0 seconds to 11.0 seconds. We want our X axis to display 10-11 seconds, not samples 1-200. set xmultiplier 0.005 # (11 - 10) / 200 set xoffset 10.0 set xlabel "Time (seconds)" ---------------------------------------------------------------------------- set xrange -10 -3 Specify the range you want for each axis set yrange -100, -90 set y1range 1.0E+3, 2.0E+3 set y2range -10 30 set xrange autorange Autoranging is the default for all axis's. set yrange autorange set y1range autorange set y2range autorange set y2range y1range Force Y2 and Y1 to have the same scaling. The default is for Y1 and Y2 to have independent scaling when 2 Y ranges are being plotted. This command is implied if 3 or more Y ranges are being plotted. ---------------------------------------------------------------------------- ************************************************************************** 5 DATA FILE FORMAT The format of a data file is simply ASCII text. It will be parsed the same as the 'commands' from above. The data can be delimited with spaces, tabs, or commas. The data file should have the data on successive lines. FPLOT now supports a new feature in data file format. A blank line (or just a comment line) in the data stream is now interpreted to indicate a 'line break'. The current line segment is completed and then a new line segment will be generated starting with the first line after the line break. This is useful for (1) drawing maps and (2) it gives the user an (effective) infinite number of possible Y ranges. Only 1 line at a time is allowed for a line break. If there are 2 or more successive blank lines, FPLOT will terminate with an error. Also, the first line in a data file must have data, the first line is not treated as a line break. See the sample data files, "DATA.*" NOTE : The 'line break' feature also works with the old method of specifying Y ranges (using multiple fields of data). Example: data file has 6 fields, so field 1 defaults to the X axis and fields 2-6 defaults to 5 Y ranges. If the data file has line breaks, such as: 2 42 55 -71 92 -32 3 37 65 -62 98 -37 4 25 72 -87 84 -42 5 18 62 -68 82 -39 # line break 1 (could have been an empty line also) 1 85 82 -77 11 -92 2 28 32 -58 32 -86 # line break 2 3 85 82 -71 71 -61 5 28 32 -54 62 -46 This data file would result in 15 line segments. There are 3 unique data sections (due to 2 line breaks) times 5 y-ranges = 15 total y ranges. The most useful and flexible use of line breaks is to simply have one X,Y pair on a line. Then use multiple line breaks to get as many Y ranges as you need. ************************************************************************** 6 LINE STYLES and SYMBOLS used FPLOT uses a combination of varying line widths and black/gray color to differentiate between different Y ranges when only 'lines' are being drawn. It also uses different symbols when 'points' or 'linesandpoints' are being drawn. The various combinations are shown below. If 'linesandpoints' is the graphtype, then medium-width black lines will only be used since the symbols can be used to differentiate between the Y ranges. Y-Range Line-width Line-color Symbol ----------------------------------------------------------------- 1 Medium Black Diamond 2 Narrow Black Box 3 Wide Black Triangle Up 4 Medium Gray Triangle Down 5 Narrow Gray Plus sign (+) 6 Wide Gray Cross sign (X) The pattern is repeated for Y ranges 7-12. ************************************************************************** 7 POINTS OF INTEREST o) The version of the distribution package is now tied to the RCS version of fplot.c. fplot will automatically parse the version from RCS_ID[]. This is why there was an abrupt change in the version from 0.6b to 2.10. o) The program will parse numbers in 'normal' or scientific notation. It can handle 3691.9275 as well as -9.87364e-10. The exponent 'e' may be upper or lower case. I just use the 'atof' function in C. o) The program needs to have some idea of what 'zero' is. In real life floating point calculations, you can never safely check for equality (or inequality) between two numbers. You have to subtract them and compare the result against a sufficiently small value. The small value I chose was 1.0E-12. Any number smaller than this will be treated as zero. If you need to plot numbers smaller than this, I suggest using the 'set [x|y]multiplier NN' command. An example of this is shown above. o) The program creates temp files during execution and deletes them at the end. For DOS, the files will be in the directory pointed to by the TMP environment variable or in C:\ if TMP is not set. For Unix, the files will be /tmp/fpl#####.### where the # will be uniquely set. On some systems, '/usr/tmp' may be a better choice, depending on the amount of free disk space in each directory. o) The program has a fairly strict parser. Any command it can't make sense of will terminate the program with some appropriate error message. o) All global variables begin with 'g_'. This convention is something I've done for a long time. It is very handy when working on a program you haven't seen for a long time. (Maintenance Mode!). o) I've used wrapper functions around malloc and free. I allocate extra bytes and put a signature pattern before and after the block and verify the pattern before the 'free'. This guarantees that you haven't overrun a memory block or free a block that you've already freed. A fairly simple program like this probably doesn't need them but I already had them lying around. o) There are a bunch of hard coded constants in the postscript code that I'm not proud of. They should be #defines or variables with a descriptive name. o) There is a font size lookup table in the code. This table is not exact. I need to know the size of each character so I can center the 4 main labels on the graph; the title, x axis label, and both y axis labels. I could not find any postscript operator in Peter Weingartner's document that resembled the length of a string given the string and the font with the current point size. So what I did (don't laugh) was print out each ASCII char 50 times and measured the length of each char with a ruler, converted the length to my coordinate system and I'm done. These are the numbers in the table. If anyone has the point size for the 95 printable ASCII char, please send them to me and I will put the real numbers in the table, or supply some postscript code that does the auto-centering for me. Even though this is not as scientific as I like, the net result is actually quite good. o) The program captures a handful of 'signals.' This is done so I can always clean up after myself, releasing memory and deleting the temp files I create. If any other OS's require more/less signal capturing, please let me know. As of now I just control this with conditional compiles in the code. ************************************************************************** 8 MULTIPLT MULTIPLT can be used to post-process the postscript output from FPLOT. It will also work with GNUPLOT. It should work with any postscript file if it meets the following 2 conditions: a) The original postscript file results in 1 page being printed. b) The original postscript file uses the 'showpage' command to eject the page near the end of the file. 'showpage' must be the only command OR the first command on the line where it is found. Up to 9 plots can be output on 1 physical page using multiplt. There will be a unique output for 2, 3, 4, 6, 8, and 9 plots. 5 plots will be output in the same format as 6 plots with the last plot being blank. 7 plots will be output in the same format as 8 plots with the last plot being blank. MULTIPLT accepts '--' as a filename. This will output an empty plot for that position on the plotted output. This can be used to force multiplt to output the plot in a different format, i.e. force a 6 plot format with a 4 plot input by using '--' two times : multiplt f1 f2 -- -- f3 f4 >output [4 plots on the page with ] [the 2 middle 'plots' blank] MULTIPLT supports 8 different output page sizes. The 8 page sizes are : 'letter' 8.5 x 11 inches (default) 'legal' 8.5 x 14 'tabloid' 11 x 17 'a3' 297mm x 420mm 'a4' 210mm x 297mm 'a5' 148mm x 210mm 'b4' 257mm x 364mm 'b5' 182mm x 257mm The page size is specified by calling multiplt with '-s' as the first argument. The default is letter, 8.5 x 11. Examples : multiplt -sa4 f1 f2 ... output page size is A4 multiplt -slegal f1 f2 ... output page size is LEGAL, 8.5 x 14 multiplt -sb5 f1 f2 ... output page size is B5 If the input files were created with 'fplot', the input files may be set to any arbitrary page size. 'fplot' outputs a special comment in the postscript header indicating the page size which multiplt uses to re-scale the data, if necessary. If the input files were created with 'gnuplot', the input files must be scaled using 8.5 x 11 inches. The output page size may still be changed but the input page must be 8.5 x 11. MULTIPLT simply reads postscript files from the command line, reformats the output, and sends the data to stdout. You can redirect the output to another file if so desired. Assume we have 9 postscript files from FPLOT or GNUPLOT named f1.ps through f9.ps. multiplt f1.ps > LPT1 (DOS) [Doesn't really do anything since] multiplt f1.ps | lp (Unix) [only 1 file is specified. ] multiplt f1.ps > newfile.ps [Included for symmetry. ] multiplt -sa4 f1.ps > newfile.ps [With '-s', easy way to translate] [from one page size to another! ] multiplt f1.ps f2.ps > LPT1 Put 2 plots on 1 page. multiplt -sa4 f1.ps f2.ps f3.ps > LPT1 Put 3 plots on 1 A4 page. multiplt -slegal f1.ps f2.ps f3.ps f4.ps > LPT1 Put 4 plots on 1 8.5x14 page. etc ... multiplt f1.ps ... 2-8 ... f9.ps > LPT1 Put 9 plots on 1 page. NOTE! : multiplt can be used recursively. In other words, the input to multiplt can be previous outputs of multiplt. This can be used to put 12, 16, 18, 24, ... plots on a page. As an example, this is how to put 16 plots on a page : multiplt f1 f2 f3 f4 > f1tmp Put 4 plots on 1 'page'. multiplt f5 f6 f7 f8 > f2tmp Put 4 plots on 1 'page'. multiplt fa fb fc fd > f3tmp Put 4 plots on 1 'page'. multiplt fe ff fg fh > f4tmp Put 4 plots on 1 'page'. multiplt f1tmp f2tmp f3tmp f4tmp > LPT1 Put all 16 plots on 1 'page'. ************************************************************************** 9 CLOSING If you have any questions, problems, or would like additional features, (like new set commands) feel free to contact : Michael Ring 10750 108th Ave. N. Maple Grove, MN 55369 e-mail : ringx004@tc.umn.edu web : http://tc.umn.edu/~ringx004 **************************************************************************