% \iffalse meta-comment % % Copyright (C) 2018 by Jacob Wiersma % --------------------------------------------------------------------------- % This work 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. % % This work has the LPPL maintenance status `maintained'. % % The Current Maintainer of this work is Jacob Wiersma. % % This work consists of the files onedown.dtx and onedown.ins % and the derived filebase onedown.sty. % % \fi % % \iffalse %<*driver> \ProvidesFile{onedown.dtx} % %\NeedsTeXFormat{LaTeX2e}[2014/05/01] %\def\ODwstyleversion{1.7}\def\ODwstyledate{2023/12/07} %\ProvidesPackage{onedown} % [\ODwstyledate\space v\ODwstyleversion\space % Typeset Bridge Diagrams - Jacob Wiersma (C) 2016-2023] % %<*driver> \PassOptionsToPackage{shorthands=off}{babel} % % with draft no hyperrefs \documentclass[a4paper,12pt,% german,dutch,french,swedish,english]{ltxdoc} % Of all available languages, we use only thes few in some examples % the package |shortvrb| is auto-loaded, providing |...| as shorthand \usepackage[utf8]{inputenc} % \usepackage[T1]{fontenc} \usepackage{babel} \usepackage{onedown}[2023/12/07] \usepackage[normalem]{ulem}% for strikeout todos that are done \usepackage{needspace}% keep contiguous lines on one page \usepackage[inline]{enumitem}% Control various parameters of lists \usepackage{titlesec} \usepackage{verbatimbox}% For env. verbnobox (set font) %\usepackage[hyphens]{url}% for typesetting URLs \setcounter{secnumdepth}{4} \titleformat{\paragraph}{\normalfont\normalsize\bfseries}{\theparagraph}{1em}{} \titlespacing*{\paragraph}{0pt}{3.25ex plus 1ex minus .2ex}{1.5ex plus .2ex} \usepackage[numbered]{hypdoc} % % add '-' and '/' to the list of URL break characters % '/' won't work! % \expandafter\def\expandafter\UrlBreaks\expandafter{\UrlBreaks\do\-\do/\do\/} % % Set a nice color for \MacroDef and \EnvDef. % But not if we want a printout on a monochrome printer % \newboolean{NoColor}% to suppress all colors \AtBeginDocument{% \ifNoColor \setdefaults{colors=b+w} \hypersetup{linkcolor=black,urlcolor=black} \def\ODwcolor{black} \definecolor{defbackgr}{rgb}{1,1,1} \definecolor{optbackgr}{named}{lightgray} \else \def\ODwcolor{red} \definecolor{defbackgr}{rgb}{1,1,0.75} \definecolor{optbackgr}{named}{lime} \fi }% % \newlength\defwidth % % We need to typeset optional args without \meta too! %\newcommand\Oarg[1]{{\ttfamily[}#1{\ttfamily]}} \newcommand\Oarg[1]{\colorbox{optbackgr}{\textbf{#1}}} % \NewDocumentCommand\MacroDef{st+mO{}}{% % \MacroDef* + {macroname}[args] % 1 2 3 4 % #1 flags if macroname is multi-lingual % #2 flags if macroname is put in the list of user commands % #3 is the macroname that we describe % #4 are the possible args of macroname % \bgroup \IfBooleanTF#2{\usercom{#3}}{}% \setlength{\fboxsep}{4pt}\setlength{\fboxrule}{1.25pt}% \setlength\defwidth\linewidth% \addtolength\defwidth{-2\fboxrule}% \addtolength\defwidth{-2\fboxsep}% \fcolorbox{black}{defbackgr}{% \makebox[\defwidth][l]{% \IfBooleanTF#1{\ML}{}% \texttt{\footnotesize\bs#3#4}% }% }% \par\vspace{0.5\baselineskip}\noindent% \egroup }% MacroDef % \NewDocumentCommand\EnvDef{st+mO{}}{% % \EnvDef* + {env-name}[args] % #1 #2 #3 #4 % #1 flags if env-name is multi-lingual % #2 flags if env-name is put in the list of user commands % #3 is the env-name that we describe % #4 are the possible args of env-name % \bgroup \IfBooleanTF#2{\usercom[]{#3 (env)}}{}% \setlength{\fboxsep}{4pt}\setlength{\fboxrule}{1.25pt}% \setlength\defwidth\linewidth% \addtolength\defwidth{-2\fboxrule}% \addtolength\defwidth{-2\fboxsep}% \fcolorbox{black}{defbackgr}{% \makebox[\defwidth][l]{% \IfBooleanTF#1{\ML}{}% \texttt{\footnotesize\bs begin\string{#3\string}#4\ldots\bs end\string{#3\string}} }% }% \par\vspace{0.5\baselineskip}\noindent% \egroup }% EnvDEf % % % Special processing of user commands % % We supply command NAMES, so we must add the \ afterwards, to make it look % like a real command in the index % \newcommand\bs{% \texttt{% \upshape% the itshape of meta screws the backslash \textbackslash% }% }% bs % % \usercom gets the NAME of a command (without \), labels the actual % position and inserts the appropriate hyperref index entry in the UCFile, % whilst adding the \ before the command name. % \newcommand\usercom[2][\noexpand\bs]{% \ifnumequal{\pdfshellescape}{1}{% % restricted shell enabled \label{#2}% \immediate\write\UCFile{% \noexpand\hyperref[#2]{% #1#2, \thepage\noexpand\newline% }% }% }{}% }% usercom % % We write the user commands (on the fly sorted) in file onedown.odw. % We must disable | first and enable it again afterwards % \ifnumequal{\pdfshellescape}{1}{% \newwrite\UCFile \DeleteShortVerb{\|} \immediate\openout\UCFile="| sort -d > \jobname.odw \MakeShortVerb{\|} }{} % % Used to mark MultiLingual macros % \newcommand\ML{\textcolor{\ODwcolor}{\textsc{\tiny ML}}\xspace} % % Typeset package names % \newcommand\packname[1]{\texttt{#1}\xspace} % % Write our own package name a bit special % \newcommand\OneDown{\textcolor{\ODwcolor}{\smaller\bfseries\textsc{OneDown}}\xspace} % % We translate our multilingual examples % \NewDocumentCommand\Translate{smO{german}}{% \let\xspaceODwold=\xspace% \def\xspace{}% \foreignlanguage{#3}{% \IfBooleanTF#1{\translate{#2-(ODw)}}{#2}% }% \let\xspace=\xspaceODwold% }% Translate % % Put a frame surrounding examples % \newcommand\example[1]{\fbox{#1}} % % End of user-command % \setdefaults*{game=\sffamily\bfseries\footnotesize,% other=\sffamily\bfseries\footnotesize} \AtBeginDocument{\CodelineIndex \EnableCrossrefs} \AtBeginDocument{\RecordChanges} \extrafloats{100} \begin{document} \DocInput{onedown.dtx} \end{document} % % \fi % % \CheckSum{3814} % % \CharacterTable % {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z % Lower-case \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z % Digits \0\1\2\3\4\5\6\7\8\9 % Exclamation \! Double quote \" Hash (number) \# % Dollar \$ Percent \% Ampersand \& % Acute accent \' Left paren \( Right paren \) % Asterisk \* Plus \+ Comma \, % Minus \- Point \. Solidus \/ % Colon \: Semicolon \; Less than \< % Equals \= Greater than \> Question mark \? % Commercial at \@ Left bracket \[ Backslash \\ % Right bracket \] Circumflex \^ Underscore \_ % Grave accent \` Left brace \{ Vertical bar \| % Right brace \} Tilde \~} % % ^^A Commands to be used for the documentations only % % \makeatletter % \def\CP{\ODw@Compass} % \def\Xfer#1{\ODw@Xfer{#1}} % \makeatother % % ^^A We are onedown now with new versioning! % % \changes{v0.1}{2018/01/28}{\\ % - Reorganized the bzr versioning. bzr will contain only onedown, the % former bidnplay stuff is archived. The ToDo and Known-Bugs lists are % cleaned. \\ % - We are version 0.1 now, trying to keep the bzr version number equal to % the changes minor number.} % % \changes{v0.2}{2018/02/12}{\\ % - We finally have a List of User Commands. \\ % - In the compass we can print vulner in red and mark the dealer. We have % a hook \cmd{\CompassMid} to write something in the middle of the % compass.\\ % - Added several macros to auto-translate common stuff like 'lead' etc.\\ % - Added the danish language. \\ % - Corrected a bug in \cmd{\dealer} and \cmd{\vulner}.\\ % - Removed pgf-key 'lang': we now load the needed languages on the fly.\\ % - Finally we revised the documentation.} % % \changes{v0.4}{2018/03/09}{\\ % - Major change in playtricks: the winner is now determined by the cards % played, and code is added to check consistency.\\ % - Dirty coded macros like \cmd{\ODw@symbol} and \cmd{\ODw@(@)Card(s)} are % replaced by neat expl3 code.\\ % - We load necesary dictionaries automatically on the fly and enhanced the % colors options.\\ % - Corrected some minor bugs and reorganized the documentation. \\ % - One can now also generate the documentation without the list of user % commands} % % \changes{v0.5}{2018/03/14}{\\ % - Associated the names and bidders in a fixed way.\\ % - Added checks to onesuitNS/EW.\\ % - Made ODw@OtherFont local where necessary.\\ % - Redefined columntypes.\\ % - Made 'T' a code for '10'.\\ % - Adapted the 'translate' macro to enable both 1H and 1\cmd{\He} etc. \\ % - Enhanced the documentation.} % % \changes{v0.6}{2018/03/14}{\\ % - Made all internal names hidden by adding 'ODw@' to it.\\ % - Changed \cmd{\ODw@AccTricksN} in \cmd{\ODw@AccTricks}.\\ % - Some minor adaptions of the documentation} % % \changes{v0.7}{2018/03/20}{\\ % - Final(?) edits of the documentation: Consequent use of 'card diagram', % 'bidding' diagram and 'play diagram'. \\ % - Corrected some minor bugs. \\ % - Changed the name of the 'playtricks' environment into 'play'.\\ % - Can now disable all colors in the manual for monochrome printing.\\ % - Changed signature of \cmd{\expertquiz} and \cmd{\boardtext}.} % % \changes{v0.7a}{2018/03/24}{\\ % - Major change: Removed all \cmd{\bidXX} and \cmd{\bidXXpair} commands.\\ % - The biddings can now be shown with \cmd{\showXX+} (with token '\texttt{+}').\\ % - The macros \cmd{\hand-} and the bidding environments suppress their % output with token '\texttt{-}'} % % \changes{v0.8}{2018/04/11}{\\ % - Added package \packname{verbatimbox} to adjust verbatim font easily.\\ % - Added \cmd{\setdefaults} with keys for fonts, compass and bidding % diagrams.\\ % - Made \cmd{\FirstBidCol} internally hidden.\\ % - Removed \cmd{\longcalls}, \cmd{\CompassMid}, added \cmd{\compassfont}.\\ % - Changed the order of the hands in \cmd{\onesuitAll}.\\ % - Renewed the implementation of the compass and added extra features.} % % \changes{v0.9}{2018/04/15}{\\ % - Adapted \cmd{\ODwset} and \cmd{\setdefaults}.\\ % - Separated key \emph{messages} into keys \emph{warn} and \emph{err}.\\ % - Adapted \cmd{\ODw@Compass}. \\ % - Removed legends from \cmd{\showNS}.\\ % - Added \cmd{\sbox1} to all \cmd{\showXX} macros with a N-hand.\\ % - Changed ODw@[No]Warnings and ODw@[No]Errors.\\ % - Corrected some minor bugs and adapted the documentation accordingly.} % % \changes{v1.0}{2018/05/23}{\\ % - Adapted the urls, the directories and some filenames to conform to the % CTAN-standard and made the bundle ready for upload. \\ % - Corrected a small bug in \cmd{\ODw@Compass} that was introduced in % v0.9.\\ % - Made all relevant text-writing macros in 4 versions with/without tokens % '*' and '^^21'.\\ % - Corrected a sizing/font bug.\\ % - Added 4 variants of many other text-writing macros, onesuit-NE/NW/.\\ % - Adapted \cmd{\handskip}. \\ % - Added code to work-around a \packname{babel}-\packname{translations} % inconsistency w.r.t. norsk/norwegian.} % % \changes{v1.1}{2018/09/22}{\\ % - Corrected onedown-ref.tex\\ % . Added the missing rows in lines 419-422.\\ % . and the explanational text on line 457.\\ % - Changed in all ODw*.trsl files: The translation of 'pass!' into 'p' and % 'Pass!' into 'P'.\\ % - Corrected some typos in ShowAll.tex:\\ % . \cmd{\contract*} into \cmd{\contract},\\ % . \cmd{\declarer*} into \cmd{\declarer} and\\ % . \cmd{\lead*} into \cmd{\lead}.\\ % - Removed some illegal chars from changes entries.} % \changes{v1.2a}{2018/10/10}{\\ % - Enhanced the documention (both onedown.dtx and onedown-ref.tex: The % command tokens are no longer shown as '[*^^21]', but as '*^^21' with a % different background color.\\ % - Added a thinspace ('\cmd{\,}') before all points counts (HCP, LP, DP % and TP)\\ % - Improved \cmd{\alert} by using \cmd{\textasteriskcentered} rather than % just a '*'\\ % - The changes history has a better layout now \\ % - \cmd{\showNS} and \cmd{\showEW} now can selectively display only the N- % or S-hand, resp the E- or W-hand.} % \changes{v1.2b}{2018/10/31}{\\ % - Corrected a bug: Added \cmd{\ODw@monochromefalse} in all % initializations of multi colors in \cmd{\ODw@set}\\ % - Made all relevant setdefaults settings (like bidfirst) non-global\\ % - Made all \cmd{\ODw@BidderX} and \cmd{\ODw@NameX} non-global\\ % - Removed '\cmd{\global}' from \cmd{\ODw@CompShow} (false and true), % \cmd{\ODw@CompTurn}, \cmd{\ODw@Bidders}, \cmd{\ODw@BidLine} and % \cmd{\ODw@LongCalls}\\ % - In command \cmd{\suit} changed 'JW \cmd{\ODw@GameSize}' into % '\cmd{\ODw@GameSize}'} % \changes{v1.3a}{2019/02/21}{\\ % - Added \cmd{\HLP} \\ % - Changed/Added in all relevant ODw-lang.trsl: \\ % - 'V0.4' into 'V0.4-2018/12/01' \\ % - 'FP' into 'F' , 'fp' into 'f' (entry HCP/hcp) \\ % - 'Figuren-Punkte' into 'Figurenpunkte' , 'figuren-punkte' into 'figurenpunkte' \\ % - 'FL' into 'L' , 'f{}l' into 'l' \\ % - \cmd{\NewDictTranslation\\ \{HLP-(ODw)\}\{FL\}} (german) % } % \changes{v1.3b}{2019/03/16}{\\ % - Added setdefaults to the list of User Commands \\ % - Corrected \cmd{\setdefaults} in onedown-examples: \\ % - changed [~] into \{\} \\ % - Adapted/corrected onedown-ref and onedown-examples \\ % - Added color 'gray' for special effects % } % \changes{v1.4}{2019/10/12}{\\ % - Made \emph{onedown-ref} independent of \emph{onedown-examples} and \emph{subfiles} \\ % - Corrected some mistakes ODw-*.trsl files, all \texttt{V0.51-2019/10/15} \\ % - Added macro \cmd{\Ten} to get rid of the extra enlargment by 'scalefnt' in \cmd{\gamefont} % - Added support for the spanish language \\ % - Made onedown-ref.tex and onedown-examples.tex multilangual. We can output the onedown % commands in all supported languages. \\ % - \cmd{\DeclareSymbolFont \\ \{symbols\}\{OMS\} \{txsy\}\{m\}\{n\}} interferes with package \packname{newtxmath}. % I renamed \emph{symbols} into \textbf{ODw@symbols} and \emph{symbolsC} into \textbf{ODw@symbolsC} % to solve this. % } % \changes{v1.5}{2020/02/02}{\\ % - Added a check if the etoolbox package is recent enough.\\ % - Added code to load onedown.symbols (card symbols) and explained in onedown-examples % (CardSymbols) how to use it. % } % \changes{v1.6}{2021/04/25}{\\ % - Switched to \packname{translator} due to incompatibilities with % \packname{translations}\\ % - We now use \cmd{\translate} rather than \cmd{\GetTranslation}\\ % - Translation files are named like: ODw-German.dict\\ % - Adapted the code to read them on the fly % } % \changes{v1.7}{2023/12/07}{\\ % - Added support for the italian language \\ % - Added an example showing how to define own colors for card symbols % } % ^^A Note: ^^21 denotes the exclamation mark (!) % ^^A Note: Char ' is not allowed within changes % % \DoNotIndex{\newcommand,\newenvironment,\BODY,\boolean,\IfEqCase,\IfInteger, % \DeclareFontSubstitution,\dimexpr,\ifcat,\ifmmode,\IfValueT, % \fontencoding,\fontfamily,\fontseries,\fontshape,\makebox,\StrChar,\StrLen, % \mathord,\mdseries,\NewEnviron,\newif,\mskip,\edef,\rotatebox,\width, % \newsavebox,\noexpand,\rmfamily,\rule,\sbox,\scshape,\put,\real, % \selectfont,\SetSymbolFont,\slshape,\tabcolsep,\color,\cs,\do,\docsvlist, % \thinspace,\usebox,\AtBeginDocument,\begingroup,\endgroup,\unitlength, % \bgroup,\egroup,\IfValueTF,\newcolumntype,\renewrobustcmd} % \DoNotIndex{\@ifstar,\\,\,} % \DoNotIndex{\addtolength,\advance,\alph,\baselineskip,\begin,\bfseries,\macro, % \group,\center,\centering,\clubsuit,\collectcell,\count,\def,\ ,\let, % \diamondsuit,\dimen,\divide,\dpts,\egroup,\else,\empty,\end,\expandafter, % \endcenter,\endcollectcell,\endinput,\ensuremath,\equal,\everypar, % \extracolsep,\fbox,\fboxrule,\fboxsep,\fi,\gdef,\global,\ExplSyntaxOff, % \hangafter,\hangindent,\hbadness,\hbox,\heartsuit,\hfill,\ExplSyntaxOn, % \hline,\hsize,\hskip,\hspace,\hss,\ht,\HUGE,\if,\IfBooleanTF,\moveto, % \ifthenelse,\ifx,\itemsep,\kern,\labelsep,\labelwidth,\large, % \leftmargin,\leftskip,\lengthtest,\uselanguage,\lower, % \mathbf,\medskip,\multicolumn,\NeedsTeXFormat,\newboolean,\numexpr, % \newcounter,\newdimen,\NewDocumentCommand,\strokepath,\closepath, % \NewDocumentEnvironment,\newlength,\noindent,\p@,\par,\whiledo, % \parbox,\parfillskip,\parindent,\parsep,\parskip,\partopsep,\lineto, % \phantom,\ProvidesPackage,\quad,\raggedright,\raisebox,\linethickness, % \relax,\renewcommand,\RequirePackage,\rightmargin,\PackageWarning, % \rightskip,\rlap,\setboolean,\setbox,\setcounter,\setlength, % \settowidth,\sffamily,\smaller,\larger,\space,\spadesuit,\skip@, % \ssmall,\stackbox,\stepcounter,\styledate,\styleversion,\textbf, % \textrm,\textsc,\textsf,\textsl,\textwidth,\thefootnote,\ifnumequal, % \thinspace,\topsep,\typeout,\vspace,\vtop,\wd,\widthof,\IfFileExists, % \xspace,\xspaceaddexceptions,\z@,\PackageWarning,\ForEachTrackedLanguage, % \newtoks,\PackageInfo,\provideenvironment,\str,\textit,\Hoffset,\Voffset, % \the,\thinmuskip,\thislang,\tl,\tmp,\xdef,\PicSize,\MidSize, % } % \DoNotIndex{% % \\,\arrayrulewidth,\addtocounter,\cci,\DeclareMathSymbol,\skip@, % \DeclareSymbolFont,\footnotemark,\footnotesize,\footnotetext,\isodd, % \mathalpha,\pgfkeys,\pgfqkeys,\ProcessPgfOptions,\scriptsize, % \shortstack,\superscript,\textcolor,\thinspace,\tiny,\underline,\value} % \DoNotIndex{\translate,\translation,\ifpdf,\iflanguage,\iffalse,\AfterPackage, % \ifbool,\setbool,\newbool,\StrSubstitute,\StrCount,\StrDel,\ifcase, % \ifboolexpr,\ifnumcomp,\or,\overline,\mbox,\@ODw} % \setcounter{IndexColumns}{2} % ^^A \providecommand*{\url}{\texttt} % ^^A\newcommand{\tasc}{\textbf{\raisebox{-0.7ex}[1ex][0pt]{*}}} % \newcommand{\tasc}{\textbf{\textasteriskcentered}} % ^^A \newcommand{\plus}{\texttt{\larger{\raisebox{-0.25ex}[1ex][0pt]{+}}}} % \newcommand{\plus}{\texttt{\larger{\raisebox{-0.25ex}[1ex][0pt]{+}}}} %^^A set the font for the macros in the margin % \renewcommand{\MacroFont}{\ttfamily\scriptsize} % % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % ^^A We must redefine \verb (from doc.sty), % ^^A because there is no font-changing hook to add \footnotesize % ^^A This is only for the document, not the style file % % \makeatletter % \def\verb{\relax\ifmmode\hbox\else\leavevmode\null\fi % \bgroup \let\do\do@noligs \verbatim@nolig@list % \ttfamily\footnotesize \verb@eol@error \let\do\@makeother \dospecials % \@ifstar{\@sverb}{\@vobeyspaces \frenchspacing \@sverb}} % % \newcommand\ODwBox{\ODw@Box\xspace} % % \makeatother % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % \GetFileInfo{onedown.sty} % \title{The \OneDown package\\[0.5em] % \normalsize\url{www.ctan.org/pkg/onedown} % ^^A The frustrating ltxdoc also obfuscates this simple thing! % \thispagestyle{empty} % } % \author{Jacob Wiersma \\ \url{jack46@schuli-wirsi.de}} % \date{v\ODwstyleversion~from \ODwstyledate} % % \maketitle % { % \gamefont{\sffamily\bfseries\large} % \otherfont{\rmfamily\bfseries\normalsize} % \setdefaults{bidfirst=S,bidlong=on,err=on,warn=on} % \hfill % \frame{ % \setdefaults{bidlong=off} % \parbox{22em}{ % \northhand{A32}{QJT}{KQJT9}{QJ} % \southhand{KQJT}{9876}{A8}{AK2} % \westhand{8765}{AK}{732}{T987} % \easthand{94}{5432}{654}{6543} % \dealer[\South*!]\vulner[\NorthSouth*!] % \leftupper{\dealertext}{\vulnertext}{} % \showAll* % % \begin{bidding}*(\explainit{15--17}\\\explainit{quantitative}) % 1N\markit & p & 4N\markit & p \\ % 6N & X & {\Allpass*} \\ % \end{bidding} % % \setdefaults{warn=off} % % \begin{play}*{W} % HK & T & 2 & 6 \\ % HA & J & 3 & 7 \\ % \end{play} % } % } % \hfill % } % \setdefaults*{} % \newpage % \begin{abstract}\noindent % This package implements commands and environments to typeset various bridge % diagrams, with or without a |bidding| sequence. It offers following % features: % \begin{itemize} % \item It is possible to use an own font and/or a font-size with which the % diagrams will be typeset independently from the main font used in the % document. This also allows an easy production of overhead slides and for % digital projection. Different fonts can be used for e.g.\ the bidding % diagram, its header, the compass, the hands etc. Most diagrams can be % centered both horizontally and vertically. % % \item A special feature is the automated check on consistency of suits % and hands. If a hand holds more than 13 cards an error is printed, if there % are less then 13 cards a warning. If a suit over the 4 hands has more % than 13 cards or if a card appears more than once an error like % \example{\textcolor{\ODwcolor}{Error: Card \Sp\,8 occurs 2 times}} is printed. % These warnings and error messages are controlled by the |err| and |warn| % options, e.g.\ when loading the package. % % \item The output of the implemented bridge terms like \example{\double} % (which you get by calling the command |\double|) are multilingual % and get translated automatically. When the language |german| is % active the command |\double| would produce % \example{\Translate{\double}}. Also the basic symbols like A(ce), % K(ing), Q(ueen) and J(ack) are multilingual. So % \example{\suit[\Di]{AKQJ}} would automatically become % \example{\Translate{\suit[\Di\,]{AKQJ}}} in a German text. % % \item It is possible to add annotations to a card diagram, like the % board number, the dealer or the vulnerability etc.\ on several positions % in the diagram (if a board number is given, the dealer and vulnerability % are computed automatically). One can also add explanations to the % |bidding| diagram, as well as the real world names of the bidders. % % \item There are two specials: a command to typeset a quiz with answers, % and an environment to typeset the sequence of playing tricks, where also % the total number of tricks won by each side is calculated and displayed. % \end{itemize} % \end{abstract} % % \tableofcontents % % \section{Preface} % % I am neither a good bridge player nor a good package writer. But I like % to read about bridge and when I write about bridge (sometimes a funny % short story, sometimes some training exercises for beginners) I do feel % the need for an appropriate tool to support that. Surprisingly enough, % there exists no comprehensive package on |CTAN| for typesetting bridge % diagrams. For all those people who feel more or less the same as I do, % there is this package called \OneDown. As some say: \emph{one down is % good bridge}\footnote{please, don't discuss the truth-value of this % statement with me}, I hope that \OneDown is a good bridge package. % % You can generate this documentation by running % % \iffalse %<*verb> % \fi \begin{verbnobox}[\small] pdflatex --shell-escape onedown.dtx makeindex -s gind.ist onedown.idx makeindex -s gglo.ist -o onedown.gls onedown.glo pdflatex --shell-escape onedown.dtx pdflatex --shell-escape onedown.dtx \end{verbnobox} % \iffalse % % \fi % Use:\\ % |pdflatex --shell-escape '\AtBeginDocument{\NoColortrue}\input{onedown.dtx}'| % as last run to get a |PDF| for printing on a monochrome printer. % The |--shell-escape| flag is necesary to generate the list of user % commands. If you think this is too dangerous, then run pdflatex without % this flag and you will get the docmentation without the list of user % command (of about 1 page). In any case you'll find a multi-page reference % overview of all commands in |onedown-ref.pdf|. % % \section{Introduction} % % There must be a lot of bridge players who also use \LaTeX{} to typeset % their documents. And it is almost incredible that on |CTAN| there exist % no modern package with a decent documentation that supports % this. % In 1990 Kees van der Laan \cite{Laan} published an article in % TUGBoat\footnote{\url{http://tug.org/TUGboat/Articles/tb11-2/tb28laan.pdf}} % in which he describes how well the \TeX-machinery is able to produce % beautiful bridge diagrams. Based on this article and examples, % Johannes % Braams put these commands together in a style file\footnote{% % \packname{bridge.sty}, last version v1.7c, 1994/12/20} and added more. % Some time later René Steiner and Thomas Hof produced the % \packname{bridge-i} and the \packname{kibitzer}\footnote{both v1.0, % 1995/04/06} style files, in which they made a lot of % enhancements. % Also others made some efforts in this direction.\footnote{Antony Lee % released his package \packname{bridge} in 2012 and Gordon Bower his % package \packname{grbbridge} in 2013. Both are very interesting but offer % only limited features and are not on CTAN at the time of writing. See % \url{http://www.bridgebase.com/forums/topic/51967-latex-package-for-typesetting-bridge-related-stuff/}} % Around 2005 I used these style files for % some tiny projects. The quality of the output was splendid. Putting the % text and diagrams together was not always easy and the documentation was % poor. In 2015, after a long pause, I had to produce bridge texts again. I % enhanced some of the existing stuff and made ad hoc changes in the code, % which led to smaller and greater catastrophes. Summer 2016 I decided to % write a new package, based on the work of the previously mentioned % persons. I called it \OneDown. The central goal was to offer a user % friendly package with detailed documentation. For example you don't need % to say |\setlength{\handskip}{5mm}| or |\def\handskip{5mm}| but rather % call the command |\handskip{1em}|. Not only the call is somewhat % friendlier, but more important, by setting the width in terms of the % font used, it will automatically adapt its size accordingly to font and % font-size changes. \OneDown features: % \begin{itemize} % \item Sizing of diagrams relative to font and font-size. % \item The font-sizes of the diagrams and text are independent. % \item Automated translation of all important bridge terms. % \item Diagrams can optionally contain information about the dealer, who % is vulnerable etc. % \end{itemize} % % The \OneDown package is designed to be used for typesetting texts that have to % do with the game of bridge. It provides not only simple commands like % |\Sp| which produces the spade symbol \example{\Sp}. Also complete % card diagrams with the hands of the \north, \east, etc.\ player can % be defined in several ways. One can select which hands are to be shown. % Bidding diagrams can be shown stand-alone or in connection with one or % more hands. One can add annotations to any bid in a bidding diagrams. % % \section{Usage} % % \subsection{Initialization} % % \subsubsection{Requirements} % % The package \OneDown depends on several other packages, such as % \packname{ifthen}, \packname{translator} or \packname{xspace}. All % these packages get loaded automatically if not already used in your % document. For a complete overview of all required packages, refer to page % \pageref{RequirePackage}. All the packages are loaded without any option, % so the risk of an option clash should be low: Just load your package with % options \emph{before} \OneDown. % % Furthermore, for the several languages that \OneDown supports, there are % the dictionary files with translations of the specific bridge terms. % These dictionaries follow the naming convention: % |ODw-.dict| and are included in the bundle. The % name of the || is generally the same as the name that you % use as option for \packname{babel}, but starting with a capital. % \iffalse % There is one exception: the % Norwegian language uses |norsk| for \packname{babel} and |norwegian| for % \packname{translator}. But all the same, the |norwegian| dictionary is % automatically loaded when |norsk| is used. % \fi % % Should you make a dictionary for a language that is not provided yet, or % have corrections for an existing one, please send it to the maintainer, % so it can be added to the bundle. % % \subsubsection{Loading the package} % % Simply say |\usepackage{onedown}| in the preamble of % your document if you want to load \OneDown with its default settings. % % \textbf{Warning:} \OneDown loads all necessary |ODw|-dictionaries % automatically. In order to know which % languages must be loaded, these must be specified \emph{before} package % \packname{onedown} is loaded. In general this means that if you use % \packname{babel} (or \packname{polyglossia}) you must % load it before package \OneDown. If for some reason you cannot % or do not want to do that, you can load any |ODw|-dictionary if you put % the command: |\uselanguage{}| in your % preamble, provided that the dictionary is in the \TeX-path. For a % discussion about the caveats of using e.g.\ babel, refer to section% % \ref{Languages}. % % \subsubsection{Options}\label{Options} % % To change the behaviour of \OneDown one can load the package with certain % options: |\usepackage[]{onedown}|. Of course this 'option % loading' takes place in the preamble. But it is also possible to set (or % change) options within the document by calling the macro |\setdefaults|. % This macro uses the same |key=val| syntax as is used for the % options and offers some more keys that cannot be used when loading the % package. Refer to page~\pageref{Defaults} for details. % % As said before, the package loads its options using the % |key=val| syntax. These options deal with: % \begin{itemize} % \item[colors] \verb:colors=0|1|2|3|4A|4B:\\ % The color in which the card symbols will % be printed. The color options are \textbf{0} (black only), \textbf{1} % (black and white) \textbf{2} (black and red), \textbf{3} (grey (for special effects)), % \textbf{4A} (green, orange, % red and blue), \textbf{4B} (black, orange, red and green). We also % defined some synonyms, as shown in the table below. % \par % Thus loading the package with |\usepackage[colors=X]{onedown}| will print % \begin{itemize} % \item[x=0:] {\setdefaults{colors=0} \Cl, \Di, \He and \Sp} % (synonyms: |mono|, |black|) % \item[x=1:] {\setdefaults{colors=1} \Cl, \Di, \He and \Sp} % (synonyms: |b+w|) % \item[x=2:] {\setdefaults{colors=2} \Cl, \Di, \He and \Sp} % (synonyms: |b+r|) % \item[x=3:] {\setdefaults{colors=3} \Cl, \Di, \He and \Sp} % (synonyms: |gray|, |grey|) % \item[x=4A:] {\setdefaults{colors=4A} \Cl, \Di, \He and \Sp} % (synonyms: |4a|, |fourA|) % \item[x=4B:] {\setdefaults{colors=4B} \Cl, \Di, \He and \Sp} % (synonyms: |4b|, |fourB|) % \end{itemize} % The default is |colors=2| for printing in black and red. Please note, that |colors=3| is not % meant to typeset the whole document. You can use it if you want e.g. to repeat something and want % it to be less apparent. % \item[err, warn] \verb:err=on|off:\qquad\verb:warn=|on|off:\\ % These options regulate which messages are to be output. These % messages have to do with the consistency of cards in % a suit, in a hand or combined hands. It is an error when a hand has more % that 13 cards, or when the same card occurs twice or more in a hand or a % deal. With the option |err=on| (which is the default) these error % messages appear as output. With |err=off| you can suppress that. % On the other hand when a suit has less than 13 cards, this must not % necessarily be wrong. Maybe only some cards are to be shown, e.g.\ in an % example concerning a finesse. Or when only e.g.\ |E-W| hands are % concerned, not all cards of the deck will be specified. These situations % will be caught by setting |warn=on|. To suppress these spurious warnings % use |warn=off|, which is the default. % Synonyms for |on| are |1| and |true|. Synonyms for |off| are |0| and % |false|. This also applies for other keys that do not control a package % option. % \end{itemize} % % \subsubsection{Languages \& Dictionaries}\label{Languages} % % \OneDown uses the \packname{tranlator} package to automatically % translate often appearing brigde terms like e.g.\ \emph{declarer}. It does % so by looking up these terms in the special |ODw|-dictionary for the % active language. The current \OneDown version supports English, German, % Dutch, French, Italian, Spanish, most Scandinavian languages and Turkish. Some % dictionaries may not be complete or may contain errors, please send % corrections/additions to the maintainer. % % In order to make \packname{translator} do its job (automatically select the % right translation when the current language switches to another), % \textbf{\larger it is % necessary to specify the languages with the \texttt{documentclass}, and not with % \texttt{babel}! } % % \needspace{5\baselineskip} % % \paragraph*{\textcolor{red}{\centering Warning for people using active % characters.}} % % Some language packages fiddle around making characters active. % This can have unexpected influence on \OneDown. % The |=|~sign is used when loading the package \packname{onedown} to % specify options. % It appears also in calls like |\setdefaults{warn=on}|. % We also use the following characters as tokens for optional arguments % with the meaning as shown in this list: % \begin{itemize}[itemsep=-1mm,topsep=-0em] % \item[|*|] to center diagrams or print a long or capitalized text % \item[|!|] special action like short names of vertical layout % \item[|-|] to hide what would normally been shown % \item[|+|] to show what would normally be hidden % \end{itemize} % \par\noindent % To give you an idea what e.g.\ babel can cause we cite from % \emph{The Turkish style for babel}:\par % \begin{quote} % Turkish typographic rules specify that a little 'white space' should be % added before the characters ':', '!' and '='. In order to insert this % white space automatically these characters are made |\active|, so they % have to be treated in a special way. % \end{quote} % So babel-Turkish makes the equal sign and exlamation mark active. This % leads to errors when you call e.g.\ |\setdefaults{warn=on}| or |\hand!|. % If you do not need any character to be active, then load this language % with |\usepackage[turkish,shorthands=]{babel}|. % % You can also put |\PassOptionsToPackage{shorthands=off}{babel}| % above your |documentclass| line. Here is a complete example: % % \iffalse %<*verb> % \fi \begin{verbnobox}[\small] \PassOptionsToPackage{shorthands=off}{babel} \documentclass[a4paper,fontsize=11pt,% dutch,% german,% english,% this is the default language ]{scrartcl} \usepackage{babel} \end{verbnobox} % \iffalse % % \fi % % If you do need the % shorthand then you must disable it every time you have to use e.g.\ the % |=|~character as a normal character by: % % \iffalse %<*verb> % \fi \begin{verbnobox}[\small] \shorthandoff{=}% Make '=' not active any more \setdefaults{warn=on} \shorthandon{=}% Restore '=' to active again \end{verbnobox} % \iffalse % % \fi % % \section{User Commands} % % \subsection{Overview} % % In the next sections we give a short description of all the user commands % and environments that are defined in \OneDown. The commands marked with % \ML are multilingual. I.e.\ the text they typeset gets % translated automatically into the active language. % % In order to make sure that the example diagrams do not disturb the % page layout of this document too much, we scaled them down to % |footnotesize|. % \gamefont{\bfseries\sffamily\footnotesize} % % Sometimes the output of a command is shown as an example. This output is % framed in this document like \example{this}, just to recognize it easily % as an output example. In an accompanying % file\footnote{onedown-examples.pdf} with examples one can find in more % detail how these commands are used and what they produce. % % We have loaded the package \OneDown with the default option for colors, % giving us \textcolor{black}{black} and \textcolor{red}{red}. Furthermore, % when we descibe macros, we use a colored frame that also shows the output % of the commend. Some commands have optional tokens that produce an output % that differs from the naked version. These optional tokens appear in a % different background color like \Oarg{*!}. If an output of a macro is % shown, then the output of tokenized calls is shown in parenthesis to % demonstrate the difference. % % \subsubsection{The Compass} % % \boardnr{0} % The compass \CP is not available as a user command itself, but it is used % in all user commands that draw a card diagram. It has some special % features. % \begin{itemize}[itemsep=0em] % \item It can mark the dealer (\north) \boardnr{1} \CP % \item It can write the vulnerable side (\northsouth) in red \boardnr{5} \CP % \item it can put something (a board number) in the middle % \boardnr{3} \setdefaults{compmid=3} \CP % \end{itemize} % The machinery is intelligent enough to calculate the dealer and % vulnerability from the board number. When only |black| or % |b+w| is selected as option for colors, then the % vulnerable side is written in italics rather colorized. Because % underlining the \South*-hand would interfere with the compass frame, we % overline it. With the command |\setdefaults| one can customize the look % of the compass. In particular, if you want to print the actual board % number, specified by calling |\boardnr{Nr}|, you can achieve that by % calling |\setdefaults{compmid=\boardtext}|. In the accompanying file with % examples you'll find more examples about |\setdefaults|. % % \subsubsection{Hooks} % % We use kind of hooks to % \begin{enumerate} % \item change the font or the font-size. These are discussed in chapter % \emph{Sizing and Fonts} on page \pageref{Fonts}. % \item add commentary information to card diagrams. These are discussed in % chapter \emph{Conditions in Diagrams} on page \pageref{Conditions} % \item There is one other hook to enable the user to add something to the % compass. This is done by calling |\setdefaults{compmid=}|. % \end{enumerate} % % \subsection{Basic Symbols}\label{BasicSym} % % In this section we show the predefined commands that produce terms that % occur often in bridge text. On page \pageref{ReDefine} an easy way is % shown to redefine them as to use a different variant of the term in % question. % \par\vspace{0.3\baselineskip}\noindent % The next 5 macros are shorthands for the suit symbols and \NT: % \par\vspace{0.5\baselineskip}\noindent % \needspace{5\baselineskip}\noindent % \DescribeMacro{\Cl}\MacroDef+{Cl}[\hfill \Cl] % \par\noindent % \DescribeMacro{\Di}\MacroDef+{Di}[\hfill \Di] % \par\noindent % \DescribeMacro{\He}\MacroDef+{He}[\hfill \He] % \par\noindent % \DescribeMacro{\Sp}\MacroDef+{Sp}[\hfill \Sp] % \par\noindent % \DescribeMacro{\NT}\MacroDef*+{NT}[\hfill \NT] % \par\vspace{0.3\baselineskip}\noindent % The next 4 macros typeset the non-bid calls % \par\vspace{0.5\baselineskip}\noindent % \needspace{4\baselineskip}\noindent % \DescribeMacro{\pass}\MacroDef*+{pass}[\hfill \pass] % \par\noindent % \DescribeMacro{\allpass}\MacroDef*+{allpass}[\hfill \allpass] % \par\noindent % \DescribeMacro{\double}\MacroDef*+{double}[\hfill \double] % \par\noindent % \DescribeMacro{\redouble}\MacroDef*+{redouble}[\hfill \redouble] % The next 6 macros typeset the directions that identify dealer (or player) % and the axis that is vulnerable. % \par\vspace{0.5\baselineskip}\noindent % \needspace{4\baselineskip}\noindent % \DescribeMacro{\north}\MacroDef*+{north}[\hfill \north] % \par\noindent % \DescribeMacro{\east}\MacroDef*+{east}[\hfill \east] % \par\noindent % \DescribeMacro{\south}\MacroDef*+{south}[\hfill \south] % \par\noindent % \DescribeMacro{\west}\MacroDef*+{west}[\hfill \west] % \par\vspace{0.5\baselineskip}\noindent % \DescribeMacro{\northsouth}\MacroDef*+{northsouth}[\hfill \northsouth] % \par\noindent % \DescribeMacro{\eastwest}\MacroDef*+{eastwest}[\hfill \eastwest] % The next 4 macros typeset the \emph{unit} of the points when valuing a % bridge hand. If one or more of these items do not appear in your bridge % world, don't argue them, Just don't use them! They are meant to specify % \emph{High Card Points}, \emph{High Card + Length Points}, \emph{Length Points}, % \emph{Distribution Points} and \emph{Total Points} respectively. % \par\vspace{0.5\baselineskip}\noindent % \DescribeMacro{\HCP}\MacroDef*+{HCP}[\hfill \HCP] % \par\noindent % \DescribeMacro{\HLP}\MacroDef*+{HLP}[\hfill \HLP] % \par\noindent % \DescribeMacro{\LP}\MacroDef*+{LP}[\hfill \LP] % \par\noindent % \DescribeMacro{\DP}\MacroDef*+{DP}[\hfill \DP] % \par\noindent % \DescribeMacro{\TP}\MacroDef*+{TP}[\hfill \TP] % \par\noindent % The next 5 commands produce the abbreviations for several forcing % expressions. % \par\vspace{0.5\baselineskip}\noindent % \DescribeMacro{\GF}\MacroDef*+{GF}[\hfill \GF] % \par\noindent % \DescribeMacro{\SF}\MacroDef*+{SF}[\hfill \SF] % \par\noindent % \DescribeMacro{\NMF}\MacroDef*+{NMF}[\hfill \NMF] % \par\noindent % \DescribeMacro{\TSF}\MacroDef*+{TSF}[\hfill \TSF] % \par\noindent % \DescribeMacro{\FSF}\MacroDef*+{FSF}[\hfill \FSF] % % \subsubsection{Header of the Bidding Table} % % \par\vspace{0.5\baselineskip}\noindent % \DescribeMacro{\namesNS}\MacroDef+{namesNS}[\marg{N-name}\marg{S-name}] % Defines the real world names for the \north and the \south player. If % they are defined, they appear in the \North*!- and the \South*!-column % of the |bidding| diagram. % \par\vspace{0.5\baselineskip}\noindent % \DescribeMacro{\namesEW}\MacroDef+{namesEW}[\marg{E-name}\marg{W-name}] % Same as |\namesNS| but now for the \east and the \west player. % % \subsection{The Card Diagrams} % % \subsubsection{The hands of the players} % Before a card diagram can be shown, one must specify the cards that % each player holds. With the various |hand|-commands one can % do this. The suits they define are only shown when a |show|-command is % issued after they have been defined. The |show|-commands are discussed on % page \pageref{ShowCommands}. % \par\vspace{0.5\baselineskip}\noindent % \needspace{4\baselineskip}\noindent % \DescribeMacro{\northhand}\MacroDef+{northhand}[\oarg{v-offset}\marg{Sp}\marg{He}\marg{Di}\marg{Cl}] % \par\noindent % \DescribeMacro{\easthand}\MacroDef+{easthand}[\oarg{h-offset}\marg{Sp}\marg{He}\marg{Di}\marg{Cl}] % \par\noindent % \DescribeMacro{\southhand}\MacroDef+{southhand}[\oarg{v-offset}\marg{Sp}\marg{He}\marg{Di}\marg{Cl}] % \par\noindent % \DescribeMacro{\westhand}\MacroDef+{westhand}[\oarg{h-offset}\marg{Sp}\marg{He}\marg{Di}\marg{Cl}] % The command |\northhand| defines the cards (all 4 suits) for the % \North*!-player. |\easthand|, |\southhand| and |\westhand| do that for % the \East*!-, \South*!- or \West*!-player. These commands have 4 % mandatory arguments in % which the cards of the 4 suits are specified. In all suit commands where % card ranks are issued, one must use \textbf{T} to denote the value % \textbf{10}. On output, some kerning takes care that the output looks % like \suit{T} and not like a \textbf{1} followed by a \textbf{0}. So % |\suit{AKJT8}| produces \example{\suit{AKJT8}}. % It is also possible to use a small 'x' as symbol for a spot card: |\suit{AKxxx}| % produces \example{\suit{AKxxx}}. % % These commands also have an optional argument, an offset which by default % is 0pt. This offset is meant to finetune the layout of the hands in the % card diagrams. They change the distance between a hand and the compass. % |\northhand| and |\southhand| have a \emph{vertical} offset, whereas % |\easthand| and |\westhand| have a \emph{horizontal} one. A positive % value moves away from the compass. % % \subsubsection{The single hand} % % \noindent % \DescribeMacro{\hand}\MacroDef+{hand}[\Oarg{*!-}\oarg{pos}\marg{Sp}\marg{He}\marg{Di}\marg{Cl}] % This macro typesets the cards of one single hand, either vertically or % horizontally. There are 4 mandatory arguments defining the 4 suits. With % 2 optional tokens '|*|' resp.\ '|!|' one can typeset the hand with % some special features: % \begin{itemize}[itemsep=0em] % \item |\hand*| typesets a hand horizontally, centered % \item |\hand!| typesets a hand vertically, left aligned % \item |\hand*!| typesets a hand vertically, centered %\end{itemize} % For vertical hands the optional argument |pos| (default= \textbf{c}) % controls the horizontal alignment. Without a token, the hand is typeset % horizontally, left aligned: The call |\hand{AK2}{T85}{AQT6}{A42}| % typesets the hand horizontally like: % \par\vspace{0.3\baselineskip}\noindent % \example{\hand{AK2}{T85}{AQT6}{A42}}, % \par\vspace{0.3\baselineskip}\noindent % whereas the |\hand!| version produces % \shorthandoff{!} % \example{\hand!{AK2}{T85}{AQT6}{A42}}. % \shorthandon{!} % \par\vspace{0.3\baselineskip}\noindent % The third optional token, a '|-|' suppresses all output and saves the % stuff for later use. This is used e.g.\ in |\expertquiz|. % % \subsubsection{Only one suit} % % \noindent % \DescribeMacro{\onesuitAll}\MacroDef+{onesuitAll}[\Oarg{*!}\marg{N}\marg{S}\marg{E}\marg{W}] % Typesets the cards of 1 suit for all players. This command has 4 % mandatory arguments defining the cards of the 4 players. There are 2 % optional tokens. With |\onesuitAll*| the output is centered, with % |onesuitAll!| the cards are placed around a |NESW| compass. % Without the '|!|'-token a small box (\ODwBox) is used instead. Thus % the macro call |\onesuitAll{AQ6}{J3}{T54}{K2}| produces % \example{\onesuitAll{AQ6}{J3}{T54}{K2}}. % \par\noindent % Please note the order of the % players in the arguments: the first two denote the \north and \south hand. % The last 2 denote the \east and \west hand. We choose it this way so you % can easily cut and paste one pair from the |\onesuitAll|, or extend % |\onesuitNS| to showing all hands. % \par\vspace{0.5\baselineskip}\noindent % \DescribeMacro{\onesuitNS}\MacroDef+{onesuitNS}[\Oarg{*!}\marg{N}\marg{S}] % \par\noindent % \DescribeMacro{\onesuitEW}\MacroDef+{onesuitEW}[\Oarg{*!}\marg{E}\marg{W}] % \par\noindent % \DescribeMacro{\onesuitNE}\MacroDef+{onesuitNE}[\Oarg{*!}\marg{N}\marg{E}] % \par\noindent % \DescribeMacro{\onesuitNW}\MacroDef+{onesuitNW}[\Oarg{*!}\marg{N}\marg{W}] % These commands are similar to |\onesuitAll| but have only 2 mandatory % arguments. The command |\onesuitNS{AQ3}{JT9}| typesets % \example{\onesuitNS{AQ3}{JT9}} and |\onesuitEW{8764}{K2}| will % produce \example{\onesuitEW{8764}{K2}}. Please note that at the latter the % cards for the \east hand appear in the first argument. Finally % |\onesuitNE{AQ3}{8764}| produces \example{\onesuitNE{AQ3}{8764}} and % |\onesuitNW{AQ3}{K2}| \example{\onesuitNW{AQ3}{K2}}. % \par\vspace{0.5\baselineskip}\noindent % \DescribeMacro{\suit}\MacroDef+{suit}[\oarg{suit symbol}\marg{cards}] % This command has 1 optional argument denoting a suit symbol and 1 % mandatory argument, defining the cards of the suit. % |\suit{AQJ7}| by default produces \example{\suit{AQJ7}}. When the German % language is active it would produce \example{\Translate{\suit{AQJ7}}}. % Using the optional argument like in |\suit[\Di]{AQJ7}| will produce: % \example{\suit[\Di]{AQJ7}}. % % \subsubsection{Showing Card Diagrams}\label{ShowCommands} % % \noindent % \DescribeMacro{\showAll}\MacroDef+{showAll}[\Oarg{*+}\oarg{pos}] % \par\noindent % \DeleteShortVerb{\|} % \DescribeMacro{\showNS}\MacroDef+{showNS}[\Oarg{*+}\oarg{pos}\parg{N|S}] % \par\noindent % \DescribeMacro{\showEW}\MacroDef+{showEW}[\Oarg{*+}\oarg{pos}\parg{E|W}] % \MakeShortVerb{\|} % \par\noindent % \DescribeMacro{\showNE}\MacroDef+{showNE}[\Oarg{*+}\oarg{pos}] % \par\noindent % \DescribeMacro{\showNW}\MacroDef+{showNW}[\Oarg{*+}\oarg{pos}] % All |show|-commands have two optional tokens, a '|*|' which centers the % output and a '|+|' which also displays a |bidding| diagram next to the % card diagram. This |bidding| diagram must have been defined before, see % page~\pageref{Bidding}. % They also have one optional argument that defines the aligning. Its % default is~\textbf{c}. % |\showAll| typesets a card diagram with the |NESW| compass with \North*! in % top and the hands of the 4 players surrounding it. These hands must have % been defined before by calling |\northhand| etc. Hands that are not % defined are left empty. Optionally some conditions (like the dealer or % who is vulnerable etc.) can be added to the diagram by using the commands % described in section \emph{Diagram Conditions}. Please note that when the % \north or \south hand contains a long suit that extends beyond the % |NESW| compass, this might collide with these extra texts. You can % correct that with the optional offset parameter of the condition commands % (see page \pageref{Legend}). % % The other commands are similar to |\showAll| but typeset only the hands % of the players that are represented in the name of the command: % \NorthSouth*!, \EastWest*!, \North*!--\East*! and \North*!--\West*!. % % The commands |\showNS| and |\showEW| have an extra optional argument with % which selectively only one of the two hands can be displayed. E.g.\ % |\showNS(S)| will display only the \South*-hand. % \needspace{6\baselineskip}\noindent % % \subsubsection{Showing Card Diagrams with Bidding}\label{PlayCommands} % % \subsubsection{Diagram Conditions} % % \noindent % \DescribeMacro{\headlinetext}\MacroDef+{headlinetext}[\marg{text}] % \par\noindent % \DescribeMacro{\footlinetext}\MacroDef+{footlinetext}[\marg{text}] % These commands have 1 mandatory argument: the text that defines the % annotation that is to be added to a card diagram. The text can be on more % than one line, just separate them with a |\par| or % |\newline|\footnote{Using '\bs\bs' instead produces a misleading error: % \textbf{! Missing \} inserted\ldots}}. % |\headlinetext| places the annotation above the diagram, |\footlinetext| % below it. % \par\vspace{0.5\baselineskip} % \needspace{4\baselineskip}\noindent % \DescribeMacro{\leftupper}\MacroDef+{leftupper}[\oarg{h-offset}\marg{line1}\marg{line2}\marg{line3}]\label{Legend} % \par\noindent % \DescribeMacro{\leftlower}\MacroDef+{leftlower}[\oarg{h-offset}\marg{line1}\marg{line2}\marg{line3}] % \par\noindent % \DescribeMacro{\rightupper}\MacroDef+{rightupper}[\oarg{h-offset}\marg{line1}\marg{line2}\marg{line3}] % \par\noindent % \DescribeMacro{\rightlower}\MacroDef+{rightlower}[\oarg{h-offset}\marg{line1}\marg{line2}\marg{line3}] % These commands have 1 optional argument (default 0pt) with which you can % add some extra horizontal space if hand and legend collide, and 3 % mandatory arguments: the lines of text that are added as conditions % to the card diagram. Both |\leftupper| (|\rightupper|) place their % text in the left- (right-) upper corner of the diagram. The top line % will be aligned with the (inner) top of the diagram. |\leftlower| % (|\rightlower|) are similar, but place their text at the lower corner of % the diagram. The last line is aligned with the (inner) bottom of the % diagram. For an empty line you must issue an empty argument. % With a positive offset, |\leftupper| and |\leftlower| shift to the left % whereas |\rightupper| and |\rightlower| shift to the right. I.e.\ they % shift away from their neighbouring hand. % \par\vspace{0.5\baselineskip}\noindent % \DescribeMacro{\dealer}\MacroDef+{dealer}[\oarg{text}]\label{dealerX} % \par\noindent % \DescribeMacro{\vulner}\MacroDef+{vulner}[\oarg{text}] % Both commands have 1 optional argument. If present it sets (and prints) % the internal corresponding variable to this value, otherwise it only % outputs the value of this internal variable. % \par\vspace{0.5\baselineskip}\noindent % \DescribeMacro{\dealertext}\MacroDef+{dealertext}[\oarg{text}] % \par\noindent % \DescribeMacro{\vulnertext}\MacroDef+{vulnertext}[\oarg{text}] % These commands have also 1 optional argument. If present e.g.\ % |\dealertext[\North*]| this text is output in the form % \example{\dealertext[\North*]}. If the German language is active then the % call |\dealertext[\South*]| produces the text % \foreignlanguage{german}{\example{\dealertext[\South*]}}. Calling % |\dealertext| without an argument outputs the predefined text, which can % be set with |\dealer|.\\ % Example: % |\dealer[Jacob]\dealertext| produces \example{\dealer[Jacob]\dealertext}. % % \par\vspace{0.5\baselineskip}\noindent % \DescribeMacro{\boardnr}\MacroDef+{boardnr}[\marg{Nr}] % The macro |\boardnr| has 1 mandatory argument. If it is a number, it is % considered to be the board number. The dealer and which side is % vulnerable is then calculated from it and stored in the appropriate % variables. If it is not a positive integer, it is considered user-defined % text and will be stored and used \emph{as is}. % \par\vspace{0.5\baselineskip}\noindent % \DescribeMacro{\boardtext}\MacroDef*+{boardtext}[\Oarg{*}] % The macro |\boardtext| has 1 token and no arguments. |\boardtext| % retrieves only the board number (stored by calling |\boardnr|). % |\boardtext*| outputs the board number with some additional (multilingual) % text. |\boardnr{23}\boardtext| produces \example{\boardnr{23}\boardtext} % whereas |\boardtext*| would produce \example{\boardtext*}. % Note that |\boardnr| can have a non-integer argument. % |\boardnr{Fun}\boardtext| produces \example{\boardnr{Fun}\boardtext} and % with |\boardtext*| it would produce \example{\boardtext*}. % % \subsubsection{Sizing and Fonts}\label{Fonts} % % \noindent % \DescribeMacro{\handskip}\MacroDef+{handskip}[\marg{length description}] % This command has 1 mandatory argument: a \textbf{text} describing a % length. |\handskip| enlarges the distance (default |1em|) between the % rightmost hand and the |bidding| diagram. A negative value diminishes the % distance. % \par\vspace{0.5\baselineskip} % \needspace{4\baselineskip}\noindent % \DescribeMacro{\bidderfont}\MacroDef+{bidderfont}[\marg{font description}] % \par\noindent % \DescribeMacro{\compassfont}\MacroDef+{compassfont}[\marg{font description}] % \par\noindent % \DescribeMacro{\gamefont}\MacroDef+{gamefont}[\marg{font description}] % \par\noindent % \DescribeMacro{\legendfont}\MacroDef+{legendfont}[\marg{font description}] % \par\noindent % \DescribeMacro{\namefont}\MacroDef+{namefont}[\marg{font description}] % \par\noindent % \DescribeMacro{\otherfont}\MacroDef+{otherfont}[\marg{font description}] % These commands all have 1 mandatory argument: a \textbf{description} of % the font to be used. In the list below the command names are typeset in % their default font. % \begin{itemize}[itemsep=-2mm] % \item {\mdseries\sffamily bidderfont}: Used for the player-names in the % |bidding| diagram.\\ The default is |\mdseries\sffamily|. % \item {\mdseries\sffamily compassfont}: Used for the directions and the % ''midvalue'' in the compass. The default is |\mdseries\sffamily|. % \item {\bfseries\sffamily gamefont}: Used for card diagrams, hands and % suits.\\ The default is |\bfseries\sffamily|. % \item {\mdseries\rmfamily legendfont}: Used for the conditions in % card diagrams.\\ The default is |\mdseries\rmfamily|. % \item {\mdseries\slshape namefont}: Used for the real world names in % |bidding| diagrams.\\ The default is |\mdseries\slshape|. % \item {\bfseries\sffamily otherfont}: Used for the other bridge % expressions, also outside diagrams. The default is |\bfseries\sffamily|. % \end{itemize} % If a new font is % defined, all relevant dimensions of the card diagrams (including the % |NESW| compass, the |bidding| diagram etc.) will be recalculated. % Some examples for setting the gamefont to a new value are: % \begin{itemize}[itemsep=-2mm] % \item |\gamefont{\sffamily\bfseries\HUGE}| to get \emph{HUGE} diagrams. % Refer to the documentation of package \packname{moresize} for details. % \item |\legendfont{\smaller}| to diminish the text in the card diagram % conditions a little. Refer to the % documentation of package \packname{relsize} for details. % \item |\gamefont{\sffamily\scalefont{3}}|\footnote{needs package % scalefnt} to typeset real big diagrams for overhead sheets % \end{itemize} % \needspace{4\baselineskip}\noindent % % \subsection{Misc} % % Many of the text producing macros have in common that they can produce 4 % different versions of the text they represent. Normally, without any % token, they produce the % lowercase text. With the token~|*| they produce the capitalised text. % With the token |!| they produce some abbreviation of the text (if % available). Finally with both tokens~|*!| the produce the capitalised % abbreviation of the text. What exactly is produced, is shown in the % macro descriptions. In some cases it seems rather strange to have the % code for an abbreviated form, i.e.\ |\Lead[*!]|, because it produces only % the variants \Lead and \Lead*. But remember that we also support automatic % translations into other languages and that in another language an % abreviation might be feasible: With the german language active |\Lead*| % and |\Lead*!| produce \foreignlanguage{german}{\example{\Lead*}} and % \foreignlanguage{german}{\example{\Lead*!}} respectively. % At the other % hand it seems peculiar to let |\Ace!| produce \example{\Ace!} for an % Ace. But we do not foresee which modern novelist might want to produce % this. That's why they are defined, but 'normal' writers probably will % never used it. % % The short versions are primarily meant to be used within diagrams, % allthough it is possible to get the long forms there too. Refer to page % \pageref{Defaults} for details. We show the output of such a macro % |\Macro| (note the capital~|M|!) in the form: % \par\vspace{0.3\baselineskip}\noindent % \MacroDef{Macro}[\Oarg{*!}\hfill \cmd{\Macro} (\cmd{\Macro*}, \cmd{\Macro!}, \cmd{\Macro*!})] % In addition to each macro |\Macro| with its 4 variants, we also create a % macro |\macro| which is defined to output the most used variant of % |\Macro|: % \par\vspace{0.3\baselineskip}\noindent % \MacroDef{macro}[\hfill most used variant of \cmd{\Macro}] % \par\vspace{0.3\baselineskip}\noindent % It is very easy to redefine |\macro|.\label{ReDefine} % As an example we take the macro |\ace|. Its definition is: % \par % |\def\ace{\Ace*!}|\\ % so calling |\ace| will produce \example{\ace}. If somewhere in your % document you redefine |\ace| to be % \par % |\def\ace{\Ace*}|\\ % {\def\ace{\Ace*} then |\ace| will produce \example{\ace}} rather than \example{\ace}. % % \subsubsection{Honor Cards} % % \noindent % \DescribeMacro{\Ace}\MacroDef*+{Ace}[\Oarg{*!}\hfill \Ace (\Ace*, \Ace!, \Ace*!)] % \par\noindent % \DescribeMacro{\ace}\MacroDef*+{ace}[\hfill \ace] % \par\noindent % \DescribeMacro{\King}\MacroDef*+{King}[\Oarg{*!}\hfill \King (\King*, \King!, \King*!)] % \par\noindent % \DescribeMacro{\king}\MacroDef*+{king}[\hfill \king] % \par\noindent % \DescribeMacro{\Queen}\MacroDef*+{Queen}[\Oarg{*!}\hfill \Queen (\Queen*, \Queen!, \Queen*!)] % \par\noindent % \DescribeMacro{\queen}\MacroDef*+{queen}[\hfill \queen] % \par\noindent % \DescribeMacro{\Jack}\MacroDef*+{Jack}[\Oarg{*!}\hfill \Jack (\Jack*, \Jack!, \Jack*!)] % \par\noindent % \DescribeMacro{\jack}\MacroDef*+{jack}[\hfill \jack] % These commands produce the language dependent names for the honor % cards. To be used primarily when adding a lead to a card diagram. % % \subsubsection{Variants of Basic Symbols} % % In section \ref{BasicSym} we already described the macros for the main % variant. Here we introduce the macros that handle 4 variants with a % combination of the tokens |*| and |!|. % \par\noindent % We start with the variants for |\NT| % \par\vspace{0.3\baselineskip}\noindent % \DescribeMacro{\nt}\MacroDef*+{nt}[\Oarg{*!}\hfill \nt (\nt*, \nt!, \nt*!)] % \par\noindent % Next we show the 4 macros for the non-bid calls: % \par\vspace{0.3\baselineskip}\noindent % \DescribeMacro{\Pass}\MacroDef*+{Pass}[\Oarg{*!}\hfill \Pass (\Pass*, \Pass!, \Pass*!)] % \par\noindent % \DescribeMacro{\Allpass}\MacroDef*+{Allpass}[\Oarg{*!}\hfill \Allpass % (\Allpass*, \Allpass!, \Allpass*!)] % \par\noindent % \DescribeMacro{\Double}\MacroDef*+{Double}[\Oarg{*!}\hfill \Double (\Double*, % \Double!, \Double*!)] % \par\noindent % \DescribeMacro{\Redouble}\MacroDef*+{Redouble}[\Oarg{*!}\hfill \Redouble % (\Redouble*, \Redouble!, \Redouble*!)] % \par\noindent % Next come the 6 macros for the symbolic names of players and axes. % \par\vspace{0.5\baselineskip}\noindent % \needspace{4\baselineskip}\noindent % \DescribeMacro{\North}\MacroDef*+{North}[\Oarg{*!}\hfill \North (\North*, \North!, \North*!)] % \par\noindent % \DescribeMacro{\East}\MacroDef*+{East}[\Oarg{*!}\hfill \East (\East*, \East!, \East*!)] % \par\noindent % \DescribeMacro{\South}\MacroDef*+{South}[\Oarg{*!}\hfill \South (\South*, \South!, \South*!)] % \par\noindent % \DescribeMacro{\West}\MacroDef*+{West}[\Oarg{*!}\hfill \West (\West*, \West!, \West*!)] % \par\vspace{0.5\baselineskip}\noindent % \DescribeMacro{\NorthSouth}\MacroDef*+{NorthSouth}[\Oarg{*!}\hfill \NorthSouth (\NorthSouth*, \NorthSouth!, \NorthSouth*!)] % \par\noindent % \DescribeMacro{\EastWest}\MacroDef*+{EastWest}[\Oarg{*!}\hfill \EastWest (\EastWest*, \EastWest!, \EastWest*!)] % \par\noindent % The 4 commands that typeset the \emph{point-unit} % \par\vspace{0.5\baselineskip}\noindent % \DescribeMacro{\hpts}\MacroDef*+{hpts}[\Oarg{*!}\hfill \hpts (\hpts*, \hpts!, \hpts*!)] % \par\noindent % \DescribeMacro{\tpts}\MacroDef*+{tpts}[\Oarg{*!}\hfill \tpts (\tpts*, \tpts!, \tpts*!)] % \par\noindent % \DescribeMacro{\lpts}\MacroDef*+{lpts}[\Oarg{*!}\hfill \lpts (\lpts*, \lpts!, \lpts*!)] % \par\noindent % \DescribeMacro{\dpts}\MacroDef*+{dpts}[\Oarg{*!}\hfill \dpts (\dpts*, \dpts!, \dpts*!)] % \par\noindent % The forcing terms % \par\vspace{0.5\baselineskip}\noindent % \DescribeMacro{\gforce}\MacroDef*+{gforce}[\Oarg{*!}\hfill \gforce (\gforce*, \gforce!, \gforce*!)] % \par\noindent % \DescribeMacro{\sforce}\MacroDef*+{sforce}[\Oarg{*!}\hfill \sforce (\sforce*, \sforce!, \sforce*!)] % \par\noindent % \DescribeMacro{\nmforce}\MacroDef*+{nmforce}[\Oarg{*!}\hfill \nmforce (\nmforce*, \nmforce!, \nmforce*!)] % \par\noindent % \DescribeMacro{\tsforce}\MacroDef*+{tsforce}[\Oarg{*!}\hfill \tsforce (\tsforce*, \tsforce!, \tsforce*!)] % \par\noindent % \DescribeMacro{\fsforce}\MacroDef*+{fsforce}[\Oarg{*!}\hfill \fsforce (\fsforce*, \fsforce!, \fsforce*!)] % % \subsubsection{Conditions in Diagrams}\label{Conditions} % % These commands produce the langugage dependent expressions for % \emph{\all, \none, \by, \board} etc. To be used primarily in card % diagrams. % \par\vspace{0.5\baselineskip}\noindent % \DescribeMacro{\All}\MacroDef*+{All}[\Oarg{*!}\hfill \All (\All*, \All!, \All*!)] % \par\noindent % \DescribeMacro{\all}\MacroDef*+{all}[\hfill \all] % \par\noindent % \DescribeMacro{\None}\MacroDef*+{None}[\Oarg{*!}\hfill \None (\None*, \None!, \None*!)] % \par\noindent % \DescribeMacro{\none}\MacroDef*+{none}[\hfill \none] % \par\noindent % \DescribeMacro{\by}\MacroDef*+{by}[\hfill \by] % \par\noindent % \DescribeMacro{\Board}\MacroDef*+{Board}[\Oarg{*!}\hfill \Board (\Board*, \Board!, \Board*!)] % \par\noindent % \DescribeMacro{\board}\MacroDef*+{board}[\hfill \board] % \par\noindent % \DescribeMacro{\Contract}\MacroDef*+{Contract}[\Oarg{*!}\hfill \Contract (\Contract*, \Contract!, \Contract*!)] % \par\noindent % \DescribeMacro{\contract}\MacroDef*+{contract}[\hfill \contract] % \par\noindent % \DescribeMacro{\Declarer}\MacroDef*+{Declarer}[\Oarg{*!}\hfill \Declarer (\Declarer*, \Declarer!, \Declarer*!)] % \par\noindent % \DescribeMacro{\declarer}\MacroDef*+{declarer}[\hfill \declarer] % \par\noindent % \DescribeMacro{\Deal}\MacroDef*+{Deal}[\Oarg{*!}\hfill \Deal (\Deal*, \Deal!, \Deal*!)] % \par\noindent % \DescribeMacro{\deal}\MacroDef*+{deal}[\hfill \deal] % \par\noindent % \DescribeMacro{\Lead}\MacroDef*+{Lead}[\Oarg{*!}\hfill \Lead (\Lead*, \Lead!, \Lead*!)] % \par\noindent % \DescribeMacro{\lead}\MacroDef*+{lead}[\hfill \lead] % % \subsubsection{Annotations in Bidding Diagrams} % % \noindent % \DescribeMacro{\alert}\MacroDef+{alert}[\hfill \alert] % \par\noindent % \DescribeMacro{\announce}\MacroDef+{announce}[\hfill \announce] % \par\noindent % These macros have no argument. With |\alert| one can mark a call that % must be alerted with an asterisk (\alert) e.g.\ a weak 2\NT{} opening % with |2\NT\alert|. It produces \example{2\NT\alert}. With |\announce| one % can mark a bid with an 'A' (\announce) where an announcement is % obligatory, e.g |2\He\announce| produces \example{2\He\announce}. % \par\vspace{0.5\baselineskip} % \needspace{4\baselineskip}\noindent % \DescribeMacro{\markit}\MacroDef+{markit} % \par\noindent % \DescribeMacro{\explainit}\MacroDef+{explainit}[\marg{explanation}] % These commands are to be used to mark a call in the |bidding| diagram and % explain it with a kind of footnote-like mechanism, directly below the % |bidding| diagram. Both |\markit| and |\explainit| step a counter for % associating the explanation with the mark. |\markit| has no arguments; % |\explainit| has one mandatory argument: the text to be displayed as % explanation. |\explainit| should be called in the description part of % |bidding| diagrams (or expertquiz). The text of the explanation is then % typeset under the |bidding| diagram and has the same width. % You can use newline (|\\|, or |\newline|) in your text to force an new % line in the explanation\footnote{Using \bs par produces the error: % \textbf{Runaway argument?\ldots}}. % \needspace{6\baselineskip}% % \subsubsection{Specials} % % \par\vspace{0.5\baselineskip}\noindent % \DescribeMacro{\expertquiz}\MacroDef+{expertquiz}[\Oarg{*!}\oarg{comment}\marg{award}] % This command displays a hand, a |bidding| sequence and some additional % stuff. It is designed after the \emph{Expert Quiz} column in the % \emph{Bridge Magazin} of the \textsf{DBV}\footnote{Deutsche Bridge % Verband}, the German Bridge Union. % \\ % It has 2 optional tokens: a '|*|' for centering and a % '|!|' which 1) forces the |bidding| diagram to appear on a new line, and % 2) shifts the hand a bit to the right. % Next there is one optional argument with wich some commentary information % can be added. And finally there is 1 mandatory argument that describes the % awards for certain solutions. Both the hand and the bidding must be % defined before calling |\expertquiz|. One can do that by calling e.g. % |\hand-| which suppresses the output of the hand. % % \subsubsection{Re-Initialization} % % \par\vspace{0.5\baselineskip}\noindent % \DescribeMacro{\newgame}\MacroDef+{newgame} % This command resets most bridge diagram data and can be used to start a % new series of bridge diagrams. It is however not necessary to use % |\newgame| if one enters new cards for the \north etc.\ hands. The list % below shows which items are reset by calling |\newgame| % \begin{itemize} % \item resets |\boardnr{0}|. % \item resets |headlinetext| and |footlinetext|. % \item resets |LeftUpperText|, |LeftLowerText|, |RightUpperText| and % |RightLowerText|. % \item resets |northhand|, |easthand|, |southhand| and |westhand|. % \item resets |namesNS| and |namesEW|. % \item resets the checks for Spades, Hearts, Diamonds and Clubs. % \end{itemize} % \needspace{15\baselineskip} % \par\vspace{0.5\baselineskip}\noindent % \DescribeMacro{\setdefaults}\MacroDef+{setdefaults}[\Oarg{*}\string{\meta{key1=val1},\meta{key2=val2},\ldots\string}]\label{Defaults} % \par\noindent % \DeleteShortVerb{\|} % \begin{tabular}{>{\ttfamily}l>{\ttfamily}l} % key & font \\\hline % bidder & bidderfont \\ % compass & compassfont \\ % game & gamefont \\ % legend & legendfont \\ % name & namefont \\ % other & otherfont \\\hline % \\ % key & value \\\hline % colors & 0|1|\underline{2}|3|4A|4B \\ % warn & \underline{off}|on \\ % err & off|\underline{on} \\ % \hline % \end{tabular} % \qquad % \begin{tabular}{>{\ttfamily}l>{\ttfamily}l} % key & value \\\hline % compline & \meta{factor} \\ % compshow & off|\underline{on} \\ % compsize & \meta{factor} \\ % compturn & \underline{off}|on \\\hline % \\ % key & value \\\hline % bidders & off|\underline{on} \\ % bidfirst & N|E|S|\underline{W} \\ % bidline & \underline{off}|on \\ % bidlong & off|\underline{on} \\ % \hline % \end{tabular} % \MakeShortVerb{\|} % \par\vspace{\baselineskip} % The macro |\setdefaults| uses a \meta{key}=\meta{val} mechanism. The % tables above show which keys are available. The underlined key values are % defaults. The available keys with respect to fonts are: |bidder|, % |compass|, |game|, |legend|, |name| and |other|. In upper the table to % the left the association between key and font is shown. A call e.g.\ % |\setdefaults{name=\bfseries\scriptsize}| will set the default for the % namefont to the value specified. The starred form |\setdefaults*| will % also call |\resetfonts|, which effectuates any change in a new default % font immediately. % % In the lower table to the left you'll find the three keys that are also % possible as package options. They have been described already in section % \ref{Options}. % % The keys with respect to the compass are: |compline|, |compshow|, % |compsize| and |compturn|. They are shown in the upper table to the % right. With the first key one can set the linethickness of the compass % frame, the default is |0.1em|. The second key controls whether the % compass is shown or not. The third key controls the size of the compass, % which per default is |2.5em|. With the fourth key one can rotate the % letters for the \EastWest*! direction over 90°. The % multiplication-\meta{factor}, which defaults to the value |1|, can have % any non-negative real value. % % The keys with respect to the |bidding| diagram are: |bidders|, |bidfirst|, % |bidline| and |bidlong|. They are shown in the lower table to the right. % With the first key one can suppress the bidders in the bidding header. % With the second key one can set which bidder appears in the first column % of the diagram. The default is |W|. The third key controls whether an % |\hline| is printed below the header. The fourth key switches between % the long or short form of the non-bid calls, like \example{\pass} or % \example{\Pass!}. % % For the key-value |on| we have the synonyms |true| and |1|, for the % key-value |off| we have the synonyms |false| and |0|. % \par\vspace{0.5\baselineskip}\noindent % \DescribeMacro{\resetfonts}\MacroDef+{resetfonts} % When calling this macro, all fonts are set back to their default value. % This is the value that was explicitly set by a previous call of % |\setdefaults|, or to the intrinsic default value if |\setdefaults| has % not been called before. % % \subsection{Environments} % % In the first place we must warn the user for a peculiarity of the package % \packname{collcell}, which is used to do some special processing in these % 3 environments: \emph{The last row must either end with a newline} (|\\|) % \emph{or with an \emph{empty} cell.}\par\noindent % The advantage of the |collcell| processing is that within the |bidding| % and |play| diagrams we can use shorthands for the suit symbols: rather % than writing |3\Sp| in a |bidding| diagram we can also write |3S| to obtain % 3\,\Sp. In the |play| diagram we could write |HA| instead of |\He\,\Ace| % and get \He\,A as output. In |bidding| diagrams some non-bid calls may % appear in short or in long form, controlled by calling % |\setdfefaults{bidlong=on}|, which switches to the lang form, or % |\setdfefaults{bidlong=off}| which switches to the short form. % These non-bid calls are coded as follows: A small |p| yields short form % \example{\Pass!} or long form \example{\pass}. A capital |P| yields short % form \example{\Allpass*!} or long form \example{\allpass}. A capital |X| % yields short form \example{\Double!} and long form \example{\double}. A % capital |R| yields short form \example{\Redouble!} and long form % \example{\redouble}.\footnote{due to the fact that |x| denotes a % spotcard, we had to implement it this way} % \par\vspace{0.5\baselineskip}\noindent % \DescribeEnv{bidding}\EnvDef*+{bidding}[\Oarg{*!-}\oarg{pos}\parg{description}]\label{Bidding} % This environment has 3 tokens. The '|*|' centers the |bidding| diagram. % The '|!|' outputs the short form: e.g.\ \North*! rather than the long form % \North* in the table heading. The '|-|' completely suppresses the output. % The data is stored in a savebox and can be used in other macros, e.g.\ in % all |\showXX| macros. Next come 2 optional parameters. The first % one controls the alignment (default \textbf{c}) and the second one adds % the list of annotations below the |bidding| diagram. With |\setdefaults| % one can fine tune the look of the |bidding| diagram. Refer to page % \pageref{Defaults} for details. For example % \iffalse %<*verb> % \fi \begin{verbnobox}[\small] \begin{bidding}(\explainit{WeakTwo}\explainit{preemptive}) 2H\markit & p & 3H\markit & p \\ \end{bidding} \quad \setdefaults{bidlong=off} \begin{bidding}! 2H & p & 3H & p\\ \end{bidding}\\ \end{verbnobox} % \iffalse % % \fi % produces\\ % \example{ % \begin{bidding}(\explainit{WeakTwo}\\\explainit{preemptive}) % 2H\markit & p & 3H\markit & p \\ % \end{bidding} % \quad % \setdefaults{bidlong=off} % ^^A avoid clash with babel languages % \shorthandoff{!} % \begin{bidding}! % 2H & p & 3H & p \\ % \end{bidding} % } % % \shorthandon{!}\setdefaults{bidlong=on} % % \par\vspace{0.3\baselineskip}\noindent % In addition to the shorthands we mentioned before, one can also use macros % in the bidding and play diagrams. As long as these macros appear as 1 % single token in the diagram, no special care has to be taken. But if a % macro appears as multiple tokens, e.g.\ like the call |\Pass*!|, which % consists of the 3 tokens |\Pass|, |*| and |!|, then it \textbf{must} be % enclosed in braces |{...}| to make it act as 1 token. Without the % braces |\Pass*!| will produce \example{\Xfer{\Pass*!}}, with them % |{\Pass*!}| will produce \example{\Xfer{{\Pass*!}}}. % Note that although |\pass| expands to |\Pass*|, it wil produce the correct % \example{\Xfer{\pass}}. % \par\vspace{0.5\baselineskip}\noindent % \DescribeEnv{biddingpair}\EnvDef*+{biddingpair}[\Oarg{*!-}\oarg{pos}\parg{descr}] % This environment is essentially the same as the |bidding| environment, but % here the |bidding| diagram has only two columns rather than four. % \par\vspace{0.5\baselineskip}\noindent % \DescribeEnv{play}\EnvDef*+{play}[\Oarg{*}\marg{Lead}\oarg{Trump}] % This environment has 1 token, a '|*|', which controls the centering of % the table; 1 mandatory argument, denoting the opening lead and 1 % optional argument which specifies the trump suit, with default: \NT. It % typesets a diagram with the sequence of playing tricks, by producing a % table with 8 columns: the running number; the player who had % had the lead; the 4 cards played in this trick and finally % the 2 columns that show how many tricks \NorthSouth*!{} and \EastWest*!{} % have won so far. The user has to specify only the columns 3-6, i.e.\ the % cards that were played. Columns 1--2 and 7--8 are constructed by % \OneDown. Just as in |bidding| diagrams, also here % one can denote the suit with |S|, |H|, |D|, or |C|. The winning card is % automatically detected, taking into account if a suit contract or \NT % is played. The winning tricks counters are then updated automatically. % Concerning consistency it is just as with hands and deals: If a card % occurs more than one time, an error is raised and for missing cards a % warning is issued. % \\[0.3\baselineskip] % \needspace{4\baselineskip}\noindent % \otherfont{\sffamily\bfseries\footnotesize} % \begin{minipage}{\linewidth} % \begin{minipage}[b]{0.36\linewidth} % % \iffalse %<*verb> % \fi \begin{verbnobox}[\small] \begin{play}{W} \\ D3 & 2 & Q & K \\ HA & 5 & 4 & J \\ C3 & 5 & K & A \\ \end{play} \end{verbnobox} % \iffalse % % \fi % % \end{minipage} % \quad % \example{ % \begin{play}{W} % D3 & 2 & Q & K \\ % HA & 5 & 4 & J \\ % C3 & 5 & K & A \\ % \end{play} % } % \end{minipage} % % \needspace{8\baselineskip}\noindent % % \iffalse %<*verb> % \fi \begin{verbnobox}[\small] \begin{play}*{W} \\ D3 & 2 & Q & K \\ HA & 5 & 4 & J \\ C3 & 5 & K & A \\ \end{play} \end{verbnobox} % \iffalse % % \fi % % produces the same diagram, but this time horizontally % centered.\\[0.5\baselineskip] % \example{ % \begin{minipage}{0.95\linewidth} % \begin{play}*{W} % D3 & 2 & Q & K \\ % HA & 5 & 4 & J \\ % C3 & 5 & K & A \\ % \end{play} % \end{minipage} % } % \otherfont{\sffamily\bfseries\footnotesize} % % \section{Final Remarks} % % \subsection{Known Bugs} % % \begin{itemize} % \item Some dictionaries have questionable translations. % \item The boxes in |\northhand| and |\southhand| lead to problems with % shifting the \west hand. See file Legends in the example bundle. % \end{itemize} % \newpage % % \subsection{ToDo} % % \begin{itemize}[itemsep=-2mm] % \item \textbf{Correct the description how to enable automatic language % switching (since we use package translator)} % \item Add the High Points to card diagrams (like Turnier in KA) % \item Check if |\def\xspace{}| is also needed in bidding...? % \item Make a template for showing 16 hands on 1 DIN A4 (3x5+1 or 4x4 % landscape) e.g as handout for the hands on slides. % \item Read source files in PBN format. Example: % \url{http://new.bridgekosice.sk/bridzove-diagramy-vykrelene-pomocou-tex/} % \end{itemize} %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % \subsection{Acknowledgements} % %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % % % This package is based on (ideas from) the style files: % \begin{itemize}[itemsep=-2mm] % \item |bridge-i v1.0 (1995/04/16)| by René Steiner and Thomas Hof. % \item |kibitzer v1.0 (1995/04/16)| by René Steiner and Thomas Hof. % \item |bridge v0.1 (2012/03/18)| by Antony Lee. % \item |grbbridge v2.2 (2013/12/24)| by Gordon Bower. % \end{itemize} %  % The style file |bridge-i| is based on the style file |bridge| v1.7c % (1994/12/20) by J.L. Braams, which on itself was based on an article % by Kees van der Laan in TUGboat (Vol 11 (1990), No 2: p265ff. % \par % Last but not least I want to thank all those wonderful people down % there in the Internet who spent their time in answering silly questions % and solving difficult problems. If I had imagined the difficulties I % would encounter, then I would not have started this work. And without the % help %of all these, to me unknown, people, this package would not exist. % % \StopEventually{} % % \newpage % \section{Implementation} % % \iffalse %<*package> % \fi % % \subsection{Prelimaries} % % \subsubsection{Packages we depend upon} % % \label{RequirePackage} % \begin{macrocode} % Warn if a too old expl3 package is used. \RequirePackage{expl3}[2019/09/21]% needed for LaTeX3 packages (xparse) \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 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 translator,% 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 } % \end{macrocode} %\noindent % Add exceptions for xspace % \begin{macrocode} \xspaceaddexceptions{% = \markit \, \suit \translate 2 3 4 5 6 7 8 9 T J Q K A } % \end{macrocode} % % \subsubsection{Options} % % We use the \packname{pgf} |=| system for our % options: |colors|, |warn| and |err|. % \begin{macrocode} \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,} % \end{macrocode} % The details for option |colors| are on page \pageref{Colors}ff and those for % option |warn| and |err| on page \pageref{Messages}. % % \subsubsection{Misc} % % \begin{macro}{\,}\MacroDef{,} % \begin{macro}{\thinspace}\MacroDef{thinspace} % We redefine |\thinspace| (originally $\frac{1}{6}$em) to a smaller amount. % That makes denominations like |3\Sp| (3\Sp) look better. The code is % from:\\ % \url{https://tex.stackexchange.com/questions/181003/multiply-fine-tuning-with-a-thinspace}\\ % This code however doesn't work when coded within an own package, unless we % use |\AtBeginDocument|. % \begin{macrocode} \AtBeginDocument{% \renewcommand{\,}[1][1]{% \ifmmode\mskip#1\thinmuskip% \else\thinspace[#1]\fi% }% \renewcommand{\thinspace}[1][1]{% \kern#1\dimexpr0.16667em\relax% }% }% AtBeginDocument % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\ODw@gsetlength}\MacroDef{ODw@gsetlength}[\marg{\bs len-name}\marg{len-value}] % \noindent % % We need to store the length of certain objects that are within a % group (the group is needed to keep the font-size changes local). % Therefore we define macro |\ODw@gsetlength| % that works globally. The code is based upon a solution on LaTeX % StackExchange:\\ % (\url{https://tex.stackexchange.com/questions/406015/defining-macro-gsetlength-as-global-setlength-reliable}) % \begin{macrocode} \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 % \end{macrocode} % \end{macro} % % \begin{macro}{\ODw@append}\MacroDef{ODw@append}[\marg{tokens}] % In the environment |play| we need to calculate the winning tricks for % \NorthSouth*! and \EastWest*!\footnote{For details see page \pageref{Play}}. % We store this information as a string in |\ODw@Scratch| and use % |\ODw@append| to accumulate them. % \begin{macrocode} \gdef\ODw@append#1{% \bgroup% \edef\tmp{\the\ODw@Scratch #1}% \global\ODw@Scratch=\expandafter{\tmp}% \egroup% }% ODw@append % \end{macrocode} % \end{macro} % % \subsubsection{Variables} % % In this package we do use font relative sizing. That means that widths % and skips are defined in terms of |em|, |ex| and |baselineskip|. On the % other hand there are e.g.\ the real world names of the bidders, that must % be recorded. Some of these the user should be able to control. Rather % than forcing the user to do that directly with |\def| or |\renewcommand| % we store all this information in internal variables, by defining a % constant command. These variables can be set by calling a user command, % that is associated with the variable. E.g.\ the variable |\ODw@Skipwidth| % gets set by the command |\handskip|. The variables we use are: % \par\vspace{0.5\baselineskip}\noindent % \DescribeMacro{\ODw@BidderFont} % Controlled by |\bidderfont|: the font used for the players (|bidding|). % \par\noindent % \DescribeMacro{\ODw@CompassFont} % Controlled by |\compassfont|: the font used for the compass. % \par\noindent % \DescribeMacro{\ODw@GameFont} % Controlled by |\gamefont|: the font used for all card diagrams % \par\noindent % \DescribeMacro{\ODw@LegendFont} % Controlled by |\legendfont|: the font used for the annotations. % \par\noindent % \DescribeMacro{\ODw@NameFont} % Controlled by |\namefont|: the font used for the real world names. % \par\noindent % \DescribeMacro{\ODw@OtherFont} % Controlled by |\otherfont|: the font used for other bridge % expressions, also outside diagrams. % \par\vspace{0.5\baselineskip}\noindent % \DescribeMacro{\ODw@BidderDefault} % \DescribeMacro{\ODw@CompassDefault} % \DescribeMacro{\ODw@GameDefault} % \DescribeMacro{\ODw@LegendDefault} % \DescribeMacro{\ODw@NameDefault} % \DescribeMacro{\ODw@OtherDefault} % These contain the default values for the fonts % \par\vspace{5.5\baselineskip}\noindent % \DescribeMacro{\ODw@North@Name} % \DescribeMacro{\ODw@South@Name} % Controlled by |\namesNS|: hold the real world names of the \north % and the \south player. % \par\vspace{0.5\baselineskip}\noindent % \DescribeMacro{\ODw@East@Name} % \DescribeMacro{\ODw@West@Name} % Controlled by |\namesEW|: hold the real world names of the \east % and the \west player. These names are typeset using the font specified with % |\namefont|. % \par\vspace{0.5\baselineskip}\noindent % \DescribeMacro{ODw@BoardText} % Controlled by |\boardtext|: holds the board number and extra text.\\ % \DescribeMacro{ODw@HeaderText} % Controlled by |\headlinetext|: holds header information for card % diagrams.\\ % \DescribeMacro{ODw@FooterText} % Controlled by |\footlinetext|: holds footer information for card % diagrams.\\ % \DescribeMacro{ODw@Last} % Used in command |\ODw@Tricks|: to store the player that had the % lead\footnote{see page \pageref{Last}}.\\ % \DescribeMacro{\ODw@Skipwidth} % Controlled by |\handskip|: holds the distance between hand and bidding % diagram. % \begin{macrocode} \def\ODw@CompSize{1}% factor to enlarge the compass \def\ODw@CompLine{}% thickness of compass frame \def\ODw@Skipwidth{1em}% % \end{macrocode} % % \subsubsection{Booleans, Saveboxes, Lengths, Counters and Registers} % % \paragraph{Booleans} % % \DescribeMacro{\ifODw@description} % |\ifODw@description| is used in the |bidding| environments and the % command |\expertquiz| to test if there is an annotation that should % be written. % \par\noindent % \DescribeMacro{\ifODw@short} % |\ifODw@short| is used in the |bidding| environments and the command % |\expertquiz| to denote if a short form of the diagram header is to be % used. % \par\noindent % \DescribeMacro{\ifODw@monochrome} % |\ifODw@monochrome| flags the case % that the user specified |colors=0| or |colors=1|, i.e.\ just black and % white. In this situation we will not print the vulnerable side in red, % but use italics instead. % \par\noindent % \DescribeMacro{\ifOdW@CardSkip} % |\ifOdW@CardSkip| determines whether we need some extra space between % card ranks (i.e.\ in suit descriptions) or not (i.e.\ in |bidding| % or |play| diagrams). % \par\noindent % \DescribeMacro{\ifOdW@Bidders} % |\ifODw@Bidders| suppresses the bidders in the bidding header. % \par\noindent % \DescribeMacro{\ifOdW@BidLine} % |\ifODw@BidLine| draw a |\hline| below the bidding header. % \par\noindent % \DescribeMacro{\ifOdW@LongCalls} % |\ifODw@LongCalls| determines whether to use the short (like \North*!) or % the long form (like \North*) for calls in the |bidding| diagram. % \par\noindent % \DescribeMacro{\ifOdW@CompShow} % With |\ifODw@CompShow| one can suppress drawing a compass within card % diagramns completely. % \par\noindent % \DescribeMacro{\ifOdW@CompTurn} % With |\ifODw@CompTurn| one rotates letters |E| and |W| in the % compass 90°. % \begin{macrocode} \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 % \end{macrocode} % The next booleans are directly controlled by |\setdefaults|. % \begin{macrocode} \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° % \end{macrocode} % \begin{macro}{\ODw@EmptyHeader} % \begin{macro}{\ODw@EmptyFooter} % Since there seems to be a problem in using\label{Empty} % |\ifthenelse|\footnote{\textbf{ifthenelse} bites \textbf{multicolumn}!} % in particular places, these booleans are set by calling |ODw@TestIfEmpty| % (which uses an ordinary |\ifthenelse|) \emph{outside} the dangerous % places, and then use e.g.\ |\ifODw@EmptyHeader| as a test whether the % header is empty or not. % \begin{macrocode} \newboolean{ODw@EmptyHeader}% = 'header is empty' \newboolean{ODw@EmptyFooter}% = 'footer is empty' % \end{macrocode} % \end{macro} % \end{macro} % \paragraph{Saveboxes} % \DescribeMacro{\ODw@Diagram@Box} % |\ODw@Diagram@Box| is to store the actual card diagram (the compass % with the hands) in order to calculate its width. % \par\noindent % \DescribeMacro{\ODw@BidBox} % |\ODw@BidBox| stores a |bidding| diagram. % \par\noindent % \DescribeMacro{\ODw@Hand@Box} % |\ODw@Hand@Box| stores a hand with the 4 suits. % \par\noindent % \begin{macrocode} \newsavebox\ODw@Diagram@Box \newsavebox\ODw@Hand@Box \newsavebox\ODw@BidBox % \end{macrocode} % \paragraph{Lengths} % \DescribeMacro{\ODw@Bid@Width} % Is used to store the actual width of the |bidding| diagram. % \par\noindent % \DescribeMacro{\ODw@Card@Skip} Defines space between % adjacent cards in suits. % \par\noindent % \DescribeMacro{\ODw@Diagram@Width} Defines the width of compass plus % (\EastWest*!) hands. % \par\noindent % \DescribeMacro{\ODw@Skip@Width} Defines the distance between the card % diagram and the |bidding| diagram. % \par\noindent % \DescribeMacro{\ODw@Tmp@Len} % \par\noindent % \DescribeMacro{\ODw@Tmp@Width} Auxiliary lengths, used in several % calculations. % \par\noindent % \begin{macrocode} \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 % \end{macrocode} % \paragraph{Counters} % \DescribeMacro{ODw@Nr} Counts lines (in |play| diagrams) and explanations % (in |bidding| diagrams). % \begin{macrocode} \newcounter{ODw@Nr} % \end{macrocode} % \par\noindent % \DescribeMacro{ODw@Cnt} Auxiliary counter, used in several calculations. % \begin{macrocode} \newcounter{ODw@Cnt} % \end{macrocode} % \par\noindent % \DescribeMacro{ODw@PlayerNr} Set to the player that won the trick in % environment |play|. % \begin{macrocode} \newcounter{ODw@PlayerNr} % \end{macrocode} % \par\noindent % \DescribeMacro{ODw@NSCnt} Holds the number of N-S tricks in environment % |play|. % \begin{macrocode} \newcounter{ODw@NSCnt} % \end{macrocode} % \par\noindent % \DescribeMacro{ODw@EWCnt} Holds the number of E-W tricks in environment % |play|. % \begin{macrocode} \newcounter{ODw@EWCnt} % \end{macrocode} % \paragraph{Registers} % \DescribeMacro{ODw@Scratch} Tempory store for winning tricks in % environment |play|. % \begin{macrocode} \newtoks{\ODw@Scratch} % \end{macrocode} % % \subsubsection{Fonts} % % \paragraph{Text Fonts} % % Here we merely define the commands to set the default fonts. At the end % of this .sty file they are set to their value. Refer to % section~\ref{Init} for details. % \begin{macro}{\bidderfont} % \begin{macro}{\ODw@BidderFont} % The font used to indicate the symbolic player (N, E, S, W) in bidding % diagrams. The default is |\mdseries\sffamily|. % \begin{macrocode} \newcommand\bidderfont[1]{\gdef\ODw@BidderFont{#1}} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\compassfont} % \begin{macro}{\ODw@CompassFont} % The font used to indicate the directions (N, E, S, W) in the compass. The % default is |\mdseries\sffamily|. % \begin{macrocode} \newcommand\compassfont[1]{\gdef\ODw@CompassFont{#1}} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\namefont} % \begin{macro}{\ODw@NameFont} % The font used for the real world names of the players in bidding % diagrams. The default id |\mdseries\slshape|. % \begin{macrocode} \newcommand\namefont[1]{\gdef\ODw@NameFont{#1}} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\legendfont} % \begin{macro}{\ODw@LegendFont} % The font used for the conditions in card diagrams. The default is % |\mdseries\rmfamily|. % \begin{macrocode} \newcommand\legendfont[1]{\gdef\ODw@LegendFont{#1}} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\otherfont} % \begin{macro}{\ODw@OtherFont} % The font used for the other bridge expressions like |\north|, |\pass| or % |\double|. The default is |\bfseries\sffamily|. % \begin{macrocode} \newcommand\otherfont[1]{\gdef\ODw@OtherFont{#1}} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\gamefont} % The font for the hands and calls. It sets the general font-size/widths for % the game. The default is |\bfseries\sffamily|. % \par\noindent % \begin{macro}{\ODw@GameFont} % We use widths that are dynamically adjusted at font changes and store the % 'value' as text in |\ODw@GameFont|. % \par\noindent % \begin{macro}{\ODw@GameSize} % |\ODw@GameSize| recalculates these % sizes and is called in all show- and bid-diagrams. % \begin{macrocode} \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 % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \paragraph{Symbol Font} % We need special symbols to get solid colored \He{} and \Di, rather than % \textcolor{red}{\ensuremath{\heartsuit}}{} and % \textcolor{red}{\ensuremath{\diamondsuit}}. We use those from |stix|. % As the shape of the 'normal' black suits differ from the red ones we also % take the black suits from the font |stix|. First we define the symbols % and font. As we do not want to load the complete package, we only use % the relevant piece of code found in |txfont.sty|: % \begin{macrocode} \fontencoding{T1}\fontfamily{stix} \fontseries{m}\fontshape{n}\selectfont % % Code stolen from txfonts.sty. % It works smoothly: thank you guys! % Because of an interference with package newtxmath I had to rename % symbols into ODw@symbols and symbolsC into ODw@symbolsC % \DeclareSymbolFont{ODw@symbols}{OMS}{txsy}{m}{n} \SetSymbolFont{ODw@symbols}{bold}{OMS}{txsy}{bx}{n} \DeclareFontSubstitution{OMS}{txsy}{m}{n} \DeclareSymbolFont{ODw@symbolsC}{U}{txsyc}{m}{n} \SetSymbolFont{ODw@symbolsC}{bold}{U}{txsyc}{bx}{n} \DeclareFontSubstitution{U}{txsyc}{m}{n} % \end{macrocode} % \begin{macro}{\ODw@spadesuit} % \begin{macrocode} \DeclareMathSymbol{\ODw@spadesuit}{\mathord}{ODw@symbols}{127} % \end{macrocode} % \end{macro} % \begin{macro}{\ODw@varheart} % \begin{macrocode} \DeclareMathSymbol{\ODw@varheart}{\mathord}{ODw@symbolsC}{114} % \end{macrocode} % \end{macro} % \begin{macro}{\ODw@vardiamond} % \begin{macrocode} \DeclareMathSymbol{\ODw@vardiamond}{\mathord}{ODw@symbolsC}{113} % \end{macrocode} % \end{macro} % \begin{macro}{\ODw@clubsuit} % \begin{macrocode} \DeclareMathSymbol{\ODw@clubsuit}{\mathord}{ODw@symbols}{124} % \end{macrocode} % \end{macro} % % \subsection{Bridge Basic Terms} % % \subsubsection{Suit Symbols} % % First we supply shorthands for the `five' suits (\Cl, \Di, \He, \Sp and % \NT) that are used in the game of bridge. % We define the international version with the English shortcuts. We use % the |xcolor| package to colorize the suit symbols. The color can be set % as an |=| option when loading the package. The option % |colors=0| means mono-color (black only), synonyms of key 0 are |mono| % and |black|. |colors=1| means black and white, a synonym is |b+w|. % |colors=2| means bi-color (black and red), with synonym |b+r|. % |colors=3| means grey, with synonyms |gray| and |grey|. This 'color' is meant for special % effects, e.g. for making unimportant parts less visible % |colors=4A| gives qua-color (green, orange, red and blue); synonyms are % |fourA| and |4a|. Finally |colors=4B| defines the second qua-color (black, % orange, red and green) with synonyms |fourB| and |4b|. % % We precede all the suit symbols with a `very-thin-space' (|\,[0.3]|) % which is 0.3 the size of a normal |\thinspace|.\label{Colors} % % In order to test which suit (|\Cl|,\ldots) was encountered in % |\ODw@translate|\footnote{see page \pageref{Translate}} we \emph{must} % define the suits with a |renewrobustcommand|. So we must |\def| them % first. % % \changes{v0.6a}{2018/03/15}{\\ % - In order to test which suit (\cmd{\Cl},\ldots) was encountered in \cmd{\ODw@translate} (see page \pageref{Translate}) we \emph{must} define the suits as a \emph{renewrobustcommand}. So we \cmd{\def}ine them first! The idea was given on LaTeX StackExchange by egreg, see \url{https://tex.stackexchange.com/questions/420257/test-which-macro-is-called-in-tabular/420258#420258} % } % % \begin{macrocode} % \def them first and then use renewrobustcmd! \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={% \ODw@monochromefalse% \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/3/.code={% \ODw@monochromefalse% \renewrobustcmd\Cl{\textcolor{gray}% {\,[0.3]\ensuremath{\ODw@clubsuit}}\xspace}% \renewrobustcmd\Di{\textcolor{gray}% {\,[0.3]\ensuremath{\ODw@vardiamond}}\xspace}% \renewrobustcmd\He{\textcolor{gray}% {\,[0.3]\ensuremath{\ODw@varheart}}\xspace}% \renewrobustcmd\Sp{\textcolor{gray}% {\,[0.3]\ensuremath{\ODw@spadesuit}}\xspace}% }% } \ODw@set{colors/grey/.code={\pgfkeys{/ODw/colors=3}}} \ODw@set{colors/gray/.code={\pgfkeys{/ODw/colors=3}}} % \ODw@set{% colors/4A/.code={% \ODw@monochromefalse% \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={% \ODw@monochromefalse% \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}}} % \end{macrocode} % % \begin{macro}{\nt} % \begin{macro}{\NT} % Because some languages use a different symbol for \NT{} (\nt*) we must % look it up in the dictionary to find e.g.\ \Translate{\NT} % (\Translate{\nt*}) for German. % \begin{macrocode} \NewDocumentCommand\nt{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF#1{% \IfBooleanTF#2 {\,[0.3]\translate{NT-(ODw)}}% {\translate{No Trump-(ODw)}}% }{% \IfBooleanTF#2 {\,[0.3]\translate{nt-(ODw)}}% {\translate{no trump-(ODw)}}% }% \egroup% \xspace% }% nt % \end{macrocode} % Define a practical shorthand to produce \NT{} without the need to add a % token. % \begin{macrocode} \def\NT{\nt*!} % \end{macrocode} % \end{macro} % \end{macro} % \par\vspace{0.3\baselineskip}\noindent % \begin{macro}{\ODw@SetRank}\MacroDef{ODw@SetRank}[\marg{card rank}] % |\ODw@SetRank| stores the rank of the card played in |\ODw@Rank|. This is % essentially the intrinsic rank of the card (\emph{2} for a 2, \emph{14} % for an Ace), but there are special cases: % \begin{itemize}[itemsep=-2mm,topsep=-1em] % \item Spot cards (denoted with \emph{x}) always get rank 0 % \item Discards always get rank 0 % \item Trump cards get 15 (\emph{15} to ensure that a spot trump card % defeats an Ace) added to the intrinsic rank, to make sure % that: % \begin{itemize}[itemsep=-1mm,topsep=-0.3em] % \item A trump card will defeat all other cards % \item The highest trump card will win the trick % \end{itemize} % \end{itemize} % \par\vspace{0.5\baselineskip} % We first define three variables, one to store the suit of the actual card, % the second one to store which suit was led and the last variable % to store which suit is the trump suit, all initialized with the '\NT-suit'. % \begin{macrocode} \gdef\ODw@SuitPlayed{N} \gdef\ODw@SuitLead{N} \gdef\ODw@TrumpSuit{N} \newcounter{ODw@Rank} % \end{macrocode} % \begin{macrocode} \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 % \end{macrocode} % \end{macro} % \par\vspace{0.3\baselineskip}\noindent % \begin{macro}{\ODw@Xfer}\MacroDef{ODw@Xfer}[\marg{tokens}] % This macro gets called by |ODw@Tfer| which is automatically called in the % environments |play|, |bidding| and |biddingpair| by means of % |columntype P| and |columntype B| to convert at one hand the shorthand % suit code in suit symbols and at the other hand to translate card honors % into the active language. It also converts the card value |T| into % \Xfer{T} and a hyphen into an en-dash. It calls |\ODw@translate| to do % the work. % % The following code was contributed on StackExchange by egreg, see % \url{https://tex.stackexchange.com/questions/417731/problem-with-xstring-ifeqcase-case-falls-thru/417788?noredirect=1#comment1045001_417788} % \begin{macrocode} \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 % \end{macrocode} % \end{macro} % \par\vspace{0.3\baselineskip}\noindent % \begin{macro}{\ODw@translate}\MacroDef{ODw@translate}[\marg{tokens}] % |\ODw@translate| processes a (relatively short) string of tokens that % determine an entry in |bidding| or |play| diagrams, and also % in all situations where suits are defined. It gets called by |\ODw@Xfer|. % % It expects bridge stuff describing strings like |AKT54| to produce the % suit \suit{AKT52}, |2H\alert| to produce the call % \Xfer{2H\alert} in the |bidding| diagram, or |DA| to produce \Xfer{DA} as % entry in the |play| diagram to show that the ace of diamonds was played. % Please note that constructs like |\textit{DA}| or |\frame{2H}| are not % allowed and will produce rather misleading errors like:\\ % \example{|! Argument of \bs ODw@translate:n has an extra \}.|} or \\ % \example{|! Missing number,treated as zero.|}\\[0.2\baselineskip] % Even clever people who use |{\frame{2H}}| will get disoppointed, because % they'll get \frame{2H} rather than the wanted \frame{2\He}. But the very % clever people can reach their goal by using |{\frame{2\He}}| or % |{\textit{\Di A}}|. % \par\vspace{0.5\baselineskip} % \begin{macrocode} \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 } % \end{macrocode} % We offer the possibility that one can use also |\He| in |bidding| and % |play| diagrams rather than just the abbreviation |H|. Therefore we must % test which suit was given and set |\ODw@SuitPlayed| accordingly. To make % this test work, we had to redefine the suit macros with an % |\renewrobustcmd|.\label{Translate} Here we also issue |\expandafter{#1}| % rather than just |#1|. Otherwise, among others, the coloring of the suit % symbol would extend behind it. Curiously enough the phenomena does not % occur anymore. I leave the expandafter in, until this is cleared. % \begin{macrocode} {% 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 % \end{macrocode} % \end{macro} % \par\vspace{0.3\baselineskip}\noindent % \begin{macro}{\ODw@AppendCard}\MacroDef{ODw@AppendCard}[\marg{suit}\marg{card}] % In order to do a simple consistency check in |play| diagrams, we % need to store the cards that were played. We do that for each suit in the % variable |\ODw@|. This macro is called in |\ODw@translate|, i.e.\ % for all situations where cards are to be manipulated. But the result of % |\ODw@AppendCard| is used only within |play| diagrams. The macro % |\ODw@appendcard| appends 1 character to a string. % % \begin{macrocode} % \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 % \end{macrocode} % \end{macro} % \par\vspace{0.3\baselineskip}\noindent % \begin{macro}{\ODw@PTfer}\MacroDef{ODw@PTfer}[\marg{tokens}] % This macro is called within |play| diagrams where we can write |HA| and % get \Xfer{HA}. Also all relevant symbols get translated into the active % language. We use the counter |ODw@PlayerNr| to determine the column in % the |play| diagrams with the winning card, and from this we can compute % which player won the trick. % |\ODw@PTfer| is essentially called for each entry in all columns of the % |play| diagram through the column definition:\\ % |\newcolumntype{P}{>{\collectcell\ODw@PTfer}c<{\endcollectcell}}| % % We first define two counters, both initially set to zero. % \begin{macrocode} \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 }% {}% } % \end{macrocode} % \end{macro} % \par\vspace{0.3\baselineskip}\noindent % \begin{macro}{\ODw@FTfer}\MacroDef{ODw@FTfer}[\marg{tokens}] % |\ODw@FTfer| is called for the first column of the |play| diagram % TableII. In |\ODw@Tricks| it just resets |ODw@PlayerNr| and |\ODw@Last| % and writes the player who leads. Finally it processes the entry of the % first column by calling |\ODw@PTfer|. % |\ODw@FTfer| is essentially called for the entries in the first column of % TableII in the |play| diagram through the column definition:\\ % |\newcolumntype{F}{>{\collectcell\ODw@FTfer}c<{\endcollectcell}}| % \begin{macrocode} \def\ODw@FTfer#1{% \ODw@Tricks% \ODw@PTfer{#1}% }% ODw@FTfer % \end{macrocode} % \end{macro} % \par\vspace{0.3\baselineskip}\noindent % \begin{macro}{\ODw@BTfer}\MacroDef{ODw@BTfer}[\marg{tokens}] % This macro is called within |bidding| diagrams and enables us to type % |1C\announce| and get \Xfer{1C\announce}. The symbols get translated into % the active language. |\ODw@BTfer| is essentially called for each entry in % the |bidding| diagrams through:\\ % |\newcolumntype{B}{>{\collectcell\ODw@BTfer}c<{\endcollectcell}}| % % As there is no special processing for the biding entries, we call |\ODw@Xfer| % right away to do the job. % % \begin{macrocode} \def\ODw@BTfer#1{% \ODw@Xfer{#1}% } % \end{macrocode} % \end{macro} % % \subsubsection{Names of Directions and Axes} % % \begin{macro}{\North}\MacroDef{North}[\Oarg{*!}] % \begin{macro}{\north}\MacroDef{north} % \begin{macrocode} \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*} % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\East}\MacroDef{East}[\Oarg{*!}] % \begin{macro}{\east}\MacroDef{east} % \begin{macrocode} \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*} % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\South}\MacroDef{South}[\Oarg{*!}] % \begin{macro}{\south}\MacroDef{south} % \begin{macrocode} \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*} % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\West}\MacroDef{West}[\Oarg{*!}] % \begin{macro}{\west}\MacroDef{west} % \begin{macrocode} \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*} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\NorthSouth}\MacroDef{NorthSouth}[\Oarg{*!}] % \begin{macro}{\northsouth}\MacroDef{northsouth} % \begin{macrocode} \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*} % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\EastWest}\MacroDef{EastWest}[\Oarg{*!}] % \begin{macro}{\eastwest}\MacroDef{eastwest} % \begin{macrocode} \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*} % \end{macrocode} % \end{macro} % \end{macro} % Next we define macros that translate the short form of the directions % into the active language. % \par\noindent % \begin{macro}{\ODw@N} % \begin{macro}{\ODw@E} % \begin{macro}{\ODw@S} % \begin{macro}{\ODw@W} % \begin{macrocode} \def\ODw@N{% \@ifstar{\translate{N-(ODw)}}% {\translate{n-(ODw)}}% } \def\ODw@E{% \@ifstar{\translate{E-(ODw)}}% {\translate{e-(ODw)}}% } \def\ODw@S{% \@ifstar{\translate{S-(ODw)}}% {\translate{s-(ODw)}}% } \def\ODw@W{% \@ifstar{\translate{W-(ODw)}}% {\translate{w-(ODw)}}% } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % % \begin{macro}{\ODw@NS} % \begin{macro}{\ODw@EW} % \begin{macrocode} \def\ODw@NS{\ODw@N--\ODw@S} \def\ODw@EW{\ODw@E--\ODw@W} % \end{macrocode} % \end{macro} % \end{macro} % % % \begin{macro}{\ODw@North} % \begin{macro}{\ODw@East} % \begin{macro}{\ODw@South} % \begin{macro}{\ODw@West} % \begin{macrocode} \def\ODw@North{% \@ifstar{\translate{North-(ODw)}}% {\translate{north-(ODw)}}% } \def\ODw@East{% \@ifstar{\translate{East-(ODw)}}% {\translate{east-(ODw)}}% } \def\ODw@South{% \@ifstar{\translate{South-(ODw)}}% {\translate{south-(ODw)}}% } \def\ODw@West{% \@ifstar{\translate{West-(ODw)}}% {\translate{west-(ODw)}}% } % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % \end{macro} % % % \subsubsection{Non-Bid Calls} % % \begin{macro}{\Pass}\MacroDef{Pass}[\Oarg{*!}] % \begin{macro}{\pass}\MacroDef{pass} % \begin{macrocode} \NewDocumentCommand\Pass{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\translate{Pass!-(ODw)}}% {\translate{Pass-(ODw)}}% }{% \IfBooleanTF{#2}% {\translate{pass!-(ODw)}}% {\translate{pass-(ODw)}}% }% TF#1 \egroup% \xspace% }% Pass % \def\pass{\Pass*} % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\Allpass}\MacroDef{Allpass}[\Oarg{*!}] % \begin{macro}{\allpass}\MacroDef{allpass} % \begin{macrocode} \NewDocumentCommand\Allpass{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF#1{% \IfBooleanTF{#2}% {\translate{AP-(ODw)}}% {\translate{All pass-(ODw)}}% }{% \IfBooleanTF{#2}% {\translate{ap-(ODw)}}% {\translate{all pass-(ODw)}}% }% TF#1 \egroup% \xspace% }% Allpass % \def\allpass{\Allpass*} % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\Double}\MacroDef{Double}[\Oarg{*!}] % \begin{macro}{\double}\MacroDef{double} % \begin{macrocode} \NewDocumentCommand\Double{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF#1{% \IfBooleanTF{#2}% {\translate{Dbl-(ODw)}}% {\translate{Double-(ODw)}}% }{% \IfBooleanTF{#2}% {X}% {\translate{double-(ODw)}}% }% TF#1 \egroup% \xspace% }% Double % \def\double{\Double*} % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\Redouble}\MacroDef{Redouble}[\Oarg{*!}] % \begin{macro}{\redouble}\MacroDef{redouble} % \begin{macrocode} \NewDocumentCommand\Redouble{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF#1{% \IfBooleanTF{#2}% {\translate{ReDbl-(ODw)}}% {\translate{ReDouble-(ODw)}}% }{% \IfBooleanTF{#2}% {\mbox{X\kern-0.1em X}}% {\translate{redouble-(ODw)}}% }% TF#1 \egroup% \xspace% }% Redouble % \def\redouble{\Redouble*} % \end{macrocode} % \end{macro} % \end{macro} % % % \subsubsection{Bidding Diagrams} % % \DeleteShortVerb{\|} % \begin{macro}{\ODw@FirstBidCol}\MacroDef{ODw@FirstBidCol}[\marg{{\upshape N|S|E|W}}] % \MakeShortVerb{\|} % % |\ODw@FirstBidCol| determines which player starts in the first bidding column. % We also take care that the real world name of the players are kept % associated with the columns. For |\ODw@BidderX| (X=I,II,III,IV) we % define two macros: |\ODw@BidderX| and |\ODw@BidderX*| in one. When these % macros are called in the |bidding| diagram, the starred version writes the % short notation whereas the unstarred one writes the long version. % \begin{macrocode} \newcommand\ODw@FirstBidCol[1]{% \IfEqCase{#1}{% {N}{% \def\ODw@BidderI{\@ifstar{\ODw@North*}{\ODw@N*}}% \def\ODw@BidderII{\@ifstar{\ODw@East*}{\ODw@E*}}% \def\ODw@BidderIII{\@ifstar{\ODw@South*}{\ODw@S*}}% \def\ODw@BidderIV{\@ifstar{\ODw@West*}{\ODw@W*}}% \def\ODw@NameI{\ODw@North@Name}% \def\ODw@NameII{\ODw@East@Name}% \def\ODw@NameIII{\ODw@South@Name}% \def\ODw@NameIV{\ODw@West@Name}% }% {E}{% \def\ODw@BidderI{\@ifstar{\ODw@East*}{\ODw@E*}}% \def\ODw@BidderII{\@ifstar{\ODw@South*}{\ODw@S*}}% \def\ODw@BidderIII{\@ifstar{\ODw@West*}{\ODw@W*}}% \def\ODw@BidderIV{\@ifstar{\ODw@North*}{\ODw@N*}}% \def\ODw@NameI{\ODw@East@Name}% \def\ODw@NameII{\ODw@South@Name}% \def\ODw@NameIII{\ODw@West@Name}% \def\ODw@NameIV{\ODw@North@Name}% }% {S}{% \def\ODw@BidderI{\@ifstar{\ODw@South*}{\ODw@S*}}% \def\ODw@BidderII{\@ifstar{\ODw@West*}{\ODw@W*}}% \def\ODw@BidderIII{\@ifstar{\ODw@North*}{\ODw@N*}}% \def\ODw@BidderIV{\@ifstar{\ODw@East*}{\ODw@E*}}% \def\ODw@NameI{\ODw@South@Name}% \def\ODw@NameII{\ODw@West@Name}% \def\ODw@NameIII{\ODw@North@Name}% \def\ODw@NameIV{\ODw@East@Name}% }% {W}{% \def\ODw@BidderI{\@ifstar{\ODw@West*}{\ODw@W*}}% \def\ODw@BidderII{\@ifstar{\ODw@North*}{\ODw@N*}}% \def\ODw@BidderIII{\@ifstar{\ODw@East*}{\ODw@E*}}% \def\ODw@BidderIV{\@ifstar{\ODw@South*}{\ODw@S*}}% \def\ODw@NameI{\ODw@West@Name}% \def\ODw@NameII{\ODw@North@Name}% \def\ODw@NameIII{\ODw@East@Name}% \def\ODw@NameIV{\ODw@South@Name}% }% }% IfEqCase }% ODw@FirstBidCol % \end{macrocode} % \end{macro} % % Next we define the real world names for the \NorthSouth*! and the \EastWest*! % bidders. We use |\ODw@All@Names| as variable to test if we have names for % bidders at all: If it is empty, then no names were defined. % \begin{macro}{\namesNS}\MacroDef{namesNS}[\marg{N-name}\marg{S-name}] % \begin{macrocode} \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 % \end{macrocode} % \end{macro} % % \begin{macro}{\namesEW}\MacroDef{namesEW}[\marg{E-name}\marg{W-name}] % \begin{macrocode} \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 % \end{macrocode} % \end{macro} % % \subsubsection{Diagram Hands} % % Here we implement commands that store the cards that each player holds. % E.g.\ |\northhand| defines the complete hand, i.e.\ all 4 suits for the % \North*-player. They have an optional parameter (an offset, default |0pt|) % to finetune the distance to the compass. In |\ODw@Nhand| and % |\ODw@Shand| we use a makebox to prevent that its width goes beyond the % |NESW| compass (but this can interfere with the Right-U/L-Legend). Within % these macros, we check the consistency of the cards in the hand and also % store card-information to check a complete deal later. % \begin{macro}{\northhand}\MacroDef{northhand}[\oarg{v-offset}\marg{Sp}\marg{He}\marg{Di}\marg{Cl}] % |\northhand[v-offset]{Sp}{He}{Di}{Cl}|\\ % | 1 2 3 4 5| % \begin{macrocode} \newcommand\northhand[5][0pt]{% % check that north has 13 cards \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 % \end{macrocode} % \begin{macro}{\ODw@Nhand} % We fit the \north hand in a box to avoid that a % very long suit shifts the \east hand to the right % \begin{macrocode} \gdef\ODw@Nhand{% \makebox[\ODw@Compasssize + 2ex][l]{% \ODw@hand{t}{#2}{#3}{#4}{#5}% }% \vspace{#1}% }% % \end{macrocode} % \end{macro} % \begin{macrocode} }% northhand % \end{macrocode} % \end{macro} % \begin{macro}{\easthand}\MacroDef{easthand}[\oarg{h-offset}\marg{Sp}\marg{He}\marg{Di}\marg{Cl}] % |\easthand[h-offset]{Sp}{He}{Di}{Cl}|\\ % | 1 2 3 4 5| % \begin{macrocode} \newcommand\easthand[5][0pt]{% % check that east has 13 cards \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 % \end{macrocode} % \begin{macro}{\ODw@Ehand} % \begin{macrocode} \gdef\ODw@Ehand{% \hspace{#1}% \ODw@hand{c}{#2}{#3}{#4}{#5}% }% % \end{macrocode} % \end{macro} % \begin{macrocode} }% easthand % \end{macrocode} % \end{macro} % \begin{macro}{\southhand}\MacroDef{southhand}[\oarg{v-offset}\marg{Sp}\marg{He}\marg{Di}\marg{Cl}] % |\southhand[v-offset]{Sp}{He}{Di}{Cl}|\\ % | 1 2 3 4 5| % \begin{macrocode} \newcommand\southhand[5][0pt]{% % check that south has 13 cards \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 % \end{macrocode} % \begin{macro}{\ODw@Shand} % We fit the \south hand in a box to avoid that a % very long suit shifts the \east hand to the right % \begin{macrocode} \gdef\ODw@Shand{% \parbox[b]{\ODw@Compasssize + 2ex}{% \vspace*{#1}\par% \makebox[0pt][l]{% \ODw@hand{b}{#2}{#3}{#4}{#5}% }% }% }% % \end{macrocode} % \end{macro} % \begin{macrocode} }% southhand % \end{macrocode} % \end{macro} % \begin{macro}{\westhand}\MacroDef{westhand}[\oarg{h-offset}\marg{Sp}\marg{He}\marg{Di}\marg{Cl}] % |\westhand[h-offset]{Sp}{He}{Di}{Cl}|\\ % | 1 2 3 4 5| % \begin{macrocode} \newcommand\westhand[5][0pt]{% % check that west has 13 cards \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 % \end{macrocode} % \begin{macro}{\ODw@Whand} % \begin{macrocode} \gdef\ODw@Whand{% \ODw@hand{c}{#2}{#3}{#4}{#5}% \hspace*{#1}% }% % \end{macrocode} % \end{macro} % \begin{macrocode} }% westhand % \end{macrocode} % \end{macro} % % \subsubsection{A Single Hand} % % Sometimes we want to show only (the cards of) one single hand. % % \noindent % \begin{macro}{\hand}\MacroDef{hand}[\Oarg{*!-}\oarg{pos}\marg{Sp}\marg{He}\marg{Di}\marg{Cl}] % \begin{macrocode} \NewDocumentCommand\hand{s t! t- O{c}mmmm}{% % \end{macrocode} % |\hand* ! -[pos]{Sp}{He}{Di}{Cl}|\\ % | 1 2 3 4 5 6 7 8|\\ % This macro has 3 optional tokens that act as follows:\\ % Naked mode: Displays the hand horizontally, left aligned.\\ % |*| mode: Displays the hand horizontally, centered.\\ % |!| mode: Displays the hand vertically, left aligned.\\ % |*!| mode: Displays the hand vertically, centered.\\ % |-| mode: Output is suppressed, it is stored in a savebox for later use. % \par\vspace{0.3\baselineskip}\noindent % The 4th argument is the aligning (used only in case of a vertical hand): % default \textbf{c}. The rest of the arguments denote the cards of the % suits. % % We first check that this hand has 13 cards. Then we check for each % suit that there are no multiples. Finally we store the hand in % |\ODw@Hand@Box|. If output is not suppressed, we write the hand with % |\usebox\ODw@Hand@Box|. % \begin{macrocode} \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 % \end{macrocode} % \end{macro} % % \begin{macro}{\ODw@hhand}\MacroDef{ODw@hhand}[\marg{Sp}\marg{He}\marg{Di}\marg{Cl}] % Displays a hand horizontally (e.g.\ \hand{xxxx}{xxx}{xxx}{xxx}). We use a % |tabular| with 4 columns in 1 row to print the 4 suits. % \begin{macrocode} \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 % \end{macrocode} % \end{macro} % % % \begin{macro}{\ODw@vhand}\MacroDef{ODw@vhand}[\oarg{pos}\marg{Sp}\marg{He}\marg{Di}\marg{Cl}] % \shorthandoff{!} % Display a hand vertically (e.g.\ \hand!{xxxx}{xxx}{xxx}{xxx}). We call % \shorthandon{!} % |\ODw@hand| to do the job. % \begin{macrocode} \newcommand\ODw@vhand[5][c]{% \ODw@hand{#1}{#2}{#3}{#4}{#5}% }% ODw@vhand % \end{macrocode} % \end{macro} % % \begin{macro}{\ODw@hand}\MacroDef{ODw@hand}[\oarg{pos}\marg{Sp}\marg{He}\marg{Di}\marg{Cl}] % We put a hand and some spacing in a |tabular| by reading the cards for % each suit, making the lines more tense with the |\\[-0.5ex]|. % Empty hands are discarded completely. % % \begin{macrocode} \newcommand\ODw@hand[5]{% % \end{macrocode} % |ODw@hand{pos}{spades}{hearts}{diamonds}{clubs}|\\ % | 1 2 3 4 5| % \par\noindent % First we test if the hand is completely empty; only if not, we output % something. % \begin{macrocode} \ifthenelse{\equal{#2#3#4#5}{}}{}{% \setlength\tabcolsep{\ODw@Card@Skip}% %JW \ODw@GameSize% XYX JW 30.04.2018 \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 % \end{macrocode} % \end{macro} % % \subsubsection{Suits} % % In some cases, we need only a collection of cards, without a suit symbol. % \begin{macro}{\onesuitAll}\MacroDef{onesuitAll}[\Oarg{*!}\marg{N}\marg{S}\marg{E}\marg{W}] % Display the cards of one suit in a \North*!{}\South*!--\East*!{}\West*! diagram, with % the \North*!-, \East*!-, \South*!- and \West*!-hand. % \begin{macrocode} \NewDocumentCommand\onesuitAll{s t! mmmm}{% % \end{macrocode} % |onesuitAll* !{N-hand}{S-hand}{E-hand}{W-hand}|\\ % | 1 2 3 4 5 6|\\ % |Naked version: Use a |\ODwBox\\ % |* version: Display the diagram centered|\\ % |! version: use the NESW compass| % \par\noindent % First we test that we have no multiple cards in the suit. Then we use a % |tabular| to place the cards around a compass or around a box. % \begin{macrocode} \ODw@ChkSameCards{#3#4#5#6}{}% \IfBooleanTF#1{\begin{center}}{}% \bgroup% \ODw@GameSize% \setlength\tabcolsep{0em}% \begin{tabular}{@{}r@{ }c@{ }l@{}}% %\begin{tabular}{@{}rcl@{}}% & \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 % \end{macrocode} % \end{macro} % % % \begin{macro}{\onesuitNS}\MacroDef{onesuitNS}[\Oarg{*!}\marg{N}\marg{S}] % Display a suit as |NS|-diagram. Similar to |\onesuitAll| but with only % |N|- and |S|-hand. % \begin{macrocode} \NewDocumentCommand\onesuitNS{s t! mm}{% % \end{macrocode} % |onesuitNS* !{N-hand}{S-hand}|\\ % | 1 2 3 4|\\ % |Naked version: Use a |\ODwBox\\ % |* version: Display the diagram centered|\\ % |! version: use the NESW compass| % % \begin{macrocode} \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 % \end{macrocode} % \end{macro} % % % \begin{macro}{\onesuitEW}\MacroDef{onesuitEW}[\Oarg{*!}\marg{E}\marg{W}] % Display a suit as |EW| diagram. Similar to |\onesuitAll| but with only % |E|- and |W|-hand. % \begin{macrocode} \NewDocumentCommand\onesuitEW{s t! mm}{% % \end{macrocode} % |onesuitEW* !{E-hand}{W-hand}|\\ % | 1 2 3 4|\\ % |Naked version: Use a |\ODwBox\\ % |* version: Display the diagram centered|\\ % |! version: use the NESW compass| % % \begin{macrocode} \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 % \end{macrocode} % \end{macro} % % \begin{macro}{\onesuitNE}\MacroDef{onesuitNE}[\Oarg{*!}\marg{N}\marg{E}] % Display a suit as |NE| diagram. Similar to |\onesuitAll| but with only % |N|- and |E|-hand. % \begin{macrocode} \NewDocumentCommand\onesuitNE{s t! mm}{% % \end{macrocode} % |onesuitNE* !{N-hand}{E-hand}|\\ % | 1 2 3 4|\\ % |Naked version: Use a |\ODwBox\\ % |* version: Display the diagram centered|\\ % |! version: use the NESW compass| % % \begin{macrocode} \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 % \end{macrocode} % \end{macro} % % \begin{macro}{\onesuitNW}\MacroDef{onesuitNW}[\Oarg{*!}\marg{N}\marg{W}] % Display a suit as |NW| diagram. Similar to |\onesuitAll| but with only % |N|- and |W|-hand. % \begin{macrocode} \NewDocumentCommand\onesuitNW{s t! mm}{% % \end{macrocode} % |onesuitNW* !{N-hand}{W-hand}|\\ % | 1 2 3 4|\\ % |Naked version: Use a |\ODwBox\\ % |* version: Display the diagram centered|\\ % |! version: use the NESW compass| % % \begin{macrocode} \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 % \end{macrocode} % \end{macro} % % \begin{macro}{\suit}\MacroDef{suit}[\oarg{suit symbol}\marg{cards}] % Command for displaying the cards of a suit. With the optional argument % one can add a suit symbol to the suit. % % \begin{macrocode} \newcommand\suit[2][]{% % \end{macrocode} % |\suit[suit]{cards}|\\ % | 1 2 | % \begin{macrocode} \ODw@ChkNrOfCards{#2}{suit}% \ODw@ChkSameCards{#2}{#1}% \bgroup% keep font change local %JW \ODw@GameSize% #1\ODw@Cards{#2}% \egroup% \xspace% }% suit % \end{macrocode} % \end{macro} % % \begin{macro}{\ODw@Cards}\MacroDef{ODw@Cards}[\marg{cards}] % This macro gets called by |\suit| and all commands that process hands. It % processes the ranks of the cards. Between ranks some space is typeset. % Care is taken that |T| becomes \suit{T} and honor cards are % translated into the active language. % \begin{macrocode} \newcommand{\ODw@Cards}[1]{% % \end{macrocode} % \par\vspace{0.3\baselineskip}\noindent % We enable the cardskip and call |\ODw@Xfer| to do the job % \begin{macrocode} \OdW@CardSkiptrue% \ODw@Xfer{#1}% }% ODw@Cards % \end{macrocode} % \end{macro} % % \subsubsection{Card Diagrams} % % Next we define several diagrams with hands around the compass. % |\ODw@GameSize| sets the size of the compass, the directions and the % hands, according to the actual font or font-size. % |\ODw@LeftUpperText| etc.\ displays extra text, that appear in the left % upper, etc.\ corner of the diagram. If |\headlinetext| (|\footlinetext|) % is the empty string, we set boolean |ODw@EmptyHeader| (|ODw@EmptyFooter|) % to true\footnote{see page \pageref{Empty}, last paragraph why this is % necessary}. This value is used in % |\ODw@ProcessHeader| to conditionally span the 3 columns with the % headline- (footline)text. We first store the diagram in a box, so we can % calculate its width and use that as a size to limit the header/footer % texts. % % \begin{macro}{\showAll}\MacroDef{showAll}[\Oarg{*+}\oarg{pos}] % Define the diagram, showing the cards for \textbf{All} hands. % % \begin{macrocode} \NewDocumentCommand\showAll{s t+ O{c}}{% % \end{macrocode} % |showAll* + [pos]|\\ % | 1 2 3|\\ % |Display the NS--EW diagram, defined by \northhand, etc|\\ % |* Version: Display the diagram centered|\\ % |+ Version: Also display a bidding diagram|\\ % |pos: aligning, default= c| % \par\noindent % First, for all suits we store all cards of all sides together. Next we % check the consistency of all complete suits. The individual suits of each % player have already been checked as we defined the hands. Finally we % print the hands around the compass using a |tabular|, taking care of the % additions above, below and in the corners of the diagram. Before we write % the diagram, we store it in an sbox to calulate its width, so we can use % that in other places. % % \begin{macrocode} \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 % \end{macrocode} % \end{macro} % % \DeleteShortVerb{\|} % \begin{macro}{\showNS}\MacroDef{showNS}[\Oarg{*+}\oarg{pos}\parg{N|S}] % \MakeShortVerb{\|} % Define the diagram, showing the cards for the \NorthSouth*! hands. % % \begin{macrocode} \NewDocumentCommand\showNS{s t+ O{c} d()}{% % \end{macrocode} % |showNS* +[pos] (N/S)|\\ % | 1 2 3 4|\\ % |Display the NS diagram, defined by \northhand, etc|\\ % |* Version: Display the diagram centered|\\ % |+ Version: Also display a bidding diagram|\\ % |pos: aligning, default c|\\ % |N/S: only N-hand (or S-hand) is to be displayed|\\ % \par\noindent % Description: similar to |\showAll| % \begin{macrocode} % For all suits store all cards of north and south together \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}% % \end{macrocode} % Here we store the width of the diagram \textbf{without} the header and % footer. So we can limit their width to the diagramwidth. % \begin{macrocode} % sbox1 necessary to calc. |Compasssize| for |Nhand| \sbox1{\ODw@Compass}% \sbox0{% \begin{tabular}[#3]{@{}r@{}c@{}l@{}}% % Display the N-hand only with token 'N', or no token at all & \IfNoValueTF{#4}{\ODw@Nhand}{\ifthenelse{\equal{#4}{N}}{\ODw@Nhand}{}} & \\ & \usebox{1} & \\ % Display the S-hand only with token 'S', or no token at all & \IfNoValueTF{#4}{\ODw@Shand}{\ifthenelse{\equal{#4}{S}}{\ODw@Shand}{}} & \\ \end{tabular}% }% sbox0 \ODw@gsetlength\ODw@Diagram@Width{\wd0}% \begin{tabular}[#3]{@{}r@{}c@{}l@{}}% \ODw@ProcessHeader{3}% span 3 columns % Display the N-hand only with token 'N', or no token at all & \IfNoValueTF{#4}{\ODw@Nhand}{\ifthenelse{\equal{#4}{N}}{\ODw@Nhand}{}} & \\ & \usebox{1} & \\ % Display the S-hand only with token 'S', or no token at all & \IfNoValueTF{#4}{\ODw@Shand}{\ifthenelse{\equal{#4}{S}}{\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 % \end{macrocode} % \end{macro} % % \DeleteShortVerb{\|} % \begin{macro}{\showEW}\MacroDef{showEW}[\Oarg{*+}\oarg{pos}\parg{E|W}] % \MakeShortVerb{\|} % Define the diagram, showing the cards for the \EastWest*! hands. % \begin{macrocode} \NewDocumentCommand\showEW{s t+ O{c} d()}{% % \end{macrocode} % |showEW* + [pos] (E/W)|\\ % | 1 2 3 4|\\ % |Display the EW diagram, defined by \easthand, etc|\\ % |* Version: Display the diagram centered|\\ % |+ Version: Also display a bidding diagram|\\ % |pos: aligning, default c|\\ % |E/W: only E-hand (or W-hand) is to be displayed|\\ % \par\noindent % Description: similar to |\showAll| % \begin{macrocode} % For all suits put all cards of east and west together \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@{}}% % Display the W-hand only with token 'W', or no token at all \IfNoValueTF{#4}{\ODw@Whand}{\ifthenelse{\equal{#4}{W}}{\ODw@Whand}{}} & \ODw@Compass & % Display the E-hand only with token 'E', or no token at all \IfNoValueTF{#4}{\ODw@Ehand}{\ifthenelse{\equal{#4}{E}}{\ODw@Ehand}{}} \\ \end{tabular}% }% sbox \ODw@gsetlength{\ODw@Diagram@Width}{\wd0}% \begin{tabular}[#3]{@{}r@{}c@{}l@{}}% \ODw@ProcessHeader{3}% span 3 columns & & \\ % Display the W-hand only with token 'W', or no token at all \IfNoValueTF{#4}{\ODw@Whand}{\ifthenelse{\equal{#4}{W}}{\ODw@Whand}{}} & \ODw@Compass & % Display the E-hand only with token 'E', or no token at all \IfNoValueTF{#4}{\ODw@Ehand}{\ifthenelse{\equal{#4}{E}}{\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 % \end{macrocode} % \end{macro} % % % \begin{macro}{\showNE}\MacroDef{showNE}[\Oarg{*+}\oarg{pos}] % Define the diagram, showing the cards for the % \North*!{}\textbf{--}\East*! hands. % \begin{macrocode} \NewDocumentCommand\showNE{s t+ O{c}}{% % \end{macrocode} % |showNE* +[pos]|\\ % | 1 2 3|\\ % |Display the NE diagram, defined by \northhand, etc|\\ % |* Version: Display the diagram centered|\\ % |+ Version: Also display a bidding diagram|\\ % |pos: aligning, default c|\\ % Description: similar to |\showAll| % \begin{macrocode} % For all suits put all cards of north and east together \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 % \end{macrocode} % \end{macro} % % % \begin{macro}{\showNW}\MacroDef{showNW}[\Oarg{*+}\oarg{pos}] % Define the diagram, showing the cards for the % \North*!{}\textbf{--}\West*! hands. % \begin{macrocode} \NewDocumentCommand\showNW{s t+ O{c}}{% % \end{macrocode} % |showNW* +[pos]|\\ % | 1 2 3|\\ % |Display the NW diagram, defined by \northhand, etc|\\ % |* Version: Display the diagram centered|\\ % |+ Version: Also display a bidding diagram|\\ % |pos: aligning, default c|\\ % Description: similar to |\showAll| % \begin{macrocode} % For all suits put all cards of north and west together \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 % \end{macrocode} % \end{macro} % % \subsubsection{The Compass} % % When displaying the compass, the square with |N-S| and |E-W| axes, we try % to achieve several things: % \begin{enumerate}[itemsep=0em] % \item Making the size font-size dependent % \item Put both |N| and |S| horizontally centered % \item Put both |E| and |W| vertically centered % \item Print the vulnerable side in red if in colored mode % \item Underline the dealer (we \emph{over}line |S| for better clarity) % \end{enumerate} % We use the mapping as shown in the tables below. The |U| stands for % undefined. This reflects the situation where neither |\vulner| nor % |\dealer| have been called, and also there is no board number known.\\ % % \hfill % \begin{tabular}{|c|c|}\hline % \multicolumn{2}{|c|}{Player} \\\hline % N & 0 \\ % E & 1 \\ % S & 2 \\ % W & 3 \\\hline % \end{tabular} % \hfill\hfill % \begin{tabular}{|c|c|}\hline % \multicolumn{2}{|c|}{Vulner} \\\hline % none & 0 \\ % all & 1 \\ % N-S & 2 \\ % E-W & 3 \\\hline % U & -1 \\\hline % \end{tabular} % \hfill\hfill % \begin{tabular}{|c|c|}\hline % \multicolumn{2}{|c|}{Dealer} \\\hline % N & 0 \\ % E & 1 \\ % S & 2 \\ % W & 3 \\\hline % U & -1 \\\hline % \end{tabular} % \hfill\hfill % % \begin{macro}{\ODw@Compass}\MacroDef{ODw@Compass} % \begin{macrocode} \newcommand{\ODw@Compass}{% % \end{macrocode} % The codes for dealership (|\ODw@D|) and vulnerability (|\ODw@V|) are used % in |\ODw@Print|. We initialize them with the value |-1| to denote the % undefined state. |\@ODw| acts as a local temp variable in oder to make a % smooth comparison. % \begin{macrocode} \begingroup \def\ODw@V{-1}\def\ODw@D{-1}% % % Set the code for vulnerability % \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% % % Set the code for dealership % \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% % % \end{macrocode} % We use a |picture| environment and set its size to % $\mbox{|2.5em|} \times \mbox{|2.5em|}$ % by setting the |\PicSize| to 500 and the unitlength to |0.005em|. Doing this % enables us the avoid floating point arithmetic in the calculations of % positions. Both |\PicSize| and |\MidSize| are local to |\ODw@Compass| and % skipped from indexing. The same goes for |\Hoffset| and |\Voffset|. % \begin{macrocode} \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 % \end{macrocode} % \end{macro} % % \begin{macro}{\ODw@Print}\MacroDef{ODw@Print}[\marg{player-code}] % |\ODw@Print| prints |N|, |E|, |S| and |W| in the compass. The side that % is vulnerable is printed in red (or italics if we are monochrome), % otherwise in black. The dealer is under- or overlined. % \par\noindent % The |\ifcase| distinguishes between the players. Then dealership and % vulnerability are tested. |\ODw@PrintColor| is called to actually print % the player. % \begin{macrocode} \newcommand\ODw@Print[1]{% % \end{macrocode} % |\ODw@Print{player-code}|\\ % | 1 (player-code=0-3)| % \begin{macrocode} \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 % \end{macrocode} % \end{macro} % % \DeleteShortVerb{\|} % \begin{macro}{\ODw@PrintColor}\MacroDef{ODw@PrintColor}[\{|N|E|S|W\}] % \MakeShortVerb{\|} % |\ODw@PrintColor| checks if we are in monochrome mode. If that is the % case we print |N|, |E|, |S| or |W| in italics, otherwise in color. % % \begin{macrocode} \newcommand\ODw@PrintColor[1]{% \ifODw@monochrome\textit{#1}\else\textcolor{red}{#1}\fi% }% ODw@PrintColor % \end{macrocode} % \end{macro} % % \begin{macro}{\ODw@mid} % Hook to write something in the middle of the compass. We write what is % stored in |\ODw@CompMid| a bit smaller than the |N-S| and |E-W| letters. % |\ODw@mid| writes the contents of |\ODw@CompMid| in the middle of the % compass. As there is only very limited room, this text should be very % short. It is primarily meant to write just a board number in the % compass. % \begin{macro}{\ODw@CompMid} % \begin{macrocode} \def\ODw@CompMid{} \def\ODw@mid{{\smaller\smaller\smaller\ODw@CompMid}} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\ODw@Box} % Displays a \ODwBox % \begin{macrocode} \newcommand{\ODw@Box}{% \bgroup \setlength{\fboxsep}{0pt}% \setlength{\fboxrule}{0.1em}% \fbox{\rule{0mm}{0.7em}\rule{0.7em}{0mm}}% \egroup }% ODw@Box % \end{macrocode} % \end{macro} % % % \subsubsection{Diagram Conditions} % % Here we implement several macros that add some board information to the % card diagram. |\ODw@BoardText| serves as a variable to store the % user-defined or (by means of the board number) auto-generated text, % concerning the board. The macro |\boardnr| has 1 mandatory argument. If % it is a number, it is considered to be the board number. % The dealer and which side is vulnerable is then % calculated from it and stored by calling |\dealer| resp. |\vulner|. If % it is not a positive integer, it is considered user-defined text which is % stored 'as is' in |\ODw@BoardText|. The contents can be retrieved by the % user by calling |\boardtext| to actually print the board information. % \begin{macro}{\ODw@BoardText} % \begin{macrocode} \def\ODw@BoardText{} % \end{macrocode} % \end{macro} % \begin{macro}{\boardtext}\MacroDef{boardtext}[\Oarg{*}] % \noindent % |\boardtext| has only 1 token and no arguments. The unstarred form % outputs only the text stored in |\ODw@BoardText|, this is normally a % board number. |\boardtext*| outputs something like 'Board:~23'. % \begin{macrocode} \NewDocumentCommand\boardtext{s}{% \IfBooleanTF#1{\translate{Board-(ODw)}:\,\ODw@BoardText}% {\ODw@BoardText}% }% boardtext % \end{macrocode} % \end{macro} % \begin{macro}{\boardnr}\MacroDef{boardnr}[\marg{Nr}] % |\boardnr{Nr}| sets the dealership and vulnerability according to |Nr|. % As the system repeats itself after the 16th board, we canonize |Nr| to % the range of 1--16. We also set |\ODw@BoardText| accordingly. For the % association between boardnumber and dealer/vulner, see file % \emph{Compass} of the |onedown-example| collection. % \begin{macrocode} \newcommand{\boardnr}[1]{% \IfInteger{#1}{% \gdef\ODw@BoardText{% \bgroup% \ODw@OtherFont% % \translate{Board-(ODw)} #1% #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 % Board 0 = no board: mark dealer and vulner undefined {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 % \end{macrocode} % \end{macro} % % The next macros are used to add some game information above resp. below % the card diagram. |\ODw@HeaderText| and |\ODw@FooterText| are used as % variables to store the user-defined text. % \begin{macro}{\headlinetext}\MacroDef{headlinetext}[\marg{text}] % \begin{macro}{\ODw@HeaderText} % \begin{macrocode} \newcommand\headlinetext[1]{\gdef\ODw@HeaderText{#1}} \headlinetext{} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\footlinetext}\MacroDef{footlinetext}[\marg{text}] % \begin{macro}{\ODw@FooterText} % \begin{macrocode} \newcommand\footlinetext[1]{\gdef\ODw@FooterText{#1}} \footlinetext{} % \end{macrocode} % \end{macro} % \end{macro} % % The next macros are used to add some game information in the corners of % the card diagram. We use a |tabular| with 1 column and 3 lines to do so. % % We redefine the (originally empty) |Left[Upper/Lower]|- and\\ % |Right[Upper/Lower]Text|, and set it to the wanted value. The % first (optional) parameter defines some horizontal extra space if the % hand and a condition text collide. The commands have 3 mandatory % arguments, each for 1 of the 3 condition lines, which may be empty. % \begin{macro}{\leftupper}\MacroDef{leftupper}[\oarg{h-offset}\marg{line1}\marg{line2}\marg{line3}] % \begin{macro}{\ODw@LeftUpperText} % \begin{macrocode} \def\ODw@LeftUpperText{} \newcommand\leftupper[4][0pt]{% \gdef\ODw@LeftUpperText{% \hspace{-#1}% \begin{tabular}[t]{l}#2\\#3\\#4\\\end{tabular} }% }% leftupper % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\leftlower}\MacroDef{leftlower}[\oarg{h-offset}\marg{line1}\marg{line2}\marg{line3}] % \begin{macro}{\ODw@LeftLowerText} % \begin{macrocode} \def\ODw@LeftLowerText{} \newcommand\leftlower[4][0pt]{% \gdef\ODw@LeftLowerText{% \hspace{-#1}% \begin{tabular}[b]{l}#2\\#3\\#4\\\end{tabular} }% }% leftlower % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\rightupper}\MacroDef{rightupper}[\oarg{h-offset}\marg{line1}\marg{line2}\marg{line3}] % \begin{macro}{\ODw@RightUpperText} % \begin{macrocode} \def\ODw@RightUpperText{} \newcommand\rightupper[4][0pt]{% \gdef\ODw@RightUpperText{% \hspace{#1}% \begin{tabular}[t]{l}#2\\#3\\#4\\\end{tabular} }% }% rightupper % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\rightlower}\MacroDef{rightlower}[\oarg{h-offset}\marg{line1}\marg{line2}\marg{line3}] % \begin{macro}{\ODw@RightLowerText} % \begin{macrocode} \def\ODw@RightLowerText{} \newcommand\rightlower[4][0pt]{% \gdef\ODw@RightLowerText{% \hspace{#1}% \begin{tabular}[b]{l}#2\\#3\\#4\\\end{tabular} }% }% rightlower % \end{macrocode} % \end{macro} % \end{macro} % % % % \begin{macro}{\ODw@ProcessHeader}\MacroDef{ODw@ProcessHeader}[\marg{N}] % |\ODw@ProcessHeader[N]| puts |HeaderText| in a multicolumn which spans N % columns. % \begin{macrocode} \newcommand{\ODw@ProcessHeader}[1]{% % \end{macrocode} % Programmers note:\\ % |\ODw@TestIfEmpty| cannot be called in here. The |\ifthenelse| called within % the tabular environment leads to the error:\\ % \example{|! Misplaced |\bs|omit. |\bs|multispan ->|\bs|omit |\bs|@multispan|} % \par\vspace{0.5\baselineskip}\noindent % So the test of the emptiness of |Header-| and |FooterText| is done out of % the tabular. Why is (La)TeX always causing unexpected problems?:-( % \par\noindent % We set the headline/footline text to the width of the diagram with a % solution found at:\\ % \url{https://tex.stackexchange.com/questions/125005/how-to-create-a-table-where-one-cell-spans-all-the-columns-and-the-text-wraps-pr} % % \begin{macrocode} \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 % \end{macrocode} % \end{macro} % % \begin{macro}{\ODw@TestIfEmpty}\MacroDef{ODw@TestIfEmpty}[\marg{Str}\marg{Bool}] % Tests the emptiness of a string. % \begin{macrocode} \newcommand{\ODw@TestIfEmpty}[2]{% % \end{macrocode} % |\ODw@TestIfEmpty{Str}{Bool}|\\ % | sets boolean Bool to true if string Str is empty| % \begin{macrocode} \ifthenelse{\equal{#1}{}}{% \setboolean{#2}{true}}{% \setboolean{#2}{false}% }% }% ODw@TestIfEmpty % \end{macrocode} % \end{macro} % % % \begin{macro}{\ODw@ProcessFooter}\MacroDef{ODw@ProcessFooter}[\marg{N}] % |\ODw@ProcessFooter[N]| puts |FooterText| in a multicolumn which spans % |N| columns. % \begin{macrocode} \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 % \end{macrocode} % \end{macro} % % \begin{macro}{\handskip}\MacroDef{handskip}[\marg{length}] % |\handskip| adds || to |SkipWidth|, i.e.\ the distance between % the card diagram (with or without the east hand) and the |bidding| % diagram. % \begin{macrocode} \newcommand\handskip[1]{% \def\ODw@Skipwidth{1em + #1}% recalculate the new Skipwidth \setlength\ODw@Skip@Width{\ODw@Skipwidth}% }% handskip % \end{macrocode} % \end{macro} % % \begin{macro}{\ODw@DealerText} % Typesets the string \emph{Dealer}. % \begin{macrocode} \def\ODw@DealerText{% \bgroup% \ODw@OtherFont\translate{Dealer-(ODw)}% \egroup% }% ODw@DealerText % \end{macrocode} % \end{macro} % \par\noindent\needspace{2\baselineskip} % \begin{macro}{\ODw@VulnerText} % \makeatletter % \MacroDef{ODw@VulnerText}[\Oarg{*!}\hfill \ODw@VulnerText (\ODw@VulnerText*, % \ODw@VulnerText!, \ODw@VulnerText*!)] % \makeatother % Typesets the string \emph{vulnerable} or \emph{Vul}. % \begin{macrocode} \NewDocumentCommand\ODw@VulnerText{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF#1{% \IfBooleanTF#2{\translate{Vul-(ODw)}}% {\translate{Vulnerable-(ODw)}}% }{% \IfBooleanTF#2{\translate{vul-(ODw)}}% {\translate{vulnerable-(ODw)}}% }% \egroup% \xspace% }% ODw@VulnerText % \end{macrocode} % \end{macro} % % \begin{macro}{\ODw@AwardText} Typesets the text to be put as 'title' in % the \emph{award} part of a expert quiz. % \begin{macrocode} \def\ODw@AwardText{\textsf{\translate{Award-(ODw)}}} % \end{macrocode} % \end{macro} % % \begin{macro}{\dealer}\MacroDef{dealer}[\oarg{dealer}] % If |#1 = empty| then set |\ODw@Dealer| to |#1| else output |\ODw@Dealer| % \begin{macrocode} \newcommand\dealer[1][]{% \ifthenelse{\equal{#1}{}}% {\ODw@Dealer}% {\gdef\ODw@Dealer{#1}}% }% dealer % \end{macrocode} % \end{macro} % \begin{macro}{\ODw@Dealer} % set \north as default % \begin{macrocode} \def\ODw@Dealer{\North*} % \end{macrocode} % \end{macro} % % \begin{macro}{\vulner}\MacroDef{vulner}[\oarg{vulner}] % If |#1 = empty| then set |\ODw@Vulner| to |#1| else output |\ODw@Vulner| % \begin{macrocode} \newcommand\vulner[1][]{% \ifthenelse{\equal{#1}{}}% {\ODw@Vulner}% {\gdef\ODw@Vulner{#1}}% }% vulner % \end{macrocode} % \end{macro} % \begin{macro}{\ODw@Vulner} % set \NorthSouth as default % \begin{macrocode} \def\ODw@Vulner{\NorthSouth} % \end{macrocode} % \end{macro} % % \begin{macro}{\dealertext} % \begin{macrocode} \newcommand\dealertext[1][\ODw@Dealer]{\ODw@DealerText:\,#1} % \end{macrocode} % \end{macro} % % \begin{macro}{\vulnertext} % \begin{macrocode} \newcommand\vulnertext[1][\ODw@Vulner]{% \ifODw@LongCalls% \ODw@VulnerText*% \else% \ODw@VulnerText*!% \fi% :\,#1% } % \end{macrocode} % \end{macro} % % \begin{macro}{\alert} % \begin{macrocode} \newcommand{\alert}{{}\ensuremath{^\textbf{\textasteriskcentered}}} % \end{macrocode} % \end{macro} % % \begin{macro}{\announce} % \begin{macrocode} \newcommand{\announce}{{}\ensuremath{^\textbf{\smaller A}}} % \end{macrocode} % \end{macro} % % \begin{macro}{\markit}\MacroDef{markit} % \begin{macrocode} \newcommand\markit{% % \end{macrocode} % Sets markers \emph{a, b} etc. To be used only in |bidding| diagrams. % \begin{macrocode} \stepcounter{ODw@Nr}% \footnotemark[\theODw@Nr]% }% markit % \end{macrocode} % \end{macro} % % \begin{macro}{\explainit}\MacroDef{explainit}[\marg{text}] % \begin{macrocode} \newcommand\explainit[1]{% % \end{macrocode} % Explains the marked items. To be used only in |bidding| diagrams. The % counter |ODw@Nr| associates the marker with the explanation. % \begin{macrocode} \stepcounter{ODw@Nr}% \ensuremath{{}^\textrm{\smaller\alph{ODw@Nr}}}\,#1% }% explainit % \end{macrocode} % \end{macro} % % \subsection{The Bidding Environments} % % \subsubsection{Special Columntypes} % % \begin{macro}{\newcolumntype} % In order to automatically apply a macro call on all cell contents of a % column (translate/convert; step a counter) in |bidding| and |play| diagrams, % we define newcolumntypes, made possible by loading package % \packname{collectcell}. We define next columntypes: % \begin{description}[topsep=2mm,itemsep=-2mm] % \item{B:} Transfers suits and cards (|bidding| and |play|) % \item{F:} sets First column in |play| diagrams % \item{P:} Transfers suits and cards, accumulates won tricks (|play|) % \end{description} % % \begin{macrocode} \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}} % \end{macrocode} % \end{macro} % % \subsubsection{The Hidden Implementation} % % As explained before, in the |bidding| diagrams we convert |S| to the spade % symbol \Sp, etc. We do need packages \packname{array} and % \packname{collectcell} for this and define the columntype |B|. In order % to avoid these convertions in the top row, where names are displayed, we % use the |\cci|-trick to suppress expansion of the cell macro. Curiously % the command |\cci| (from \packname{collcell}, v0.5, 2011/02/27) sometimes % produces unwanted characters. The reason is unknown to me. % We use a space ("| |") as first character in |\cci| to avoid this. % \par\noindent % We store the |bidding| diagram without the explanations in a box, so we can % calculate the width of the |bidding| diagram and make our explanation part % exactly as wide. In the first row we write the bidders: |North| etc.\ (or % |N|, if it has to be short). In the second row we write the real world % names of the bidders, if given. If any description is given, we make a % multicolumn over the 4 rows with the previously stored width to write the % explanations. We also use this width to calculate whether the bidding % diagram will fit on the actual line. If not, we put it on a new line. % \begin{environment}{ODw@Bidding}\MacroDef{ODw@Bidding}[\oarg{pos}\parg{description}\ldots\bs endODw@Bidding] % \begin{macrocode} \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 % \end{macrocode} % \end{environment} % % \begin{environment}{ODw@Biddingpair}\MacroDef{ODw@Biddingpair}[\oarg{pos}\parg{description}\ldots\bs endODw@Biddingpair] % Decription: Similar to |ODw@Bidding| % \begin{macrocode} \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 % \end{macrocode} % \end{environment} % % \subsection{The User Environments} % % \subsubsection{Bidding} % % The |bidding| environments have 2 optional arguments: an alignment % \oarg{pos} and an annotation \parg{description}. There are also 3 tokens: % the |*| centers the |bidding| diagram, the |+| forces the short notation, % i.e. \North*! rather than \North* and the |-| suppresses all output. % \par\noindent % |\ODw@GameSize| takes care of the font dependent sizing of the diagram. % We locally redefine |\thefootnote| and reset the (general) counter % |ODw@Nr|, which is stepped in |\markit| and |\explainit| to make the % annotations correspond. In the end code we define a multicolumn over all % 4 (2) columns and write the annotation given in argument |#2|. With % |p{...\ODw@Bid@Width...}| care is taken to limit this text to the width % of the diagram. % % \begin{environment}{bidding}\EnvDef{bidding}[\Oarg{*!-}\oarg{pos}\parg{description}] % \begin{macrocode} \NewDocumentEnvironment{bidding}{s t! t- O{c}d()}{% % \end{macrocode} % |\begin{bidding}* ! -[pos](description)|\\ % | 1 2 3 4 5|\\ % The 1st token (|*|) centers the environment; the 2nd token (|!|) switches to the short % notation in the table header; the 3rd token (|-|) suppresses the output. % Argument 4 regulates the alignment of the table (default is \textbf{c} % and the 5th argument contains the annotations of the bidding. % \begin{macrocode} \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 % \end{macrocode} % \end{environment} % % \begin{environment}{biddingpair}\EnvDef{biddingpair}[\Oarg{*!-}\oarg{pos}\parg{description}] % \begin{macrocode} \NewDocumentEnvironment{biddingpair}{s t! t- O{c}d()}{% % \end{macrocode} % |\begin{biddingpair}* ! -[pos](description)|\\ % | 1 2 3 4 5|\\ % The same as with environment |bidding|, only with 2 columns instead of 4. % \begin{macrocode} \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 % \end{macrocode} % \end{environment} % % % \subsubsection{Play} % % Environment |play| displays the sequence of playing tricks. It uses % 2 |newcolumntype|s: % \begin{itemize}[itemsep=0em] % \item[|F|] to increment and display the current row. % \item[|P|] to translate an convert suits/ranks. % \end{itemize} % % \begin{macro}{\ODw@AccTricks} % |\ODw@AccTricks| calculates and shows the accumulated tricks in % |play| that |N-S| and |E-W| has won. The winning card is detected % automatically and |\ODw@LastTrick| is called to process the winning trick % for whichever side won it (|N-S| or |E-W|) by stepping the counter for the % winning side. The counter |ODw@Player| denotes the player who won the % trick. From the player who leads and the position that wins we calculate % the winning player and step the counter for his side. % \begin{macrocode} \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 % \end{macrocode} % \end{macro} % % \begin{macro}{\ODw@Tricks}\MacroDef{ODw@Tricks} % \begin{macro}{\ODw@Last}\label{Last} % This macro is automatically called in TableII for column 1. % This column displays the player who had the lead. % It essentially 1) resets the |ODw@PlayerNr| which will be % stepped for each next column in search for the winning card 2) % remembers in |\ODw@Last| who had the lead. From these two values we can % later calculate who won this trick. The stepping of |ODw@PlayerNr| occurs % in |\ODw@Tfer|. % \begin{macrocode} \def\ODw@Tricks{% \setcounter{ODw@PlayerNr}{0}% \gdef\ODw@Last{\ODw@NextLead}% \expandafter\translate% \expandafter{\ODw@NextLead-(ODw)}:\,% % write a colon and a thin space in the table, % as separator between lead player and lead card. }% ODw@Tricks % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\ODw@LastTrick}\MacroDef{ODw@LastTrick}[\marg{Player}\marg{Pos}] % This macro is called by |\ODw@AccTricks|. % It computes who won the last trick and steps the corresponding counter. % \begin{macrocode} \newcommand\ODw@LastTrick[2]{% % \end{macrocode} % |\ODw@LastTrick{Player}{Pos}|\\ % | 1 2--- Seat Nr that won the trick|\\ % | +---------- Player (N,E,S,W) who has led| % \par\vspace{0.5\baselineskip}\noindent % Consider the following table, where the seats are in horizontal % direction, starting with the player who leads in seat 1. Vertically, in % the first column, we have an initial value, stored in |ODw@Cnt| which is % associated with the leading player. % % \begin{tabular}{c|cccc} % & 1 & 2 & 3 & 4 \\\hline % 0 & W$^1$ & N$^2$ & E$^3$ & S$^4$ \\ % 1 & N$^2$ & E$^3$ & S$^4$ & W$^5$ \\ % 2 & E$^3$ & S$^4$ & W$^5$ & N$^6$ \\ % 3 & S$^4$ & W$^5$ & N$^6$ & E$^7$ \\ % \end{tabular} % \par\noindent % If we add this initial value to the % \emph{seat} where the trick is won, then the result gives us the % \emph{player} who won the trick. Suppose that e.g.\ |S| had the lead, % so |ODw@Cnt| $=$ 3. Suppose also that seat number 3 wins the trick. The % sum equals 6 and this is the seat of |N|. For clarity these sums are % displayed in the table as superscripts to the players % \par\vspace{0.5\baselineskip}\noindent % First we set the counter |ODw@Cnt| to the player who has the lead and add % the seat number (|#2|) to it. We then store who has the next lead in % |\ODw@NextLead| and increment the counter of the winning side. % % \begin{macrocode} \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 % \end{macrocode} % \end{macro} % % \begin{environment}{play}\EnvDef{play}[*\marg{Lead}\oarg{Trump}] % \label{Play} % \changes{v0.3}{2018/02/24}{\\ % - In order to avoid empty columns in environment \texttt{playtricks} we % reorganized it. Rather than just 1 table we use 3 tables. The middle one % typesets the relevant tricks, stored in an \texttt{lrbox}, while % generating on the fly a string with the winning tricks. Finally we put % the running trick-number in TableI, we 'use' TableII and contruct % TableIII from the string with the winning tricks.} % % Finally we define environment |play|. It consists primarily of % these 3 tables, the middle one with the special newcolumntype % \textbf{P}. We reset the % counter for the running line (=trick) |ODw@Nr| and the winning trick % counters for |N|--|S| and |E|--|W|: |ODw@NSCnt| and |ODw@EWCnt|. As usual % |\ODw@GameSize| takes care for the correct sizing. The first row (the % title row) is displayed using the |\cci| method. The 3th table gets a % stacked |N/S| and |E/W| title. % \begin{macrocode} \NewDocumentEnvironment{play}{s mO{N}}{% % #1 --> s center % #2 --> m lead % #3 --> O trumpsuit (default NoTrump) \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% % % We need some data which is calculated in TableII % to create TableI and TableIII. So we put TableII in a % box and display it later at due time % \def\ODw@EXtra{0.9em}% white space in title % \provideenvironment{TableII}{% \begin{tabular}[b]{FPPP}% \multicolumn{1}{c}{\translate{Lead!-(ODw)}} &% \cci{\translate{2nd-(ODw)}} &% \cci{\translate{3rd-(ODw)}} &% \cci{\translate{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}}{}% % % \end{macrocode} % We need TableI to show the running trick number. When constructing Table % II, the total number of tricks that were actually displayed is available % in counter |ODw@Nr|. So we just need to loop |\theODw@Nr| times and write % the local counter value |\theODw@Cnt|. To avoid \emph{the extra line % problem} we use the solution from:\\ % \url{https://tex.stackexchange.com/questions/50296/problem-with-using-loop-inside-the-tabular-environment/142562#142562} % \begin{macrocode} % \begin{tabular}[b]{r}% TableI \cci{\translate{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}% % % TableII showing the cards played in the tricks % \usebox{0}% % % \end{macrocode} % We use TableIII to show the winning trick counts. These are already stored % in a CSV-list |\ODw@Scratch|, implemented as a token register. To process % this list we use |\docsvlist| and must only define our |\do|. As this % table has 2 columns, we check with |ODw@Nr| that after an item is read, % we put an \& and after the next item a |\\|. % \begin{macrocode} % \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 % \end{macrocode} % \end{environment} % % \subsection{Card Diagrams with Bidding} % % \begin{macro}{\ODw@CondNewLine}\MacroDef{ODw@CondNewLine}[\oarg{offset}] % \begin{macrocode} \NewDocumentCommand\ODw@CondNewLine{O{0em}}{% % \end{macrocode} % |\ODw@CondNewLine| forces a newline if the |bidding| diagram does not fit on % the line, taking into account the width of the card diagram and the width % of the |bidding| diagram. % Otherwise the |bidding| diagram appears to the right of the card diagram at % distance |\ODw@Skip@Width|. We call the global macro % |\ODw@Diagram@Width| that contains the width of the card diagram. The % optional parameter of |\ODw@CondNewLine| is used to add some extra % offset if needed. % % \begin{macrocode} {\ODw@GameFont% needed to relate skips to the font-size % :\the\ODw@Skip@Width:% JW XXX \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 % \end{macrocode} % \end{macro} % % \subsection{The Expert Quiz} % % \begin{macro}{\expertquiz}\MacroDef{expertquiz}[\Oarg{*!}\oarg{comment}\marg{award}] % The macro |\expertquiz| displays a hand, a |bidding| diagram and the award % for the answers. Optionally a description can be added. The hand and the % bidding have to be defined before. This is done to avoid having 4 more % arguments, needed for specifying the hand. The token '|*|' centers the % whole and the token '|!|' forces that the |bidding| diagram appears on a % new line and that the hand shifts a bit to the right. The last parameter % defines the award. In order to limit the width of the award we use the % known widths of the |bidding| diagram and the hand and set the parbox % accordingly to display the award. % % \begin{macrocode} \NewDocumentCommand\expertquiz{st! O{}m}{% % 12 3 4 % \end{macrocode} % |\expertquiz* ![comment]{award}|\\ % | 1 2 3 4 |\\ % \begin{macrocode} \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}{}% }% % \fi% \IfBooleanTF#1{\end{center}}{}% }% expertquiz % \end{macrocode} % \end{macro} % % \subsection{Resetting the Game} % % We use \packname{pgfkeys} with its |=| system to %specify the fonts and other things that we want to have as defaults, %rather than the intitial \OneDown values. Therefore we first define the %keys and the store for it. % % \begin{macrocode} \pgfkeys{% /ODw/.is family, /ODw, % fonts 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, % compass compline/.store in = \ODw@CompLine, compmid/.store in = \ODw@CompMid, compsize/.store in = \ODw@CompSize, } % compass \ODw@set{compshow/.is choice} \ODw@set{compshow/off/.code={\ODw@CompShowfalse}} \ODw@set{compshow/on/.code={\ODw@CompShowtrue}} \ODw@set{compturn/.is choice} \ODw@set{compturn/off/.code={\ODw@CompTurnfalse}} \ODw@set{compturn/on/.code={\ODw@CompTurntrue}} % bídding \ODw@set{bidders/.is choice} \ODw@set{bidders/off/.code={\ODw@Biddersfalse}} \ODw@set{bidders/on/.code={\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={\ODw@BidLinefalse}} \ODw@set{bidline/on/.code={\ODw@BidLinetrue}} \ODw@set{bidlong/.is choice} \ODw@set{bidlong/off/.code={\ODw@LongCallsfalse}} \ODw@set{bidlong/on/.code={\ODw@LongCallstrue}} % synonyms \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}}} % \end{macrocode} % % \begin{macro}{\resetfonts}\MacroDef{resetfonts} % \begin{macrocode} \newcommand\resetfonts{% \bidderfont{\ODw@BidderDefault}% \compassfont{\ODw@CompassDefault}% \gamefont{\ODw@GameDefault}% \legendfont{\ODw@LegendDefault}% \namefont{\ODw@NameDefault}% \otherfont{\ODw@OtherDefault}% }% resetfonts % \end{macrocode} % \end{macro} % % \begin{macro}{\setdefaults}\MacroDef{setdefaults}[\Oarg{*}\string{\meta{key1=val1},\meta{key2=val2},\ldots\string}] % The available keys are those defined in |\pgfkeys| some lines up from % here. For the fonts they are: |bidder|, |compass|, |game|, |legend|, % |name| and |other|. They store the new default value in the corresponding % variable. In order to make the new default active, we must use % |\setdefaults*| which will also call |\resetfonts|. % % The keys for the compass are: |compline|, |compmid|, |compshow|, % |compsize| and |compturn|. They control the thickness of the frame, the % mid-text, the visibility of the compass, its size and the angle of the % compass E--W letters. % % For the |bidding| diagram we have: |bidders|, |bidfirst|, |bidline| and % |bidlong|. They control if bidders are to be displayed at all, which % bidder appears in the first column, draw a |\hline| below the header and % showing long calls. % % Furthermore defined elsewhere are the keys to control errors |err| and % warnings |warn|, as well as the key to control the color e.g. of the % symbols |colors|. Refer to section~\ref{Options} % % \begin{macrocode} \NewDocumentCommand\setdefaults{s m}{% \pgfkeys{/ODw,#2}% \IfBooleanTF{#1}{\resetfonts}{}% }% setdefaults % % \end{macrocode} % \end{macro} % % \begin{macro}{\newgame}\MacroDef{newgame} % |\newgame| resets and clears the stored game information to be ready for % a new game. We do not reset the option for warn- and err-messages, nor % any selected font. Setting |\boardnr{0}| executes also:\\ % |\ODw@BoardText{}\vulner[-1]\dealer[-1]}|. % % \begin{macrocode} \newcommand\newgame{% \boardnr{0}% \headlinetext{}% \footlinetext{}% % clear the left/right upper/lower stuff \gdef\ODw@LeftUpperText{}% \gdef\ODw@LeftLowerText{}% \gdef\ODw@RightUpperText{}% \gdef\ODw@RightLowerText{}% % clear the hands \gdef\ODw@Nhand{\ODw@hand{t}{}{}{}{}}% \gdef\ODw@Ehand{\ODw@hand{c}{}{}{}{}}% \gdef\ODw@Shand{\ODw@hand{b}{}{}{}{}}% \gdef\ODw@Whand{\ODw@hand{c}{}{}{}{}}% % % set default for real bidders names: no names % we print only the symbolic names North, East, etc. % \namesNS{}{}\namesEW{}{}% % % reset consistency check stuff % \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 % \end{macrocode} % \end{macro} % % \subsection{Error Handling} % % \subsubsection{Consistency Checks} % % We perform different checks on consistency of the cards entered: % \begin{enumerate}[itemsep=-2mm] % \item Check that a hand not has more than 13 cards (E) % \item Check that a hand doesn't contain multiple cards (E) % \item Check that a deal doesn't contain multiple cards (E) % \item Check that a hand has less than 13 cards (W) % \item check that a suit of a deal has more than 13 cards (E) % \item check that a suit of a deal has less than 13 cards (W) % \item In |play| diagrams: check that a card is played only once (E) % \end{enumerate} % The checks marked with (E) raise an error, those marked with (W) raise % a warning. They can be controlled with the package options |err| and % |warn|. % % \begin{macro}{\ODw@ChkNrOfCards}\MacroDef{ODw@ChkNrOfCards}[\marg{cards}\marg{hand}] % \begin{macrocode} \newcommand\ODw@ChkNrOfCards[2]{% % \end{macrocode} % |\ODw@ChkNrOfCards{cards}{hand}|\\ % | 1 2|\\ % |#1 = a string with all cards of all suits of the hand denoted by #2|\\ % |step 1: remove all "-" (that denotes an empty suit)|\\ % |step 2: warn if StrLen < 13 ; Err if StrLen > 13| % % \begin{macrocode} \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 % \end{macrocode} % \end{macro} % % \begin{macro}{\ODw@PrErr}\MacroDef{ODw@PrErr}[\marg{rank}\marg{count}\marg{suit}] % \begin{macrocode} \newcommand\ODw@PrErr[3]{% % \end{macrocode} % |\ODw@PrErr{rank}{count}{suit}|\\ % | 1 2 3|\\ % This macro only outputs the warning/error if the card specified by rank % (\#1) and suit (\#3) does not occur (denoted by \#2) exactly $1 \times$. % An exception for spotcards must not be made, because in % |\ODw@ChkSameCards| they are not taken into account. (In fact they are % already filtered out by |ODw@translate|). % % \begin{macrocode} \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 % \end{macrocode} % \end{macro} % % \begin{macro}{\ODw@ChkSameCards}\MacroDef{ODw@ChkSameCards}[\marg{cards}\marg{suit}] % \begin{macrocode} \newcommand\ODw@ChkSameCards[2]{% % \end{macrocode} % |#1 = a string with all cards of 1 suit (denoted by #2) of all hands|\\ % |step 1: remove all "-" |\\ % |step 2: we count the frequency of all ranks 2--9,T,J,Q,K,A| (|ODw@CCnt|)\\ % |step 3: Warn if Freq(card) = 0 ; Err if Freq(card) > 1| (|ODw@PrErr|)\\ % % \begin{macrocode} \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 % \end{macrocode} % \end{macro} % % \subsubsection{Controlling Messages} % % \label{Messages} % \begin{macrocode} \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} % \end{macrocode} % \begin{macro}{\ODw@Error} % \begin{macrocode} \newcommand\ODw@Error[1]{% \ifbool{ODw@Errors}{% \par\textcolor{red}{Error: #1}\par}{}% }% ODw@Error % \end{macrocode} % \end{macro} % % \begin{macro}{\ODw@Warning} % \begin{macrocode} \newcommand\ODw@Warning[1]{% \ifbool{ODw@Warnings}{% \par\textcolor{blue}{Warning: #1}\par}{}% }% ODw@Warning % \end{macrocode} % \end{macro} % % \subsection{Misc Bridge Terms} % % \subsubsection{Honour Cards} % % These macros retrieve the translations of the 4 alternative forms of the % honour cards from the |ODw|-dictionary of the active language. % \noindent % \begin{macro}{\Ace} % \begin{macro}{\ace} % \begin{macrocode} \NewDocumentCommand{\Ace}{s t!}{% \bgroup% %JW \ODw@GameFont% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\translate{A-(ODw)}}% {\translate{Ace-(ODw)}}% }{% \IfBooleanTF{#2}% {\translate{a-(ODw)}}% {\translate{ace-(ODw)}}% }% \egroup% \xspace% }% Ace % \def\ace{\Ace*!} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\King} % \begin{macro}{\king} % \begin{macrocode} \NewDocumentCommand{\King}{s t!}{% \bgroup% %JW \ODw@GameFont% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\translate{K-(ODw)}}% {\translate{King-(ODw)}}% }{% \IfBooleanTF{#2}% {\translate{k-(ODw)}}% {\translate{king-(ODw)}}% }% \egroup% \xspace% }% King % \def\king{\King*!} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\Queen} % \begin{macro}{\queen} % \begin{macrocode} \NewDocumentCommand{\Queen}{s t!}{% \bgroup% %JW \ODw@GameFont% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\translate{Q-(ODw)}}% {\translate{Queen-(ODw)}}% }{% \IfBooleanTF{#2}% {\translate{q-(ODw)}}% {\translate{queen-(ODw)}}% }% \egroup% \xspace% }% Queen % \def\queen{\Queen*!} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\Jack} % \begin{macro}{\jack} % \begin{macrocode} \NewDocumentCommand{\Jack}{s t!}{% \bgroup% %JW \ODw@GameFont% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\translate{J-(ODw)}}% {\translate{Jack-(ODw)}}% }{% \IfBooleanTF{#2}% {\translate{j-(ODw)}}% {\translate{jack-(ODw)}}% }% \egroup% \xspace% }% Jack % \def\jack{\Jack*!} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\Ten} % \begin{macrocode} \newcommand{\Ten}{% \bgroup% %JW \ODw@GameFont% 10% \egroup% \xspace% }% Ten % \end{macrocode} % \end{macro} % % \subsubsection{Vulnerability} % % These macros retrieve the translations of the 4 alternative forms of the % commands |\All| and |\None| from the |ODw|-dictionary of the active % language. As there is no short form for them in the English language, we % just code these entries in the |ODw|-dictionaries with an exclamation % mark~'|!|'. % \begin{macro}{\All} % \begin{macro}{\all} % \begin{macrocode} \NewDocumentCommand{\All}{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\translate{All!-(ODw)}}% {\translate{All-(ODw)}}% }{% \IfBooleanTF{#2}% {\translate{all!-(ODw)}}% {\translate{all-(ODw)}}% }% \egroup% \xspace% }% All % \def\all{\All*} % \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\None} % \begin{macro}{\none} % \begin{macrocode} \NewDocumentCommand{\None}{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\translate{None!-(ODw)}}% {\translate{None-(ODw)}}% }{% \IfBooleanTF{#2}% {\translate{none!-(ODw)}}% {\translate{none-(ODw)}}% }% \egroup% \xspace% }% None % \def\none{\None*} %% \end{macrocode} % \end{macro} % \end{macro} % % \subsubsection{Diagram Annotations} % % These macros retrieve the translations of the 4 alternative forms of the % commands |\Contract|, |\Lead|, |\Declarer|, |\Board| and |\Deal| from the % |ODw|-dictionary of the active language. % % \begin{macro}{\Contract} % \begin{macro}{\contract} % \begin{macrocode} \NewDocumentCommand{\Contract}{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\translate{Contr-(ODw)}}% {\translate{Contract-(ODw)}}% }{% \IfBooleanTF{#2}% {\translate{contr-(ODw)}}% {\translate{contract-(ODw)}}% }% \egroup% \xspace% }% Contract % \def\contract{\Contract*} %% \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\Lead} % \begin{macro}{\lead} % \begin{macrocode} \NewDocumentCommand{\Lead}{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\translate{Lead!-(ODw)}}% {\translate{Lead-(ODw)}}% }{% else #1 \IfBooleanTF{#2}% {\translate{lead!-(ODw)}}% {\translate{lead-(ODw)}}% }% #1 \egroup% \xspace% }% Lead % \def\lead{\Lead*} %% \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\Declarer} % \begin{macro}{\declarer} % \begin{macrocode} \NewDocumentCommand{\Declarer}{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\translate{Decl-(ODw)}}% {\translate{Declarer-(ODw)}}% }{% \IfBooleanTF{#2}% {\translate{decl-(ODw)}}% {\translate{declarer-(ODw)}}% }% \egroup% \xspace% }% Declarer % \def\declarer{\Declarer*} %% \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\by} % \begin{macrocode} \newcommand\by{% \bgroup% \ODw@OtherFont% \translate{by-(ODw)}% \egroup% \xspace% }% by % \end{macrocode} % \end{macro} % % \begin{macro}{\Board} % \begin{macro}{\board} % \begin{macrocode} \NewDocumentCommand{\Board}{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\translate{Brd-(ODw)}}% {\translate{Board-(ODw)}}% }{% \IfBooleanTF{#2}% {\translate{brd-(ODw)}}% {\translate{board-(ODw)}}% }% \egroup% \xspace% }% Board % \def\board{\Board*} %% \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\Deal} % \begin{macro}{\deal} % \begin{macrocode} \NewDocumentCommand{\Deal}{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\translate{Deal!-(ODw)}}% {\translate{Deal-(ODw)}}% }{% \IfBooleanTF{#2}% {\translate{deal!-(ODw)}}% {\translate{deal-(ODw)}}% }% \egroup% \xspace% }% Deal % \def\deal{\Deal*} %% \end{macrocode} % \end{macro} % \end{macro} % \begin{macro}{\doubled} % The commands |\doubled| and |\redoubled| do not have a short form. % \begin{macrocode} \NewDocumentCommand{\doubled}{s}{% \bgroup% \ODw@OtherFont% \IfBooleanTF{#1}{% \translate{Doubled-(ODw)}}{% \translate{doubled-(ODw)}% }% \egroup% \xspace% }% doubled % \end{macrocode} % \end{macro} % % \begin{macro}{\redoubled} % \begin{macrocode} \NewDocumentCommand{\redoubled}{s}{% \bgroup% \ODw@OtherFont% \IfBooleanTF{#1}{% \translate{Redoubled-(ODw)}}{% \translate{redoubled-(ODw)}% }% \egroup% \xspace% }% redoubled % \end{macrocode} % \end{macro} % % \subsubsection{Point Units} % % These macros retrieve the translations of the commands |\hpts|, |\lpts|, % |\dpts| and |\tpts| from the |ODw|-dictionary of the active language. % \begin{macro}{\hpts} % \begin{macro}{\HCP} % \begin{macrocode} \NewDocumentCommand{\hpts}{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\translate{HCP-(ODw)}}% {\translate{High Card Points-(ODw)}}% }{% \IfBooleanTF{#2}% {\translate{hcp-(ODw)}}% {\translate{high card points-(ODw)}}% }% \egroup% \xspace% }% High Card Points % \def\HCP{\,\hpts*!} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\lpts} % \begin{macro}{\LP} % \begin{macro}{\HLP} % \begin{macrocode} \NewDocumentCommand{\lpts}{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\translate{LP-(ODw)}}% {\translate{Length Points-(ODw)}}% }{% \IfBooleanTF{#2}% {\translate{lp-(ODw)}}% {\translate{length points-(ODw)}}% }% \egroup% \xspace% }% Length Points % \def\LP{\,\lpts*!} \def\HLP{\,\bgroup\ODw@OtherFont\translate{HLP-(ODw)}\egroup\xspace} % \end{macrocode} % \end{macro} % \end{macro} % \end{macro} % % \begin{macro}{\dpts} % \begin{macro}{\DP} % \begin{macrocode} \NewDocumentCommand{\dpts}{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\translate{DP-(ODw)}}% {\translate{Distribution Points-(ODw)}}% }{% \IfBooleanTF{#2}% {\translate{dp-(ODw)}}% {\translate{distribution points-(ODw)}}% }% \egroup% \xspace% }% Distribution Points % \def\DP{\,\dpts*!} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\tpts} % \begin{macro}{\TP} % \begin{macrocode} \NewDocumentCommand{\tpts}{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\translate{TP-(ODw)}}% {\translate{Total Points-(ODw)}}% }{% \IfBooleanTF{#2}% {\translate{tp-(ODw)}}% {\translate{total points-(ODw)}}% }% \egroup% \xspace% }% Total Points % \def\TP{\,\tpts*!} % \end{macrocode} % \end{macro} % \end{macro} % % \subsubsection{Forcings} % % These macros retrieve the translations of the commands |\gforce|, % |\sforce|, |\nmforce|, |\tsforce| and |\fsforce| from the % |ODw|-dictionary of the active language. % \begin{macro}{\gforce} % \begin{macro}{\GF} % \begin{macrocode} \NewDocumentCommand{\gforce}{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\translate{GF-(ODw)}}% {\translate{Game Forcing-(ODw)}}% }{% \IfBooleanTF{#2}% {\translate{gf-(ODw)}}% {\translate{game forcing-(ODw)}}% }% \egroup% \xspace% }% Game Forcing % \def\GF{\gforce*!} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\sforce} % \begin{macro}{\SF} % \begin{macrocode} \NewDocumentCommand{\sforce}{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\translate{SF-(ODw)}}% {\translate{Semi Forcing-(ODw)}}% }{% \IfBooleanTF{#2}% {\translate{sf-(ODw)}}% {\translate{semi forcing-(ODw)}}% }% \egroup% \xspace% }% Semi Forcing % \def\SF{\sforce*!} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\nmforce} % \begin{macro}{\NMF} % \begin{macrocode} \NewDocumentCommand{\nmforce}{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\translate{NMF-(ODw)}}% {\translate{New Minor Forcing-(ODw)}}% }{% \IfBooleanTF{#2}% {\translate{nmf-(ODw)}}% {\translate{new minor forcing-(ODw)}}% }% \egroup% \xspace% }% New Minor Forcing % \def\NMF{\nmforce*!} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\tsforce} % \begin{macro}{\TSF} % \begin{macrocode} \NewDocumentCommand{\tsforce}{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\translate{TSF-(ODw)}}% {\translate{Third Suit Forcing-(ODw)}}% }{% \IfBooleanTF{#2}% {\translate{tsf-(ODw)}}% {\translate{third suit forcing-(ODw)}}% }% \egroup% \xspace% }% Third Suit Forcing % \def\TSF{\tsforce*!} % \end{macrocode} % \end{macro} % \end{macro} % % \begin{macro}{\fsforce} % \begin{macro}{\FSF} % \begin{macrocode} \NewDocumentCommand{\fsforce}{s t!}{% \bgroup% \ODw@OtherFont% \IfBooleanTF{#1}{% \IfBooleanTF{#2}% {\translate{FSF-(ODw)}}% {\translate{Fourth Suit Forcing-(ODw)}}% }{% \IfBooleanTF{#2}% {\translate{fsf-(ODw)}}% {\translate{fourth suit forcing-(ODw)}}% }% \egroup% \xspace% }% Fourth Suit Forcing % \def\FSF{\fsforce*!} % \end{macrocode} % \end{macro} % \end{macro} % % \subsection{Initialization}\label{Init} % % It's time to prepare everything. We clear the game and set the defaults. % \begin{macrocode} \newgame % \end{macrocode} % Set the default fonts % \begin{macrocode} \setdefaults{bidder=\mdseries\sffamily} \setdefaults{compass=\mdseries\sffamily} \setdefaults{game=\bfseries\sffamily} \setdefaults{legend=\mdseries\rmfamily} \setdefaults{name=\mdseries\slshape} \setdefaults*{other=\bfseries\sffamily} % \end{macrocode} % % Set default coloring to black and red % \begin{macrocode} \setdefaults{colors=b+r} % \end{macrocode} % % Set the compass % \begin{macrocode} \setdefaults{compshow=on,compturn=off} % \end{macrocode} % set the start column for bidding (West is recommended) and the long form. % \begin{macrocode} \setdefaults{bidfirst=W,bidders=on,bidlong=on} % \end{macrocode} % Now we load the dictionaries for the languages that are to be used in % the document. We use \packname{tracklang} to iterate over all the % document languages and load the corresponding |ODw|-dictionaries. % \iffalse % Due to % an inconsistency between \packname{babel} and \packname{translations} % with respect to the Norwegian language (\packname{babel} calls this % language \emph{norsk} whereas \packname{translations} insist on using % \emph{norwegian}, we redefine |\thislang| to the latter if it happens to % be \emph{norsk}. % \fi % \begin{macrocode} %\AtBeginDocument{% \usedictionary{ODw} %%%% \ForEachTrackedLanguage{\thislang}{% \PackageInfo{ODw}{Language \thislang\ detected}% % % Commented out due to translator % \ifthenelse{\equal{\thislang}{norsk}}% % {\def\thislang{norwegian}}{}% % \IfEqCase{\thislang}{% {danish}{\IfFileExists{ODw-Danish.dict}% {\uselanguage{Danish}% \PackageInfo{ODw}{Dictionary ODw-Danish.dict loaded} }{\PackageWarning{ODw}{Dictionary ODw-Danish.dict missing}}}% % {dutch}{\IfFileExists{ODw-Dutch.dict}% {\uselanguage{Dutch}% \PackageInfo{ODw}{Dictionary ODw-Dutch.dict loaded} }{\PackageWarning{ODw}{Dictionary ODw-Dutch.dict missing}}}% % {english}{\IfFileExists{ODw-English.dict}% {\uselanguage{English}% \PackageInfo{ODw}{Dictionary ODw-English.dict loaded} }{\PackageWarning{ODw}{Dictionary ODw-English.dict missing}}}% % {french}{\IfFileExists{ODw-French.dict}% {\uselanguage{French}% \PackageInfo{ODw}{Dictionary ODw-French.dict loaded} }{\PackageWarning{ODw}{Dictionary ODw-French.dict missing}}}% % {german}{\IfFileExists{ODw-German.dict}% {\uselanguage{German}% \PackageInfo{ODw}{Dictionary ODw-German.dict loaded} }{\PackageWarning{ODw}{Dictionary ODw-German.dict missing}}}% % {italian}{\IfFileExists{ODw-Italian.dict}% {\uselanguage{Italian}% \PackageInfo{ODw}{Dictionary ODw-Italian.dict loaded} }{\PackageWarning{ODw}{Dictionary ODw-Italian.dict missing}}}% % {norsk}{\IfFileExists{ODw-Norsk.dict}% {\uselanguage{Norsk}% \PackageInfo{ODw}{Dictionary ODw-Norsk.dict loaded} }{\PackageWarning{ODw}{Dictionary ODw-Norsk.dict missing}}}% % {spanish}{\IfFileExists{ODw-Spanish.dict}% {\uselanguage{Spanish}% \PackageInfo{ODw}{Dictionary ODw-Spanish.dict loaded} }{\PackageWarning{ODw}{Dictionary ODw-Spanish.dict missing}}}% % {swedish}{\IfFileExists{ODw-Swedish.dict}% {\uselanguage{Swedish}% \PackageInfo{ODw}{Dictionary ODw-Swedish.dict loaded} }{\PackageWarning{ODw}{Dictionary ODw-Swedish.dict missing}}}% % {turkish}{\IfFileExists{ODw-Turkish.dict}% {\uselanguage{Turkish}% \PackageInfo{ODw}{Dictionary ODw-Turkish.dict loaded} }{\PackageWarning{ODw}{Dictionary ODw-Turkish.dict missing}}}% % }[% \PackageWarning{ODw}% {Language \thislang\space not supported by OneDown} ]% IfEqCase % }% ForEach %%%%% %}% AtBeginDocument % Look if we can find a file called onedown.symbols somewhere in the \LaTeX-path % If so, we load it (the code for inputting card symbols directly from keyboard). % If not, we keep silent about it \@input{onedown.symbols} % % \end{macrocode} % That's it folks, happy \TeX ing! % \begin{macrocode} \endinput% onedown.sty % \end{macrocode} % % \iffalse % % \fi % % \Finale % \begin{thebibliography}{Laan} % \bibitem{Laan} Kees van der Laan: % \emph{Typsetting Bridge via \TeX}, % TUGboat Vol.~11, No.~2 (1990), p265ff % % \bibitem{Pav} Richard Pavlicek: % \emph{Bridge Writing Style Guide}, % \url{http://www.rpbridge.net/7z69.htm} % \end{thebibliography} % % \PrintChanges % \newpage % \PrintIndex % \ifnumequal{\pdfshellescape}{1}{% % \newpage % \enlargethispage{1\baselineskip} % \immediate\closeout\UCFile % \begin{multicols}{3}[\section{List of User Commands}] % % \IfFileExists{\jobname.odw} % {\noindent\input{\jobname.odw}} % {\PackageWarning{ODw}{File \jobname.odw not found}} % \end{multicols} % }{} \endinput