This program processes files in a funny SGML-like feed into a native setter
code - actually it is very simple markup language.

It loops around a queue, when a file arrives it processes it into the codes and
works out width and depth.

It passes the file onto the next stage which can either be directly to the
setter or a holding queue for later inclusion into a page or block.

The device file, tables/form/SETTER, is used to define fonts and character
The current version supports PostScript only.

FIP Header fields in the incoming file are searched for :
    FK: Sort key - used generally by the User Interface 'form' for
        collecting and collating many files that have been processed
        individually previously - like election results for example.
    FN: File name of the output file if different from the incoming
        file. This name is Overwritten by the Sort Key if there is one.
    SN: Name of data file. This can be either the SN field or the actual
        filename if there is NO FipHdr or Fip-style filename.
    FQ: Output queue for PostScript file. This defaults to spool/setit.
    FU: Destination for output file. Generally if a destination is
        to be added, the file also need to be sent to 'spool/2go' for
        IPWHEEL to redistribute - use FQ for this ie :
        where 'nextstep' is a valid destination in the USERS file.
    FCR:    Should CR, NL (LF) be thought of as quads ? Normally yes !
        Add 'FCR:' to the Fip Hdr of the incoming file and all CRs and
        NLs are ignored and a quad is ONLY the Quad command <q:?>
        (where ? is l, c or r).
    FP: Page number to start with - for books and documents only.
        This can be changed with the 'newFP' parameter in the SETPAGE file
        eg if you want to use PV    newFP:PV
    FH: name of PS HEADER file in tables/form/postscript if NOT the -h
        input option or, failing that, the default (PSHDR). To specify
        NO header file use a null parameter eg #SH:bigpage#FH:#FP:99#
    FEC:    name of a file containing extra PS Comments to add before the
        %%EndComments. The default is none.
    FAC1:   name of a file containing PS commands to add after the
        %%EndComments and BEFORE the PSHDR. The default is none.
            FAC1: to FAC9: are available.
    FM: USER file to include after PSHDR header file and before main
        body of the text. This overrides the -u input option whether it
        has been specified or not. The file should be pure PostScript
        and be in tables/form/postscript. FM is case-sensitive.
    FAM1:   After USERS file to include after the USERS file.!
        Same conditions exists as for FM:
            FAM1: to FAM9: are available.
    FT: name of PS TRAILER file in tables/form/postscript if NOT the -t
        input parameter or, if no -t, the default (PSTLR). To specify
        NO header file use a null parameter eg #SH:lilpage#FH:#FM:#FT:#
    FF: Use the normal font on the setter or use a reencoded one which
        will be supplied in the PS HEADER file. Default is use the
        normal font with the name supplied. Options are :
            FF:yes      Use normal font
            FF:no       Use Encoded font as defined by CMP array
                    in the PSHEADER.
            FF:small    Use the Small changes to the font as
                    defined in the FipSmallVec and called
                    by FipReEncodeSmall in the PS HEADER.
    FZ: Name of SETTER file to use if not the default in tables/form
    FA: Name of SETPAGE file to use if not the default in tables/form
    FG: FG:block    Set <b> to Block-is-group as default for this job only.
        FG:colhdr   Set <b> to Block-is-column-header as default for this job only.
        This overrides the -G Input switch for this job or the default.
    FBBOX-ONLY: Only write the PostScript Header with Bounding Box as output
        This option does NOT write any data from the file.
    FBBOX-MULTIPLIER: (number)
        When the PSHDR etc are read, the 4 values of the Bounding Box
        are available as FipHdr fields F0 to F3.
        This  will generate 4 new FipHdrs F4 to F7 which will be the
        F0 - F3 multiplied by this number. Use this with FMETA* to
        create booking/billing records in millimetres for example :
    FBBOX: Override the calculated bounding box with these values
        There MUST be 4 values - just like %%BoundingBox
            FBBOX:0 0 860 1100
    FMULTIPLE: (number) For 'book:', put (number) of pages in each file.
        The default is 1 page per file.
    FIPHDR: Copy the incoming FipHdr onto the output file and add
        these extra FipHdr fields to the end of it
        eg :    FIPHDR:\nRH:opi3
        To copy the original FipHdr with no change  :
        Do NOT use '#' in the FIPHDR: string as they are intpreted as
        end of the FIPHDR: string - not as part of the new FipHdr you
        want to put on the output file.
        Certain FipHdr fields are zapped automatically, others can be
        zapped using ZAP-FIPHDR:XX,XX,XX,XX
            where XX is obviously a FipHdr field.
        Automatically zapped are XP, XT, XZ and XN
    FnoFIPHDR:  Do NOT add a FipHdr to the output file
    FSCRIPT: (path to a script)
        Run after a File (which may be a page) has been sent
        Run before a File (which may be a page) has been sent
        (Run after the whole input file has finished)
        This will run a script after the output file has been created
        with the fullpath and name of the file as the last parameter.
        Fipseq may be used to specify other parameters :
            FSCRIPT:/fip/local/create_view_file \FN \%d-\$m-\$y
        Do NOT add a 4 digit sequence on the end of the book as the name
        is in FipSeq and caters for it.
            ie in the setpage file  page:Biggy  book:   name:P\FPbiggy.pdf
        (Also triggered by the '-S' input switch)
        add EPSF to %!PS line   default: yes
        Log missing/slow included EPSFs     default: yes
        FLOG-EPSF:999 will print on the screen '.r1024-2 ' for each block read where
the 1st number is the blocksize and the second the number of secs since the
    FOUTPUT-META-FILE: (fullpath and filename in FipSeq)
        Create another output file which is ONLY the FipHdr of the
        original file plus any generated FipHdr fields like the Bounding
        Box etc (the F* fields described below)
    FOUTPUT-META-APPEND:  append any meta data to an existing file
    FOUTPUT-META-OUTPUT: (string to output in place of the FipHdr)
    FSTYLE-FILE: (fullpath and filename in FipSeq)
        Read this file - which contains Markup and FipSeq for data and
        use for output. In this case the data part of the incoming file
        is ignored !!
        If using this any FIpHdr fields used should be checked beforehand so that
        any '<', '>', CR, NL and '#' are mapped out of the way
        Generally '<' is 0376 xFE, '>' is 0377 or xFF, CR and NL are SPC
        FipHdr fields in this case can be up to 16k in length rather than the normal
