To help users of the placemat software, in this thread will be posted the used parameters of the placemat software. The intention is that placemats made by JDAW can be used as examples of how the software’s features can be invoked.

These placemats were generally made with the then-current version. Later versions of the software have changed the names or usage or defaults or existence of some of the parameters. Hence readers might prefer to start reading at the end.

The Df75, which was surprisingly good, caused some intricacy. It was to be served as an aperitif, so not to appear on the glasses sheets. It would need a pre-pour sheet and a sticky label. But these two contain repeats of the relevant component of the glasses sheet. Not on glasses sheet ⇒ no pre-pour, no sticky. Hmmm: awkward.

What to do? So it was on a glasses sheet, the first, containing just the ’75 (/GlassesOnSheets [ [ 0 ] ! ] def). But zero copies of this sheet were shown (/NonDecanterLabelGlassesNumCopies {SheetNum 0 eq {0} {1} ifelse} def). Thus pre-pour and sticky repeats of the glasses sheet ’75 could appear. Yes, it is a bit awkward, but driven by the desire for a very strong visual similarity between the pre-pour sheets and the sheets to which glasses are then transferred.

However, be careful if generalising this trick. Imagine that there were a dozen ports to appear on pre-pour but not on the glasses sheets. If these were all put on the first glasses sheet (of which zero copies are printed), the computed radius would be much smaller, and that would shrink the radius on other sheets with which it shared a common radius (controlled by ShrinkRadii). Not good. Obviously there would need to be several different glasses sheets to be printed zero times.

The combination of the large titles in TrebuchetMS-Bold (sans-serif, pleasingly weighted, with bright negative spaces) and smaller text in Garamond-Bold and Garamond (ornately seriffed, and slightly antique) works well.

I wanted the short Circlearrays to resonate with the Rays, which is why CircletextsMaxCopies is so complicated. This code will be moved into the code proper, perhaps to be activated by a parameter to be called CircletextsAttemptResonateWithRays.

• Data is mostly in two arrays, PeopleData and PortData, and is decanted from there into the parameter arrays. For large tastings this can be easier, as it keeps together the relevant items of Titles, Overtitles, FillTexts, etc.

• Some of the people have complicated names, containing code that tests TypeOfPagesBeingRendered and chooses a suitably shortened version. The compound strings to be rendered themselves contain code, kerning, shrinking and superscripting.

• With the glasses pages being A3 and the tasting-note pages being A4, GlassesOnSheets â‰ GlassesOnTastingNotePages. Also unusually, GlassesClusteredOnVoteRecorders and GlassesClusteredOnCorkDisplay were re-ordered versions of GlassesOnTastingNotePages.

• PermittedPackingStyles contains only one possibility, an array: [ Â [0Â 0] [1Â 1] [2Â 0] [3Â 1] [4Â 0] [5Â 1] [6Â 0] [7Â 1] Â [0Â 2.2] [1Â 3.2] [2Â 2.2] [3Â 3.2] [4Â 2.2] [5Â 3.2] [6Â 2.2] [7Â 3.2] Â ]. (Usually PermittedPackingStyles contains contains multiple named arrangements including /RectangularDislocation, /PseudoHexagonal, and /SquareGrid.) But for the array possibility the code chooses the radius and x and y scaling factors, to fill the page less margins. The extra 0.2 in some of the array’s y values slightly separates the top two rows from the bottom two: before and after dinner. But even without this, observe that the ordering of the glasses would be different to that in a /PseudoHexagonal arrangement.

• FlightSeparationLines is an array of depth four holding the definitions of lines that separate flights. For the first time at least my first time this contains code. The code calculates half the distance between the Ni52c and D80 centres, and, to give the appearance of neatness, ensures that the line starts on the left the same distance below the D80. So the line starts at [/Left 8 -1.13324], which is on the left margin, at a height equal to the y-centre of circle 8 (as ‟8” is an integer), adjusted by the real × radius. (So ‟8” and ‟8.0” would do different things.) This real is stored in JDAW-Rs, so that it could also be used relative to the TV76 circle on the right.

• Finally FillTextPrintQuickerDistillSlower. With this false, distillation took 34 seconds. With it true, removing copies of FillTexts that were entirely clipped away, it took 1302 seconds, more thanÂ 38 × slower. The file size fell from 2,135,094 to 1,482,771 bytes, so a change of about -30%. (Indeed, the placenames weren’t used, and without them distillation would have taken only 199 seconds. Also removing the unused pre-pour sheets would have further reduced the time to only 48 seconds.)

Edit in January 2013: recently added to the code is the function HalfDistanceBetweenCentresProportionRadius, which simplifies part of the above to

