|  | .TH GRAP 1 | 
|  | .SH NAME | 
|  | grap \- pic preprocessor for drawing graphs | 
|  | .SH SYNOPSIS | 
|  | .B grap | 
|  | [ | 
|  | .I file ... | 
|  | ] | 
|  | .SH DESCRIPTION | 
|  | .I Grap | 
|  | is a | 
|  | .IR pic (1) | 
|  | preprocessor for drawing graphs on a typesetter. | 
|  | Graphs are surrounded by the | 
|  | .I troff | 
|  | `commands' | 
|  | .B \&.G1 | 
|  | and | 
|  | .BR  \&.G2 . | 
|  | Data are scaled and plotted, | 
|  | with tick marks supplied automatically. | 
|  | Commands exist to modify the frame, | 
|  | add labels, override the default ticks, | 
|  | change the plotting style, | 
|  | define coordinate ranges and transformations, | 
|  | and include data from files. | 
|  | In addition, | 
|  | .I grap | 
|  | provides the same loops, conditionals, and macro processing that | 
|  | .I pic | 
|  | does. | 
|  | .PP | 
|  | .BI frame | 
|  | .B ht | 
|  | .I e | 
|  | .B wid | 
|  | .I e | 
|  | .B top | 
|  | .B dotted | 
|  | .IR ... : | 
|  | Set the frame around the graph to specified | 
|  | .B ht | 
|  | and | 
|  | .BR wid ; | 
|  | default is 2 by 3 (inches). | 
|  | The line | 
|  | .I styles | 
|  | .RB ( dotted , | 
|  | .BR dashed , | 
|  | .BR invis , | 
|  | .BR solid | 
|  | (default)) | 
|  | of the | 
|  | .I sides | 
|  | .RB ( top , | 
|  | .BR bot , | 
|  | .BR left , | 
|  | .BR right ) | 
|  | of the frame can be set | 
|  | independently. | 
|  | .PP | 
|  | .B label | 
|  | .I side | 
|  | .B \&"a label" | 
|  | .B \&"as a set of strings" | 
|  | .IR adjust : | 
|  | Place label on specified side; default side is bottom. | 
|  | .I adjust | 
|  | is | 
|  | .B up | 
|  | (or | 
|  | .B down | 
|  | .B left | 
|  | .BR right ) | 
|  | .I expr | 
|  | to shift default position; | 
|  | .B width | 
|  | .I expr | 
|  | sets the width explicitly. | 
|  | .PP | 
|  | .BI ticks | 
|  | .I side | 
|  | .B in | 
|  | .B at | 
|  | .IR "optname expr, expr, ..." : | 
|  | Put ticks on | 
|  | .I side | 
|  | at | 
|  | .I "expr, ..., | 
|  | and label with | 
|  | .I \&"expr"\f1. | 
|  | If any | 
|  | .I expr | 
|  | is followed by "...", label tick with "...", | 
|  | and turn off all automatic labels. | 
|  | If "..." contains | 
|  | .BR %f 's, | 
|  | they will be interpreted as | 
|  | .B printf | 
|  | formatting instructions for the tick value. | 
|  | Ticks point | 
|  | .B in | 
|  | or | 
|  | .B out | 
|  | (default out). | 
|  | Tick iterator: instead of | 
|  | .B at | 
|  | .IR \&... , | 
|  | use | 
|  | .BI from | 
|  | .I expr | 
|  | .B to | 
|  | .I expr | 
|  | .B by | 
|  | .I "op expr | 
|  | where | 
|  | .I op | 
|  | is optionally | 
|  | .B +-*/ | 
|  | for additive or multiplicative steps. | 
|  | .B by | 
|  | can be omitted, to give steps of size 1. | 
|  | If no ticks are requested, they are supplied automatically; | 
|  | suppress this with | 
|  | .B ticks | 
|  | .BR off . | 
|  | Automatic ticks normally | 
|  | leave a margin of 7% on each side; set this to anything by | 
|  | .B margin | 
|  | .B = | 
|  | .IR expr . | 
|  | .PP | 
|  | .B grid | 
|  | .I "side linedesc" | 
|  | .B at | 
|  | .IR "optname expr, expr, ..." : | 
|  | Draw grids perpendicular to | 
|  | .I side | 
|  | in style | 
|  | .I linedesc | 
|  | at | 
|  | .I "expr, ....\& | 
|  | Iterators and labels work as with ticks. | 
|  | .PP | 
|  | .B coord | 
|  | .I optname | 
|  | .B x | 
|  | .I "min, max" | 
|  | .B y | 
|  | .I "min, max" | 
|  | .B "log x | 
|  | .BR " log y" : | 
|  | Set range of coords and optional log scaling on either or both. | 
|  | This overrides computation of data range. | 
|  | Default value of | 
|  | .I optname | 
|  | is current coordinate system | 
|  | (each | 
|  | .B coord | 
|  | defines a new coordinate system). | 
|  | .PP | 
|  | .B plot | 
|  | .I \&"str" | 
|  | .B at | 
|  | .IR point ; | 
|  | .B | 
|  | .I \&"str" | 
|  | .B at | 
|  | .IR point : | 
|  | Put | 
|  | .I str | 
|  | at | 
|  | .IR point . | 
|  | Text position can be qualified with | 
|  | .BR rjust , | 
|  | .BR ljust , | 
|  | .BR above , | 
|  | .BR below | 
|  | after "...". | 
|  | .PP | 
|  | .B line | 
|  | .B from | 
|  | .I point | 
|  | .B to | 
|  | .IR "point linedesc" : | 
|  | Draw line from here to there. | 
|  | .B arrow | 
|  | works in place of | 
|  | .BR line . | 
|  | .PP | 
|  | .B next | 
|  | .I optname | 
|  | .B at | 
|  | .IR "point linedesc" : | 
|  | Continue plot of data in | 
|  | .I optname to | 
|  | .IR point ; | 
|  | default is current. | 
|  | .PP | 
|  | .BI draw | 
|  | .IR "optname linedesc ..." : | 
|  | Set mode for | 
|  | .BR next : | 
|  | use this style from now on, | 
|  | and plot "..." at each point (if given). | 
|  | .PP | 
|  | .BI new | 
|  | .IR "optname linedesc ..." : | 
|  | Set mode for | 
|  | .BR next , | 
|  | but disconnect from previous. | 
|  | .PP | 
|  | A list of numbers | 
|  | .I "x y1 y2 y3 ... | 
|  | is treated as | 
|  | .B plot | 
|  | .B bullet | 
|  | .B at | 
|  | .IR x,y1 ; | 
|  | .B plot | 
|  | .B bullet | 
|  | .B at | 
|  | .IR x,y2 ; | 
|  | etc., or as | 
|  | .B next | 
|  | .B at | 
|  | .I x,y1 | 
|  | etc., if | 
|  | .B draw | 
|  | is specified. | 
|  | Abscissae of 1,2,3,... are provided if there is only one input number per line. | 
|  | .PP | 
|  | A | 
|  | point | 
|  | .I "optname expr, expr | 
|  | maps the point to the named coordinate system. | 
|  | A | 
|  | .I linedesc | 
|  | is one of | 
|  | .B dot | 
|  | .B dash | 
|  | .B invis | 
|  | .B solid | 
|  | optionally followed by an expression. | 
|  | .PP | 
|  | .BI define | 
|  | .I name | 
|  | .BI { whatever } \f1: | 
|  | Define a macro. | 
|  | There are macros already defined for standard plotting | 
|  | symbols like | 
|  | .BR bullet , | 
|  | .BR circle , | 
|  | .BR star , | 
|  | .BR plus , | 
|  | etc., in | 
|  | .BR /sys/lib/grap.defines , | 
|  | which is included if it exists. | 
|  | .PP | 
|  | .I var | 
|  | .B = | 
|  | .IR expr : | 
|  | Evaluate an expression. | 
|  | Operators are | 
|  | .B= | 
|  | .B + | 
|  | .B - | 
|  | .B * | 
|  | and | 
|  | .BR / . | 
|  | Functions are | 
|  | .B log | 
|  | and | 
|  | .B exp | 
|  | (both base 10), | 
|  | .BR sin , | 
|  | .BR cos , | 
|  | .BR sqrt ; | 
|  | .B rand | 
|  | returns random number on [0,1); | 
|  | .BI max( e , e )\f1, | 
|  | .BI min( e , e )\f1, | 
|  | .BI int( e )\f1. | 
|  | .PP | 
|  | .B print | 
|  | .IR expr ; | 
|  | .B print | 
|  | \fL"\f2...\fL"\f1: | 
|  | As a debugging aid, print | 
|  | .I expr | 
|  | or | 
|  | .I string | 
|  | on the standard error. | 
|  | .PP | 
|  | .B copy | 
|  | \fL"\fIfile name\fL"\fR: | 
|  | Include this file right here. | 
|  | .PP | 
|  | .B copy | 
|  | .B thru | 
|  | .IR macro : | 
|  | Pass rest of input (until | 
|  | .BR \&.G2 ) | 
|  | through | 
|  | .IR macro , | 
|  | treating each field (non-blank, or "...") as an argument. | 
|  | .I macro | 
|  | can be the name of a macro previously defined, | 
|  | or the body of one in place, like | 
|  | .BR "/plot $1 at $2,$3/" . | 
|  | .PP | 
|  | .B copy | 
|  | .B thru | 
|  | .I macro | 
|  | .B until | 
|  | \fL"\fIstring\fL"\fR: | 
|  | Stop copy when input is | 
|  | .I string | 
|  | (left-justified). | 
|  | .PP | 
|  | .BI pic | 
|  | .IR "remainder of line" : | 
|  | Copy to output with leading blanks removed. | 
|  | .PP | 
|  | .BI graph | 
|  | .IR "Name pic-position" : | 
|  | Start a new frame, place it at specified position, | 
|  | e.g., | 
|  | .B graph | 
|  | .B Thing2 | 
|  | .BR "with .sw at Thing1.se + (0.1,0)" . | 
|  | .I Name | 
|  | must be capitalized to keep | 
|  | .I pic | 
|  | happy. | 
|  | .PP | 
|  | .BI \&. "anything at beginning of | 
|  | .IR line : | 
|  | Copied verbatim. | 
|  | .PP | 
|  | .B sh | 
|  | .BI % anything | 
|  | .BR % : | 
|  | Pass everything between the | 
|  | .BR % 's | 
|  | to the shell; | 
|  | as with macros, | 
|  | .B % | 
|  | may be any character and | 
|  | .I anything | 
|  | may include newlines. | 
|  | .PP | 
|  | .B # | 
|  | .IR anything : | 
|  | A comment, which is discarded. | 
|  | .PP | 
|  | Order is mostly irrelevant; no category is mandatory. | 
|  | Any arguments on the | 
|  | .B \&.G1 | 
|  | line are placed on the generated | 
|  | .B \&.PS | 
|  | line for | 
|  | .IR pic . | 
|  | .SH EXAMPLES | 
|  | .EX | 
|  | .ps -1 | 
|  | .vs -1 | 
|  | \&.G1 | 
|  | frame ht 1 top invis right invis | 
|  | coord x 0, 10 y 1, 3 log y | 
|  | ticks left in at 1 "bottommost tick", 2,3 "top tick" | 
|  | ticks bot in from 0 to 10 by 2 | 
|  | label bot "silly graph" | 
|  | label left "left side label" "here" | 
|  | grid left dashed at 2.5 | 
|  | copy thru / circle at $1,$2 / | 
|  | 1 1 | 
|  | 2 1.5 | 
|  | 3 2 | 
|  | 4 1.5 | 
|  | 10 3 | 
|  | \&.G2 | 
|  | .G1 | 
|  | frame ht 1 top invis right invis | 
|  | coord x 0, 10 y 1, 3 log y | 
|  | ticks left in at 1 "bottommost tick", 2,3 "top tick" | 
|  | ticks bot in from 0 to 10 by 2 | 
|  | label bot "silly graph" | 
|  | label left "left side label" "here" | 
|  | grid left dashed at 2.5 | 
|  | copy thru / circle at $1,$2 / | 
|  | 1 1 | 
|  | 2 1.5 | 
|  | 3 2 | 
|  | 4 1.5 | 
|  | 10 3 | 
|  | .G2 | 
|  | .ps | 
|  | .vs | 
|  | .EE | 
|  | .SH FILES | 
|  | .TF /sys/lib/grap.defines | 
|  | .TP | 
|  | .B /sys/lib/grap.defines | 
|  | definitions of standard plotting characters, e.g., bullet | 
|  | .SH SOURCE | 
|  | .B /sys/src/cmd/grap | 
|  | .SH "SEE ALSO" | 
|  | .IR pic (1), | 
|  | .IR troff (1) | 
|  | .br | 
|  | J. L. Bentley and B. W. Kernighan, | 
|  | ``GRAP\(emA Language for Typesetting Graphs'', | 
|  | .I | 
|  | Unix Research System Programmer's Manual, | 
|  | Tenth Edition, Volume 2. |