%% %% This is file `onedown.sty', %% generated with the docstrip utility. %% %% The original source files were: %% %% onedown.dtx (with options: `package') %% %% This is a generated file. %% %% Copyright (C) 2018 by Jacob Wiersma %% %% This file may be distributed and/or modified under the conditions of %% the LaTeX Project Public License, either version 1.3 of this license %% or (at your option) any later version. The latest version of this %% license is in: %% %% http://www.latex-project.org/lppl.txt %% %% and version 1.3 or later is part of all distributions of LaTeX version %% 2005/12/01 or later. %% \NeedsTeXFormat{LaTeX2e}[2014/05/01] \def\ODwstyleversion{1.0}\def\ODwstyledate{2018/05/23} \ProvidesPackage{onedown} [\ODwstyledate\space v\ODwstyleversion\space Typeset Bridge Diagrams - Jacob Wiersma (C) 2016-2018] %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% \RequirePackage{% xcolor,% colorizing symbols \Sp etc. textcomp,% for the numbersign in environment play. moresize,% add \HUGE and \ssmall to font-sizes relsize,% relative font-sizes. (e.g. \smaller) makecmds,% needed for provideenvironment expl3,% needed for LaTeX3 packages (xparse) xparse,% optional params and starred commands xspace,% handling of spacing behind a command calc,% makes calculations and lengths easier ifthen,% easy booleans, tests and loops adjustbox,% stacked boxes in L-/R-Lower captions translations,% auto-translate terms (e.g. East->Ost) array,% actions for tabular column cells collcell,% macro calls for tabular column cells pgfopts,% for keyval opts, loads also pgfkeys environ,% for handling bidding environments xstring,% for easy string processing. tracklang,% for iterating over loaded languages pict2e,% for drawing the compass } \xspaceaddexceptions{% = \markit \, \suit \GetTranslation 2 3 4 5 6 7 8 9 T J Q K A } \LoadDictionaryFor{fallback}{ODw} \pgfkeys{/ODw/.is family} \def\ODw@set#1{\pgfkeys{/ODw,#1}} \ODw@set{colors/.is choice,} \ODw@set{warn/.is choice,} \ODw@set{err/.is choice,} \AtBeginDocument{% \renewcommand{\,}[1][1]{% \ifmmode\mskip#1\thinmuskip% \else\thinspace[#1]\fi% }% \renewcommand{\thinspace}[1][1]{% \kern#1\dimexpr0.16667em\relax% }% }% AtBeginDocument \gdef\ODw@gsetlength#1#2{% \begingroup \setlength\skip@{#2}% local assign to scratch reg. \global#1=\skip@% global assignment to #1; \endgroup% restore \skip@ by endgroup. }% ODw@gsetlength \gdef\ODw@append#1{% \bgroup% \edef\tmp{\the\ODw@Scratch #1}% \global\ODw@Scratch=\expandafter{\tmp}% \egroup% }% ODw@append \def\ODw@CompSize{1}% factor to enlarge the compass \def\ODw@CompLine{}% thickness of compass frame \def\ODw@Skipwidth{1em}% \newif\ifODw@description% must typeset an annotation \newif\ifODw@short% short form in bidding header \newif\ifODw@monochrome% no colors wanted \newif\ifOdW@CardSkip% skip between ranks needed \newif\ifODw@Bidders% suppress bidders in bidding header \newif\ifODw@BidLine% draw \hline below bidding header \newif\ifODw@LongCalls% switch between long/short calls \newif\ifODw@CompShow% show compass or not \newif\ifODw@CompTurn% turn E-W letters 90° \newboolean{ODw@EmptyHeader}% = 'header is empty' \newboolean{ODw@EmptyFooter}% = 'footer is empty' \newsavebox\ODw@Diagram@Box \newsavebox\ODw@Hand@Box \newsavebox\ODw@BidBox \newlength\ODw@Compasssize% the size of the compass. \newlength\ODw@Diagram@Width \newlength\ODw@Card@Skip \setlength\ODw@Card@Skip{.15em}% space between cards \newlength\ODw@Bid@Width \newlength\ODw@Skip@Width \setlength\ODw@Skip@Width{\ODw@Skipwidth} \newlength\ODw@Tmp@Len% temp var for computations \newlength\ODw@Tmp@Width% temp var for computations \newcounter{ODw@Nr} \newcounter{ODw@Cnt} \newcounter{ODw@PlayerNr} \newcounter{ODw@NSCnt} \newcounter{ODw@EWCnt} \newtoks{\ODw@Scratch} \newcommand\bidderfont[1]{\gdef\ODw@BidderFont{#1}} \newcommand\compassfont[1]{\gdef\ODw@CompassFont{#1}} \newcommand\namefont[1]{\gdef\ODw@NameFont{#1}} \newcommand\legendfont[1]{\gdef\ODw@LegendFont{#1}} \newcommand\otherfont[1]{\gdef\ODw@OtherFont{#1}} \newcommand\gamefont[1]{% \gdef\ODw@GameFont{#1}% \gdef\ODw@GameSize{% recalculate dimens for the new font \ODw@GameFont% \setlength\ODw@Skip@Width{\ODw@Skipwidth}% }% }% gamefont \fontencoding{T1}\fontfamily{stix} \fontseries{m}\fontshape{n}\selectfont \DeclareSymbolFont{symbols}{OMS}{txsy}{m}{n} \SetSymbolFont{symbols}{bold}{OMS}{txsy}{bx}{n} \DeclareFontSubstitution{OMS}{txsy}{m}{n} \DeclareSymbolFont{symbolsC}{U}{txsyc}{m}{n} \SetSymbolFont{symbolsC}{bold}{U}{txsyc}{bx}{n} \DeclareFontSubstitution{U}{txsyc}{m}{n} \DeclareMathSymbol{\ODw@spadesuit}{\mathord}{symbols}{127} \DeclareMathSymbol{\ODw@varheart}{\mathord}{symbolsC}{114} \DeclareMathSymbol{\ODw@vardiamond}{\mathord}{symbolsC}{113} \DeclareMathSymbol{\ODw@clubsuit}{\mathord}{symbols}{124} \def\Cl{}\def\Di{}\def\He{}\def\Sp{}% \ODw@set{% colors/0/.code={% \ODw@monochrometrue% \renewrobustcmd\Cl{\textcolor{black}% {\,[0.3]\ensuremath{\ODw@clubsuit}}\xspace}% \renewrobustcmd\Di{\textcolor{black}% {\,[0.3]\ensuremath{\ODw@vardiamond}}\xspace}% \renewrobustcmd\He{\textcolor{black}% {\,[0.3]\ensuremath{\ODw@varheart}}\xspace}% \renewrobustcmd\Sp{\textcolor{black}% {\,[0.3]\ensuremath{\ODw@spadesuit}}\xspace}% }% } \ODw@set{colors/mono/.code={\pgfkeys{/ODw/colors=0}}} \ODw@set{colors/black/.code={\pgfkeys{/ODw/colors=0}}} \ODw@set{% colors/1/.code={% \ODw@monochrometrue% \renewrobustcmd\Cl{\textcolor{black}% {\,[0.3]\ensuremath{\ODw@clubsuit}}\xspace}% \renewrobustcmd\Di{\,[0.3]\ensuremath{\diamondsuit}\xspace}% \renewrobustcmd\He{\,[0.3]\ensuremath{\heartsuit}\xspace}% \renewrobustcmd\Sp{\textcolor{black}% {\,[0.3]\ensuremath{\ODw@spadesuit}}\xspace}% }% } \ODw@set{colors/b+w/.code={\pgfkeys{/ODw/colors=1}}} \ODw@set{% colors/2/.code={% \renewrobustcmd\Cl{\textcolor{black}% {\,[0.3]\ensuremath{\ODw@clubsuit}}\xspace}% \renewrobustcmd\Di{\textcolor{red}% {\,[0.3]\ensuremath{\ODw@vardiamond}}\xspace}% \renewrobustcmd\He{\textcolor{red}% {\,[0.3]\ensuremath{\ODw@varheart}}\xspace}% \renewrobustcmd\Sp{\textcolor{black}% {\,[0.3]\ensuremath{\ODw@spadesuit}}\xspace}% }% } \ODw@set{colors/b+r/.code={\pgfkeys{/ODw/colors=2}}} \ODw@set{% colors/4A/.code={% \renewrobustcmd\Cl{\textcolor{green}% {\,[0.3]\ensuremath{\ODw@clubsuit}}\xspace}% \renewrobustcmd\Di{\textcolor{orange}% {\,[0.3]\ensuremath{\ODw@vardiamond}}\xspace}% \renewrobustcmd\He{\textcolor{red}% {\,[0.3]\ensuremath{\ODw@varheart}}\xspace}% \renewrobustcmd\Sp{\textcolor{blue}% {\,[0.3]\ensuremath{\ODw@spadesuit}}\xspace}% }% } \ODw@set{colors/fourA/.code={\pgfkeys{/ODw/colors=4A}}} \ODw@set{colors/4a/.code={\pgfkeys{/ODw/colors=4A}}} \ODw@set{% colors/4B/.code={% \renewrobustcmd\Cl{\textcolor{black}% {\,[0.3]\ensuremath{\ODw@clubsuit}}\xspace}% \renewrobustcmd\Di{\textcolor{orange}% {\,[0.3]\ensuremath{\ODw@vardiamond}}\xspace}% \renewrobustcmd\He{\textcolor{red}% {\,[0.3]\ensuremath{\ODw@varheart}}\xspace}% \renewrobustcmd\Sp{\textcolor{green}% {\,[0.3]\ensuremath{\ODw@spadesuit}}\xspace}% }% } \ODw@set{colors/fourB/.code={\pgfkeys{/ODw/colors=4B}}} \ODw@set{colors/4b/.code={\pgfkeys{/ODw/colors=4B}}} \ODw@set{colors=2} \NewDocumentCommand\nt{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF#1{% \IfBooleanTF#2 {\,[0.3]\GetTranslation{NT-(ODw)}}% {\GetTranslation{No Trump-(ODw)}}% }{% \IfBooleanTF#2 {\,[0.3]\GetTranslation{nt-(ODw)}}% {\GetTranslation{no trump-(ODw)}}% }% \egroup% \xspace% }% nt \def\NT{\nt*!} \gdef\ODw@SuitPlayed{N} \gdef\ODw@SuitLead{N} \gdef\ODw@TrumpSuit{N} \newcounter{ODw@Rank} \def\ODw@SetRank#1{% \ifthenelse{\equal{\ODw@SuitPlayed}{\ODw@SuitLead}}% % if a suit is followed, store the intrinsic rank {\setcounter{ODw@Rank}{#1}}% {% else, if a suit is not followed then ... % (at NoTrump, the trumpsuit is coded 'N' and will % never match a real suit (coded C, D, H and S)) % thus avoiding that trump cards are detected \ifthenelse{\equal{\ODw@SuitPlayed}{\ODw@TrumpSuit}}% % if it is a trump card, increase the rank {\setcounter{ODw@Rank}{#1}% \addtocounter{ODw@Rank}{15}}% % if it is a discard, set the rank to 0 to make % sure it will never win {\setcounter{ODw@Rank}{0}}% }% ifthen % If the card was of another suit, % then ODw@SuitPlayed was changed. % If we encounter 'unsuited' cards, % then we must reestablish the % original ODw@SuitPlayed. \global\edef\ODw@SuitPlayed{\ODw@SuitLead}% org. suit }% ODw@SetRank \ExplSyntaxOn % NB: now all spaces are ignored, use '~' if needed. \NewDocumentCommand{\ODw@Xfer}{m}{ \bgroup % we do not want spaces here \def\xspace{} \tl_map_function:nN {#1} \ODw@translate:n \egroup }% ODw@Xfer \cs_new_protected:Nn \ODw@translate:n { \setcounter{ODw@Rank}{0} \str_case:nnTF {#1} { % Store the suit of the card played % needed to determine the winner % and for checking for multiple cards {C}{\Cl\gdef\ODw@SuitPlayed{C}} {D}{\Di\gdef\ODw@SuitPlayed{D}} {H}{\He\gdef\ODw@SuitPlayed{H}} {S}{\Sp\gdef\ODw@SuitPlayed{S}} {N}{\NT\gdef\ODw@SuitPlayed{N}} % Translate a hyphen into an en-dash {-}{--} % % 1: translate the honour cards, % 2: store the played cards for checking % 3: and set their rank. This must be done last, because % \ODw@SetRank resets \ODw@SuitPlayed to \ODw@SuitLead % Honour Cards % 1 2 {A}{\Ace*!\ODw@AppendCard{\ODw@SuitPlayed}{A} \ODw@SetRank{14}}% 3 {K}{\King*!\ODw@AppendCard{\ODw@SuitPlayed}{K} \ODw@SetRank{13}} {Q}{\Queen*!\ODw@AppendCard{\ODw@SuitPlayed}{Q} \ODw@SetRank{12}} {J}{\Jack*!\ODw@AppendCard{\ODw@SuitPlayed}{J} \ODw@SetRank{11}} {T}{\kern-0.1em1\kern-0.1em0% massage 1 and 0 a bit \ODw@AppendCard{\ODw@SuitPlayed}{T}\ODw@SetRank{10}} % Numeral Cards {9}{9\ODw@AppendCard{\ODw@SuitPlayed}{9}\ODw@SetRank{9}} {8}{8\ODw@AppendCard{\ODw@SuitPlayed}{8}\ODw@SetRank{8}} {7}{7\ODw@AppendCard{\ODw@SuitPlayed}{7}\ODw@SetRank{7}} {6}{6\ODw@AppendCard{\ODw@SuitPlayed}{6}\ODw@SetRank{6}} {5}{5\ODw@AppendCard{\ODw@SuitPlayed}{5}\ODw@SetRank{5}} {4}{4\ODw@AppendCard{\ODw@SuitPlayed}{4}\ODw@SetRank{4}} {3}{3\ODw@AppendCard{\ODw@SuitPlayed}{3}\ODw@SetRank{3}} {2}{2\ODw@AppendCard{\ODw@SuitPlayed}{2}\ODw@SetRank{2}} % A spot card has rank 0 {x}{x\ODw@SetRank{0}} % % Non cards (bidding only) {1}{1}% this enables e.g. 1\He in biddings {p}{\ifODw@LongCalls\Pass*\else\Pass!\fi} {P}{\ifODw@LongCalls\Allpass*\else\Allpass*!\fi} {X}{\ifODw@LongCalls\Double*\else\Double!\fi} {R}{\ifODw@LongCalls\Redouble*\else\Redouble!\fi} }% case {% if matched (case T(rue)) \ifOdW@CardSkip\hspace{\ODw@Card@Skip}\fi % suit of 1st card (ODw@SuitLead) is ODw@SuitPlayed \if\theODw@PlayerNr1 \global\edef\ODw@SuitLead{\ODw@SuitPlayed} \fi } {% if not matched (case F(alse)) \ifx#1\Cl\gdef\ODw@SuitPlayed{C}\fi \ifx#1\Di\gdef\ODw@SuitPlayed{D}\fi \ifx#1\He\gdef\ODw@SuitPlayed{H}\fi \ifx#1\Sp\gdef\ODw@SuitPlayed{S}\fi \expandafter{#1}% enables e.g. 1\He % suit of 1st card (ODw@SuitLead) is ODw@SuitPlayed \if\theODw@PlayerNr1 \global\edef\ODw@SuitLead{\ODw@SuitPlayed} \fi } }% ODw@translate \ExplSyntaxOff \newcommand{\ODw@appendcard}[2]{\xdef#1{#1#2}} \newcommand\ODw@AppendCard[2]{% \IfEqCase{#1}{% {C}{\ODw@appendcard{\ODw@Clubs}{#2}}% {D}{\ODw@appendcard{\ODw@Diamonds}{#2}}% {H}{\ODw@appendcard{\ODw@Hearts}{#2}}% {S}{\ODw@appendcard{\ODw@Spades}{#2}}% }% }% ODw@AppendCard \newcounter{ODw@Highest}% the highest rank until now \setcounter{ODw@Highest}{0} \newcounter{ODw@WinningNr}% player with the highest rank \setcounter{ODw@WinningNr}{0} \def\ODw@PTfer#1{% \stepcounter{ODw@PlayerNr}% \ODw@Xfer{#1}% ODw@Rank = the rank for this card \ifthenelse{\value{ODw@Rank} > \value{ODw@Highest}}% {% This rank is higher than previous highest one \setcounter{ODw@WinningNr}{\theODw@PlayerNr}% \setcounter{ODw@Highest}{\theODw@Rank}% }% {}% \ifthenelse{\value{ODw@PlayerNr} = 4}% {% last player: Process the winning trick: \stepcounter{ODw@Nr}% Start new row with new player \ODw@AccTricks% Accumulate tricks for N-S/E-W }% {}% } \def\ODw@FTfer#1{% \ODw@Tricks% \ODw@PTfer{#1}% }% ODw@FTfer \def\ODw@BTfer#1{% \ODw@Xfer{#1}% } \NewDocumentCommand\North{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF#1{% \IfBooleanTF{#2}{\ODw@N*}{\ODw@North*}% }{% \IfBooleanTF{#2}{\ODw@N}{\ODw@North}% }% TF#1 \egroup% \xspace% }% North \def\north{\North*} \NewDocumentCommand\East{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF#1{% \IfBooleanTF{#2}{\ODw@E*}{\ODw@East*}% }{% \IfBooleanTF{#2}{\ODw@E}{\ODw@East}% }% TF#1 \egroup% \xspace% }% East \def\east{\East*} \NewDocumentCommand\South{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF#1{% \IfBooleanTF{#2}{\ODw@S*}{\ODw@South*}% }{% \IfBooleanTF{#2}{\ODw@S}{\ODw@South}% }% TF#1 \egroup% \xspace% }% South \def\south{\South*} \NewDocumentCommand\West{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF#1{% \IfBooleanTF{#2}{\ODw@W*}{\ODw@West*}% }{% \IfBooleanTF{#2}{\ODw@W}{\ODw@West}% }% TF#1 \egroup% \xspace% }% West \def\west{\West*} \NewDocumentCommand\NorthSouth{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF#1{% \IfBooleanTF{#2}{\North*!--\South*!}{\North*--\South*}% }{% \IfBooleanTF{#2}{\North!--\South!}{\North--\South}% }% \egroup% \xspace% }% NorthSouth \def\northsouth{\NorthSouth*} \NewDocumentCommand\EastWest{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF#1{% \IfBooleanTF{#2}{\East*!--\West*!}{\East*--\West*}% }{% \IfBooleanTF{#2}{\East!--\West!}{\East--\West}% }% \egroup% \xspace% }% EastWest \def\eastwest{\EastWest*} \def\ODw@N{% \@ifstar{\GetTranslation{N-(ODw)}}% {\GetTranslation{n-(ODw)}}% } \def\ODw@E{% \@ifstar{\GetTranslation{E-(ODw)}}% {\GetTranslation{e-(ODw)}}% } \def\ODw@S{% \@ifstar{\GetTranslation{S-(ODw)}}% {\GetTranslation{s-(ODw)}}% } \def\ODw@W{% \@ifstar{\GetTranslation{W-(ODw)}}% {\GetTranslation{w-(ODw)}}% } \def\ODw@NS{\ODw@N--\ODw@S} \def\ODw@EW{\ODw@E--\ODw@W} \def\ODw@North{% \@ifstar{\GetTranslation{North-(ODw)}}% {\GetTranslation{north-(ODw)}}% } \def\ODw@East{% \@ifstar{\GetTranslation{East-(ODw)}}% {\GetTranslation{east-(ODw)}}% } \def\ODw@South{% \@ifstar{\GetTranslation{South-(ODw)}}% {\GetTranslation{south-(ODw)}}% } \def\ODw@West{% \@ifstar{\GetTranslation{West-(ODw)}}% {\GetTranslation{west-(ODw)}}% } \NewDocumentCommand\Pass{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\GetTranslation{Pass!-(ODw)}}% {\GetTranslation{Pass-(ODw)}}% }{% \IfBooleanTF{#2}% {\GetTranslation{pass!-(ODw)}}% {\GetTranslation{pass-(ODw)}}% }% TF#1 \egroup% \xspace% }% Pass \def\pass{\Pass*} \NewDocumentCommand\Allpass{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF#1{% \IfBooleanTF{#2}% {\GetTranslation{AP-(ODw)}}% {\GetTranslation{All pass-(ODw)}}% }{% \IfBooleanTF{#2}% {\GetTranslation{ap-(ODw)}}% {\GetTranslation{all pass-(ODw)}}% }% TF#1 \egroup% \xspace% }% Allpass \def\allpass{\Allpass*} \NewDocumentCommand\Double{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF#1{% \IfBooleanTF{#2}% {\GetTranslation{Dbl-(ODw)}}% {\GetTranslation{Double-(ODw)}}% }{% \IfBooleanTF{#2}% {X}% {\GetTranslation{double-(ODw)}}% }% TF#1 \egroup% \xspace% }% Double \def\double{\Double*} \NewDocumentCommand\Redouble{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF#1{% \IfBooleanTF{#2}% {\GetTranslation{ReDbl-(ODw)}}% {\GetTranslation{ReDouble-(ODw)}}% }{% \IfBooleanTF{#2}% {\mbox{X\kern-0.1em X}}% {\GetTranslation{redouble-(ODw)}}% }% TF#1 \egroup% \xspace% }% Redouble \def\redouble{\Redouble*} \newcommand\ODw@FirstBidCol[1]{% \IfEqCase{#1}{% {N}{% \gdef\ODw@BidderI{\@ifstar{\ODw@North*}{\ODw@N*}}% \gdef\ODw@BidderII{\@ifstar{\ODw@East*}{\ODw@E*}}% \gdef\ODw@BidderIII{\@ifstar{\ODw@South*}{\ODw@S*}}% \gdef\ODw@BidderIV{\@ifstar{\ODw@West*}{\ODw@W*}}% \gdef\ODw@NameI{\ODw@North@Name}% \gdef\ODw@NameII{\ODw@East@Name}% \gdef\ODw@NameIII{\ODw@South@Name}% \gdef\ODw@NameIV{\ODw@West@Name}% }% {E}{% \gdef\ODw@BidderI{\@ifstar{\ODw@East*}{\ODw@E*}}% \gdef\ODw@BidderII{\@ifstar{\ODw@South*}{\ODw@S*}}% \gdef\ODw@BidderIII{\@ifstar{\ODw@West*}{\ODw@W*}}% \gdef\ODw@BidderIV{\@ifstar{\ODw@North*}{\ODw@N*}}% \gdef\ODw@NameI{\ODw@East@Name}% \gdef\ODw@NameII{\ODw@South@Name}% \gdef\ODw@NameIII{\ODw@West@Name}% \gdef\ODw@NameIV{\ODw@North@Name}% }% {S}{% \gdef\ODw@BidderI{\@ifstar{\ODw@South*}{\ODw@S*}}% \gdef\ODw@BidderII{\@ifstar{\ODw@West*}{\ODw@W*}}% \gdef\ODw@BidderIII{\@ifstar{\ODw@North*}{\ODw@N*}}% \gdef\ODw@BidderIV{\@ifstar{\ODw@East*}{\ODw@E*}}% \gdef\ODw@NameI{\ODw@South@Name}% \gdef\ODw@NameII{\ODw@West@Name}% \gdef\ODw@NameIII{\ODw@North@Name}% \gdef\ODw@NameIV{\ODw@East@Name}% }% {W}{% \gdef\ODw@BidderI{\@ifstar{\ODw@West*}{\ODw@W*}}% \gdef\ODw@BidderII{\@ifstar{\ODw@North*}{\ODw@N*}}% \gdef\ODw@BidderIII{\@ifstar{\ODw@East*}{\ODw@E*}}% \gdef\ODw@BidderIV{\@ifstar{\ODw@South*}{\ODw@S*}}% \gdef\ODw@NameI{\ODw@West@Name}% \gdef\ODw@NameII{\ODw@North@Name}% \gdef\ODw@NameIII{\ODw@East@Name}% \gdef\ODw@NameIV{\ODw@South@Name}% }% }% IfEqCase }% ODw@FirstBidCol \newcommand\namesNS[2]{% \gdef\ODw@North@Name{#1}% \gdef\ODw@South@Name{#2}% \gdef\ODw@All@Names{#1#2\ODw@East@Name\ODw@West@Name}% }% namesNS \newcommand\namesEW[2]{% \gdef\ODw@East@Name{#1}% \gdef\ODw@West@Name{#2}% \gdef\ODw@All@Names{#1#2\ODw@North@Name\ODw@South@Name}% }% namesEW \newcommand\northhand[5][0pt]{% \ODw@ChkNrOfCards{#2#3#4#5}{\north}% \gdef\ODw@NSpades{#2}% Save norths cards \gdef\ODw@NHearts{#3}% of all suits \gdef\ODw@NDiamonds{#4}% for later \gdef\ODw@NClubs{#5}% checking \gdef\ODw@Nhand{% \makebox[\ODw@Compasssize + 2ex][l]{% \ODw@hand{t}{#2}{#3}{#4}{#5}% }% \vspace{#1}% }% }% northhand \newcommand\easthand[5][0pt]{% \ODw@ChkNrOfCards{#2#3#4#5}{\east}% \gdef\ODw@ESpades{#2}% Save easts cards \gdef\ODw@EHearts{#3}% of all suits \gdef\ODw@EDiamonds{#4}% for later \gdef\ODw@EClubs{#5}% checking \gdef\ODw@Ehand{% \hspace{#1}% \ODw@hand{c}{#2}{#3}{#4}{#5}% }% }% easthand \newcommand\southhand[5][0pt]{% \ODw@ChkNrOfCards{#2#3#4#5}{\south}% \gdef\ODw@SSpades{#2}% Save souths cards \gdef\ODw@SHearts{#3}% of all suits \gdef\ODw@SDiamonds{#4}% for later \gdef\ODw@SClubs{#5}% checking \gdef\ODw@Shand{% \parbox[b]{\ODw@Compasssize + 2ex}{% \vspace*{#1}\par% \makebox[0pt][l]{% \ODw@hand{b}{#2}{#3}{#4}{#5}% }% }% }% }% southhand \newcommand\westhand[5][0pt]{% \ODw@ChkNrOfCards{#2#3#4#5}{\west}% \gdef\ODw@WSpades{#2}% Save wests cards \gdef\ODw@WHearts{#3}% of all suits \gdef\ODw@WDiamonds{#4}% for later \gdef\ODw@WClubs{#5}% checking \gdef\ODw@Whand{% \ODw@hand{c}{#2}{#3}{#4}{#5}% \hspace*{#1}% }% }% westhand \NewDocumentCommand\hand{s t! t- O{c}mmmm}{% \ODw@ChkNrOfCards{#5#6#7#8}{Hand}% \ODw@ChkSameCards{#5}{\Sp}% \ODw@ChkSameCards{#6}{\He}% \ODw@ChkSameCards{#7}{\Di}% \ODw@ChkSameCards{#8}{\Cl}% \global\sbox{\ODw@Hand@Box}{% \bgroup% \ODw@GameSize% \IfBooleanTF{#2}% {\ODw@vhand[#4]{#5}{#6}{#7}{#8}}% {\ODw@hhand{#5}{#6}{#7}{#8}}% \egroup% }% sbox \IfBooleanTF{#3}{}{% \IfBooleanTF{#1}% {{\centering \usebox{\ODw@Hand@Box}\par}}% {\usebox{\ODw@Hand@Box}}% }% }% hand \newcommand\ODw@hhand[4]{% \bgroup% \def\xspace{}% undo xspace locally % it screws the distance between suit and cards \setlength\tabcolsep{1\ODw@Card@Skip}% \begin{tabular}{llll} % we can't use \suit here: it would cause double checks! \Sp\hspace{0.3em}\ODw@Cards{#1} &% \He\hspace{0.3em}\ODw@Cards{#2} &% \Di\hspace{0.3em}\ODw@Cards{#3} &% \Cl\hspace{0.3em}\ODw@Cards{#4} \\ \end{tabular}% \egroup% }% ODw@hhand \newcommand\ODw@vhand[5][c]{% \ODw@hand{#1}{#2}{#3}{#4}{#5}% }% ODw@vhand \newcommand\ODw@hand[5]{% \ifthenelse{\equal{#2#3#4#5}{}}{}{% \setlength\tabcolsep{\ODw@Card@Skip}% \begin{tabular}[#1]{ll}% % we can't use \suit here: it would cause double checks! \Sp & \ODw@Cards{#2}\\[-0.5ex] \He & \ODw@Cards{#3}\\[-0.5ex] \Di & \ODw@Cards{#4}\\[-0.5ex] \Cl & \ODw@Cards{#5}\\ \end{tabular}% }% ifthenelse }% ODw@hand \NewDocumentCommand\onesuitAll{s t! mmmm}{% \ODw@ChkSameCards{#3#4#5#6}{}% \IfBooleanTF#1{\begin{center}}{}% \bgroup% \ODw@GameSize% \setlength\tabcolsep{0em}% \begin{tabular}{@{}r@{ }c@{ }l@{}}% & \ODw@Cards{#3} \IfBooleanTF#2{\\[-0.2em]}{\\}% \ODw@Cards{#6} & \IfBooleanTF#2{\ODw@Compass}{\ODw@Box}% & \ODw@Cards{#5} \IfBooleanTF#2{\\[-0.2em]}{\\}% & \ODw@Cards{#4}\\ \end{tabular}% \egroup% \IfBooleanTF#1{\end{center}}{}% }% onesuitAll \NewDocumentCommand\onesuitNS{s t! mm}{% \ODw@ChkSameCards{#3#4}{}% \IfBooleanTF#1{\begin{center}}{}% \bgroup% \ODw@GameSize% \begin{tabular}{@{}c@{}}% \ODw@Cards{#3}\IfBooleanTF#2{\\[-0.2em]}{\\}% \IfBooleanTF#2{\ODw@Compass\\[-0.2em]}{\ODw@Box\\}% \ODw@Cards{#4}% \end{tabular}% \egroup% \IfBooleanTF#1{\end{center}}{}% }% onesuitNS \NewDocumentCommand\onesuitEW{s t! mm}{% \ODw@ChkSameCards{#3#4}{}% \IfBooleanTF#1{\begin{center}}{}% \bgroup% \ODw@GameSize% \begin{tabular}{@{}r@{ }c@{ }l@{}}% \ODw@Cards{#4} &% \IfBooleanTF#2{\ODw@Compass}{\ODw@Box} &% \ODw@Cards{#3} \\% \end{tabular}% \egroup% \IfBooleanTF#1{\end{center}}{}% }% onesuitEW \NewDocumentCommand\onesuitNE{s t! mm}{% \ODw@ChkSameCards{#3#4}{}% \IfBooleanTF#1{\begin{center}}{}% \bgroup% \ODw@GameSize% \begin{tabular}[b]{c@{ }l@{}}% \ODw@Cards{#3} \\% \IfBooleanTF#2{\ODw@Compass}{\ODw@Box} &% \ODw@Cards{#4} \\% \end{tabular}% \egroup% \IfBooleanTF#1{\end{center}}{}% }% onesuitEW \NewDocumentCommand\onesuitNW{s t! mm}{% \ODw@ChkSameCards{#3#4}{}% \IfBooleanTF#1{\begin{center}}{}% \bgroup% \ODw@GameSize% \begin{tabular}[b]{r@{ }c}% & \ODw@Cards{#3} \\% \ODw@Cards{#4} & \IfBooleanTF#2{\ODw@Compass}{\ODw@Box} \\% \end{tabular}% \egroup% \IfBooleanTF#1{\end{center}}{}% }% onesuitEW \newcommand\suit[2][]{% \ODw@ChkNrOfCards{#2}{suit}% \ODw@ChkSameCards{#2}{#1}% \bgroup% keep font change local #1\ODw@Cards{#2}% \egroup% \xspace% }% suit \newcommand{\ODw@Cards}[1]{% \OdW@CardSkiptrue% \ODw@Xfer{#1}% }% ODw@Cards \NewDocumentCommand\showAll{s t+ O{c}}{% \gdef\ODw@Spades{% store all Spades together \ODw@NSpades\ODw@ESpades\ODw@SSpades\ODw@WSpades% }% \gdef\ODw@Hearts{% store all Hearts together \ODw@NHearts\ODw@EHearts\ODw@SHearts\ODw@WHearts% }% \gdef\ODw@Diamonds{% store all Diamonds together \ODw@NDiamonds\ODw@EDiamonds\ODw@SDiamonds\ODw@WDiamonds% }% \gdef\ODw@Clubs{% store all Clubs together \ODw@NClubs\ODw@EClubs\ODw@SClubs\ODw@WClubs% }% % check for multiple and nr. of cards \ODw@ChkNrOfCards{\ODw@Spades}{\Sp}% \ODw@ChkSameCards{\ODw@Spades}{\Sp}% \ODw@ChkNrOfCards{\ODw@Hearts}{\He}% \ODw@ChkSameCards{\ODw@Hearts}{\He}% \ODw@ChkNrOfCards{\ODw@Diamonds}{\Di}% \ODw@ChkSameCards{\ODw@Diamonds}{\Di}% \ODw@ChkNrOfCards{\ODw@Clubs}{\Cl}% \ODw@ChkSameCards{\ODw@Clubs}{\Cl}% \IfBooleanTF#1{\begin{center}}{}% \bgroup% \setlength\tabcolsep{0em}% \ODw@GameSize% \ODw@TestIfEmpty{\ODw@HeaderText}{ODw@EmptyHeader}% \ODw@TestIfEmpty{\ODw@FooterText}{ODw@EmptyFooter}% % sbox1 necessary to calc. |Compasssize| for |Nhand| \sbox1{\ODw@Compass}% \sbox0{% \begin{tabular}[#3]{@{}r@{}c@{}l@{}}% \ODw@LeftUpperText & \ODw@Nhand & \ODw@RightUpperText\\ \ODw@Whand & \usebox{1} & \ODw@Ehand\\ \ODw@LeftLowerText & \ODw@Shand & \ODw@RightLowerText\\ \end{tabular}% }% sbox \ODw@gsetlength{\ODw@Diagram@Width}{\wd0}% \begin{tabular}[#3]{@{}r@{}c@{}l@{}}% \ODw@ProcessHeader{3}% span 3 columns \ODw@LeftUpperText & \ODw@Nhand & \ODw@RightUpperText\\ \ODw@Whand & \usebox{1} & \ODw@Ehand\\ \ODw@LeftLowerText & \ODw@Shand & \ODw@RightLowerText\\ \ODw@ProcessFooter{3}% span 3 columns \end{tabular}% \IfBooleanTF#2{% % needed for \ODw@CondNewLine \setlength{\ODw@Bid@Width}{\wd\ODw@BidBox}% \ODw@CondNewLine% \usebox{\ODw@BidBox}% }{}% \egroup% \IfBooleanTF#1{\end{center}}{}% }% showAll \NewDocumentCommand\showNS{s t+ O{c}}{% \gdef\ODw@Spades{\ODw@NSpades\ODw@SSpades}% \gdef\ODw@Hearts{\ODw@NHearts\ODw@SHearts}% \gdef\ODw@Diamonds{\ODw@NDiamonds\ODw@SDiamonds}% \gdef\ODw@Clubs{\ODw@NClubs\ODw@SClubs}% \ODw@ChkSameCards{\ODw@Spades}{\Sp}% \ODw@ChkSameCards{\ODw@Hearts}{\He}% \ODw@ChkSameCards{\ODw@Diamonds}{\Di}% \ODw@ChkSameCards{\ODw@Clubs}{\Cl}% \IfBooleanTF#1{\begin{center}}{}% \bgroup% \setlength\tabcolsep{0em}% \ODw@GameSize% \ODw@TestIfEmpty{\ODw@HeaderText}{ODw@EmptyHeader}% \ODw@TestIfEmpty{\ODw@FooterText}{ODw@EmptyFooter}% % sbox1 necessary to calc. |Compasssize| for |Nhand| \sbox1{\ODw@Compass}% \sbox0{% \begin{tabular}[#3]{@{}r@{}c@{}l@{}}% & \ODw@Nhand & \\ & \usebox{1} & \\ & \ODw@Shand & \\ \end{tabular}% }% sbox0 \ODw@gsetlength\ODw@Diagram@Width{\wd0}% \begin{tabular}[#3]{@{}r@{}c@{}l@{}}% \ODw@ProcessHeader{3}% span 3 columns & \ODw@Nhand & \\ & \usebox{1} & \\ & \ODw@Shand & \\ \ODw@ProcessFooter{3}% span 3 columns \end{tabular}% \IfBooleanTF#2{% % necessary for \ODw@CondNewLine \setlength{\ODw@Bid@Width}{\wd\ODw@BidBox}% \ODw@CondNewLine% \usebox{\ODw@BidBox}% }{}% \egroup% \IfBooleanTF#1{\end{center}}{}% }% showNS \NewDocumentCommand\showEW{s t+ O{c}}{% \gdef\ODw@Spades{\ODw@ESpades\ODw@WSpades}% \gdef\ODw@Hearts{\ODw@EHearts\ODw@WHearts}% \gdef\ODw@Diamonds{\ODw@EDiamonds\ODw@WDiamonds}% \gdef\ODw@Clubs{\ODw@EClubs\ODw@WClubs}% \ODw@ChkSameCards{\ODw@Spades}{\Sp}% \ODw@ChkSameCards{\ODw@Hearts}{\He}% \ODw@ChkSameCards{\ODw@Diamonds}{\Di}% \ODw@ChkSameCards{\ODw@Clubs}{\Cl}% \IfBooleanTF#1{\begin{center}}{}% \bgroup% \setlength\tabcolsep{0em}% \ODw@GameSize% \ODw@TestIfEmpty{\ODw@HeaderText}{ODw@EmptyHeader}% \ODw@TestIfEmpty{\ODw@FooterText}{ODw@EmptyFooter}% \sbox0{% \begin{tabular}[#3]{@{}r@{}c@{}l@{}}% \ODw@Whand & \ODw@Compass & \ODw@Ehand \\ \end{tabular}% }% sbox \ODw@gsetlength{\ODw@Diagram@Width}{\wd0}% \begin{tabular}[#3]{@{}r@{}c@{}l@{}}% \ODw@ProcessHeader{3}% span 3 columns & & \\ \ODw@Whand & \ODw@Compass & \ODw@Ehand \\ \ODw@ProcessFooter{3}% span 3 columns \end{tabular}% \IfBooleanTF#2{% % necessary for \ODw@CondNewLine \setlength{\ODw@Bid@Width}{\wd\ODw@BidBox}% \ODw@CondNewLine% \usebox{\ODw@BidBox}% }{}% \egroup% \IfBooleanTF#1{\end{center}}{}% }% showEW \NewDocumentCommand\showNE{s t+ O{c}}{% \gdef\ODw@Spades{\ODw@NSpades\ODw@ESpades}% \gdef\ODw@Hearts{\ODw@NHearts\ODw@EHearts}% \gdef\ODw@Diamonds{\ODw@NDiamonds\ODw@EDiamonds}% \gdef\ODw@Clubs{\ODw@NClubs\ODw@EClubs}% \ODw@ChkSameCards{\ODw@Spades}{\Sp}% \ODw@ChkSameCards{\ODw@Hearts}{\He}% \ODw@ChkSameCards{\ODw@Diamonds}{\Di}% \ODw@ChkSameCards{\ODw@Clubs}{\Cl}% \IfBooleanTF#1{\begin{center}}{}% \bgroup% \setlength\tabcolsep{0em}% \ODw@GameSize% \ODw@TestIfEmpty{\ODw@HeaderText}{ODw@EmptyHeader}% \ODw@TestIfEmpty{\ODw@FooterText}{ODw@EmptyFooter}% % sbox1 necessary to calc. |Compasssize| for |Nhand| \sbox1{\ODw@Compass}% \sbox0{% \begin{tabular}[#3]{@{}c@{}l@{}}% \ODw@Nhand & \ODw@RightUpperText\\ \usebox{1} & \ODw@Ehand\\ \end{tabular}% }% sbox \ODw@gsetlength{\ODw@Diagram@Width}{\wd0}% \begin{tabular}[#3]{@{}c@{}l@{}}% \ODw@ProcessHeader{2}% span 2 columns \ODw@Nhand & \ODw@RightUpperText\\ \usebox{1} & \ODw@Ehand\\ \ODw@ProcessFooter{2}% span 2 columns \end{tabular}% \IfBooleanTF#2{% % necessary for \ODw@CondNewLine \setlength{\ODw@Bid@Width}{\wd\ODw@BidBox}% \ODw@CondNewLine% \usebox{\ODw@BidBox}% }{}% \egroup% \IfBooleanTF#1{\end{center}}{}% }% showNE \NewDocumentCommand\showNW{s t+ O{c}}{% \gdef\ODw@Spades{\ODw@NSpades\ODw@WSpades}% \gdef\ODw@Hearts{\ODw@NHearts\ODw@WHearts}% \gdef\ODw@Diamonds{\ODw@NDiamonds\ODw@WDiamonds}% \gdef\ODw@Clubs{\ODw@NClubs\ODw@WClubs}% \ODw@ChkSameCards{\ODw@Spades}{\Sp}% \ODw@ChkSameCards{\ODw@Hearts}{\He}% \ODw@ChkSameCards{\ODw@Diamonds}{\Di}% \ODw@ChkSameCards{\ODw@Clubs}{\Cl}% \IfBooleanTF#1{\begin{center}}{}% \bgroup% \setlength\tabcolsep{0em}% \ODw@GameSize% \ODw@TestIfEmpty{\ODw@HeaderText}{ODw@EmptyHeader}% \ODw@TestIfEmpty{\ODw@FooterText}{ODw@EmptyFooter}% % sbox1 necessary to calc. |Compasssize| for |Nhand| \sbox1{\ODw@Compass}% \sbox0{% \begin{tabular}[#3]{@{}c@{}l@{}}% \ODw@LeftUpperText & \ODw@Nhand\\ \ODw@Whand & \usebox{1}\\ \end{tabular}% }% sbox \ODw@gsetlength{\ODw@Diagram@Width}{\wd0}% \begin{tabular}[#3]{@{}r@{}c@{}}% \ODw@ProcessHeader{2}% span 2 columns \ODw@LeftUpperText & \ODw@Nhand\\ \ODw@Whand & \usebox{1}\\ \ODw@ProcessFooter{2}% span 2 columns \end{tabular}% \IfBooleanTF#2{% % necessary for \ODw@CondNewLine \setlength{\ODw@Bid@Width}{\wd\ODw@BidBox}% \ODw@CondNewLine% \usebox{\ODw@BidBox}% }{}% \egroup% \IfBooleanTF#1{\end{center}}{}% }% showNW \newcommand{\ODw@Compass}{% \begingroup \def\ODw@V{-1}\def\ODw@D{-1}% \def\@ODw{\none}\ifx\ODw@Vulner\@ODw\def\ODw@V{0}\fi% \def\@ODw{\none*}\ifx\ODw@Vulner\@ODw\def\ODw@V{0}\fi% \def\@ODw{\none!}\ifx\ODw@Vulner\@ODw\def\ODw@V{0}\fi% \def\@ODw{\none*!}\ifx\ODw@Vulner\@ODw\def\ODw@V{0}\fi% \def\@ODw{\all}\ifx\ODw@Vulner\@ODw\def\ODw@V{1}\fi% \def\@ODw{\all*}\ifx\ODw@Vulner\@ODw\def\ODw@V{1}\fi% \def\@ODw{\all!}\ifx\ODw@Vulner\@ODw\def\ODw@V{1}\fi% \def\@ODw{\all*!}\ifx\ODw@Vulner\@ODw\def\ODw@V{1}\fi% \def\@ODw{\NorthSouth}\ifx\ODw@Vulner\@ODw\def\ODw@V{2}\fi% \def\@ODw{\NorthSouth*}\ifx\ODw@Vulner\@ODw\def\ODw@V{2}\fi% \def\@ODw{\NorthSouth!}\ifx\ODw@Vulner\@ODw\def\ODw@V{2}\fi% \def\@ODw{\NorthSouth*!}\ifx\ODw@Vulner\@ODw\def\ODw@V{2}\fi% \def\@ODw{\EastWest}\ifx\ODw@Vulner\@ODw\def\ODw@V{3}\fi% \def\@ODw{\EastWest*}\ifx\ODw@Vulner\@ODw\def\ODw@V{3}\fi% \def\@ODw{\EastWest!}\ifx\ODw@Vulner\@ODw\def\ODw@V{3}\fi% \def\@ODw{\EastWest*!}\ifx\ODw@Vulner\@ODw\def\ODw@V{3}\fi% \def\@ODw{\North}\ifx\ODw@Dealer\@ODw\def\ODw@D{0}\fi% \def\@ODw{\North*}\ifx\ODw@Dealer\@ODw\def\ODw@D{0}\fi% \def\@ODw{\North!}\ifx\ODw@Dealer\@ODw\def\ODw@D{0}\fi% \def\@ODw{\North*!}\ifx\ODw@Dealer\@ODw\def\ODw@D{0}\fi% \def\@ODw{\East}\ifx\ODw@Dealer\@ODw\def\ODw@D{1}\fi% \def\@ODw{\East*}\ifx\ODw@Dealer\@ODw\def\ODw@D{1}\fi% \def\@ODw{\East!}\ifx\ODw@Dealer\@ODw\def\ODw@D{1}\fi% \def\@ODw{\East*!}\ifx\ODw@Dealer\@ODw\def\ODw@D{1}\fi% \def\@ODw{\South}\ifx\ODw@Dealer\@ODw\def\ODw@D{2}\fi% \def\@ODw{\South*}\ifx\ODw@Dealer\@ODw\def\ODw@D{2}\fi% \def\@ODw{\South!}\ifx\ODw@Dealer\@ODw\def\ODw@D{2}\fi% \def\@ODw{\South*!}\ifx\ODw@Dealer\@ODw\def\ODw@D{2}\fi% \def\@ODw{\West}\ifx\ODw@Dealer\@ODw\def\ODw@D{3}\fi% \def\@ODw{\West*}\ifx\ODw@Dealer\@ODw\def\ODw@D{3}\fi% \def\@ODw{\West!}\ifx\ODw@Dealer\@ODw\def\ODw@D{3}\fi% \def\@ODw{\West*!}\ifx\ODw@Dealer\@ODw\def\ODw@D{3}\fi% \ODw@CompassDefault% use the compass font \def\PicSize{500}% \def\MidSize{250}% % Multiply unitlength=0.005em with CompSize (default= 1) \setlength\unitlength{0.005em * \real{\ODw@CompSize}}% \ODw@gsetlength\ODw@Compasssize{\unitlength * \PicSize + 2ex}% \def\Hoffset{30}% distance between W (E) and frame \def\Voffset{30}% distance between N (S) and frame \setlength\ODw@Tmp@Width{0.1em * \real{\ODw@CompLine}}% \linethickness{\ODw@Tmp@Width}% % leave 1ex space on all sides \parbox[c][\ODw@Compasssize]{\ODw@Compasssize}{% \centering% \begin{picture}(\PicSize,\PicSize)% \ifODw@CompShow% % the frame \moveto(0,0) \if\ODw@CompLine0% must do it this way, because \else% linethickness zero does not suppress the line \lineto(0,\PicSize)\lineto(\PicSize,\PicSize) \lineto(\PicSize,0)\closepath\strokepath \fi% % the cardinal points \put(\MidSize,\the\numexpr \PicSize - \Voffset)% {\makebox[0pt]{\raisebox{-\height}{\ODw@Print{0}}}}% N \put(\MidSize,\Voffset){\makebox[0pt]{\ODw@Print{2}}}% S \put(\Hoffset,\MidSize){% \makebox[0pt][l]{% \ifODw@CompTurn% \raisebox{-0.5\height}{% \rotatebox[origin=t]{90}{\ODw@Print{3}}% }% \else% \raisebox{-0.5\height}{\ODw@Print{3}}% \fi% }% makebox }% W \put(\the\numexpr \PicSize - \Hoffset,\MidSize)% {\makebox[0pt][r]{% \raisebox{-0.5\height}{% \ifODw@CompTurn% \rotatebox[origin=c]{90}{\ODw@Print{1}}% \else% \ODw@Print{1}% \fi% }% }% makebox }% E % the center \put(\MidSize,\MidSize){\makebox(0,0){\ODw@mid}} \fi% \end{picture}% }% parbox \endgroup }% ODw@Compass \newcommand\ODw@Print[1]{% \bgroup \smaller\smaller% \ifcase#1% #1=0: print N \ifboolexpr{ test {\ifnumcomp{\ODw@D}{=}{0}}}% {% dealer = N \ifboolexpr{ test {\ifnumcomp{\ODw@V}{=}{1}} or% test {\ifnumcomp{\ODw@V}{=}{2}} }% {\ODw@PrintColor{\underline{\ODw@N*}}}% Vul {\underline{\ODw@N*}}% not Vul }{% dealer <> N \ifboolexpr{ test {\ifnumcomp{\ODw@V}{=}{1}} or% test {\ifnumcomp{\ODw@V}{=}{2}} }% {\ODw@PrintColor{\ODw@N*}}% Vul {\ODw@N*}% not Vul }% \or% #1=1: print E \ifboolexpr{ test {\ifnumcomp{\ODw@D}{=}{1}}}% {% dealer E \ifboolexpr{ test {\ifnumcomp{\ODw@V}{=}{1}} or% test {\ifnumcomp{\ODw@V}{=}{3}} }% {\ODw@PrintColor{\underline{\ODw@E*}}}% Vul {\underline{\ODw@E*}}% not Vul }{% dealer <> E \ifboolexpr{ test {\ifnumcomp{\ODw@V}{=}{1}} or% test {\ifnumcomp{\ODw@V}{=}{3}} }% {\ODw@PrintColor{\ODw@E*}}% Vul {\ODw@E*}% not Vul }% \or% #1=2: print S \ifboolexpr{ test {\ifnumcomp{\ODw@D}{=}{2}}}% {% dealer S \ifboolexpr{ test {\ifnumcomp{\ODw@V}{=}{1}} or% test {\ifnumcomp{\ODw@V}{=}{2}} }% {\ODw@PrintColor{% \ensuremath{\overline{\mbox{\ODw@S*}}}}% }% Vul {\ensuremath{\overline{\mbox{\ODw@S*}}}}% not Vul }{% dealer <> S \ifboolexpr{ test {\ifnumcomp{\ODw@V}{=}{1}} or% test {\ifnumcomp{\ODw@V}{=}{2}} }% {\ODw@PrintColor{\ODw@S*}}% Vul {\ODw@S*}% not Vul }% \or% #1=3: print W \ifboolexpr{ test {\ifnumcomp{\ODw@D}{=}{3}}}% {% dealer W \ifboolexpr{ test {\ifnumcomp{\ODw@V}{=}{1}} or% test {\ifnumcomp{\ODw@V}{=}{3}} }% {\ODw@PrintColor{\underline{\ODw@W*}}}% Vul {\underline{\ODw@W*}}% not Vul }{% dealer <> W \ifboolexpr{ test {\ifnumcomp{\ODw@V}{=}{1}} or% test {\ifnumcomp{\ODw@V}{=}{3}} }% {\ODw@PrintColor{\ODw@W*}}% Vul {\ODw@W*}% not Vul }% \fi% (ifcase#1) \egroup% }% ODw@Print \newcommand\ODw@PrintColor[1]{% \ifODw@monochrome\textit{#1}\else\textcolor{red}{#1}\fi% }% ODw@PrintColor \def\ODw@CompMid{} \def\ODw@mid{{\smaller\smaller\smaller\ODw@CompMid}} \newcommand{\ODw@Box}{% \bgroup \setlength{\fboxsep}{0pt}% \setlength{\fboxrule}{0.1em}% \fbox{\rule{0mm}{0.7em}\rule{0.7em}{0mm}}% \egroup }% ODw@Box \def\ODw@BoardText{} \NewDocumentCommand\boardtext{s}{% \IfBooleanTF#1{\GetTranslation{Board-(ODw)}:\,\ODw@BoardText}% {\ODw@BoardText}% }% boardtext \newcommand{\boardnr}[1]{% \IfInteger{#1}{% \gdef\ODw@BoardText{% \bgroup% \ODw@OtherFont% #1% \egroup% }% \setcounter{ODw@Cnt}{#1}% \whiledo{\theODw@Cnt > 16}{% \addtocounter{ODw@Cnt}{-16}% }% whiledo, now 1 <= Cnt <= 16 \IfEqCase{\theODw@Cnt}{% set dealer/vulner {0}{\gdef\ODw@BoardText{}\vulner[-1]\dealer[-1]} {1}{\vulner[\none]\dealer[\North*!]} {2}{\vulner[\NorthSouth*!]\dealer[\East*!]} {3}{\vulner[\EastWest*!]\dealer[\South*!]} {4}{\vulner[\all]\dealer[\West*!]} {5}{\vulner[\NorthSouth*!]\dealer[\North*!]} {6}{\vulner[\EastWest*!]\dealer[\East*!]} {7}{\vulner[\all]\dealer[\South*!]} {8}{\vulner[\none]\dealer[\West*!]} {9}{\vulner[\EastWest*!]\dealer[\North*!]} {10}{\vulner[\all]\dealer[\East*!]} {11}{\vulner[\none]\dealer[\South*!]} {12}{\vulner[\NorthSouth*!]\dealer[\West*!]} {13}{\vulner[\all]\dealer[\North*!]} {14}{\vulner[\none]\dealer[\East*!]} {15}{\vulner[\NorthSouth*!]\dealer[\South*!]} {16}{\vulner[\EastWest*!]\dealer[\West*!]} }% IfEqCase }{\gdef\ODw@BoardText{#1}}% otherwise take #1 }% boardnr \newcommand\headlinetext[1]{\gdef\ODw@HeaderText{#1}} \headlinetext{} \newcommand\footlinetext[1]{\gdef\ODw@FooterText{#1}} \footlinetext{} \def\ODw@LeftUpperText{} \newcommand\leftupper[4][0pt]{% \gdef\ODw@LeftUpperText{% \hspace{-#1}% \begin{tabular}[t]{l}#2\\#3\\#4\\\end{tabular} }% }% leftupper \def\ODw@LeftLowerText{} \newcommand\leftlower[4][0pt]{% \gdef\ODw@LeftLowerText{% \hspace{-#1}% \begin{tabular}[b]{l}#2\\#3\\#4\\\end{tabular} }% }% leftlower \def\ODw@RightUpperText{} \newcommand\rightupper[4][0pt]{% \gdef\ODw@RightUpperText{% \hspace{#1}% \begin{tabular}[t]{l}#2\\#3\\#4\\\end{tabular} }% }% rightupper \def\ODw@RightLowerText{} \newcommand\rightlower[4][0pt]{% \gdef\ODw@RightLowerText{% \hspace{#1}% \begin{tabular}[b]{l}#2\\#3\\#4\\\end{tabular} }% }% rightlower \newcommand{\ODw@ProcessHeader}[1]{% \ifODw@EmptyHeader% Must be this way (StackExchange) \else% |\ifthenelse| bites |\multicolumn|! \multicolumn{#1}{% p{\dimexpr\ODw@Diagram@Width-% 2\tabcolsep-2\arrayrulewidth}% }{{\ODw@LegendFont\ODw@HeaderText}}\\ \fi% }% ODw@ProcessHeader \newcommand{\ODw@TestIfEmpty}[2]{% \ifthenelse{\equal{#1}{}}{% \setboolean{#2}{true}}{% \setboolean{#2}{false}% }% }% ODw@TestIfEmpty \newcommand{\ODw@ProcessFooter}[1]{% \ifODw@EmptyFooter% Must be this way (StackExchange) \else% |\ifthenelse| bites |\multicolumn|! \multicolumn{#1}{% p{\dimexpr\ODw@Diagram@Width% -2\tabcolsep-2\arrayrulewidth}% }{{\ODw@LegendFont\ODw@FooterText}}\\ \fi% }% ODw@ProcessFooter \newcommand\handskip[1]{% \def\ODw@Skipwidth{1em + #1}% recalculate the new Skipwidth \setlength\ODw@Skip@Width{\ODw@Skipwidth}% }% handskip \def\ODw@DealerText{% \bgroup% \ODw@OtherFont\GetTranslation{Dealer-(ODw)}% \egroup% }% ODw@DealerText \NewDocumentCommand\ODw@VulnerText{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF#1{% \IfBooleanTF#2{\GetTranslation{Vul-(ODw)}}% {\GetTranslation{Vulnerable-(ODw)}}% }{% \IfBooleanTF#2{\GetTranslation{vul-(ODw)}}% {\GetTranslation{vulnerable-(ODw)}}% }% \egroup% \xspace% }% ODw@VulnerText \def\ODw@AwardText{\textsf{\GetTranslation{Award-(ODw)}}} \newcommand\dealer[1][]{% \ifthenelse{\equal{#1}{}}% {\ODw@Dealer}% {\gdef\ODw@Dealer{#1}}% }% dealer \def\ODw@Dealer{\North*} \newcommand\vulner[1][]{% \ifthenelse{\equal{#1}{}}% {\ODw@Vulner}% {\gdef\ODw@Vulner{#1}}% }% vulner \def\ODw@Vulner{\NorthSouth} \newcommand\dealertext[1][\ODw@Dealer]{\ODw@DealerText:\,#1} \newcommand\vulnertext[1][\ODw@Vulner]{% \ifODw@LongCalls% \ODw@VulnerText*% \else% \ODw@VulnerText*!% \fi% :\,#1% } \newcommand{\alert}{{}\ensuremath{^\textbf{*}}} \newcommand{\announce}{{}\ensuremath{^\textbf{\smaller A}}} \newcommand\markit{% \stepcounter{ODw@Nr}% \footnotemark[\theODw@Nr]% }% markit \newcommand\explainit[1]{% \stepcounter{ODw@Nr}% \ensuremath{{}^\textrm{\smaller\alph{ODw@Nr}}}\,#1% }% explainit \newcolumntype{B}{% for Biddings >{\collectcell\ODw@BTfer}c<{\endcollectcell}} \newcolumntype{F}{% for First column in |play| diagrams >{\collectcell\ODw@FTfer}c<{\endcollectcell}} \newcolumntype{P}{% for |Play| diagrams (2nd--4th column) >{\collectcell\ODw@PTfer}c<{\endcollectcell}} \NewEnviron{ODw@Bidding}[2][t]{% \def\xspace{}% \setlength\tabcolsep{0.2em}% \sbox{0}{% \begin{tabular}[#1]{BBBB}% 1st column \ifODw@Bidders% \cci{ % there MUST be a ' ' (space) \ODw@BidderFont% \ifODw@short\ODw@BidderI% \else\ODw@BidderI*% \fi% } &% 2nd column \cci{ % there MUST be a ' ' (space) \ODw@BidderFont% \ifODw@short\ODw@BidderII% \else\ODw@BidderII*% \fi% } &% 3rd column \cci{ % there MUST be a ' ' (space) \ODw@BidderFont% \ifODw@short\ODw@BidderIII% \else\ODw@BidderIII*% \fi% } &% 4th column \cci{ % there MUST be a ' ' (space) \ODw@BidderFont% \ifODw@short\ODw@BidderIV% \else\ODw@BidderIV*% \fi% } \\% end of 1st row \if\ODw@All@Names\empty% \else% 2nd row \cci{ \ODw@NameFont\ODw@NameI} &% please \cci{ \ODw@NameFont\ODw@NameII} &% mind \cci{ \ODw@NameFont\ODw@NameIII} &% the \cci{ \ODw@NameFont\ODw@NameIV} \\% spaces! \fi% \ifODw@BidLine\hline\fi% \fi% \BODY% %%%%%% \end{tabular}% }% sbox0 \setcounter{ODw@Nr}{0}% \setlength{\ODw@Bid@Width}{\wd0}% \global\sbox\ODw@BidBox{% \begin{tabular}[#1]{BBBB}% 1st column \ifODw@Bidders% \cci{ % there MUST be a ' ' (space) \ODw@BidderFont% \ifODw@short\ODw@BidderI% \else\ODw@BidderI*% \fi% } &% 2nd column \cci{ % there MUST be a ' ' (space) \ODw@BidderFont% \ifODw@short\ODw@BidderII% \else\ODw@BidderII*% \fi% } &% 3rd column \cci{ % there MUST be a ' ' (space) \ODw@BidderFont% \ifODw@short\ODw@BidderIII% \else\ODw@BidderIII*% \fi% } &% 4th column \cci{ % there MUST be a ' ' (space) \ODw@BidderFont% \ifODw@short\ODw@BidderIV% \else\ODw@BidderIV*% \fi% } \\% end of 1st row \if\ODw@All@Names\empty% \else% 2nd row \cci{ \ODw@NameFont\ODw@NameI} &% please \cci{ \ODw@NameFont\ODw@NameII} &% mind \cci{ \ODw@NameFont\ODw@NameIII} &% the \cci{ \ODw@NameFont\ODw@NameIV} \\% spaces! \fi% \ifODw@BidLine\hline\fi% \fi \BODY% %%%%% Until here the same code as in the sbox! \ifODw@description% % Add the description, if not empty \hline% \multicolumn{4}{% span explanations over 4 cols... p{\dimexpr\ODw@Bid@Width-2\tabcolsep}% }{% ...with the right width \setcounter{ODw@Nr}{0}% \raggedright% \smaller\smaller#2% }\\% \fi% \end{tabular}% }% sbox ODw@BidBox }% ODw@Bidding \NewEnviron{ODw@Biddingpair}[2][t]{% \def\xspace{}% \setlength\tabcolsep{0.2em}% \sbox{0}{% \begin{tabular}[#1]{BB}% 1st column \ifODw@Bidders% \cci{ % there MUST be a ' ' (space) \ODw@BidderFont% \ifODw@short\ODw@BidderI% \else\ODw@BidderI*% \fi% } &% 2nd column \cci{ % there MUST be a ' ' (space) \ODw@BidderFont% \ifODw@short\ODw@BidderIII% \else\ODw@BidderIII*% \fi% } \\% end of 1st row \if\ODw@All@Names\empty% \else% 2nd row \cci{ \ODw@NameFont\ODw@NameI} &% please mind \cci{ \ODw@NameFont\ODw@NameIII} \\% the spaces! \fi% \ifODw@BidLine\hline\fi% \fi% \BODY% %%%%%%% \end{tabular}% }% sbox0 \setcounter{ODw@Nr}{0}% \setlength{\ODw@Bid@Width}{\wd0}% \global\sbox\ODw@BidBox{% \begin{tabular}[#1]{BB}% 1st column \ifODw@Bidders% \cci{ % there MUST be a ' ' (space) \ODw@BidderFont% \ifODw@short\ODw@BidderI% \else\ODw@BidderI*% \fi% } &% 2nd column \cci{ % there MUST be a ' ' (space) \ODw@BidderFont% \ifODw@short\ODw@BidderIII% \else\ODw@BidderIII*% \fi% } \\% end of 1st row \if\ODw@All@Names\empty% \else% 2nd row \cci{ \ODw@NameFont\ODw@NameI} &% please mind \cci{ \ODw@NameFont\ODw@NameIII} \\% the spaces! \fi% \ifODw@BidLine\hline\fi% \fi% \BODY% %%%%%% Until here the same code as in the sbox! \ifODw@description% % Add the description, if not empty \hline% \multicolumn{2}{% p{\dimexpr\ODw@Bid@Width-2\tabcolsep}% }{% \setcounter{ODw@Nr}{0}% \raggedright% \smaller\smaller#2% }\\% \fi% \end{tabular}% }% sbox ODw@BidBox }% ODw@Biddingpair \NewDocumentEnvironment{bidding}{s t! t- O{c}d()}{% \ODw@GameSize% \renewcommand{\thefootnote}{\alph{footnote}}% \setcounter{ODw@Nr}{0}% \IfBooleanTF#1{\center}{}% "*" detected \IfBooleanTF{#2}{\ODw@shorttrue}{}% "!" detected \IfValueTF{#5}{\ODw@descriptiontrue}{\ODw@descriptionfalse}% \ODw@Bidding[#4]{#5}% }{% \endODw@Bidding% \IfBooleanTF{#3}% {\rule{0pt}{0pt}}% % +---without this, pdflatex aborts compilation! {\usebox{\ODw@BidBox}}% "-" detected \IfBooleanTF#1{\endcenter}{}% }% bidding \NewDocumentEnvironment{biddingpair}{s t! t- O{c}d()}{% \def\xspace{}% \ODw@GameSize% \renewcommand{\thefootnote}{\alph{footnote}}% \setcounter{ODw@Nr}{0}% \IfBooleanTF#1{\center}{}% "*" detected \IfBooleanTF{#2}{\ODw@shorttrue}{}% "+" detected \IfValueTF{#5}{\ODw@descriptiontrue}{\ODw@descriptionfalse}% \ODw@Biddingpair[#4]{#5}% }{% \endODw@Biddingpair% \IfBooleanTF{#3}% {\rule{0pt}{0pt}}% % +---without this, pdflatex aborts compilation! {\usebox{\ODw@BidBox}}% "-" detected \IfBooleanTF#1{\endcenter}{}% }% biddingpair \def\ODw@AccTricks{% \ODw@LastTrick{\ODw@Last}{\theODw@WinningNr}% \ODw@append{\theODw@NSCnt,\theODw@EWCnt,}% store counters \setcounter{ODw@Highest}{0}% reset for next trick }% ODw@AccTricks \def\ODw@Tricks{% \setcounter{ODw@PlayerNr}{0}% \gdef\ODw@Last{\ODw@NextLead}% \expandafter\GetTranslation% \expandafter{\ODw@NextLead-(ODw)}:\,% }% ODw@Tricks \newcommand\ODw@LastTrick[2]{% \IfEqCase{#1}{% {W}{\setcounter{ODw@Cnt}{0}}% {N}{\setcounter{ODw@Cnt}{1}}% {E}{\setcounter{ODw@Cnt}{2}}% {S}{\setcounter{ODw@Cnt}{3}}% }% IfEqCase \addtocounter{ODw@Cnt}{#2}% \IfEqCase{\theODw@Cnt}{% {1}{\gdef\ODw@NextLead{W}\stepcounter{ODw@EWCnt}} {2}{\gdef\ODw@NextLead{N}\stepcounter{ODw@NSCnt}} {3}{\gdef\ODw@NextLead{E}\stepcounter{ODw@EWCnt}} {4}{\gdef\ODw@NextLead{S}\stepcounter{ODw@NSCnt}} {5}{\gdef\ODw@NextLead{W}\stepcounter{ODw@EWCnt}} {6}{\gdef\ODw@NextLead{N}\stepcounter{ODw@NSCnt}} {7}{\gdef\ODw@NextLead{E}\stepcounter{ODw@EWCnt}} }% IfEqCase }% ODw@LastTrick \NewDocumentEnvironment{play}{s mO{N}}{% \def\ODw@TrumpSuit{#3} \gdef\ODw@NextLead{#2}% \setcounter{ODw@Nr}{0}% \setcounter{ODw@NSCnt}{0} \setcounter{ODw@EWCnt}{0}% \ODw@GameSize% \ODw@Scratch{}% make empty \let\ODw@Clubs\empty% \let\ODw@Diamonds\empty% \let\ODw@Hearts\empty% \let\ODw@Spades\empty% \def\ODw@EXtra{0.9em}% white space in title \provideenvironment{TableII}{% \begin{tabular}[b]{FPPP}% \multicolumn{1}{c}{\GetTranslation{Lead!-(ODw)}} &% \cci{\GetTranslation{2nd-(ODw)}} &% \cci{\GetTranslation{3rd-(ODw)}} &% \cci{\GetTranslation{4th-(ODw)}} \\[0.3em]\hline% \multicolumn{4}{c}{}\\[-\ODw@EXtra]% }{% \end{tabular}% }% TableII \begin{lrbox}{0}% save TableII for later \begin{TableII} }{% \end{TableII} \end{lrbox}% % Check consistency of the played cards \ODw@ChkSameCards{\ODw@Spades}{\Sp}% \ODw@ChkSameCards{\ODw@Hearts}{\He}% \ODw@ChkSameCards{\ODw@Diamonds}{\Di}% \ODw@ChkSameCards{\ODw@Clubs}{\Cl}% \setcounter{ODw@Cnt}{0}% \IfBooleanTF#1{\begin{center}}{}% \begin{tabular}[b]{r}% TableI \cci{\GetTranslation{Nr-(ODw)}}\\[0.3em] \hline\\[-\ODw@EXtra]% \setcounter{ODw@Cnt}{1}% \whiledo{\theODw@Cnt<\theODw@Nr}{% \theODw@Cnt\\ \stepcounter{ODw@Cnt}% }% \theODw@Cnt\\% MUST be outside the loop % (the extra line problem]! \end{tabular}% \usebox{0}% \setcounter{ODw@Nr}{0}% \renewcommand*{\do}[1]{% \ifnumequal{\value{ODw@Nr}}{2}{\\\setcounter{ODw@Nr}{0}}{}% \stepcounter{ODw@Nr}% ##1 \ifnumequal{\value{ODw@Nr}}{2}{}{&}% }% \begin{tabular}[b]{|cc}% TableIII \multicolumn{1}{|c}{% \cci{\scriptsize\shortstack[c]{\North*!\\\South*!}}} &% \multicolumn{1}{c}{% \cci{\scriptsize\shortstack[c]{\East*!\\\West*!}}% }\\\hline\\[-\ODw@EXtra]% \expandafter\docsvlist\expandafter{\the\ODw@Scratch}% \end{tabular}% \IfBooleanTF#1{\end{center}}{}% }% play \NewDocumentCommand\ODw@CondNewLine{O{0em}}{% {\ODw@GameFont% needed to relate skips to the font-size \setlength{\ODw@Tmp@Len}{\ODw@Bid@Width}% \addtolength{\ODw@Tmp@Len}{\ODw@Diagram@Width}% \addtolength{\ODw@Tmp@Len}{#1}% \addtolength{\ODw@Tmp@Len}{\ODw@Skip@Width}% \ifthenelse{\lengthtest{\ODw@Tmp@Len > \textwidth}}{% \\[1em]}{% \hspace{\ODw@Skip@Width}% }% }% }% ODw@CondNewLine \NewDocumentCommand\expertquiz{st! O{}m}{% \noindent% \IfBooleanTF#1{\begin{center}}% "*" detected {\par\vspace{0.5\baselineskip}}% \bgroup% keep font changes local (e.g. "\smaller"). \ODw@LegendFont% \ifx#3\empty\else#3\par\fi% \egroup% \IfBooleanTF{#2}{~\hspace*{2em}}{}% "!" detected \usebox{\ODw@Hand@Box}% display the saved hand \IfBooleanTF{#2}{}{\quad}% no "!" detected \setlength\ODw@Tmp@Width{\wd\ODw@BidBox + 1em}% \IfBooleanTF{#2}% {\\}% {\addtolength\ODw@Tmp@Width{\wd\ODw@Hand@Box}}% \usebox{\ODw@BidBox}% display the saved bidding \par\vspace{0.3em}%\noindent% {% keep legendfont and "smaller" local \ODw@LegendFont% \smaller% \IfBooleanTF#1{\bgroup\centering}{}% \parbox[t]{\ODw@Tmp@Width}{% \textbf{\ODw@AwardText: }% \raggedright#4% }% parbox \IfBooleanTF#1{\egroup}{}% }% \IfBooleanTF#1{\end{center}}{}% }% expertquiz \pgfkeys{% /ODw/.is family, /ODw, bidder/.store in = \ODw@BidderDefault, compass/.store in = \ODw@CompassDefault, game/.store in = \ODw@GameDefault, legend/.store in = \ODw@LegendDefault, name/.store in = \ODw@NameDefault, other/.store in = \ODw@OtherDefault, compline/.store in = \ODw@CompLine, compmid/.store in = \ODw@CompMid, compsize/.store in = \ODw@CompSize, } \ODw@set{compshow/.is choice} \ODw@set{compshow/off/.code={\global\ODw@CompShowfalse}} \ODw@set{compshow/on/.code={\global\ODw@CompShowtrue}} \ODw@set{compturn/.is choice} \ODw@set{compturn/off/.code={\global\ODw@CompTurnfalse}} \ODw@set{compturn/on/.code={\global\ODw@CompTurntrue}} \ODw@set{bidders/.is choice} \ODw@set{bidders/off/.code={\global\ODw@Biddersfalse}} \ODw@set{bidders/on/.code={\global\ODw@Bidderstrue}} \ODw@set{bidfirst/.is choice} \ODw@set{bidfirst/N/.code=\ODw@FirstBidCol{N}} \ODw@set{bidfirst/E/.code=\ODw@FirstBidCol{E}} \ODw@set{bidfirst/S/.code=\ODw@FirstBidCol{S}} \ODw@set{bidfirst/W/.code=\ODw@FirstBidCol{W}} \ODw@set{bidline/.is choice} \ODw@set{bidline/off/.code={\global\ODw@BidLinefalse}} \ODw@set{bidline/on/.code={\global\ODw@BidLinetrue}} \ODw@set{bidlong/.is choice} \ODw@set{bidlong/off/.code={\global\ODw@LongCallsfalse}} \ODw@set{bidlong/on/.code={\global\ODw@LongCallstrue}} \ODw@set{compshow/1/.code={\pgfkeys{/ODw/compshow=on}}} \ODw@set{compshow/true/.code={\pgfkeys{/ODw/compshow=on}}} \ODw@set{compturn/1/.code={\pgfkeys{/ODw/compturn=on}}} \ODw@set{compturn/true/.code={\pgfkeys{/ODw/compturn=on}}} \ODw@set{bidline/1/.code={\pgfkeys{/ODw/bidline=on}}} \ODw@set{bidders/true/.code={\pgfkeys{/ODw/bidders=on}}} \ODw@set{bidders/1/.code={\pgfkeys{/ODw/bidders=on}}} \ODw@set{bidline/true/.code={\pgfkeys{/ODw/bidline=on}}} \ODw@set{bidlong/1/.code={\pgfkeys{/ODw/bidlong=on}}} \ODw@set{bidlong/true/.code={\pgfkeys{/ODw/bidlong=on}}} \ODw@set{compshow/0/.code={\pgfkeys{/ODw/compshow=off}}} \ODw@set{compshow/false/.code={\pgfkeys{/ODw/compshow=off}}} \ODw@set{compturn/0/.code={\pgfkeys{/ODw/compturn=off}}} \ODw@set{compturn/false/.code={\pgfkeys{/ODw/compturn=off}}} \ODw@set{bidders/0/.code={\pgfkeys{/ODw/bidders=off}}} \ODw@set{bidders/false/.code={\pgfkeys{/ODw/bidders=off}}} \ODw@set{bidline/0/.code={\pgfkeys{/ODw/bidline=off}}} \ODw@set{bidline/false/.code={\pgfkeys{/ODw/bidline=off}}} \ODw@set{bidlong/0/.code={\pgfkeys{/ODw/bidlong=off}}} \ODw@set{bidlong/false/.code={\pgfkeys{/ODw/bidlong=off}}} \newcommand\resetfonts{% \bidderfont{\ODw@BidderDefault}% \compassfont{\ODw@CompassDefault}% \gamefont{\ODw@GameDefault}% \legendfont{\ODw@LegendDefault}% \namefont{\ODw@NameDefault}% \otherfont{\ODw@OtherDefault}% }% resetfonts \NewDocumentCommand\setdefaults{s m}{% \pgfkeys{/ODw,#2}% \IfBooleanTF{#1}{\resetfonts}{}% }% setdefaults \newcommand\newgame{% \boardnr{0}% \headlinetext{}% \footlinetext{}% \gdef\ODw@LeftUpperText{}% \gdef\ODw@LeftLowerText{}% \gdef\ODw@RightUpperText{}% \gdef\ODw@RightLowerText{}% \gdef\ODw@Nhand{\ODw@hand{t}{}{}{}{}}% \gdef\ODw@Ehand{\ODw@hand{c}{}{}{}{}}% \gdef\ODw@Shand{\ODw@hand{b}{}{}{}{}}% \gdef\ODw@Whand{\ODw@hand{c}{}{}{}{}}% \namesNS{}{}\namesEW{}{}% \gdef\ODw@Spades{}% \gdef\ODw@Hearts{}% \gdef\ODw@Diamonds{}% \gdef\ODw@Clubs{}% \gdef\ODw@NSpades{}\gdef\ODw@ESpades{}% \gdef\ODw@SSpades{}\gdef\ODw@WSpades{}% \gdef\ODw@NHearts{}\gdef\ODw@EHearts{}% \gdef\ODw@SHearts{}\gdef\ODw@WHearts{}% \gdef\ODw@NDiamonds{}\gdef\ODw@EDiamonds{}% \gdef\ODw@SDiamonds{}\gdef\ODw@WDiamonds{}% \gdef\ODw@NClubs{}\gdef\ODw@EClubs{}% \gdef\ODw@SClubs{}\gdef\ODw@WClubs{}% }% newgame \newcommand\ODw@ChkNrOfCards[2]{% \StrDel{#1}{-}[\ODw@CardStr]% remove voids \StrLen{\ODw@CardStr}[\ODw@CardLen]% \ifthenelse{\ODw@CardLen > 13}{% \ODw@Error{#2 has \ODw@CardLen{} cards}% }{% \ifthenelse{\ODw@CardLen < 13}{% \ODw@Warning{#2 has \ODw@CardLen{} cards}% }{}% }% }% ODw@ChkNrOfCards \newcommand\ODw@PrErr[3]{% \bgroup% \if#1T\def\ODw@T{10}\else\def\ODw@T{#1}\fi% \ifthenelse{#2 > 1}{% \ODw@Error{Card #3\,\ODw@T{} occurs #2 times}% }{% \ifthenelse{#2 = 0}{% \ODw@Warning{Card #3\,\ODw@T{} fails}}{}% }% \egroup% }% ODw@PrErr \newcommand\ODw@ChkSameCards[2]{% \StrDel{#1}{-}[\ODw@CardStr]% \StrCount{\ODw@CardStr}{2}[\ODw@CCnt]\ODw@PrErr{2}{\ODw@CCnt}{#2}% \StrCount{\ODw@CardStr}{3}[\ODw@CCnt]\ODw@PrErr{3}{\ODw@CCnt}{#2}% \StrCount{\ODw@CardStr}{4}[\ODw@CCnt]\ODw@PrErr{4}{\ODw@CCnt}{#2}% \StrCount{\ODw@CardStr}{5}[\ODw@CCnt]\ODw@PrErr{5}{\ODw@CCnt}{#2}% \StrCount{\ODw@CardStr}{6}[\ODw@CCnt]\ODw@PrErr{6}{\ODw@CCnt}{#2}% \StrCount{\ODw@CardStr}{7}[\ODw@CCnt]\ODw@PrErr{7}{\ODw@CCnt}{#2}% \StrCount{\ODw@CardStr}{8}[\ODw@CCnt]\ODw@PrErr{8}{\ODw@CCnt}{#2}% \StrCount{\ODw@CardStr}{9}[\ODw@CCnt]\ODw@PrErr{9}{\ODw@CCnt}{#2}% \StrCount{\ODw@CardStr}{T}[\ODw@CCnt]\ODw@PrErr{T}{\ODw@CCnt}{#2}% \StrCount{\ODw@CardStr}{J}[\ODw@CCnt]\ODw@PrErr{J}{\ODw@CCnt}{#2}% \StrCount{\ODw@CardStr}{Q}[\ODw@CCnt]\ODw@PrErr{Q}{\ODw@CCnt}{#2}% \StrCount{\ODw@CardStr}{K}[\ODw@CCnt]\ODw@PrErr{K}{\ODw@CCnt}{#2}% \StrCount{\ODw@CardStr}{A}[\ODw@CCnt]\ODw@PrErr{A}{\ODw@CCnt}{#2}% }% ODw@ChkSameCards \newbool{ODw@Warnings} \newbool{ODw@Errors} \ODw@set{warn/off/.code={% \global\setbool{ODw@Warnings}{false}}} \ODw@set{warn/on/.code={% \global\setbool{ODw@Warnings}{true}}} \ODw@set{err/off/.code={% \global\setbool{ODw@Errors}{false}}} \ODw@set{err/on/.code={% \global\setbool{ODw@Errors}{true}}} \ODw@set{warn=off} \ODw@set{err=on} \ProcessPgfOptions{/ODw} \newcommand\ODw@Error[1]{% \ifbool{ODw@Errors}{% \par\textcolor{red}{Error: #1}\par}{}% }% ODw@Error \newcommand\ODw@Warning[1]{% \ifbool{ODw@Warnings}{% \par\textcolor{blue}{Warning: #1}\par}{}% }% ODw@Warning \NewDocumentCommand{\Ace}{s t!}{% \bgroup% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\GetTranslation{A-(ODw)}}% {\GetTranslation{Ace-(ODw)}}% }{% \IfBooleanTF{#2}% {\GetTranslation{a-(ODw)}}% {\GetTranslation{ace-(ODw)}}% }% \egroup% \xspace% }% Ace \def\ace{\Ace*!} \NewDocumentCommand{\King}{s t!}{% \bgroup% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\GetTranslation{K-(ODw)}}% {\GetTranslation{King-(ODw)}}% }{% \IfBooleanTF{#2}% {\GetTranslation{k-(ODw)}}% {\GetTranslation{king-(ODw)}}% }% \egroup% \xspace% }% King \def\king{\King*!} \NewDocumentCommand{\Queen}{s t!}{% \bgroup% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\GetTranslation{Q-(ODw)}}% {\GetTranslation{Queen-(ODw)}}% }{% \IfBooleanTF{#2}% {\GetTranslation{q-(ODw)}}% {\GetTranslation{queen-(ODw)}}% }% \egroup% \xspace% }% Queen \def\queen{\Queen*!} \NewDocumentCommand{\Jack}{s t!}{% \bgroup% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\GetTranslation{J-(ODw)}}% {\GetTranslation{Jack-(ODw)}}% }{% \IfBooleanTF{#2}% {\GetTranslation{j-(ODw)}}% {\GetTranslation{jack-(ODw)}}% }% \egroup% \xspace% }% Jack \def\jack{\Jack*!} \NewDocumentCommand{\All}{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\GetTranslation{All!-(ODw)}}% {\GetTranslation{All-(ODw)}}% }{% \IfBooleanTF{#2}% {\GetTranslation{all!-(ODw)}}% {\GetTranslation{all-(ODw)}}% }% \egroup% \xspace% }% All \def\all{\All*} \NewDocumentCommand{\None}{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\GetTranslation{None!-(ODw)}}% {\GetTranslation{None-(ODw)}}% }{% \IfBooleanTF{#2}% {\GetTranslation{none!-(ODw)}}% {\GetTranslation{none-(ODw)}}% }% \egroup% \xspace% }% None \def\none{\None*} %% \end{macrocode} \NewDocumentCommand{\Contract}{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\GetTranslation{Contr-(ODw)}}% {\GetTranslation{Contract-(ODw)}}% }{% \IfBooleanTF{#2}% {\GetTranslation{contr-(ODw)}}% {\GetTranslation{contract-(ODw)}}% }% \egroup% \xspace% }% Contract \def\contract{\Contract*} %% \end{macrocode} \NewDocumentCommand{\Lead}{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\GetTranslation{Lead!-(ODw)}}% {\GetTranslation{Lead-(ODw)}}% }{% else #1 \IfBooleanTF{#2}% {\GetTranslation{lead!-(ODw)}}% {\GetTranslation{lead-(ODw)}}% }% #1 \egroup% \xspace% }% Lead \def\lead{\Lead*} %% \end{macrocode} \NewDocumentCommand{\Declarer}{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\GetTranslation{Decl-(ODw)}}% {\GetTranslation{Declarer-(ODw)}}% }{% \IfBooleanTF{#2}% {\GetTranslation{decl-(ODw)}}% {\GetTranslation{declarer-(ODw)}}% }% \egroup% \xspace% }% Declarer \def\declarer{\Declarer*} %% \end{macrocode} \newcommand\by{% \bgroup% \ODw@OtherFont% \GetTranslation{by-(ODw)}% \egroup% \xspace% }% by \NewDocumentCommand{\Board}{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\GetTranslation{Brd-(ODw)}}% {\GetTranslation{Board-(ODw)}}% }{% \IfBooleanTF{#2}% {\GetTranslation{brd-(ODw)}}% {\GetTranslation{board-(ODw)}}% }% \egroup% \xspace% }% Board \def\board{\Board*} %% \end{macrocode} \NewDocumentCommand{\Deal}{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\GetTranslation{Deal!-(ODw)}}% {\GetTranslation{Deal-(ODw)}}% }{% \IfBooleanTF{#2}% {\GetTranslation{deal!-(ODw)}}% {\GetTranslation{deal-(ODw)}}% }% \egroup% \xspace% }% Deal \def\deal{\Deal*} %% \end{macrocode} \NewDocumentCommand{\doubled}{s}{% \bgroup% \ODw@OtherFont% \IfBooleanTF{#1}{% \GetTranslation{Doubled-(ODw)}}{% \GetTranslation{doubled-(ODw)}% }% \egroup% \xspace% }% doubled \NewDocumentCommand{\redoubled}{s}{% \bgroup% \ODw@OtherFont% \IfBooleanTF{#1}{% \GetTranslation{Redoubled-(ODw)}}{% \GetTranslation{redoubled-(ODw)}% }% \egroup% \xspace% }% redoubled \NewDocumentCommand{\hpts}{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\GetTranslation{HCP-(ODw)}}% {\GetTranslation{High Card Points-(ODw)}}% }{% \IfBooleanTF{#2}% {\GetTranslation{hcp-(ODw)}}% {\GetTranslation{high card points-(ODw)}}% }% \egroup% \xspace% }% High Card Points \def\HCP{\hpts*!} \NewDocumentCommand{\lpts}{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\GetTranslation{LP-(ODw)}}% {\GetTranslation{Length Points-(ODw)}}% }{% \IfBooleanTF{#2}% {\GetTranslation{lp-(ODw)}}% {\GetTranslation{length points-(ODw)}}% }% \egroup% \xspace% }% Length Points \def\LP{\lpts*!} \NewDocumentCommand{\dpts}{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\GetTranslation{DP-(ODw)}}% {\GetTranslation{Distribution Points-(ODw)}}% }{% \IfBooleanTF{#2}% {\GetTranslation{dp-(ODw)}}% {\GetTranslation{distribution points-(ODw)}}% }% \egroup% \xspace% }% Distribution Points \def\DP{\dpts*!} \NewDocumentCommand{\tpts}{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\GetTranslation{TP-(ODw)}}% {\GetTranslation{Total Points-(ODw)}}% }{% \IfBooleanTF{#2}% {\GetTranslation{tp-(ODw)}}% {\GetTranslation{total points-(ODw)}}% }% \egroup% \xspace% }% Total Points \def\TP{\tpts*!} \NewDocumentCommand{\gforce}{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\GetTranslation{GF-(ODw)}}% {\GetTranslation{Game Forcing-(ODw)}}% }{% \IfBooleanTF{#2}% {\GetTranslation{gf-(ODw)}}% {\GetTranslation{game forcing-(ODw)}}% }% \egroup% \xspace% }% Game Forcing \def\GF{\gforce*!} \NewDocumentCommand{\sforce}{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\GetTranslation{SF-(ODw)}}% {\GetTranslation{Semi Forcing-(ODw)}}% }{% \IfBooleanTF{#2}% {\GetTranslation{sf-(ODw)}}% {\GetTranslation{semi forcing-(ODw)}}% }% \egroup% \xspace% }% Semi Forcing \def\SF{\sforce*!} \NewDocumentCommand{\nmforce}{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\GetTranslation{NMF-(ODw)}}% {\GetTranslation{New Minor Forcing-(ODw)}}% }{% \IfBooleanTF{#2}% {\GetTranslation{nmf-(ODw)}}% {\GetTranslation{new minor forcing-(ODw)}}% }% \egroup% \xspace% }% New Minor Forcing \def\NMF{\nmforce*!} \NewDocumentCommand{\tsforce}{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\GetTranslation{TSF-(ODw)}}% {\GetTranslation{Third Suit Forcing-(ODw)}}% }{% \IfBooleanTF{#2}% {\GetTranslation{tsf-(ODw)}}% {\GetTranslation{third suit forcing-(ODw)}}% }% \egroup% \xspace% }% Third Suit Forcing \def\TSF{\tsforce*!} \NewDocumentCommand{\fsforce}{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\GetTranslation{FSF-(ODw)}}% {\GetTranslation{Fourth Suit Forcing-(ODw)}}% }{% \IfBooleanTF{#2}% {\GetTranslation{fsf-(ODw)}}% {\GetTranslation{fourth suit forcing-(ODw)}}% }% \egroup% \xspace% }% Fourth Suit Forcing \def\FSF{\fsforce*!} \newgame \setdefaults{bidder=\mdseries\sffamily} \setdefaults{compass=\mdseries\sffamily} \setdefaults{game=\bfseries\sffamily} \setdefaults{legend=\mdseries\rmfamily} \setdefaults{name=\mdseries\slshape} \setdefaults*{other=\bfseries\sffamily} \setdefaults{compshow=on,compturn=off} \setdefaults{bidfirst=W,bidders=on,bidlong=on} \AtBeginDocument{% \ForEachTrackedLanguage{\thislang}{% \ifthenelse{\equal{\thislang}{norsk}}% {\def\thislang{norwegian}}{}% \IfFileExists{ODw-\thislang.trsl}% {% \LoadDictionaryFor{\thislang}{ODw}% \PackageInfo{ODw}{% Translation dictionary ODw-\thislang.trsl loaded% }% }{% \PackageWarning{ODw}{% Translation dictionary ODw-\thislang.trsl not found% }% }% }% ForEach }% AtBeginDocument \endinput% onedown.sty \endinput %% %% End of file `onedown.sty'.