Edit in autumn 2013: the handling of name variations has been made easier by the new parameters NamesVoteRecorder and its variants. PermittedPackingStyles has also been re-parameterised since summer ’12.

Margins were selected as absolute minimum values for which output was not cropped by the printer, in this case a Dell 3110cn. This was in order to maximise glass sizes, which were expected to be borderline.

Glass size did work on the night, but was defintely the borderline case (Radius=113.025) for glasses at TBH.

Layout was enforced since with minor margin change the default layout was sometimes varying from that intended (rows of 1-2-1-2-1 wanted, default varied between this and 2-2-1-2).

Logos were created from images converted to .eps in PaintShopPro, then manually adjusted for use here.

Tuesday 13th November 2012, A Smattering of Graham and Malvedos (placemats, planning and arrangements).
(There are two A3 pages. The right-hand one has been guillotined, and attached to the left, slightly overlapping, with double-sided sticky tape. The green line shows the join.)

• Typically, if the same string is to be used for many ports, I assign it to a variable name. That helps with changes, including the addition of kerning.

• The Circlearrays used these strings, a lot.

• The Titles, Belowtitles, Abovetitles, Overtitles, TitlesTastingNotes, and SubtitlesTastingNotes were then derived from the Circlearrays. Depending on how many cases there are, that can be intricate.

• The glass decoration then derived from these observe the code in InlineTitles and InlineTitlesMaxNumberContours.

• The layout on the A3 glasses pages was unusual. The problem was a shortage of table space. We just didn’t have room for 2×A3 each, but the 22 glasses wouldn’t quite fit on 1×A3 + 1×A4. So two A3s were to be used, the right one to be trimmed and the whole held together with double-sided sticky tape. That meant the headers weren’t constant. For simplicity three constants (HeaderLocation, HeaderTastingName, HeaderLinks) were def’d, and then HeaderRightText, HeaderLeftText, and HeaderCenterText set to code that chose between one of these and blank. Also the position of centre header needed to be changed, for which the code had been altered to add the parameter HeaderFooterCenterRelativeX. This was then assigned to some 132 characters of code, the complication of which might suggest that the form of this parameter was not optimally chosen. (See software thread.)

• The strange layout of the pages required an unusual value for GlassesOnSheets (note the pseudo-graphical layout), and a different value for GlassesOnTastingNotePages.

• The layout semi-compelled WaterCountsOverrideShowEverySheet to be false. In that it would have compelled had there been any left-handers present.

• Having recently added the parameter CircletextsSameFontSizeIfRadiiShrunkToBeSame, there would be good behaviour from setting /CircletextsMinCopies 4 def. So I did.

• Because of the shortage of space the margins were slightly trimmed.

• There’s an imperfection in the pre-pour sheets, as the ’63 and ’83 appear twice, later fixed:

