mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2024-11-21 06:55:39 +00:00
873 lines
23 KiB
PostScript
873 lines
23 KiB
PostScript
% === BEGIN ps-print prologue 1
|
|
% version: 6.1
|
|
|
|
% Copyright (C) 2000-2024 Free Software Foundation, Inc.
|
|
|
|
% This file is part of GNU Emacs.
|
|
|
|
% GNU Emacs is free software: you can redistribute it and/or modify
|
|
% it under the terms of the GNU General Public License as published by
|
|
% the Free Software Foundation, either version 3 of the License, or
|
|
% (at your option) any later version.
|
|
|
|
% GNU Emacs is distributed in the hope that it will be useful,
|
|
% but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
% MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
% GNU General Public License for more details.
|
|
|
|
% You should have received a copy of the GNU General Public License
|
|
% along with GNU Emacs. If not, see <https://www.gnu.org/licenses/>.
|
|
|
|
% As a special exception, the copyright holders of this module give
|
|
% you permission to include the module in a Postscript file generated
|
|
% by Emacs or other free software together with the result of
|
|
% converting text to be printed, regardless of the license terms of
|
|
% that text, and to use under terms of your choice the page images
|
|
% resulting from formatting said combination. If you modify this
|
|
% module, you may extend this exception to your version of the module
|
|
% but you are not obligated to do so. If you do not wish to do so,
|
|
% delete this exception statement from your version.
|
|
|
|
|
|
% ISOLatin1Encoding stolen from ps_init.ps in GhostScript 2.6.1.4:
|
|
/ISOLatin1Encoding where{pop}{
|
|
% -- The ISO Latin-1 encoding vector isn't known, so define it.
|
|
% -- The first half is the same as the standard encoding,
|
|
% -- except for minus instead of hyphen at code 055.
|
|
/ISOLatin1Encoding
|
|
StandardEncoding 0 45 getinterval aload pop
|
|
/minus
|
|
StandardEncoding 46 82 getinterval aload pop
|
|
%*** NOTE: the following are missing in the Adobe documentation,
|
|
%*** but appear in the displayed table:
|
|
%*** macron at 0225, dieresis at 0230, cedilla at 0233, space at 0240.
|
|
% 0200 (128)
|
|
/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
|
|
/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef/.notdef
|
|
/dotlessi/grave/acute/circumflex/tilde/macron/breve/dotaccent
|
|
/dieresis/.notdef/ring/cedilla/.notdef/hungarumlaut/ogonek/caron
|
|
% 0240 (160)
|
|
/space/exclamdown/cent/sterling
|
|
/currency/yen/brokenbar/section
|
|
/dieresis/copyright/ordfeminine/guillemotleft
|
|
/logicalnot/hyphen/registered/macron
|
|
/degree/plusminus/twosuperior/threesuperior
|
|
/acute/mu/paragraph/periodcentered
|
|
/cedilla/onesuperior/ordmasculine/guillemotright
|
|
/onequarter/onehalf/threequarters/questiondown
|
|
% 0300 (192)
|
|
/Agrave/Aacute/Acircumflex/Atilde
|
|
/Adieresis/Aring/AE/Ccedilla
|
|
/Egrave/Eacute/Ecircumflex/Edieresis
|
|
/Igrave/Iacute/Icircumflex/Idieresis
|
|
/Eth/Ntilde/Ograve/Oacute
|
|
/Ocircumflex/Otilde/Odieresis/multiply
|
|
/Oslash/Ugrave/Uacute/Ucircumflex
|
|
/Udieresis/Yacute/Thorn/germandbls
|
|
% 0340 (224)
|
|
/agrave/aacute/acircumflex/atilde
|
|
/adieresis/aring/ae/ccedilla
|
|
/egrave/eacute/ecircumflex/edieresis
|
|
/igrave/iacute/icircumflex/idieresis
|
|
/eth/ntilde/ograve/oacute
|
|
/ocircumflex/otilde/odieresis/divide
|
|
/oslash/ugrave/uacute/ucircumflex
|
|
/udieresis/yacute/thorn/ydieresis
|
|
256 packedarray def
|
|
}ifelse
|
|
|
|
/reencodeFontISO{ %def
|
|
dup
|
|
length 12 add dict % Make a new font (a new dict the same size
|
|
% as the old one) with room for our new symbols.
|
|
|
|
begin % Make the new font the current dictionary.
|
|
|
|
% Copy each of the symbols from the old dictionary
|
|
% to the new one except for the font ID.
|
|
{1 index/FID ne{def}{pop pop}ifelse}forall
|
|
|
|
% Override the encoding with the ISOLatin1 encoding.
|
|
currentdict/FontType get 0 ne{/Encoding ISOLatin1Encoding def}if
|
|
|
|
% Use the font's bounding box to determine the ascent, descent,
|
|
% and overall height; don't forget that these values have to be
|
|
% transformed using the font's matrix.
|
|
|
|
% ^ (x2 y2)
|
|
% | |
|
|
% | v
|
|
% | +----+ - -
|
|
% | | | ^
|
|
% | | | | Ascent (usually > 0)
|
|
% | | | |
|
|
% (0 0) -> +--+----+-------->
|
|
% | | |
|
|
% | | v Descent (usually < 0)
|
|
% (x1 y1) --> +----+ - -
|
|
|
|
currentdict/FontType get 0 ne
|
|
{/FontBBox load aload pop % -- x1 y1 x2 y2
|
|
FontMatrix transform/Ascent exch def pop
|
|
FontMatrix transform/Descent exch def pop}
|
|
{/PrimaryFont FDepVector 0 get def
|
|
PrimaryFont/FontBBox get aload pop
|
|
PrimaryFont/FontMatrix get transform/Ascent exch def pop
|
|
PrimaryFont/FontMatrix get transform/Descent exch def pop}ifelse
|
|
|
|
/FontHeight Ascent Descent sub def % use `sub' because descent < 0
|
|
|
|
% Define these in case they're not in the FontInfo
|
|
% (also, here they're easier to get to).
|
|
/UnderlinePosition Descent 0.70 mul def
|
|
/OverlinePosition Descent UnderlinePosition sub Ascent add def
|
|
/StrikeoutPosition Ascent 0.30 mul def
|
|
/LineThickness FontHeight 0.05 mul def
|
|
/Xshadow FontHeight 0.08 mul def
|
|
/Yshadow FontHeight -0.09 mul def
|
|
/SpaceBackground Descent neg UnderlinePosition add def
|
|
/XBox Descent neg def
|
|
/YBox LineThickness 0.7 mul def
|
|
|
|
currentdict % Leave the new font on the stack
|
|
end % Stop using the font as the current dictionary.
|
|
definefont % Put the font into the font dictionary
|
|
pop % Discard the returned font.
|
|
}bind def
|
|
|
|
% Font definition
|
|
/DefFont{findfont exch scalefont reencodeFontISO}def
|
|
|
|
% Font selection
|
|
/F{
|
|
findfont
|
|
dup/Ascent get/Ascent exch def
|
|
dup/Descent get/Descent exch def
|
|
dup/FontHeight get/FontHeight exch def
|
|
dup/UnderlinePosition get/UnderlinePosition exch def
|
|
dup/OverlinePosition get/OverlinePosition exch def
|
|
dup/StrikeoutPosition get/StrikeoutPosition exch def
|
|
dup/LineThickness get/LineThickness exch def
|
|
dup/Xshadow get/Xshadow exch def
|
|
dup/Yshadow get/Yshadow exch def
|
|
dup/SpaceBackground get/SpaceBackground exch def
|
|
dup/XBox get/XBox exch def
|
|
dup/YBox get/YBox exch def
|
|
setfont
|
|
}def
|
|
|
|
/FG/setrgbcolor load def
|
|
|
|
/bg false def
|
|
/BG{
|
|
dup/bg exch def
|
|
{[4 1 roll]}
|
|
{[1.0 1.0 1.0]}
|
|
ifelse
|
|
/bgcolor exch def
|
|
}def
|
|
|
|
% B width C
|
|
% +-----------+
|
|
% | Ascent (usually > 0)
|
|
% A + +
|
|
% | Descent (usually < 0)
|
|
% +-----------+
|
|
% E width D
|
|
|
|
/dobackground{ % width --
|
|
currentpoint % -- width x y
|
|
gsave
|
|
newpath
|
|
moveto % A (x y)
|
|
0 Ascent rmoveto % B
|
|
dup 0 rlineto % C
|
|
0 Descent Ascent sub rlineto % D
|
|
neg 0 rlineto % E
|
|
closepath
|
|
FillBgColor
|
|
grestore
|
|
}def
|
|
|
|
/eolbg{ % dobackground until right margin
|
|
PrintWidth % -- x-eol
|
|
currentpoint pop % -- cur-x
|
|
sub % -- width until eol
|
|
dobackground
|
|
}def
|
|
|
|
/LineHS LineHeight LineSpacing add def
|
|
/ParagraphHS LineHeight ParagraphSpacing add def
|
|
/PSL{/h exch def bg{eolbg}if 0 currentpoint exch pop h sub moveto}def
|
|
/PLN{PrintLineNumber{doLineNumber}if}def
|
|
|
|
/SL{LineHS PSL isLineStep pop}def % Soft Linefeed
|
|
|
|
/PHL{ParagraphHS PSL PLN}def % Paragraph Hard Linefeed
|
|
/LHL{LineHS PSL PLN}def % Hard Linefeed
|
|
|
|
% Some debug
|
|
/dcp{currentpoint exch 40 string cvs print(, )print =}def
|
|
/dp{print 2 copy exch 40 string cvs print(, )print =}def
|
|
|
|
/W{
|
|
( )stringwidth % Get the width of a space in the current font.
|
|
pop % Discard the Y component.
|
|
mul % Multiply the width of a space
|
|
% by the number of spaces to plot
|
|
bg{dup dobackground}if
|
|
0 rmoveto
|
|
}def
|
|
|
|
/Effect 0 def
|
|
/EffectUnderline false def
|
|
/EffectStrikeout false def
|
|
/EffectOverline false def
|
|
/EffectShadow false def
|
|
/EffectBox false def
|
|
/EffectOutline false def
|
|
|
|
% effect: 1 - underline 2 - strikeout 4 - overline
|
|
% 8 - shadow 16 - box 32 - outline
|
|
/EF{
|
|
/Effect exch def
|
|
/EffectUnderline Effect 1 and 0 ne def
|
|
/EffectStrikeout Effect 2 and 0 ne def
|
|
/EffectOverline Effect 4 and 0 ne def
|
|
/EffectShadow Effect 8 and 0 ne def
|
|
/EffectBox Effect 16 and 0 ne def
|
|
/EffectOutline Effect 32 and 0 ne def
|
|
}def
|
|
|
|
% stack: string |- --
|
|
/S{
|
|
/xx currentpoint dup Descent add/yy exch def
|
|
Ascent add/YY exch def def
|
|
dup stringwidth pop xx add/XX exch def
|
|
EffectShadow{
|
|
/yy yy Yshadow add def
|
|
/XX XX Xshadow add def
|
|
}if
|
|
bg{
|
|
true
|
|
EffectBox
|
|
{SpaceBackground doBox}
|
|
{xx yy XX YY doRect}
|
|
ifelse
|
|
}if % background
|
|
EffectBox {false 0 doBox}if % box
|
|
EffectShadow {dup doShadow}if % shadow
|
|
EffectOutline
|
|
{true doOutline} % outline
|
|
{show} % normal text
|
|
ifelse
|
|
EffectUnderline{UnderlinePosition Hline}if % underline
|
|
EffectStrikeout{StrikeoutPosition Hline}if % strikeout
|
|
EffectOverline {OverlinePosition Hline}if % overline
|
|
}bind def
|
|
|
|
% stack: position |- --
|
|
/Hline{
|
|
currentpoint exch pop add dup
|
|
gsave
|
|
newpath
|
|
xx exch moveto
|
|
XX exch lineto
|
|
closepath
|
|
LineThickness setlinewidth stroke
|
|
grestore
|
|
}bind def
|
|
|
|
% stack: fill-or-not delta |- --
|
|
/doBox{
|
|
/dd exch def
|
|
xx XBox sub dd sub yy YBox sub dd sub
|
|
XX XBox add dd add YY YBox add dd add
|
|
doRect
|
|
}bind def
|
|
|
|
% stack: fill-or-not lower-x lower-y upper-x upper-y |- --
|
|
/doRect{
|
|
/rYY exch def
|
|
/rXX exch def
|
|
/ryy exch def
|
|
/rxx exch def
|
|
gsave
|
|
newpath
|
|
rXX rYY moveto
|
|
rxx rYY lineto
|
|
rxx ryy lineto
|
|
rXX ryy lineto
|
|
closepath
|
|
% top of stack: fill-or-not
|
|
{FillBgColor}
|
|
{LineThickness setlinewidth stroke}ifelse
|
|
grestore
|
|
}bind def
|
|
|
|
% stack: string |- --
|
|
/doShadow{
|
|
gsave
|
|
Xshadow Yshadow rmoveto
|
|
false doOutline
|
|
grestore
|
|
}bind def
|
|
|
|
/st 1 string def
|
|
|
|
% stack: string fill-or-not |- --
|
|
/doOutline{
|
|
/-fillp- exch def
|
|
/-ox- currentpoint/-oy- exch def def
|
|
gsave
|
|
LineThickness setlinewidth
|
|
{st 0 3 -1 roll put
|
|
st dup true charpath
|
|
-fillp- {gsave FillBgColor grestore}if
|
|
stroke stringwidth
|
|
-oy- add/-oy- exch def
|
|
-ox- add/-ox- exch def
|
|
-ox- -oy- moveto
|
|
}forall
|
|
grestore
|
|
-ox- -oy- moveto
|
|
}bind def
|
|
|
|
% stack: --
|
|
/FillBgColor{bgcolor aload pop setrgbcolor fill}bind def
|
|
|
|
% stack: -- |- boolean
|
|
/isLineStep{
|
|
SyncLineZebra
|
|
{PLScounter 0 gt % or zebra
|
|
{/PLScounter PLScounter 1 sub def PLScounter 0 eq}
|
|
{false}ifelse
|
|
PrintLineStep 1 gt
|
|
{/PrintLineStep PrintLineStep 1 sub def}
|
|
{/PrintLineStep ZebraHeight def
|
|
/PLScounter PrintLineStart def}ifelse}
|
|
{LineNumber PrintLineStart sub PrintLineStep mod 0 eq}ifelse % or line step
|
|
}def
|
|
|
|
% stack: --
|
|
/doLineNumber{
|
|
/LineNumber where
|
|
{pop
|
|
isLineStep % or line step
|
|
LineNumber Lines ge or % or last line
|
|
{currentfont
|
|
gsave
|
|
LineNumberColor SetColor
|
|
/L0 findfont setfont
|
|
LineNumber Lines ge
|
|
{(end )}
|
|
{LineNumber 6 string cvs( )strcat}ifelse
|
|
dup stringwidth pop neg 0 rmoveto
|
|
show
|
|
grestore
|
|
setfont}if
|
|
/LineNumber LineNumber 1 add def
|
|
}if
|
|
}def
|
|
|
|
% stack: color-specifier |- --
|
|
/SetColor{dup type/realtype eq{setgray}{aload pop setrgbcolor}ifelse}def
|
|
|
|
% stack: --
|
|
/printZebra{
|
|
gsave
|
|
ZebraColor SetColor
|
|
/double-zebra ZebraHeight ZebraHeight add def
|
|
/yiter double-zebra LineHS mul neg def
|
|
/xiter PrintWidth InterColumn add def
|
|
/zebra-line LinesPrinted def
|
|
NumberOfColumns{LinesPerColumn doColumnZebra xiter 0 rmoveto}repeat
|
|
grestore
|
|
}def
|
|
|
|
% stack: lines-per-column |- --
|
|
/doColumnZebra{
|
|
/lpc exch def
|
|
gsave
|
|
ZebraFollow 1 and 0 ne{
|
|
/H ZebraHeight zebra-line ZebraHeight mod sub def
|
|
/lpc lpc H sub def
|
|
zebra-line double-zebra mod ZebraHeight lt
|
|
{H doZebra % "black" stripe followed by a "white" stripe
|
|
/lpc lpc ZebraHeight sub def
|
|
H ZebraHeight add}
|
|
{H}ifelse % "white" stripe
|
|
LineHS mul neg 0 exch rmoveto
|
|
/zebra-line zebra-line LinesPerColumn add def
|
|
}if
|
|
/zspacing 0 def
|
|
lpc dup double-zebra idiv{ZebraHeight doZebra 0 yiter rmoveto}repeat
|
|
double-zebra mod dup 0 le{pop}
|
|
{dup ZebraHeight gt
|
|
{pop ZebraHeight}
|
|
{/zspacing LineSpacing def
|
|
ZebraFollow 2 and 0 ne{pop ZebraHeight}if}ifelse
|
|
doZebra}ifelse
|
|
grestore
|
|
}def
|
|
|
|
% stack: zebra-height (in lines) |- --
|
|
/doZebra{
|
|
/zh exch 0.05 sub LineHS mul zspacing sub def
|
|
gsave
|
|
0 LineHeight 0.65 mul rmoveto
|
|
PrintWidth 0 rlineto
|
|
0 zh neg rlineto
|
|
PrintWidth neg 0 rlineto
|
|
0 zh rlineto
|
|
fill
|
|
grestore
|
|
}def
|
|
|
|
% stack: --
|
|
/printBackground{
|
|
/BackgroundColor where{
|
|
/LHg LineHeight 0.65 mul def
|
|
/PHg PrintHeight LHg add def
|
|
pop gsave BackgroundColor SetColor
|
|
NumberOfColumns{
|
|
gsave
|
|
0 LHg rmoveto
|
|
PrintWidth 0 rlineto
|
|
0 PHg neg rlineto
|
|
PrintWidth neg 0 rlineto
|
|
0 PHg rlineto
|
|
fill
|
|
grestore
|
|
PrintWidth InterColumn add 0 rmoveto
|
|
}repeat
|
|
grestore
|
|
}if
|
|
}def
|
|
|
|
% tx ty rotation xscale yscale xpos ypos BeginBackImage
|
|
/BeginBackImage{
|
|
/-save-image- save def
|
|
/showpage{}def
|
|
translate
|
|
scale
|
|
rotate
|
|
translate
|
|
}def
|
|
|
|
/EndBackImage{-save-image- restore}def
|
|
|
|
% string fontsize fontname rotation gray xpos ypos ShowBackText
|
|
/ShowBackText{
|
|
gsave
|
|
translate
|
|
setgray
|
|
rotate
|
|
findfont exch dup/-offset- exch -0.25 mul def scalefont setfont
|
|
0 -offset- moveto
|
|
/-saveLineThickness- LineThickness def
|
|
/LineThickness 1 def
|
|
false doOutline
|
|
/LineThickness -saveLineThickness- def
|
|
grestore
|
|
}def
|
|
|
|
/SetPageSize{
|
|
BMark/PageSize[PageWidth LandscapePageHeight LandscapeMode{exch}if]EMark setpagedevice
|
|
}def
|
|
|
|
/BeginDoc{
|
|
% ---- Remember space width of the normal text font `f0'.
|
|
/SpaceWidth/f0 findfont setfont( )stringwidth pop def
|
|
% ---- save the state of the document (useful for ghostscript!)
|
|
/docState save def
|
|
% ---- [andrewi] set PageSize based on chosen dimensions
|
|
UseSetpagedevice{
|
|
WarnPaperSize{SetPageSize}{mark{SetPageSize}stopped cleartomark}ifelse
|
|
}if
|
|
/ColumnWidth PrintWidth InterColumn add def
|
|
% ---- define where printing will start
|
|
/f0 F % this installs Ascent
|
|
/PrintStartY PrintHeight Ascent sub def
|
|
/ColumnIndex 1 def
|
|
/N-Up-Counter N-Up-End 1 sub def
|
|
/PLScounter PrintLineStart def
|
|
}def
|
|
|
|
/EndDoc{
|
|
% ---- restore the state of the document (useful for ghostscript!)
|
|
docState restore
|
|
}def
|
|
|
|
/BeginDSCPage{
|
|
% ---- when 1st column, save the state of the page
|
|
ColumnIndex 1 eq{/pageState save def}if
|
|
% ---- save the state of the column
|
|
/columnState save def
|
|
}def
|
|
|
|
/PrintHeaderWidth PrintOnlyOneHeader{PrintPageWidth}{PrintWidth}ifelse def
|
|
|
|
/BeginPage{
|
|
/LinesPrinted exch def
|
|
% ---- when 1st column, print all background effects
|
|
ColumnIndex 1 eq{
|
|
0 PrintStartY moveto % move to where printing will start
|
|
printBackground
|
|
Zebra{printZebra}if
|
|
printGlobalBackground
|
|
printLocalBackground
|
|
}if
|
|
PrintOnlyOneHeader{ColumnIndex 1 eq}{true}ifelse
|
|
dup PrintHeader and{
|
|
PrintHeaderFrame{HeaderFrame}if
|
|
HeaderText
|
|
}if
|
|
PrintFooter and{
|
|
PrintFooterFrame{FooterFrame}if
|
|
FooterText
|
|
}if
|
|
0 PrintStartY moveto % move to where printing will start
|
|
/LineNumber where
|
|
{pop
|
|
SyncLineZebra
|
|
{/H PageNumber 1 sub NumberOfColumns mul ColumnIndex 1 sub add
|
|
LinesPerColumn mul ZebraHeight mod def
|
|
/PLScounter H PrintLineStart ge{0}{PrintLineStart H sub}ifelse def
|
|
/PrintLineStep ZebraHeight H sub def}if}if
|
|
PLN
|
|
}def
|
|
|
|
/EndPage{bg{eolbg}if}def
|
|
|
|
/EndDSCPage{
|
|
ColumnIndex NumberOfColumns eq{
|
|
% ---- restore the state of the page
|
|
pageState restore
|
|
/ColumnIndex 1 def
|
|
% ---- N-up printing
|
|
N-Up 1 gt{
|
|
N-Up-Counter 0 gt
|
|
{% ---- Next page on same row
|
|
/N-Up-Counter N-Up-Counter 1 sub def
|
|
N-Up-XColumn N-Up-YColumn}
|
|
{% ---- Next page on next line
|
|
/N-Up-Counter N-Up-End 1 sub def
|
|
N-Up-XLine N-Up-YLine}ifelse
|
|
translate
|
|
}if
|
|
}{ % else
|
|
% ---- restore the state of the current column
|
|
columnState restore
|
|
% ---- and translate to the next column
|
|
ColumnWidth 0 translate
|
|
/ColumnIndex ColumnIndex 1 add def
|
|
}ifelse
|
|
}def
|
|
|
|
/TextStart{
|
|
LeftMargin BottomMargin
|
|
PrintFooter{
|
|
FooterPad add
|
|
FooterLines FooterLineHeight mul add
|
|
FooterPad add
|
|
FooterOffset add}if
|
|
}def
|
|
|
|
% stack: number-of-pages-per-sheet |- --
|
|
/BeginSheet{
|
|
/sheetState save def
|
|
/pages-per-sheet exch def
|
|
|
|
% ---- translate to bottom-right corner of Portrait page
|
|
LandscapeMode{
|
|
LandscapePageHeight 0 translate
|
|
90 rotate
|
|
}if
|
|
% ---- [jack] Kludge: my ghostscript window is 21x27.7 instead of 21x29.7
|
|
/JackGhostscript where{pop 1 27.7 29.7 div scale}if
|
|
UpsideDown{PageWidth LandscapePageHeight translate 180 rotate}if
|
|
% ---- N-Up printing
|
|
N-Up 1 gt{
|
|
% ---- landscape
|
|
N-Up-Landscape{
|
|
PageWidth 0 translate
|
|
90 rotate
|
|
}if
|
|
N-Up-Margin dup translate
|
|
% ---- scale
|
|
LandscapeMode{
|
|
/HH PageWidth def
|
|
/WW LandscapePageHeight def
|
|
}{
|
|
/HH LandscapePageHeight def
|
|
/WW PageWidth def
|
|
}ifelse
|
|
/xx 0 def
|
|
N-Up-Landscape{
|
|
/ww WW WW mul N-Up-Lines HH mul div def
|
|
/cc HH N-Up-Columns N-Up-Missing add div def
|
|
ww cc gt{/xx WW def/WW cc ww div WW mul def/xx xx WW sub def}if
|
|
}{
|
|
/hh HH N-Up-Columns N-Up-Missing add div def
|
|
/cc HH N-Up-Lines div def
|
|
hh cc gt{/xx WW def/WW cc hh div WW mul def/xx xx WW sub def}if
|
|
}ifelse
|
|
WW N-Up-Margin sub N-Up-Margin sub
|
|
N-Up-Landscape
|
|
{N-Up-Lines div HH}
|
|
{N-Up-Columns N-Up-Missing add div WW}ifelse
|
|
div dup scale
|
|
LandscapeMode{/yy 0 def}{/yy xx def/xx 0 def}ifelse
|
|
xx N-Up-Repeat 1 sub LandscapePageHeight mul yy add translate
|
|
% ---- go to start position in page matrix
|
|
N-Up-XStart N-Up-Missing 0.5 mul
|
|
LandscapeMode
|
|
{LandscapePageHeight mul N-Up-YStart add}
|
|
{PageWidth mul add N-Up-YStart}ifelse
|
|
translate
|
|
}if
|
|
% ---- translate to lower left corner of TEXT
|
|
TextStart translate
|
|
|
|
% ---- N-up printing
|
|
N-Up 1 gt N-Up-Border and pages-per-sheet 0 gt and{
|
|
% ---- page border
|
|
gsave
|
|
0 setgray
|
|
TextStart exch neg exch neg moveto
|
|
N-Up-Repeat
|
|
{N-Up-End
|
|
{gsave
|
|
PageWidth 0 rlineto
|
|
0 LandscapePageHeight rlineto
|
|
PageWidth neg 0 rlineto
|
|
closepath stroke
|
|
grestore
|
|
/pages-per-sheet pages-per-sheet 1 sub def
|
|
pages-per-sheet 0 le{exit}if
|
|
N-Up-XColumn N-Up-YColumn rmoveto
|
|
}repeat
|
|
pages-per-sheet 0 le{exit}if
|
|
N-Up-XLine N-Up-XColumn sub N-Up-YLine rmoveto
|
|
}repeat
|
|
grestore
|
|
}if
|
|
}def
|
|
|
|
/EndSheet{
|
|
showpage
|
|
sheetState restore
|
|
}def
|
|
|
|
/SetHeaderLines{ % nb-lines --
|
|
/HeaderLines exch def
|
|
% ---- bottom up
|
|
HeaderPad
|
|
HeaderLines 1 sub HeaderLineHeight mul add
|
|
HeaderTitleLineHeight add
|
|
HeaderPad add
|
|
/HeaderHeight exch def
|
|
}def
|
|
|
|
/SetFooterLines{ % nb-lines --
|
|
/FooterLines exch def
|
|
% ---- bottom up
|
|
FooterPad
|
|
FooterLines FooterLineHeight mul add
|
|
FooterPad add
|
|
/FooterHeight exch def
|
|
}def
|
|
|
|
% |---------|
|
|
% | tm |
|
|
% |---------|
|
|
% | header |
|
|
% |-+-------| <-- (x y)
|
|
% | ho |
|
|
% |---------|
|
|
% | text |
|
|
% |---------|
|
|
% | fo |
|
|
% |---------|
|
|
% | footer |
|
|
% |-+-------| <-- (0 0)
|
|
% | bm |
|
|
% |---------|
|
|
|
|
% -- |- x y
|
|
/HeaderFrameStart{0 PrintHeight HeaderOffset add}def
|
|
/FooterFrameStart{0 FooterHeight FooterOffset add neg}def
|
|
|
|
/doFramePath{
|
|
/h exch def
|
|
PrintHeaderWidth 0 rlineto
|
|
0 h rlineto
|
|
PrintHeaderWidth neg 0 rlineto
|
|
0 h neg rlineto
|
|
}def
|
|
|
|
/HeaderFramePath{HeaderHeight doFramePath}def
|
|
/FooterFramePath{FooterHeight doFramePath}def
|
|
|
|
% /path-fun /start-fun vector-property doFrame
|
|
/doFrame{
|
|
/vecFrame exch def
|
|
/startFrame exch load def
|
|
/pathFrame exch load def
|
|
gsave
|
|
vecFrame 2 get setlinewidth % frame border width
|
|
% ---- do the shadow of the next rectangle
|
|
startFrame moveto
|
|
1 -1 rmoveto
|
|
pathFrame
|
|
vecFrame 4 get SetColor fill % frame shadow color
|
|
% ---- do the next rectangle ...
|
|
startFrame moveto
|
|
pathFrame
|
|
gsave vecFrame 1 get SetColor fill grestore % frame background
|
|
gsave vecFrame 3 get SetColor stroke grestore % frame border color
|
|
grestore
|
|
}def
|
|
|
|
/HeaderFrame{/HeaderFramePath /HeaderFrameStart HeaderFrameProperties doFrame}def
|
|
/FooterFrame{/FooterFramePath /FooterFrameStart FooterFrameProperties doFrame}def
|
|
|
|
/HeaderStart{
|
|
HeaderFrameStart
|
|
exch HeaderPad add exch % horizontal pad
|
|
% ---- bottom up
|
|
HeaderPad add % vertical pad
|
|
HeaderDescent sub
|
|
HeaderLineHeight HeaderLines 1 sub mul add
|
|
}def
|
|
|
|
/FooterStart{
|
|
FooterFrameStart
|
|
exch FooterPad add exch % horizontal pad
|
|
% ---- bottom up
|
|
FooterPad add % vertical pad
|
|
FooterDescent sub
|
|
FooterLineHeight FooterLines 1 sub mul add
|
|
}def
|
|
|
|
/HeaderClip{HeaderFrameStart moveto HeaderFramePath clip}def
|
|
/FooterClip{FooterFrameStart moveto FooterFramePath clip}def
|
|
|
|
/strcat{
|
|
dup length 3 -1 roll dup length dup 4 -1 roll add string dup
|
|
0 5 -1 roll putinterval
|
|
dup 4 2 roll exch putinterval
|
|
}def
|
|
|
|
/pagenumberstring{
|
|
PageNumber 32 string cvs
|
|
ShowNofN{(/)strcat PageCount 32 string cvs strcat}if
|
|
}def
|
|
|
|
% lines is-right HeaderOrFooterTextLines
|
|
/HeaderOrFooterTextLines{
|
|
/is_right exch def
|
|
HFStart moveto
|
|
{ % ---- process the lines
|
|
aload pop
|
|
exch F
|
|
gsave
|
|
dup xcheck{exec}if
|
|
is_right{
|
|
dup stringwidth pop
|
|
PrintHeaderWidth exch sub HFPad HFPad add sub 0 rmoveto
|
|
}if
|
|
HFColor SetColor
|
|
show
|
|
grestore
|
|
0 HFLineHeight neg rmoveto
|
|
}forall
|
|
}def
|
|
|
|
% right-lines left-lines /start lineheight pad fore-color HeaderOrFooterText
|
|
/HeaderOrFooterText{
|
|
/HFColor exch def
|
|
/HFPad exch def
|
|
/HFLineHeight exch def
|
|
/HFStart exch load def
|
|
|
|
% -- rightLines leftLines -- at stack
|
|
|
|
% ---- hack: `PN 1 and' == `PN 2 modulo'
|
|
% ---- if even page number and duplex, then exchange left and right
|
|
PageNumber 1 and 0 eq SwitchHeader and{exch}if
|
|
|
|
% ---- process the left lines
|
|
false HeaderOrFooterTextLines
|
|
|
|
% ---- process the right lines
|
|
true HeaderOrFooterTextLines
|
|
}def
|
|
|
|
/HeaderText{
|
|
gsave HeaderClip
|
|
HeaderLinesRight HeaderLinesLeft
|
|
/HeaderStart HeaderLineHeight HeaderPad
|
|
HeaderFrameProperties 0 get
|
|
HeaderOrFooterText
|
|
grestore
|
|
}def
|
|
|
|
/FooterText{
|
|
gsave FooterClip
|
|
FooterLinesRight FooterLinesLeft
|
|
/FooterStart FooterLineHeight FooterPad
|
|
FooterFrameProperties 0 get
|
|
HeaderOrFooterText
|
|
grestore
|
|
}def
|
|
|
|
/ReportFontInfo{
|
|
2 copy
|
|
/t0 3 1 roll DefFont
|
|
/t0 F
|
|
/lh FontHeight def
|
|
/sw( )stringwidth pop def
|
|
/aw(01234567890abcdefghijklmnopqrstuvwxyz)dup length exch
|
|
stringwidth pop exch div def
|
|
/t1 12/Helvetica-Oblique DefFont
|
|
/t1 F
|
|
gsave
|
|
(languagelevel = )show
|
|
languagelevel 32 string cvs show
|
|
grestore
|
|
0 FontHeight neg rmoveto
|
|
gsave
|
|
(For )show
|
|
128 string cvs show
|
|
( )show
|
|
32 string cvs show
|
|
( point, the line height is )show
|
|
lh 32 string cvs show
|
|
(, the space width is )show
|
|
sw 32 string cvs show
|
|
(,)show
|
|
grestore
|
|
0 FontHeight neg rmoveto
|
|
gsave
|
|
(and a crude estimate of average character width is )show
|
|
aw 32 string cvs show
|
|
(.)show
|
|
grestore
|
|
0 FontHeight neg rmoveto
|
|
}def
|
|
|
|
% cm to point
|
|
/cm{72 mul 2.54 div}def
|
|
|
|
/ReportAllFontInfo{
|
|
% key = font name value = font dictionary
|
|
FontDirectory{pop 10 exch ReportFontInfo}forall
|
|
}def
|
|
|
|
% 3 cm 20 cm moveto 10/Courier ReportFontInfo showpage
|
|
% 3 cm 20 cm moveto ReportAllFontInfo showpage
|
|
|
|
% === END ps-print prologue 1
|