1023 chrs

    FDCS-PLATES: (DCS Plates in order separated by '%')
        This generates a single file containing as many plates as your have
        requested.  Note that Black, if specified, should be the FIRST plate.

        Just to confuse, 'ipsetter' will output the plates in REVERSE
        order so that the first plate, which should be Black, will be
        the LAST plate output. This is so that any subsequent process
        can wait for the Black plate before processing.

        This looks for several sub files in form/postscript called:
            1. Extra Comments for the top of the file BEFORE
            the %%EndComments. The file is called :
            where (plate) is uppercase.

            eg DCS_COMMENTS_BLACK
                %%DocumentProcessColors: Black
                %%PlateColor: Black
            eg DCS_COMMENTS_MY_GREEN
                %%DocumentCustomColors: (My_Green)
                %%CMYKCustomColor: 1 0 1 0 (My_Green)
                %%PlateColor: My_Green

            2. Start of Plate. Placed AFTER the PSHDR/PSUSER and
            BEFORE any data. The file is called :

            eg DCS_PLATE_BLACK
                statusdict /jobname (\SN) put
                %%BeginProcessColor: Black
                %%Page: 1 1
                5 2 \FV (color \FD) 0 90 1315 -887 beginmark
                %%BeginDocument: ------ 0

            3. End of Plate. Placed AFTER the data.
            The file is called :

            eg DCS_END_BLACK

        The thing to note is that you need to Begin/End everything in the correct

        FNO-DATA:   Do NOT output any data.
                This is usually used with 'log-data' to output page infomation
                or BBOX-ONLY to output the bounding Box only
            Same as the setpage 'col:*' keyword

            Same as the setpage 'columns-per-page' keyword

            Same as the setpage 'allow-last-page-head' keyword
            Same as the setpage 'col:' keyword
            Same as the setpage 'number-of-columns' keyword
            Same as the setpage 'hole-on-every-page' keyword

