Monday 16
th June 2014, at
The Bung Hole, 1997 Maturity Evaluation (
planning and arrangements,
placemats,
review of the evening as a whole).
Code: Select all
/MarginL {TypeOfPagesBeingRendered /Glasses ne {30} {15} ifelse} def
/MarginR {TypeOfPagesBeingRendered /Glasses ne {30} {15} ifelse} def
/MarginT {TypeOfPagesBeingRendered /Glasses ne {30} {15 HeaderFontSize add} ifelse} def
/MarginB {TypeOfPagesBeingRendered /Glasses ne {30} {
284.7
UserScratchDict /OutputTrimmedHeight known not {dup mark exch (Trimmed page height = ) exch PageHeight exch sub MarginL add 72 div 100 mul round 100 div ( inches) ConcatenateToMark OutputToLog UserScratchDict /OutputTrimmedHeight null put} if
} ifelse} def
/Vintage (1997) def
/JDAW [(JDA) {-0.06 Kern} (W)] def
/AWGH [(A) {-0.06 Kern} (WGH)] def
/JDAWAWGH [JDAW {-0.04 Kern} (+) {-0.08 Kern} AWGH] def
/PortData [
[ (D) (Dow) Vintage (IDJ) ]
[ (F) (Fonseca) Vintage (DRL) ]
[ (G) (Graham) Vintage (CPR) ]
[ (N) (Quinta do Noval) Vintage (CMAG) ]
[ (T) [(T) {-0.06 Kern} (aylor)] Vintage (DRL) ]
[ (V) [(Quinta do V) {-0.06 Kern} (esuvio)] Vintage (THRA) ]
[ (W) [(W) {-0.06 Kern} (arre)] Vintage ]
[ (Fr) (Ferreira) Vintage (IDJ) ]
[ (GC) (Gould Campbell) Vintage ]
[ (RP) (Ramos-Pinto) Vintage ]
[ (S) (Sandeman) Vintage JDAWAWGH ]
[ (SV) [(Sandeman V) {-0.06 Kern} (au)] Vintage (Single) JDAWAWGH ]
[ (SV) [(Sandeman V) {-0.06 Kern} (au)] Vintage (Double Magnum) JDAW ]
[ (SW) [(Smith W) {-0.06 Kern} (oodhouse)] Vintage (MPM) ]
[ (Ck) (Cockburn) Vintage ]
[ (CR) [(Croft Quinta da Ro) /ecircumflex (da)] Vintage (THRA) ]
[ (I) (Quinta do Infantado) Vintage (MPM) ]
[ (Mg) (Morgan) Vintage ]
[ (O) [(Of) /fl (ey)] Vintage JDAWAWGH ]
[ (Ps) [(Quinta do Passadouro)] Vintage [(V) {-0.06 Kern} (.W) {-0.06 Kern} (.&P) {(.) stringwidth pop -2 div 0 rmoveto} (.)] ]
] def
/Circlearrays [ PortData {dup 1 exch length 1 sub getinterval} forall ] def
/Titles [ PortData {0 get} forall ] def
/Belowtitles [ PortData {dup length 5 ge {3 get} {pop ()} ifelse } forall ] def
/SubtitlesVoteRecorder [ Circlearrays length {()} repeat ] def
/Names [
(MPM) JDAW AWGH
(DJ) (IJ) % DJ senior
(THRA) (CPR) (IDJ) (CMAG) (DRL) (RDA)
()
] def
/PaperType /A2 def % /A4 /A3 /USL = 8.5"x11", /USLegal = 8.5"x14", /USL2 = 11"x17", [SmallerPts LargerPts]
/Orientation {PaperType /A4 eq {/Portrait} {/Landscape} ifelse} def % /Landscape /Portrait
/HeadersLeft [
0 [(The Bung Hole, Monday 16) {SuperscriptOn} (th) {SuperscriptOff} ( June 2014)]
] def % /HeadersLeft
/HeadersCenter [
0 [Vintage ( Maturity Evaluation)]
] def % /HeadersCenter
/ExternalLinks [ % Even-length array of strings: http://URL0, Descriptor0, http://URL1, Descriptor1, ...
(http://www.theportforum.com/viewtopic.php?t=8612&view=unread#unread) (Review thread on ThePortForum.com)
(http://www.theportforum.com/viewtopic.php?t=7655&view=unread#unread) (Planning thread on ThePortForum.com)
(http://www.jdawiseman.com/2014/20140616_1997s.pdf) (Latest version this placemat)
(http://www.stevensgarnier.co.uk/sogrape-brands/) (Stevens Garnier (Sogrape))
(http://www.vintagewineandport.com/) (VintageWineAndPort.com)
(http://www.davy.co.uk/bunghole/) (The Bung Hole)
(http://www.streetmap.co.uk/map.srf?x=530848&y=181628&z=106&pc=WC1V+6DT) (WC1V 6DT, streetmap.co.uk)
(https://maps.google.co.uk/maps?z=20&t=k&layer=c&cbll=51.5182,-0.1154&cbp=11,15,,0,0) (WC1V 6DT, maps.google.co.uk)
(http://www.bing.com/maps/default.aspx?where1=WC1V+6DT&cp=51.5182~-0.1154) (WC1V 6DT, bing.com)
] def
/PlaceNames false def
/PrePourNumCopies {WithinTitles 7 mod 0 eq {1} {0} ifelse} def
/StickyLabelsNumCopies 1 def
/StickyLabelsTypes [0] def
/GlassesOnSheets [
[
00 07 09 11 13
01 02 08 10 12
03 04 15 17 19
05 06 14 16 18
]
] def % /GlassesOnSheets
/GlassesOnTastingNotePages [
00 06 [ 3 1 roll 1 exch {} for ]
07 13 [ 3 1 roll 1 exch {} for ]
14 Titles length 1 sub [ 3 1 roll 1 exch {} for ]
] def % /GlassesOnTastingNotePages
/VoteRecorderTopTexts [ % Must be same length as GlassesClusteredOnVoteRecorders, each sub-array containing some number of TopTexts
% [ (What is it?) ]
[ (Wine Of The Flight) (Wine Of The Night) (Q:) ]
] def % Must be same length as GlassesClusteredOnVoteRecorders
/TitlesFont /GillSans-CondensedBold def
/CircletextFont /Garamond def
/InlineTitles true def
/InlineBelowtitles true def
/PrePourReverseOrder false def
/FlightSeparations true def
/FlightSeparationLines
[
[ % SheetNum=0 start
% Loop surrounding Dow flight
[ /Closed [/Top 0 1] [0 1] /Curve [1 6] /Curve [6 7] /Curve [7 11] /Curve [11 12] /Curve [11 17] /Curve [16 17] [/Bottom 16 17] [/Left 15 -1.0] [/Top 5 -1.0] ]
% Loop surrounding Ferreira flight
[ /Closed [/Top 0 1] [0 1] /Curve [1 6] /Curve [6 7] /Curve [7 11] /Curve [7 12] [/Clockwise 12] [/Widdershins 8] [/Clockwise 13] [/Widdershins 9] [/Clockwise 14] [/Right 9 14] [/Top 4 +1.0] ]
% Loop surrounding Cockburn flight
[ /Closed [/Bottom 16 17] [16 17] /Curve [11 17] /Curve [11 12] /Curve [7 12] [/Clockwise 12] [/Widdershins 8] [/Clockwise 13] [/Widdershins 9] [/Clockwise 14] [/Right 9 14] [/Bottom 14 +1.0] ]
% Three pieces of separation lines, each starting at centre
[ [7 12] /Curve [7 11] /Curve [6 7] /Curve [1 6] /Curve [0 1] [/Top 0 1] ]
[ [11 12] /Curve [7 12] [/Clockwise 12] [/Widdershins 8] [/Clockwise 13] [/Widdershins 9] [/Clockwise 14] [/Right 9 14] ]
[ [7 11] /Curve [11 12] /Curve [11 17] /Curve [16 17] [/Bottom 16 17] ]
] % SheetNum=0 finish
] def % /FlightSeparationLines
/FlightSeparationPaintSeparately true def
/FlightSeparationPaintCode
{
/FSGap GlassPositions SheetNum get dup 0 get 1 get exch 5 get 1 get sub 7 div def
0.12 setlinewidth 0 setgray 0 setlinecap [] 0 setdash
FlightSeparationLineNum 0 eq
{
clipsave clip newpath
MgnL 0.06 add FSGap GlassPositions SheetNum get dup 1 get 0 get exch 2 get 0 get add 2 div {dup MgnB moveto PageHeight MgnT sub lineto stroke} for
cliprestore
} if % Dow loop
FlightSeparationLineNum 1 eq
{
clipsave clip newpath
PageHeight MgnT sub 0.06 sub FSGap neg GlassPositions SheetNum get 12 get 1 get {dup MgnL exch moveto PageWidth MgnR sub exch lineto stroke} for
cliprestore
} if % Ferreira loop
FlightSeparationLineNum 2 eq
{
clipsave clip newpath
FSGap FSGap PageWidth MgnR sub NamePlacementBottomX SheetNum get sub dup mul PageHeight MgnB MgnT add sub 2 div dup mul add sqrt
{GlassPositions SheetNum get 2 get 0 get MgnB 3 -1 roll PageWidth MgnR sub NamePlacementBottomX SheetNum get sub 2 copy gt {2 copy dup mul exch dup mul exch sub sqrt exch atan 40 1 setlinecap} {pop 0 180 0 setlinecap} ifelse arc stroke}
for cliprestore
} if % Cockburn loop
FlightSeparationLineNum FlightSeparationLines SheetNum get length 1 sub eq
{
gsave 0 setlinecap 2.4 setlinewidth 0 setgray stroke grestore 1 setlinecap 0.96 setlinewidth 1 setgray stroke
} if % All subsequent boundaries, done at once for correct black-then-white
} def % /FlightSeparationPaintCode
/PaintForegroundCode
{
TypeOfPagesBeingRendered /Glasses eq
{
/GillSans-Light 0 BelowtitleFontSizes {Max 2 copy lt {exch} if pop} forall selectfont
/FlightLabelUpperOffset 1 def
/FlightLabelLowerOffset FlightLabelUpperOffset neg gsave 0 0 moveto (Flight) false charpath PathBBox grestore 4 1 roll pop pop pop sub def % Assumes letters on baseline
MgnL GlassPositions SheetNum get 0 get 1 get 2 copy
FlightLabelUpperOffset add moveto [(Fir) {+0.04 Kern} (st)] ShowRecursive FlightLabelLowerOffset add moveto (Flight) show
PageWidth MgnR sub (Second) stringwidth pop sub GlassPositions SheetNum get 9 get 1 get 2 copy
FlightLabelUpperOffset add moveto (Second) show FlightLabelLowerOffset add moveto (Flight) show
PageWidth MgnR sub (Second) stringwidth pop sub GlassPositions SheetNum get 19 get 1 get 2 copy
FlightLabelUpperOffset add moveto [(Thir) {+0.03 Kern} (d)] ShowRecursive FlightLabelLowerOffset add moveto (Flight) show
} if % ... /Glasses
} def % Paints a pattern on top of everything. Will probably refer to TypeOfPagesBeingRendered and then to SheetNum or TastingSheetNum.
Software version: 11:30 Sunday 15th June 2014.
Edit, April 2021: it is possible that the
FlightSeparations flag
/Curve will be retired. Even if it isn’t, the new flag
/Arc is neater, and should be preferred. See issue entitled
Simplifying FlightSeparations: removal of some possibilities.
Lots of cunning usage of the parameters.
•
MarginL etc set to be small on the glasses pages, but less small on others. Glasses-page space at a premium. However
MarginB is massive on the glasses pages, with the heavy paper to be trimmed.
• As is typical of large tastings, the array
PortData holds the information which is then decanted into
Circlearrays,
Titles,
Belowtitles and
SubtitlesVoteRecorder.
• The plan was to pre-pour only the first Port of each flight, to set the measure by which people were to self-pour the rest. Hence the complication of
PrePourNumCopies.
•
/FlightSeparations true def, and, joy!, the most complicated use yet of this feature. Start by observing
/FlightSeparationPaintSeparately true def. The first three items of
FlightSeparationLines define closed paths, used by
FlightSeparationPaintCode (“
FlightSeparationLineNum 0 eq”, then
1, then
2) as
clipping regions. Decorative lines, very thin, are drawn. The remainder of
FlightSeparationLines defines the boundary paths, some with
/Curve and some without.
FlightSeparationPaintCode does nothing with these until the last one, so these are in effect not …
PaintSeparately’d. And that last item paints a thick black line inside a
gsave …
grestore, and then a less thick white line. The
setlinecaps avoid bleed.
Those tracing through the
FlightSeparationLines might be helped by the following diagram, showing where stuff is. Observe that the
Titles have been replaced with the values of
WithinPage, and the
Belowtitles with
WithinTitles. Also, some text has been moved to keep it on the page, most obviously that referring to the corners.
• Finally, the texts “First Flight” etc are
shown by
PaintForegroundCode.
Broader lesson
There is a broader lesson from these complicated parameters. The program is written in PostScript, and is structured to allow, perhaps even encourage, code injection. In almost all parameters the user has full access to the whole of PostScript, and to the values of the variables maintained by the code. E.g.,
FlightSeparationLineNum is there to seen. That gives great power, but full access to that power requires being able to use PostScript.