The author of [url=http://www.jdawiseman.com/papers/placemat/placemat.html#prepour]the manual[/url] wrote:There can, rarely, be an additional complication. If a placemat is made from several A3 placemats, guillotined and overlapped !, then the same glass will appear on two sheets. But it should not have twice as many pre-pour sheets. This technicality is fixed with PrePourRemoveDuplicatesByWithinTitles, which, if true, removes duplicates, equivalence being determined by GlassesOnSheets having the same value of WithinTitles. The guillotine-and-overlap trick also messes with the order of the pre-pour sheets, sometimes fixable with PrePourSortByWithinTitles.

The array NumberWords holds words as numbers, item 0 being (One). That drives much of the data.

There is a trickiness. The sticky labels can only contain copies of what is on the glasses sheets. The TN sheets have, faded, copies of what is on the glasses sheets. But there are no glasses sheets! Oh yes there are, but zero copies are shown: /NonDecanterLabelGlassesNumCopies 0 def. Also observe /StickyLabelsOrientationAutomatic {[true false] StickyLabelsTypeThis get} def, which allows automatic rotation of the bottle labels (2×4 on A4) but not of the glass labels (5×13).

• As is usual, much of the wine-specific action driven by the data in Circlearrays. Logic on this used in Titles (alas some its logic being redundant), Overtitles, SubtitlesVoteRecorder, ShapesInTitles, CrossHatchingTitles, InlineTitles, and InlineTitlesMaxNumberContours.

One of the two A3 pages to be guillotined and overlapped on the other, being affixed with double-sided sticky tape. That caused complications.

• Observe the layout of GlassesOnSheets, and complicated value of the only item of PermittedPackingStyles when SheetNum == 1.

• There were also complications for HeaderCenterText and HeaderRightText, and careful positioning of the centre with HeaderFooterCenterX, which was recently re-named.

• The full-declaration Taylors had CrossHatching. Because there was to be one physical sheet, the CrossHatchingTitles needed a common centre, requiring code in CrossHatchingCentreX.

• Because of the shortage of table space, the left/bottom/right margins were slightly compressed, from the usual 30, to 18. Except in the ‘backstage’ papers, which tend to have a footer, for which the bottom margin wasn’t compressed. Hence the code in MarginB.

And one thing not happening properly.

• Because the T35 and TV70 appear on both glasses sheets, they have twice as many labels as the others. Error. What to do? This could have been fixed in the parameters by making StickyLabelsNumCopies much more complicated, but that would be nasty. Of course there can’t be a !StickyLabels! equivalent of GlassesClusteredOnVoteRecorders, so it can’t be fixed that way. So instead I will code StickyLabels! equivalents to PrePourRemoveDuplicatesByWithinTitles and PrePourSortByWithinTitles.

• Recent re-parametrisation of HeadersLeft etc, compound strings being preceded by the PageOrdering! integer from which they apply. In this case easy, as all pages have the same headers.

• VoteRecorderCrossedBox is mostly its default, with one extra line as JDAW knows more about DRT’s bottle than does DRT.

• VerticalMiddlingTitles also mostly its default, except that it looks wrong for a ‟+” which would be too high. So the ‟+” is centred without regard for the vertical position of others it does not need to match anything.

• FontSizesRatioTitlesMin is a numeric parameter, defaulting to 2. So either the font sizes of the titles must be the same, or they must differ by a ratio â‰¥2. The purpose is that there shouldn’t be a Title at 180 point, and another at 175, and another at 160. Make them all 160. But if one Title is very long, so fits only if â‰¤75 point, have that at 75 and the others at 160. (If it would fit at 82 point, then the 160 shrinks to 82, and the 180 to 175, thus maintaining ratio condition.) So, in effect, /FontSizesRatioTitlesMin 99 def forces all the Titles to be the same size. In this particular case, it shrinks the ‟+” and ‟*” to the same font size as the others.

Edit: at the table, an error was noticed. There was a conflict of dates between the Title ‟(F77)” and the Circlearray ‟[ (Fonseca) (1970) (CPR) ]”. Oops: both should have been !77. Two oops in a row: oops oops.

At 433 pages + 2 log pages = 435 pages, the longest set of placemats yet made by me, and hence probably by this software. There is lots going on.

The port data starts in PortData, and is then decanted in to Titles, Circlearrays, and TitlesCorkDisplay. This simplified re-ordering of the wines as draft placemats were made, arrays automatically being kept synchronised. The decanting is slightly more general-case than was used. PortData contains arrays of length 3: an abbreviation, a long name, a vintage. But what if an item is of length â‰¥4? Then the fourth item would be in Belowtitles. But this complexity was redundant: all are of length 3, and all have the same Vintage.

In August 2013 the headers were re-parameterised, greatly simplifying having different headers in different sessions.

PrePourNumCopies was zero for blank ports.

NamesPlaceNames is a new parameter, also coded in August 2013 for this tasting. It is an array of Names-like arrays. Indeed, its first three items are plain Names, being the PlaceNames for the three sessions. Next come the ‘food names’ for the three sessions. (After printing it emerged that more names would have been better: at each session, Names for the drinking table, Names for the eating table, and food names for the latter. Even more pages!)

GlassesOnSheets has every page being exactly five glasses, even if one of those glasses is blank. GlassesOnTastingNotePages is the same but with the blanks removed.

GlassesClusteredOnVoteRecorders contains parts of GlassesOnTastingNotePages for the ‟1963 Vintage Port Of The Session” questions, but the whole of GlassesOnTastingNotePages for ‟Port Of The Weekend”. GlassesClusteredOnCorkDisplay omits the last of those.

Three sessions? Which meant lots of use of the PageOrdering! parameters: PageOrderingNonDecanterLabelGlasses, PageOrderingTastingNotePages, PageOrderingDecantingNotes, PageOrderingVoteRecorder, PageOrderingCorkDisplay, PageOrderingDecanterLabels and PageOrderingPlaceNames. Also the new parameter again coded for this placemat PageOrderingSections, which breaks the PDF’s table of contents into sections. (It was easy to do, and adds elegance; see example on right.)

/GillSansMT-Condensed: me like. Expect to see this again. But the cork-display pages showed the long shipper name rather than the abbreviation, so on these pages the titles were shown in CircletextFont (= /BookmanOldStyle) for consistency of kerning.

An uncomplicated but worthwhile use of BackgroundTextsGlasses. However, the default grey in BackgroundTextsGlassesPaintCode is 15÷16 = 0.9375, which was ‟a little too light” on AHB’s printer, so replaced with 0.90625 = 29÷32 = 14½÷16.