Output fields are :
    FX, FY  x = width, y = depth in points*scale
    FL  no of lines
    FS  scale
    HT  is either passed thru or added (time in LONG format)
    FP  this pageno (can be changed with the 'newFP' parameter
    FD  DCS only - the Name of the current Plate
    FV  DCS only - the Number (in sequence from 1) of the current Plate

Where the file will be merged with several others by the MUI, form, you may
optionally NOT include font calls, header and trailers.

Formatting commands use the syntax :
    < (cmd) [ optional (: or =) (parameter) ] >
    Only the first letter of the command is required.
    All measurements are in points.

Commands are :
    f   Change Font         <font=times>
            Font name MUST be in the SETTER table

    p   Change Point and Set size   <p=20>

    s   Change Set size         <s:20>
        This defaults to the point size - and changes on change of point size too.

    c   Change Column width     <c=174>
        This takes effect immediately so take care.

    l   Change Leading          <l=8>
        The leading value is that moved in the Y or down direction after a Quad.
        If you need to set negative leading - well it can happen - note that
        you need to specify option 'L' first with '<o:l>' - see options below.

    q   Quad (default is Quad Left) <q>, <q:l>, <q:r>, <q:c>, <q:m>, <q:z>
        Quad may be Left, Right, Centre or Middle (ie stretch to fill).
        All quads except Zero will then Lead down the Leading value.

        Quad:zero formats text on the line and then returns to the
        left hand margin at the same Y position.
        Note that if FipHdr Field 'FCR:' is NOT set, any combination of
        CR and/or NL will be treated as a Quad:Left as well

    t   Tab             <t:z>, <t:s 10,15,25,40>
        Tab may be Left, Right, Centre, Set, Clear, Save or Restore.
        Tab Left, Right and Centre do just that.
        Remember to set tabs beforehand using one of the three Tab Set commands.
        If no tabs have been set, a Tab LRorC becomes a Quad.

        There are 3 different ways of specifying tabs :
            - X position. ie distance from lefthand margin.
            - Width of each field
            - Divide the column width proportionally
        Tab Set <t:s ...> :
            Each tab is the X distance from the left hand margin
            in points. The righthand margin need not be specified.
            Note the tabs increment !
            <t:s 12,24,66,78,90>
        Tab Set-Width <t:w ...> :
            Each tab is the width of that tab in points.
            <t:w 12,12,42,12,12>
            Tab Set-Width can also have a REMAINDER flag set in 1
            of the fields. In this case, if the total width of all
            the tabs is less that the column width, the extra is
            added to this tab. eg <t:w 10,20R,10>  <t:w 25,R,10>
        Tab Set-Proportional <t:p ...> :
            Each tab is a proportion of the whole width :
            <t:p 1,1,2,1,1>
        Tab Clear is <t:z> This clears and ignores all tabs.
        Tab Save <t:x> notes the current settings and clears.
        Tab Restore <t:y> restores to last settings.
            This only works after a TabSave (x) NOT a TabClear (z)
        If you change Column width, re-specify (ie t:S, t:P or t:W) the tabs.

    w   White and Fixed Horizontal Space    <w>, <w:12>
        If specified with no parameter this is a White Space command
        which will force any data left and/or right within the quad
        or tab irrespective of whether the Quad/tab is L,R or C.
        Negative amounts are valid.
            eg   X123<ws>456X<t>
                X123       456X

    x   Xtra Lead command       <x:72>, <x:-123.1>
        This drops immediately the amount specified which may be negative.

    z   Pass thru command       <z:\n%%Include:JimmysFile\n>
        Use this to access PostScript routines you have written in your PSHDR or USER
        The whole string assumed to be in FipSeq and is parsed before output.
        This does assume you know a little bit about PostScript, so use with care.
        Please note that if you MUST preserve (or save/restore) the
        currentpoint, use the Option '<o:z>' on or off. Normally the
        currentpoint is assumed to have been zapped.
        A PassThru is assumed to have NO width so to stop overprinting, add a
        using '<w:99>' - see above.

    n   Notes or Comment        <n:Next Section here Please>
        This will appear in the output file as a PostScript comment
        complete with preceeding '%' :
                <n: Next Section here Please>
        becomes     % FipComment - Next Section here Please

    r   Rules               <r:10:174>
        Specify width (default is column width) then height.
        Specify up and back using a '-' <r:10:-99.5>
        Tint (as a percentage) is an optional third parameter (default is 100 for
            eq a 25% tinted box 10 points wide and 200 up:
        To specify a coloured rule, specify the 4 CMYK values as parameters 4 to 7
                These are percentages from 0 to 100
        To specify a diagonal line, use a 5th parameter to mark the offset Y point

        Note that rules go to the RIGHT (x direction) and UP (y dir)
        To force LEFT or DOWN, use negative values.

        Coloured tints/rules may be specified by 4 numbers for CMYK in the 4th field
         - note these go from 0 (nothing) to 1 (100%) and are C.M.Y.K
         - separate the values with space(s)
                <r = 10 = 200 == .3 .5 0 0>

    d   Leader dots         <d>, <d:0>
        The parameter is the leader character and defaults to '.'.

    m   Set mark.            <m:24>
        Up to 100 marks are permitted. Note that both X and Y values
        of the current position are saved.
        Note that the X value normally includes any text or spaces on the line
        up to the point where the Mark is made. To use the X from the start of the
        (or tab stop) use the option <o:x:no> (and to turn back on <o:x:yes>)
    j   Jump to Mark            <j:24>
        The Mark should have been set beforehand.
        Take care to avoid where a column or page turn comes between the
        mark and the jump as the results may be slightly weird.
        There are special cases for :
            - jump to the bottom of the current column  <j:bottom>
            - jump to the maximum Y so far          <j:maxy>
            These should normally be embedded inside Block/Block-End so that a column
            turn does not lead to weird output !

    i   Indent              <i>, <i:l:12>, <i:12>
        Specify whether left (default) or right or both.
        To clear indent, use WITHOUT parameters      <i>.
        Indent can be used with an optional delay and/or maximum number of lines.
        Syntax: <i : left/right/both : (width) [opt : (startingLine) : (forLines)] >
            where width is is points, starting at line is where the line
            may not be the first; forLines is the indent stops after x lines
            A line is considered a Quad-with-depth which is any <q:?> except
            for a ZeroLead quad : <q:z>.
        If the indent command is specified as the first command on the line, it
        takes effect immediately. If not it starts on the next line. However the
        StartingLine does NOT alter.

    g   Page heading
        <g:/[q]Continued on Page 2[q]/[q]Continued from Page 1[q]>
        The 1st parameter is the End of the last Page and the second
        is the top of the next Page. Note the punctuation /, to separate
        the FROM from the TO - this should be unique in the string.
        This is ONLY triggered if paginated.
        Square brackets are used to signify commands.
        The End of last page is NOT counted in the depth - pls make
        allowance manually in SETPAGE.
        However the Continued to IS taken into account.
        To do different LEFT(even page) and RIGHT (odd page) headers,
            <g:L+endofRight+beginning of Left>
            <g:R+endofLeft +beginning of Right>

    h   Column headings.        <h:[f:timesb][p:12]Account[q:l]>
        This is ONLY triggered if paginated.
        Square brackets are used to signify commands.
        Do NOT embed NL or CR as these, plus the end command '>' are
        used to end the command.
        These can be replaced by a heading by specifying 'rephead:all'
        in the SETPAGE file. A heading in this case meaning the last
        block (ie between <b> and <e>).
        An alternative Col heading can be specified for the replacement
        by using :  <h:[f:roman][p:24]Prices[q]>
        Do NOT mix the separator, ':' or '=', in the same command.
        The flag must be '1' for normal and '2' for alternate hdrs.
        Use 'althead:all' to flag you want the alternate option.
        Note althead IGNORES the next block - ie replaces both the
        header and the normal column header.

    v   Dis/Allow Vertical Justification. <v:n>, <v:y>
        or Note VJ point and set max VJ addition, <v>,    <v:10>
        By default, VJ is ON automatically for pagination.
        If Vj is OFF (with a <vj:no>) then all VJ points (<v:100>, <vj> etc)
        are ignored until the next <vj:yes> or <v:y>.
        Note that you can limit the maximum amount that VJ can add
        by the 'vjinc' command in the SETPAGE file. By default this is
        120 points.

    b,e Block               <b>, <e>
        Flag the start or end of a Block. This block will NOT be split
        by VJ unless forced to by the force: parameter in the file.
        <b> signals the beginning of the block and <e> the end.
        Blocks are used to group items together which will NOT be VJed.
        There are two types of blocks depending on :
            1. whether the input switch -G is on
            2. presence of the FipHdr field 'FG:'
        Normally <b> is Block-as-column-header meaning the program will
        attempt to float this to the top of the column. If 'rephead' or'althead'
        have been specified then the contents of the block will become
        the actual headings, replacing any default column headings.
        It is considered the best-place-to-turn-a-col-is-here and has
        higher precedence over any ColTurn-Here (<a:1> to <a:9>) except
        for Must-Turn-column-NOW (<a> on its own). It follows therefore
        that all widow and orphan checking is ignored in this case.

        If -G is ON or 'FG:block' in the FipHdr or <b:group> is specified,
        this <b> is a Block-as-group which signals that this is to be
        considered as a discrete line which can be turned only at the
        end of the block. All widow and orphan controls are
        still valid.

        For 'book' work, they can also be used to strip extra markup at the
        top of a page - see below in Column Turn point (<a>)

    a   Column turn point.
            Column MUST turn at this point      <a>
        OR  Optionally Turn column at this point    <a:3>
        OR  Do NOT turn column on BEFORE next line  <a:no>

        For optionals, the number is a priority turn (1 being highest).
        If found when checking for Widows/Orphans, this is used instead of
        number of lines. Note that <a> or <a:0> is a 'MUST turn here'
        while <a:5>, <a:9> etc are 'if you have to turn, turn here'.

        For 'book:' work the syntax is slightly different. An extra
        parameter is added which is the depth that MUST remain in the
        page/column. If less, the page/column is turned and any text
        between <b:sameNo> and <e> or <e:sameno> in the page/col hdr
        is stripped.

        The last option is <a:no> which means do-not-turn-the-column-
        before-this-line pls. You can still turn after though. This
        option is only triggered properly if orphan is >= 1.
        The optional number can be in the range 1 -> 9.

        The ColTurn marker is attached to a valid line which is defined as
        ending with a quad-with-lead - ie any Quad EXCEPT QuadZero -
        that is NOT within in Block-Column/End (within <b>...<e>).

        Note that there is an OPTION cmd <o:a:10> which will ONLY turn columns
        on <a:9> (where 9 is a number for 0 to 9) and NOT on Quads (see below)

    y   Yank or Save all text from <y> until a <Y:end>      <y>
        All data between the <y> and <y:end> is saved including
        markup. So this can be a neat way of changing Column Headings
        for continuations where a Name is required which is in the data.
    u   Unsave or restore the previously saved (ie yanked) text <u>

    o   Options :
        There are a number of Options which all use a 2nd parameter and often a
        Note that an <o> with no other parameters will reset most options to defaults
            - Disable PointSize squeeze.
            - Set Line Justified (Ragged Off).
            - Set Word/LetterSpacing to 10% maximum.
            - Zap PassThru CurrentPoint.
            - Turn Columns on any quad, turn-point.
            - Disable Wrap within a tab.
            - Disable negative leading.
            - Allow line break.
            - Allow VJ.
            - Set min and max values for leading in VJ
            - Disable Hyphenation.

        Create an unprintable character     <o:unprintable:\321>, <o:u=\xFD>
            Use this option to create characters which cannot be typed in
            your word processor - or that get translated somewhere.
            The default number system is (normally) octal unless changed.
            For Hex, use the '\xZZ' notation where ZZ is 2 hex chrs : 0-9, a-f.
            Only one chr at a time can be typed in.

        Reduce Point and Set Size to squeeze data into tab or column.
            Allow           <o:p:3>
            Disable         <o:p>
            These allow/stop squeeze of data into a tab column where normally the
            data would wrap to the next line or overprint the next tab.
            The value is the minimum point size acceptable. The program
            will start by shrinking SetSize up to 25% less than current
            SetSize and then start shrinking both Point and Set proportionally.
            Note that you can also wrap text onto the next line of a column
            using 'Allow Wrap' (see below).

        Set Ragged Left, Centre or Right
            To set ragged           <o:r:left>. <o:r:r>, <o:r:c>
            To set justified (default)  <o:r>

        Allow Word and LetterSpacing
            Allow or Squeeze        <o:c:5> - to 5 %
            Disable             <o:c>
            The default is <o:c:10> for 10% allowable squeezeover the whole line.
        Set text to letterspaced
            Add 2 pt between letters    <o:y:2>
            Disable                     <o:y>
        Disable any and all Vertical Justification at all
            Disable all                 <o:j> <o:justOFF>
            Ignore any OverMatter in the last column    <o:j:over>
            This just ignores any VJ command '<v>' and does NOT add extra leading.
            Columns, if specified, are turned with no stretching/shrinking.
            Any over matter is run on at the end of the last column.
            The Bounding Box will be that of the whole job. So to force use
            'bboxX', 'bboxY' (and possibly 'bboxX-zero' and 'bboxY-zero'
            in the SETPAGE file.
            The second variant <o:j:over> still allows small VJ adjustments to a column
            it does not fit exactly.

        Enable zero and negative leading    <o:l>
            Normally <l:0> and <l:-40> are ignored so that quads always increment down
the page.
            This affects ONLY Leading ie '<l:99>' as xtra lead like '<x:24>' can have
            positive or negative movements at any time.

        Reset Page Number for book/document work    <o:n:58>
        Output Page Number for book/document work   <o:n>
            This is the format used for pass thrus -    <o:n><z: ResetOnNewPage>
        Output Page Number for book/document work   <o:n:text>
            Use this for inserting the text in-line as though it was an ordinary string
                "This Page is Number <o:n:text> of millions"
        Add extra FipHdr data               <o:n:fiphdr:Z1:tower\nZ2:\$u>
            use escapes and FipSeq for end of lines, control chrs etc

        Make default quad Left, Centre, Right       <o:q:r>
            The normal default is Left. Use this for setting the currentpoint
            for PassThru commands to the left, centre or right of tab or column.
            (This is ONLY used if the PassThru Fudge flag is ON - otherwise the PassThru
            is placed exactly where you specify).

        For PassThru, assume the currentpoint is preserved or zapped :
            <o:z:preserve> or <o:z:p> and <o:z:zap or <o:z:z>
            Zap is the default. Zap will force a MOVETO before the
            next text while Preserve will place any text following.

        Create Fraction             <o:f:1/3>, <o:f:1 2>
            with bar or without (use space as separator)
            This will create a fraction chr by shrinking font and moving
            The advantage is that setter can determine the width.
            The Fraction Bar can be any valid chr except space and numbers. If
            it is not-printable, use \XXX format to specify an octal number

        Save or Display Variables       <o:v:c22:22.9>, <o:v:a*>
            Please see the section below on variables.

        Allow/Disable Line break
            Allow line to broken at any suitable point  <o:b>, <o:b:y>
            Do NOT break line               <o:b:n>
            Use this to group text which MUST not turn.
            The default, naturally enough, is 'Allow'.

        Allow/Disable Hyphenation
            Allow Hyphenation (default)     <o:h>, <o:h:y>
            Do NOT hyphenate            <o:h:n>
            The default, naturally enough, is 'Allow'.

        Add a soft Hyphen               <o:softhyphen>
        Add a soft Quad                 <o:softquad> or <o:softquad:right>
            Softs are used to hint where a line should break if there are no obvious

        Allow Wrap within tab               <o:w:yes> <o:wrap>
        Disable Wrap within tab             <o:w:no>  <o:wrap:no>
            Normally the program tries to squeeze data into a tab column for 10%
reduction (or more if using the Option Squeeze Pointsize (see above). This will
wrap text within a tab stop.
            Care should be taken to make sure that a wrapped tab does not drop lower
than the column depth as it will NOT be checked.
        Wrap leaders            <o:w:leaders>
                        or <o:w:topleaders>
                        or <o:w:bottomleaders>
            Only if Allow Wrap is ON, if a leader is specified the break will
            occur on the leader and the leader continued on the next line.
            The 'leaders' option sets leaders on both lines.
            The 'topleaders' option sets leaders on the top only.
            The 'bottomleaders' option sets leaders on the bottom only.

        Turn columns ONLY at specified (Opt) Col Turn points    <o:a:15>
        Turn columns normally on Quads, Col Turns etc       <o:a:no> (default)
            Normally columns are turned at the nearest line OR at the nearest Opt Col
Turn (<a:5> for example).
            Specify <o:a:99> to IGNORE quads and turn ONLY on.

        For EPSF, Create an OPI call rather than including the EPSF <o:k:(OPI stub
            The Stub file should be in tables/form/postscript if not preceeded by a '/'.
            Specify <o:k> to turn OFF.
            Some Extra FipHdr fields are available for the OPI call
                Bounding Box parameters     - F1, F2, F3, F4
                Bounding Box plus x/y offset    - F5, F6, F7, F8
                Just the filename name      - FJ
                Full path and name      - FR
        eg :
            %%BeginObject: FipOpi \$V
            %ALDImageFileName: /\FJ
            %ALDImageCropRect: \F1 \F2 \F3 \F4
            %ALDImagePosition: \F5 \F6 \F5 \F8 \F7 \F8 \F7 \F6

        For setting the maximum or minimum leading acceptable
            Minimum                 <o:min:3.3>
            Maximum                 <o:max:9.3>
            To reset max                <o:max>
            To reset both               <o:m>

        To ignore text on the line for a Mark       <o:x:no>
        To account for text on the line for a Mark  <o:x:yes> default
        Note that the X value normally includes any text or spaces on the line up to
the point where the Mark is made. To use the X from the start of the column (or
tab stop) use the option <o:x:no> (and to turn back on <o:x:yes>)

    k   Include file - for PostScript this is an EPSF <k:name>
        The pathname is /fip/spool/epsf unless changed on startup.
        Note that the currentpoint is NOT set explictly so that you may insert after
text. However normally you will want to <q> just before. eg for a 32 pt blob :
            GOOD    :  <x:32><q><k:widget>
            BAD :  <q><x:32><k:widget>
                32pt xlead will be ignored
        Note also that the filename is exactly that specfied. So if you
        specify spaces, they will need to be in the file :
            <k:A Long EPSF>       "/fip/spool/epsf/A Long EPSF"
            <k:  A Long EPSF> "/fip/spool/epsf/  A Long EPSF"
            <k:/data1/oinky/01234.eps>    "/data1/oinky/01234.eps"
            <k:../oinky/01234.eps>    "/fip/spool/oinky/01234.eps"

        These can be OPI calls if the Option 'k' flag is set:
        Here we have a Jump back to a 'marked' position.
        Then and X and Y movement
        Then we state we want this to be an OPI call using OPI-STUB-D
        as a parameter file (see the Options section above)
        The 4 numbers in the 'k' are the Aldus corner positions
            bottom left     150.24,-467.72
            top right       293.39,595.28
            Actual OPI filename 10945-1.EPS
        Finally we turn OFF opi calls with <o:k>

Note that if you want to set a < or > - which are normally cmd chrs - use the
alernate chrs which are usually 0376 for < and 0377 for >.

------------------ SETPAGE FILE -----------------------------------

The Pagination parameter file, SETPAGE, is optional and is used for ONLY those
files requiring some sort of pagination. The syntax is :

Note that there can be several lines for the same page - all starting with the
'page:' keyword. In fact for any parameters that may be specified several
times, such as 'hole:', these MUST be on separate lines otherwise only the last
on the line will be used.

    ; comment
    page: (filename)    col: (col1),(col2)..
    page: (filename)    name: (newname)
    page: (filename)    filename-size: (length)
    page: (filename)    hole:(col):(depth):(StartPosn)
    page: (filename)    noholecolhdr:
    page: (filename)    gutter: (width)
    page: (filename)    vjinc:12
    page: (filename)    widow: (NoOfLines)
    page: (filename)    orphan: (NoOfLines)
    page: (filename)    pagebreak: (col), (col)...
    page: (filename)    rules:(indent),(width),(top),(bottom)
    page: (filename)    shortrules:
    page: (filename)    rephead: (col), (col)...
            or  rephead:all
    page: (filename)    althead: (col), (col)...
            or  althead:all
    page: (filename)    bboxX: (replacement bounding box width)
    page: (filename)    bboxY: (replacement bounding box depth)
    page: (filename)    bboxX-zero: (b-box X start if not 0)
    page: (filename)    bboxY-zero: (b-box Y start if not 0)
    page: (filename)    bboxX-delta:
    page: (filename)    bboxY-delta:
    page: (filename)    all-in-one-file:
    ; these are percentages
        These two are hints for the HNJ to set tight or loose.

where  filename is case-sensitive and is the name specified in the
    hdr field FK or FN or SN.
- NAME is an new name for the output file. This is forced to a
    maximum of 31 chrs, Mac style, unless amended by 'filename-size'.
    If more than one page (which means output file) is specified
    using the 'pagebreak' parameter, then the name show have some means
    of uniqueness like sequence number OR a different name.
    To specify a sequence number:   page:OINKY  name:Oinky.\$s
    To Specify different names: page:OINKY  name:Oinky1,Oinky2,BigOinky.\$d
    Note that any FipSeq can be used including System Variables and Fip Hdr
    fields from the incoming file.  page:OINKY  name:\SN.\$d
- FILENAME-SIZE is the maximum filename size - default is 31 chrs
- GUTTER is the width in points of the gutter AND column.
    This is the left movement for the start of a new column.
- WIDOW is the no of lines required at the bottom of a column.
    Maximum is 100 lines.
- ORPHAN is the no of lines required at the top of a column.
    Maximum is 100 lines.
    Eg: page:SHARES widow:10    orphan:10
- COL is the no of points per column. There can be multiple 'col'.
- REPHEAD will allow column header replacement if a Block (which is
    normally a header) is at the top of the column. This can be the
    word ALL or a series of columns.  Note we assume the first
    column ALWAYS has a Block.  see note below.
- ALTHEAD uses the alternate header. This also replaces the next header
    block. The alt header is assumed to be the same depth as the
    normal header. It needs rephead to be flagged previously on the
    columns is question.
- VJINC is the maximum extra lead to inset at each vj point.
    This defaults to 120 points.
    example:    page:MICMAC vjinc:300
- PAGEBREAK will start newpages/output files at the top of this/these columns
    example:    page:PAGE3  pagebreak:3,6
            page:PAGE3  col:100,100,100,100,100,120,120,200,200
    This will create 3 files, the first containing 2 cols, the second
    3 cols and the third 4 cols.
- RULES allows you to specify column rules in the gutters indent is the
    1st rule from the gutter measurement.  width is the width of
    the rule.  top is the drop from the top of the page. bottom is
    the bong from the bottom of the page.
        page:ricicles   rules:2,.5,2,2
- SHORTRULES is for when 2 adjacent columns are of different length. Normally
    the column rule will be to the longer of the two. This keyword
    forces the rule to the bottom of the SHORTER column only.
    No other parameters are required for 'shortrules' as 'rules'
    specifies the lot. This is no longer valid as of v41k
- HOLE allows you to leave a hole in a column for a specified depth
    either from the top of the column (default) or from a start
    depth. Where a block covers several columns, specify a 'hole'
    for each column. There is no restriction on the number of holes
    in a column.
    In the SETPAGE file, only one hole can be specified per line. So to
    specify several, use multiple lines :
    example:    page:BIGGO  col:300,300,300,300
            page:BIGGO  hole:2,20
            page:BIGGO  hole:3,20
    This will leave a space of 20 points at the top of cols 2 and 3.
    Note for 'book' the 'hole' eill only apply to the first col/page
    unless the FipHdr field FHOLE-ON-EVERY-PAGE or setpage
        page (pagename) hole-on-every-page:
- HOLE-ON-EVERY-PAGE - see above; books only.
- BOOK: Variable no of pages using the same col depth - no VJ.
    No Widow and orphan control - use <a:3:50> to check before
- DOCUMENT: Variable no of pages which are VJed and/or widow/orphan.
    Max is about 200 pages of 200 lines
- BBOXX: Replacement bounding box width in points.
- BBOXY: Replacement bounding box depth in points.
- BBOXX-ZERO: Replacement bounding box X position (default 0) in points.
- BBOXY-ZERO: Replacement bounding box Y position (default 0) in points.
    Normally the bounding box is calculated internally. This allows
    a different BB to be specified when you may have used PassThru
    (z command) to add extra text and rules.
    These are in points and can ONLY be defined as whole numbers
    These can also be specified as BBOX-ZERO-X and -Y for clarity (!)
- BBOX-ROUND-UP - round the BoundingBox measurements up to the nearest point
(rather than the default which is down). If the actual X or Y amount is
negetive, it is rounded down.
    Normally ipsetter runs tight - and ignores slight BBox overspill.
    Use this where some device is clipping exactly to the BBox and is
    shaving the image by a couple of decipoints
- BBOX-DELTA-X (and ..-Y) add this number of points to the BoundingBox.
- NOHOLECOLHDR: if using Holes - Do NOT add a col hdr if the Hole
    is in the middle of text - ie holes for island ads
    but still place them at the top of each Column wherever it starts.
- ALWAYS-SET-LOOSE  Flag for NEVER set tight lines for hyphenation
- CALCULATE-ZERO-BBOX   track the 0.0 position for the Bounding Box.
- EMAIL-IGNORE-HYPHENS:yes/no if hyphenation is ON, break long email addresses
but do NOT hyphenate. Default: hyphenate

------------------ SETTER FILE -----------------------------------

The parameter file holding font information, normally SETTER, has the following
syntax :

    ; comment
    name: postscript        name of the output device
    defscale:1000           default scale if none specified
    band:5              band
    letterspace:3           letterspace
    unprint:o           number system used for non-printable chrs
                    o - octal (default), d - decimal, h - hex.
    ; first font = this will be font 0
    font:helvroman:Helvetica    font: IpsetterName : OutputDeviceName
    scale:960           scale if different from the default
    222='`ijl           widths - all letters in this font
                        with this width
    OR (more likely)
    afminclude:FranklinGothicITCbyBT-Book Name of an AFM file in form/fonts
and/or, if specified, the font-folder (also specified in SETTER).
    cawtinclude:FranklinGothicITCbyBT-Book Name of an Cawt file in form/cawt
and/or, if specified, the font-folder (also specified in SETTER).

    font-folder: queue name for an alternative or supplementary folder containing
AFMs and actual fonts if 'embedfont' is used in the SETTER file

        List of character names and position in a re-encoded font from an AFM file.
        Use this where you use a PShdr with added or repositioned characters (FF:no
or small)
        It is an external file in tables/form, one entry per line, ';' is a comment,
CASE is inportant (see Euro !), position can be DEC or HEX (with x)
        This parameter should be at the top of the SETTER file, before any AFM
        numbersign x81
        Euro x82
        endash xAC
        endash xAD

    Width is repeated for each different width for all the chrs of a font.
    Font and widths may be repeated as many times as is needed.
    If the character is not printable, it can be specified in the normal \000
fashion. NOTE that backslash should be specified as either \\ or \134.
    Note also that comments start with a semi-colon - ';'. So to Specify a
semicolon, use \073 (if octal) or \059 (decimal).

    The font can be embedded in the output file if a PFB file is left in
form/fonts or the alternate folder font-folder
    Specify :
        embedfont:(Filename in form/fonts)
    eg  embedfont:EuroLogon.pfb

------------------ INPUT SWITCHES -----------------------------------

Input parameters are (all optional) :
    -1 : Name of a single file to process then stop.    default: spooled
    -0 : do NOT flag zero width chrs in the item log.   default: yes
    -b : do NOT add bounding box        default: YES
    -c : do NOT output comments     default: leave comments in
    -C : copy the output file       default: link it
        The output queue is normally on the same partition as
        /fip/x. If NOT, use -C to copy the file over.
    -d : default output destination if not overwritten by FU FK or FN hdr
        fields              default: none
    -e : Path for EPSF includes     default: spool/epsf
    -E : do NOT flag missing epsfs      default: log errors
    -f : exclude font calls         default: include
    -F : default is NOT EPSF on %!PS line   default: add
    -G : Block-as-group is default      default: Block-as-column-header
    -h : def header file name       default: tables/form/postscript/PSHDR
    -H : no ps header or trailer pls    default: add both
    -i : input queue if not default     default: spool/2set
    -l : do NOT log items through       default: log
    -L : log items AND log each col details default: log only
    -n : Name of this Setter        default: SETTER
        Used ONLY for the Sequence Numbers
    -o : output queue if not default    default: spool/setit
    -O : default Output filename in FipSeq  default: SN FipHdr field or 'name:' in
the SetPage file
    -p : default output parameter file  default: tables/form/SETTER
    -P : Pass Thru fudge            default: do NOT fudge
        see notes below
    -r : use an encoding table for fonts    default: use the raw font
        This is usually CMP in the PSHDR file.
    -s : Split Input files using this splitter string   default: none
        Use this when the input file is really several files with a
        splitter string between.
    -S : For Book work, use a single output file
        with multiple pages inside  default: one file per page
    -t : def trailer file name      default: tables/form/postscript/PSTLR
    -u : User header file name in tables/form/postscript default: none
    -w : do NOT overwrite this file     default: replace
    -W : file creep time in seconds     default: none
        For files arriving from a network, this is the wait time
        Generally this should be 5 secs or more for NFS/FTP/RCPed files etc.
    -x : make x, y independent (ie transform)
    -v : version and exit

------------------ VARIABLES -----------------------------------

There are a number of save zones available to store and reuse settings. For the
following types, up to 100 zones can be saved :
    - Font Numbers
    - PointSize
    - SetSize
    - Leading
    - Column Width
    - Xlead values (vertical movement)
    - White Space (horizontal movement)

plus there are 9 marks (numbers 1-9) whose positions can be used.

- Of the 100 zones, note that zone 1 (one) is used by the system to hold the
current value and zone 0 (zero) is used to hold the previous - ie current one
before the last change.

- There are several notations used :

    The normal one is to ignore these save zones and just put the fixed amount in
the markup
        <ws: 20>          20 points of white space
        <xtraLead= 99.3>      99.3 points of extra lead
        <tab:s 10mm, 20mm, 30mm>  Tabs set at 10, 20 and 30 millimetres
    The normal one is
        % (optional Type Code) (Zone Number or Current flag or Previous flag)
    The % (percent) is the precedent char for a variable.
    The Type Code can be :
        f - Font Numbers
        p - PointSize
        s - SetSize
        l - Leading
        c - Column Width
        x - Xlead values (vertical movement)
        w - White Space (horizontal movement)
        j - Offsets from certain Mark.Jumps
        The Type Code can be left out if it is the same as that specifed.
            ie These are the same   :   <p:%p88>      <p:%88>
                            <colwidth= %c66>  <c:%66>
    Current value can be specified (QuarkLike) as a '$' (dollar) :
        make setsize the current pointsize :    <s:%p$>   or <s:%p1>
    Previous valid value can be specified as '#' (hash/numbersign :
        reload the pointsize used before the last change :  <p:#> or <p:%p0>

    The six main types are :
        %p22    Use contents of PointSize zone 22.
        %22 Use contents of zone 22 of whatever you are specifying.
        %p$ Use the current pointsize
        %p# Use the previous value pointsize
        $   Use the current value of whatever you are specifying
        #   Use the previous value of whatever you are specifying
    or  -%l$    Use the negative of the current leading

    There is a special case for offsets against a Mark or Jump.
        There are 20 marks available
        The syntax is '%j' (mark number) (0 to 5 type number)
        The folowing examples show the 6 options or variants :
            option 0 %j40 - for mark 4 - the X value of that mark
            option 1 %j81 - for mark 8 - the difference between the Column Width and the
X value of the mark
            option 2 %j72 - for mark 7 - the difference between the X value of the mark
and the current X posn
            option 3 %j33 - for mark 3 - the Y value of that mark
            option 4 %j94 - for mark 9 - the difference between the Y value of the mark
and the current Y posn
            option 5 %j95 - for mark 9 - the difference between the maximum Y attained
on the page/column and Y value of the mark

Obviously Current and Previous values (zones 1 and 0) are loaded automatically
by the program. To Load values in other zones, use the Option command :
    <o:v:c23:22.2>        load 22.2 into colwidth zone 23
    <o:v:s88 : %p88>  save contents of pointsize zone 88 in setsize zone 88
    <o:v:l66 : %p$>       save the current pointsize as leading zone 66

These values may be DISPLAYED as a PostScript Comment in the output file. Note
that the values are held as DECIpoints which appear to be 10 times bigger that
they need to be. This makes it easier for the program to process.

To Display, use Option with NO load values :
    <o:v:c77> display the contents of colwidth zone 77
    This produces :
        %FipSet Variables:ColumnWidth : 77 = 2000
    or  %FipSet Variables:ColumnWidth : 77 = NotInUse

To Display ALL zones with data stored, use a '*' (star) :
    <o:v:p*>  display all Pointsize zones used.
To Display ALL Types and ALL zones with data stored, use a type code of 'a' and
'*' (star) :
    <o:v:a*>  display all zones used.
        %FipSet Variables:Font : Previous = f17 (0), Current = helvroman (90)
        %FipSet Variables:PointSize : Previous = 240, Current = 260, 22 = 2000

------------------ Tips, Hints and Notes -----------------------------------

-- To Spread data within a tab : ie push data either side of the centre, use
<ws> (a <w> command with no parameter)
    will be presented as    (tab)12345  789(tab)

- Note that SOME the included header and trailer files MAY contain FipSeq :
    FH-PSHDR and FM-PSUSER - are added to the file with NO alterations
All others - FEC, FAC1-9, FT-PSTLR, FAM1-9 and all the DCS files are FipSeq'ed.
This may be important if you have files with '\' in.
- Millimetres were introduced at 41j. They can be used for boh markup and
SETPAGE definitions.
    eg  <p:9m>
        page:Shares col:137.65mm,143.33mm

- Indents and tabs - dont mix them in this version.
    wot you can do is strip tabs, redo col width, add indent TEXT ..
    say no turn here (a:n), quad and reverse, reset col, reset tabs and tab
    goddit ?

-- RULE is placed at gutter minus diff from left of column
    ie if gutter:132 and rules:6,.5 = rule .5 pt wide drawn at 126 pts
-- COL is depth ignoring any holes
-- HOLES - pls specify only one per line only. If you have more than one hole,
use more than one line!
-- GUTTER - currently only possible to set a regular gutter - use PassThru to
alter/Translate if you need different

-- Notes on PassThru :
    - Note that the scale factor is 1000 so all sizes, Moves etc need to
multiplied by 1000.
    - ALWAYS top and tail gsave and grestore so that the address space is NOT
    - preserve currentpoint .... use gsave/grestore and opt Z <o:z:p>

-- The -P for the PassThru Fudge :
    if -P is off - ie the default - any passthru ois placed where you specify it.
text, leader dots etc can all be added before and after
    if -P is specified, if the 'z:' is FIRST item on a line or in a tab it is
flush left (or right if <o:p:r> is set) otherwise it is where it should be on
the line.
Note that both EPSFs and PassThrus has no width - even if you give one. The
currentpoint AFTER either is exactly the same as that before. So if you have
one in the middle of the line, add a white space after the EPSF/PassThru ( eg
<ws:10> ) with the width in points of the item. Plus you need to preserve
Currentpoint with a <o:p:p>.
    This works for a single pass thru ONLY per line or tab.

-- Ignore DOCUMENT for the moment - use BOOK.

-- WIDOWS and ORPHANS can be up to 100

-- If you get a log message :
Wed Sep 18 00:06:11 ipsetter !x : ** Pls Check for Missing Data - End of Data
and NOT last column  AMEX 4
    More often than NOT it is because you have added a <b> at the begining of a
fixed block and forgotten to end it with a <e>. This message says it has been
unable to turn the column as there is no break point within a fixed block.
    OR, on Unix, you are copying a large file into the spooled queue rather than
    OR you have forgotten to put any QUADS in (except Quad:Zero) - <q>, <q:r>
    OR the leading is set to 0 or a negative - <l:0>

-- Use <b> and <e> to top and tail Pagehdrs and ColHdrs (using [b] and [e]) of

Version Control
;43z23  08jan05 added embedfont:(pfb filename)
    ;d-e 30may05 tuning shrink
    ;f-g 01dec05 added email-ignore-hyphens in SETPAGE and opi-script/eps-script
    ;h-j 10dec05 redid save_mark
    ;k 6apr06 added newFP
    ;l-m 15apr06 added colour to tints and allow gutter rules for book
    ;n-s 14may06 bug in Break/NoBreak and colhdrs (43r also tabs bugette with lots
of dec places)
    ;t 11dec06 added FBBOX: to override the bounding box on the fly
    ;u-v 21feb07 small bugette with shrink and the last col
    ;w-y 27mar07 added cawtinclude and o:y letterspacing and rule offset
    ;z1-5 28jul07 added slow check and F/FSET ;2 rework of pfb
        ;3 15feb11 bugette with tight lines ;4 variables simplified ;5 bugette when 2
'z' in sequence
        ;6 upped max Marx to 100
        ;7-9 25mar14 added -O default new name and <o:n:fiphdr....> plus use ipset.h
        ;10-12 25jul14 v long and stupid words in hyp and softquads
        ;13-15  9dec14 make setpage parameter FipSeqable
        ;16-17  4feb15 added reencodemap for SETTER file ;18 tuning softQuads ;19
minMcol added
        ;20-21  1apr16 bugette in fonts with afms > 300 entries ;22 4jul16 added
default width if not specified
        ;23 11aug16 meaningless error for SEQNO on startup

;042z   28nov02 2 bugs in hyphenation
    plus W not A if 100% plus if totx<mcol & QC, allow original quad
    ;c 23jan03 added bbox-round-up: and bbox-delta-x/y
    ;d 11feb03 added spcIsOpt for when spacing is :
        exact=0, OKtight=-1, OKloose=1 TOOtight=-2 TOOloose=2
    ;e-j 27feb03 added -s splitter and log begin/end
    ;k 21jun03/01may03 added bbox-round-up: and bbox-delta-x/y as globals for ALL
pages in setpage file
    ;l 04aug03 added neg BBox tracking 'calculate-zero-bbox:'
    ;m 11nov03 allow other drives for WinNT includes : <k:S:/live/ads/1234>
    ;n 01dec03 rounding errors - <ws:0.04000) treated wrongly
    ;o 30jan04 added option cap K for scale EPSF
    <o:K:143:93>  scale the next eps to fit in a box 143 wide by 93 high
    (bugette todo - ts is NOT mm/inch)
    ;p 17feb04 added -D to display NOT copy file
    ;q-r 26feb04 BUG - hyphenation version where there was no separator
        - plus shrink_line not always being called correctly
    ;s-u 01apr04 BUG where a line ended '\ ) spc ws '
    ;v-y 10dec04 added -Z for Fip OPI
    ;z 03jan05 added Variables for Fonts, buglette is vary for Set
;041z   02dec00 added col:* and columns-per-page ;a/b 25jan01 bugette was
    ;c 22feb01 strip leading/trailing spaces from afminclude filenames
    ;d 13mar01 X amount for mark now includes any <w>
    ;e 22mar01 in DCS, output the black plate LAST
    ;f 30apr01 added FnoFipHdr: for output files.. plus FQ not just under
    ;g/h 09may01 added FAM1-9 plus allow negative wpsc : <ws:-20>
    ;j 27jun01 allow setpage in millimetres
    ;k 01aug01 added filename-size in setpage plus allow setpage in inches
    ;l/m 05oct01 bugette - bboxX may occasionally be too big if a full
        width rule is involved
    ;o 15jan02 allow althead and colhead to have diff (and varying) depth
        added h:althead:(depth) and h:depth:(depth)
    ;p 19jun02 added output-metadata-file
    ;r 28jun02 output queue is now in FipSeq    FQ:/data/\\PP/\\PO
            (remember to use double \\)
    ;s 09jul02 added FSTYLE-FILE
    ;u/v/w 10oct02 indents revisited
    ;x/y/z 06nov02 better control of spacing and hyphens and scaling
;040z   23apr99 OPI calls and FEC: extra PS comments plus added -1 single
        plus added 'noholecolhdr:island/all'
    ;a 18jun99 added top/bottomleaders <o:w:bottomleaders>
    ;b 23jul99 added min-leading and max-leading
    ;c 21oct99 started all-in-one-file:
    ;d 19nov99 -S single book file plus WINNT bug for Binary files
    ;e 22nov99 added FMULTIPLE
    ;f 22feb00 added FIPHDR: and do_widgets
    ;g 16mar00 added FSCRIPT: and FAC1-9:
    ;h/i 03may00 redid SETTER chr widths code and added afminclude
    ;j 12may00 bugette in INDENT
    ;k 20jul00 NOTE new version of parse -> use \$V not \$S
    ;m 31jul00 seqno on SetterName
    ;n 10aug00 OPI- Aldus include better
    ;o 06sep00 variables now work for rules too
    ;p 21sep00 bugette in ColHdrs-rephead if using JUMPS
    ;r 27sep00 added FDCS-PLATES for Outputting DCS Plates
    ;s 03oct00 added Parse of PSTLR for NoOfCopies.....
    ;t 05oct00 bugette when mixing z:PassThru and k:EpsfOrOpi on same line
    ;u 19oct00 added FP as FipHdr with PageNumber..
    ;v/w 23nov00 cleanup/added FKEEP-BOOK-NAME
    ;y/z 27nov00 added FAM !

(copyright) 2017 and previous years FingerPost Ltd.