Skip to main content
Skip table of contents

(v13) HqnImpose2 PassThrough objective


This page applies to Harlequin v13.1r0 and later; both Harlequin Core and Harlequin MultiRIP.

This objective is intended for use where the entire layout of the flat is to be set in front end software. Thus such software could be written without worrying about writing all the PostScript-language code required to handle imposition. The imposition layout must be passed in a sub-dictionary called PassThroughData included in the dictionary supplied to HqnInitImpose. This dictionary can include:

FilmWidth, FilmHeight

(Required, numbers) The final film dimensions in points.

PagesPerFilm

(Optional, integer; was required before Harlequin 13.1) The number of pages on this surface. Defaults to the number of entries in PageList.

PageList

(Required, dictionary or array of subsidiary dictionaries). Each sub-dictionary defines the position of a single page on the imposed flat. If it's a dictionary, the keys for each of these values should be integers corresponding to the page number within the signature (starting at zero; for example, for a four-page signature you should define four entries with keys 0, 1, 2, and 3). Either a dictionary or an array may be used in a PostScript configuration; an array is required in a JSON configuration for Harlequin Core. Harlequin versions before 13.1 only supported the dictionary form.

Each sub-dictionary within PageList may include the following entries:

/ListPageSize

A two-element array defining the width and height of this page. Its elements may be set separately as /PageWidth and /PageHeight. If it is not set, default values are taken from the Page Setup dialog.

/ListPanelSize

A two element array defining the width and height of the panel inside which this page is drawn (see (v13) HqnImpose2 paneling). This is the same as ListPageSize if paneling is not being used. Its elements may be set separately as /PanelWidth and /PanelHeight; it defaults if unset to [(PageWidth*PageScaleX) (PageHeight*PageScaleY) ].

/ListPageOffset

A two-element array defining the offset to the page origin from the bottom-left corner of the drawing area for the page. This is normally zero except for some EPS files. Its elements may be set separately as/OffsetX and /OffsetY, and it defaults if unset to [0 0].

/ListPanelOffset

A two-element array defining the offset to the bottom-left corner of the page area from the bottom left-corner of the panel. Its elements may be set separately as /PanelOffsetX and /PanelOffsetY, and it defaults if unset to [0 0].

/ListScale

A two-element array defining the X and Y scale of this page. Its elements may be set separately as /PageScaleX and /PageScaleY , and it defaults if unset to [1 1].

/ListRotation

A real number defining the angle at which this page is rotated. It may be set instead by defining /Rotate, and defaults if unset to zero.

/ListPosition

A two-element array defining the position of the bottom-left corner of the panel for this page from the bottom-left corner of the film after taking FilmLeft and FilmBottom into account. This dictionary entry is required, and there is no default.

/ListCTM

A six-element CTM array. If present and non-null, it overrides ListPosition, ListRotate, and ListScale.

/ListClip

A four-element array (or null) which specifies an orthogonal clip zone to which you should not apply rotation. /ListClip extends the HqnImpose2 procset to accept a clipping rectangle defined in this form.

In both places, it must be null (meaning no orthogonal clipping) or an array of four numbers [ llx lly urx ury ]. If not present in the data given to the PassThrough objective, it defaults to null.

/ListCol

An integer with 0 for the left-most column increasing in number across the page.

/ListRow

An integer with 0 for the bottom row increasing in number up the page.

Example use of /PassThrough:

TEXT
  <<
  /Objective /PassThrough
  /PassThroughData <<
    /FilmWidth 400
    /FilmHeight 300
    /PagesPerFilm 6
    /PageList <<
      0 <<
        /ListPageSize [ 80 110 ]
        /ListPanelSize [ 80 110 ]
        /ListPageOffset [ 0 0 ]
        /ListPanelOffset [ 0 0 ]
        /ListScale [ 1 1 ]
        /ListRotation 45
        /ListPosition [ 90 10 ]
        % No ListClip - no clipping
      >>
      1 <<
        /ListPageSize [ 80 110 ]
        /ListPanelSize [ 80 110 ]
        /ListPageOffset [ 0 0 ]
        /ListPanelOffset [ 0 0 ]
        /ListScale [ 1 1 ]
        /ListRotation 45
        /ListPosition [ 210 10 ]
        /ListClip null% no clipping
      >>
      2 <<
        /ListPageSize [ 80 110 ]
        /ListPanelSize [ 80 110 ]
        /ListPageOffset [ 0 0 ]
        /ListPanelOffset [ 0 0 ]
        /ListScale [ 1 1 ]
        /ListRotation 45
        /ListPosition [ 330 10 ]
        /ListClip [ 0 0 400 300 ]
        % the whole sheet - no clipping
      >>
      3 <<
        /ListPageSize [ 80 110 ]
        /ListPanelSize [ 80 110 ]
        /ListPageOffset [ 0 0 ]
        /ListPanelOffset [ 0 0 ]
        /ListScale [ 1 1 ]
        /ListRotation 45
        /ListPosition [ 90 160 ]
        /ListClip [ 30 170 140 280 ]
        % a little off all corners
      >>
      4 <<
        /ListPageSize [ 80 110 ]
        /ListPanelSize [ 80 110 ]
        /ListPageOffset [ 0 0 ]
        /ListPanelOffset [ 0 0 ]
        /ListScale [ 1 1 ]
        /ListRotation 45
        /ListPosition [ 210 160 ]
        /ListClip [ 170 170 240 280 ]
        % more off left & right
      >>
      5 <<
        /ListPageSize [ 80 110 ]
        /ListPanelSize [ 80 110 ]
        /ListPageOffset [ 0 0 ]
        /ListPanelOffset [ 0 0 ]
        /ListScale [ 1 1 ]
        /ListRotation 45
        /ListPosition [ 330 160 ]
        /ListClip [ 30 170 140 280 ]
        % the wrong place - no page visible.
      >>
    >>
  >>
  >> /HqnImpose2 /ProcSet findresource /HqnInitImpose get exec

This approach would often require considerable duplicated information (for example, when all the pages and panels are identical sizes). Most of the details of the entries in individual PageList dictionaries above include notes on alternative methods of setting the values and defaults that take effect if they are not set. In these cases it is possible to omit the definition of a particular entry in the PageList dictionary, but to define the variables in italics in PassThroughData instead. (For example, if PanelWidth and PanelHeight are defined in PassThroughData, the individual PageList dictionaries do not need ListPanelSize to be defined within them. If the required values match the defaults listed above, they need not be defined in either place.

ListPosition must be defined for all pages.

A value defined within the PageList dictionary takes precedence over a more globally defined value (for example, as shown with ListRotation below).

Thus the above example could also be written as:

TEXT
  /mm { 72. mul 25.4 div } bind def
  <<
  /Objective /PassThrough
  /PassThroughData <<
    /FilmWidth 200 mm
    /FilmHeight 300 mm
    /PagesPerFilm 4
    /PageWidth 80 /PageHeight 80
    /PageList <<
      0 <<
        /ListPosition [ 10 10 ]
      >>
      1 <<
        /ListPosition [ 110 10 ]
      >>
      2 <<
        /ListRotation 180
        /ListPosition [ 190 290 ]
      >>
      3 <<
        /ListRotation 180
        /ListPosition [ 90 290 ]
      >>
    >>
  >>
  >> /HqnImpose2 /ProcSet findresource /HqnInitImpose get exec

You must use the PassThrough tactic if you select the PassThrough objective.


JavaScript errors detected

Please note, these errors can depend on your browser setup.

If this problem persists, please contact our support.