# pic(1) - man - phpMan

[PIC(1)](https://www.chedong.com/phpMan.php/man/PIC/1/markdown)                                 General Commands Manual                                [PIC(1)](https://www.chedong.com/phpMan.php/man/PIC/1/markdown)



## NAME
       pic - compile pictures for troff or TeX

## SYNOPSIS
       **pic** [**-nvCSU**] [_file_ ...]

       **pic** **-t** [**-cvzCSU**] [_file_ ...]

## DESCRIPTION
       This  manual  page describes the GNU version of **pic**, which is part of the groff document for‐
       matting system.  **pic** compiles descriptions of pictures embedded within  **troff**  or  TeX  input
       files into commands that are understood by TeX or **troff**.  Each picture starts with a line be‐
       ginning with **.PS** and ends with a line beginning with **.PE**.  Anything outside of **.PS** and **.PE** is
       passed through without change.

       It  is  the user's responsibility to provide appropriate definitions of the **PS** and **PE** macros.
       When the macro package being used does not supply such definitions (for example, old versions
       of -ms), appropriate definitions can be obtained with **-mpic**: These will center each picture.

## OPTIONS
       Options  that  do not take arguments may be grouped behind a single **-**.  The special option **--**
       can be used to mark the end of the options.  A filename of **-** refers to the standard input.

### -C

### -S
              worthy input (enabled by default).

### -U -S

### -n
              you are using a postprocessor that doesn't support these extensions.   The  extensions
              are  described  in **groff**___**[out**(5)](https://www.chedong.com/phpMan.php/man/out/5/markdown).  The **-n** option also causes **pic** not to use zero-length
              lines to draw dots in troff mode.

### -t

### -c -t
              through  transparently.  Lines beginning with **.**  are passed through with the initial **.**
              changed to **\**.  A line beginning with **.ps** is given special treatment: it takes  an  op‐
              tional  integer  argument  specifying  the line thickness (pen size) in milliinches; a
              missing argument restores the previous line thickness; the default line thickness is 8
              milliinches.   The line thickness thus specified takes effect only when a non-negative
              line thickness has not been specified by use of the **thickness** attribute or by  setting
              the **linethick** variable.

### -v

### -z

       The following options supported by other versions of **pic** are ignored:

### -D

### -T
              put generated by **pic** is device-independent.

## USAGE
       This section describes only the differences between GNU **pic** and the original version of  **pic**.
       Many of these differences also apply to newer versions of Unix **pic**.  A complete documentation
       is available in the file

              _/usr/share/doc/groff-base/pic.ms.gz_

### TeX mode
       TeX mode is enabled by the **-t** option.  In TeX mode, **pic** will define a vbox called **\graph**  for
       each  picture.   Use  the  **figname** command to change the name of the vbox.  You must yourself
       print that vbox using, for example, the command

              **\centerline{\box\graph}**

       Actually, since the vbox has a height of zero (it is defined with \vtop)  this  will  produce
       slightly more vertical space above the picture than below it;

              **\centerline{\raise** **1em\box\graph}**

       would avoid this.

       To  make  the  vbox  having  a  positive  height and a depth of zero (as used e.g. by LaTeX's
       **graphics.sty**), define the following macro in your document:

              **\def\gpicbox#1{%**
                 **\vbox{\unvbox\csname** **#1\endcsname\kern** **0pt}}**

       Now you can simply say **\gpicbox{graph}** instead of \box\graph.

       You must use a TeX driver that supports the **tpic** specials, version 2.

       Lines beginning with **\** are passed through transparently; a **%** is added to the end of the  line
       to  avoid  unwanted spaces.  You can safely use this feature to change fonts or to change the
       value of **\baselineskip**.  Anything else may well produce undesirable results; use at your  own
       risk.  Lines beginning with a period are not given any special treatment.

### Commands
       **for** _variable_ **=** _expr1_ **to** _expr2_ [**by** [*****]_expr3_] **do** _X_ _body_ _X_
              Set _variable_ to _expr1_.  While the value of _variable_ is less than or equal to _expr2_, do
              _body_ and increment _variable_ by _expr3_; if **by** is not given, increment _variable_ by 1.  If
              _expr3_  is  prefixed by ***** then _variable_ will instead be multiplied by _expr3_.  The value
              of _expr3_ can be negative for the additive case; _variable_ is then tested whether it  is
              greater  than  or  equal to _expr2_.  For the multiplicative case, _expr3_ must be greater
              than zero.  If the constraints aren't met, the loop isn't  executed.   _X_  can  be  any
              character not occurring in _body_.

       **if** _expr_ **then** _X_ _if-true_ _X_ [**else** _Y_ _if-false_ _Y_]
              Evaluate _expr_; if it is non-zero then do _if-true_, otherwise do _if-false_.  _X_ can be any
              character not occurring in _if-true_.  _Y_ can be any character not occurring in _if-false_.

       **print** _arg_...
              Concatenate the arguments and print as a line on stderr.  Each _arg_ must be an  expres‐
              sion, a position, or text.  This is useful for debugging.

       **command** _arg_...
              Concatenate  the  arguments and pass them through as a line to troff or TeX.  Each _arg_
              must be an expression, a position, or text.  This has a similar effect to a  line  be‐
              ginning with **.** or **\**, but allows the values of variables to be passed through.  For ex‐
              ample,

                     **.PS**
                     **x** **=** **14**
                     **command** **".ds** **string** **x** **is** **"** **x** **"."**
                     **.PE**
                     **\*[string]**

              prints

                     **x** **is** **14.**

       **sh** _X_ _command_ _X_
              Pass _command_ to a shell.  _X_ can be any character not occurring in _command_.

       **copy** **"**_filename_**"**
              Include _filename_ at this point in the file.

       **copy** [**"**_filename_**"**] **thru** _X_ _body_ _X_ [**until** **"**_word_**"**]
       **copy** [**"**_filename_**"**] **thru** _macro_ [**until** **"**_word_**"**]
              This construct does _body_ once for each line of _filename_; the line is split into blank-
              delimited words, and occurrences of **$**_i_ in _body_, for _i_ between 1 and 9, are replaced by
              the _i_-th word of the line.  If _filename_ is not given, lines are taken from the current
              input  up  to  **.PE**.   If an **until** clause is specified, lines will be read only until a
              line the first word of which is _word_; that line will then be discarded.  _X_ can be  any
              character not occurring in _body_.  For example,

                     **.PS**
                     **copy** **thru** **%** **circle** **at** **($1,$2)** **%** **until** **"END"**
                     **1** **2**
                     **3** **4**
                     **5** **6**
                     **END**
                     **box**
                     **.PE**

              is equivalent to

                     **.PS**
                     **circle** **at** **(1,2)**
                     **circle** **at** **(3,4)**
                     **circle** **at** **(5,6)**
                     **box**
                     **.PE**

              The commands to be performed for each line can also be taken from a macro defined ear‐
              lier by giving the name of the macro as the argument to **thru**.

### reset
       **reset** _variable1_[**,**] _variable2_ _..._
              Reset pre-defined variables _variable1_, _variable2_ ... to their default values.   If  no
              arguments  are  given,  reset all pre-defined variables to their default values.  Note
              that assigning a value to **scale** also causes all pre-defined variables that control di‐
              mensions to be reset to their default values times the new value of scale.

       **plot** _expr_ [**"**_text_**"**]
              This  is  a  text  object  which  is  constructed by using _text_ as a format string for
              sprintf with an argument of _expr_.  If _text_ is omitted a format string of **"%g"** is used.
              Attributes  can  be  specified  in  the same way as for a normal text object.  Be very
              careful that you specify an appropriate format string;  **pic**  does  only  very  limited
              checking of the string.  This is deprecated in favour of **sprintf**.

       _variable_ **:=** _expr_
              This  is  similar  to  **=** except _variable_ must already be defined, and _expr_ will be as‐
              signed to _variable_ without creating a variable local to the current block.   (By  con‐
              trast, **=** defines the variable in the current block if it is not already defined there,
              and then changes the value in the current block only.)  For example, the following:

                     **.PS**
                     **x** **=** **3**
                     **y** **=** **3**
                     **[**
                       **x** **:=** **5**
                       **y** **=** **5**
                     **]**
                     **print** **x** **"** **"** **y**
                     **.PE**

              prints

                     **5** **3**

       Arguments of the form

              _X_ _anything_ _X_

       are also allowed to be of the form

              **{** _anything_ **}**

       In this case _anything_ can contain balanced occurrences of **{** and **}**.  Strings may contain _X_  or
       imbalanced occurrences of **{** and **}**.

### Expressions
       The syntax for expressions has been significantly extended:

       _x_ **^** _y_ (exponentiation)
       **sin(**_x_**)**
       **cos(**_x_**)**
       **atan2(**_y_**,** _x_**)**
       **log(**_x_**)** (base 10)
       **exp(**_x_**)** (base 10, i.e. 10^_x_)
       **sqrt(**_x_**)**
       **int(**_x_**)**
       **rand()** (return a random number between 0 and 1)
       **rand(**_x_**)** (return a random number between 1 and _x_; deprecated)
       **srand(**_x_**)** (set the random number seed)
       **max(**_e1_**,** _e2_**)**
       **min(**_e1_**,** _e2_**)**
       **!**_e_
       _e1_ **&&** _e2_
       _e1_ **||** _e2_
       _e1_ **==** _e2_
       _e1_ **!=** _e2_
       _e1_ **>=** _e2_
       _e1_ **>** _e2_
       _e1_ **<=** _e2_
       _e1_ **<** _e2_
       **"**_str1_**"** **==** **"**_str2_**"**
       **"**_str1_**"** **!=** **"**_str2_**"**

       String comparison expressions must be parenthesised in some contexts to avoid ambiguity.

### Other Changes
       A  bare  expression, _expr_, is acceptable as an attribute; it is equivalent to _dir_ _expr_, where
       _dir_ is the current direction.  For example

              **line** **2i**

       means draw a line 2 inches long in the current direction.  The ‘i’ (or ‘I’) character is  ig‐
       nored; to use another measurement unit, set the _scale_ variable to an appropriate value.

       The  maximum  width and height of the picture are taken from the variables **maxpswid** and **maxp**‐‐
       **sht**.  Initially these have values 8.5 and 11.

       Scientific notation is allowed for numbers.  For example

              **x** **=** **5e-2**

       Text attributes can be compounded.  For example,

              **"foo"** **above** **ljust**

       is valid.

       There is no limit to the depth to which blocks can be examined.  For example,

              **[A:** **[B:** **[C:** **box** **]]]** **with** **.A.B.C.sw** **at** **1,2**
              **circle** **at** **last** **[].A.B.C**

       is acceptable.

       Arcs now have compass points determined by the circle of which the arc is a part.

       Circles, ellipses, and arcs can be dotted or dashed.  In TeX mode splines can  be  dotted  or
       dashed also.

       Boxes  can  have rounded corners.  The **rad** attribute specifies the radius of the quarter-cir‐
       cles at each corner.  If no **rad** or **diam** attribute is given, a radius of **boxrad** is used.  Ini‐
       tially, **boxrad** has a value of 0.  A box with rounded corners can be dotted or dashed.

       Boxes  can  have slanted sides.  This effectively changes the shape of a box from a rectangle
       to an arbitrary parallelogram.  The **xslanted** and **yslanted** attributes specify the x and y off‐
       set of the box's upper right corner from its default position.

       The  **.PS** line can have a second argument specifying a maximum height for the picture.  If the
       width of zero is specified the width will be ignored in computing the scaling factor for  the
       picture.  Note that GNU **pic** will always scale a picture by the same amount vertically as well
       as horizontally.  This is different from the DWB 2.0 **pic** which may scale a picture by a  dif‐
       ferent amount vertically than horizontally if a height is specified.

       Each  text  object has an invisible box associated with it.  The compass points of a text ob‐
       ject are determined by this box.  The implicit motion associated with the object is also  de‐
       termined  by  this  box.   The dimensions of this box are taken from the width and height at‐
       tributes; if the width attribute is not supplied then the width will be taken to be  **textwid**;
       if  the  height  attribute  is not supplied then the height will be taken to be the number of
       text strings associated with the object times **textht**.  Initially **textwid** and  **textht**  have  a
       value of 0.

       In (almost all) places where a quoted text string can be used, an expression of the form

              **sprintf("**_format_**",** _arg_**,**...**)**

       can also be used; this will produce the arguments formatted according to _format_, which should
       be a string as described in [**printf**(3)](https://www.chedong.com/phpMan.php/man/printf/3/markdown) appropriate for the number of arguments supplied.

       The thickness of the lines used to draw objects is  controlled  by  the  **linethick**  variable.
       This  gives  the thickness of lines in points.  A negative value means use the default thick‐
       ness: in TeX output mode, this means use a thickness of 8 milliinches;  in  TeX  output  mode
       with the **-c** option, this means use the line thickness specified by **.ps** lines; in troff output
       mode, this means use a thickness proportional to the pointsize.  A zero value means draw  the
       thinnest  possible  line  supported  by  the  output device.  Initially it has a value of -1.
       There is also a **thick**[**ness**] attribute.  For example,

              **circle** **thickness** **1.5**

       would draw a circle using a line with a thickness of 1.5 points.  The thickness of  lines  is
       not  affected by the value of the **scale** variable, nor by the width or height given in the **.PS**
       line.

       Boxes (including boxes with rounded corners or slanted sides), circles and  ellipses  can  be
       filled  by  giving  them an attribute of **fill**[**ed**].  This takes an optional argument of an ex‐
       pression with a value between 0 and 1; 0 will fill it with white, 1 with black, values in be‐
       tween  with a proportionally gray shade.  A value greater than 1 can also be used: this means
       fill with the shade of gray that is currently being used for text and lines.   Normally  this
       will  be black, but output devices may provide a mechanism for changing this.  Without an ar‐
       gument, then the value of the variable **fillval** will be used.  Initially this has a  value  of
       0.5.   The  invisible  attribute does not affect the filling of objects.  Any text associated
       with a filled object will be added after the object has been filled, so that  the  text  will
       not be obscured by the filling.

       Three  additional  modifiers  are  available  to specify colored objects: **outline**[**d**] sets the
       color of the outline, **shaded** the fill color, and **colo**[**u**]**r**[**ed**] sets both.  All three  keywords
       expect a suffix specifying the color, for example

              **circle** **shaded** **"green"** **outline** **"black"**

       Currently,  color  support isn't available in TeX mode.  Predefined color names for **groff** are
       in the device macro files, for example **ps.tmac**; additional colors can  be  defined  with  the
       **.defcolor** request (see the manual page of [**troff**(1)](https://www.chedong.com/phpMan.php/man/troff/1/markdown) for more details).

       To  change  the name of the vbox in TeX mode, set the pseudo-variable **figname** (which is actu‐
       ally a specially parsed command) within a picture.  Example:

              **.PS**
              **figname** **=** **foobar;**
              **...**
              **.PE**

       The picture is then available in the box **\foobar**.

       **pic** assumes that at the beginning of a picture both glyph and fill color are set to  the  de‐
       fault value.

       Arrow heads will be drawn as solid triangles if the variable **arrowhead** is non-zero and either
       TeX mode is enabled or the **-n** option has not been given.  Initially  **arrowhead**  has  a  value
       of 1.  Note that solid arrow heads are always filled with the current outline color.

       The  troff  output  of **pic** is device-independent.  The **-T** option is therefore redundant.  All
       numbers are taken to be in inches; numbers are never  interpreted  to  be  in  troff  machine
       units.

       Objects can have an **aligned** attribute.  This will only work if the postprocessor is **grops**, or
       **gropdf**.  Any text associated with an object having the  **aligned**  attribute  will  be  rotated
       about the center of the object so that it is aligned in the direction from the start point to
       the end point of the object.  Note that this attribute will have no effect for objects  whose
       start and end points are coincident.

       In places where _n_**th** is allowed ‘‘_expr_’’**th** is also allowed.  Note that ’’**th** is a single token: no
       space is allowed between the ’’ and the **th**.  For example,

              **for** **i** **=** **1** **to** **4** **do** **{**
                 **line** **from** ‘‘**i**’’**th** **box.nw** **to** ‘‘**i+1**’’**th** **box.se**
              **}**

## CONVERSION
       To obtain a stand-alone picture from a **pic** file, enclose your **pic** code with **.PS** and  **.PE**  re‐
       quests;  **roff**  configuration  commands may be added at the beginning of the file, but no **roff**
       text.

       It is necessary to feed this file into **groff** without adding any page information, so you must
       check which **.PS** and **.PE** requests are actually called.  For example, the mm macro package adds
       a page number, which is very annoying.  At the moment, calling  standard  **groff**  without  any
       macro package works.  Alternatively, you can define your own requests, e.g. to do nothing:

              **.de** **PS**
              **..**
              **.de** **PE**
              **..**

       **groff**  itself does not provide direct conversion into other graphics file formats.  But there
       are lots of possibilities if you first transform your picture into PostScript®  format  using
       the  **groff** option **-Tps**.  Since this _ps_-file lacks BoundingBox information it is not very use‐
       ful by itself, but it may be fed into other conversion programs, usually  named  **ps2**_other_  or
       **psto**_other_  or  the  like.  Moreover, the PostScript interpreter **ghostscript** (**gs**) has built-in
       graphics conversion devices that are called with the option

              **gs** **-sDEVICE=**_<devname>_

       Call

              **gs** **--help**

       for a list of the available devices.

       An alternative may be to use the **-Tpdf** option to convert your picture directly into **PDF**  for‐
       mat.   The  MediaBox  of  the  file produced can be controlled by passing a **-P-p** papersize to
       groff.

       As the Encapsulated PostScript File Format **EPS** is getting more and more  important,  and  the
       conversion  wasn't regarded trivial in the past you might be interested to know that there is
       a conversion tool named **ps2eps** which does the right job.  It is much  better  than  the  tool
       **ps2epsi** packaged with **gs**.

       For  bitmapped graphic formats, you should use **pstopnm**; the resulting (intermediate) **PNM** file
       can be then converted to virtually any graphics format using the tools of the **netpbm** package.

## FILES
       _/usr/share/groff/1.22.4/tmac/pic.tmac_
              Example definitions of the **PS** and **PE** macros.

## SEE ALSO
       [**troff**(1)](https://www.chedong.com/phpMan.php/man/troff/1/markdown), **groff**___**[out**(5)](https://www.chedong.com/phpMan.php/man/out/5/markdown), [**tex**(1)](https://www.chedong.com/phpMan.php/man/tex/1/markdown), [**gs**(1)](https://www.chedong.com/phpMan.php/man/gs/1/markdown), [**ps2eps**(1)](https://www.chedong.com/phpMan.php/man/ps2eps/1/markdown), [**pstopnm**(1)](https://www.chedong.com/phpMan.php/man/pstopnm/1/markdown), [**ps2epsi**(1)](https://www.chedong.com/phpMan.php/man/ps2epsi/1/markdown), [**pnm**(5)](https://www.chedong.com/phpMan.php/man/pnm/5/markdown)

       Eric S. Raymond, _Making_ _Pictures_ _With_ _GNU_ _PIC._
       _/usr/share/doc/groff-base/pic.ps_ (this file, together with its source file, pic.ms,  is  part
       of the groff documentation)

       Tpic: Pic for TeX

       Brian  W.  Kernighan,  _PIC_  _—  _A_  _Graphics_  _Language_  _for_  _Typesetting_ _(User_ _Manual)_ ⟨http://
       cm.bell-labs.com/cm/cs/cstr/116.ps.gz⟩.  AT&T Bell Laboratories, Computing Science  Technical
       Report No. 116 (revised May, 1991).

       **ps2eps** is available from CTAN mirrors, e.g. ⟨ftp://ftp.dante.de/tex-archive/support/ps2eps/⟩

       W. Richard Stevens, _Turning_ _PIC_ _into_ _HTML_ ⟨<http://www.kohala.com/start/troff/pic2html.html>⟩

       W.    Richard   Stevens,   _Examples_   _of_   pic   _Macros_   ⟨<http://www.kohala.com/start/troff/>
       pic.examples.ps⟩

## BUGS
       Input characters that are invalid for **groff** (i.e., those with ASCII code 0, or 013 octal,  or
       between 015 and 037 octal, or between 0200 and 0237 octal) are rejected even in TeX mode.

       The interpretation of **fillval** is incompatible with the pic in 10th edition Unix, which inter‐
       prets 0 as black and 1 as white.

       PostScript® is a registered trademark of Adobe Systems Incorporation.



groff 1.22.4                                23 March 2022                                     [PIC(1)](https://www.chedong.com/phpMan.php/man/PIC/1/markdown)
