与桥牌(游戏)相关的问题

与桥牌(游戏)相关的问题

在 egreg 的帮助下,我的 bridge 相关宏有了很大的进步。以下是 MWE:

%********************************************************************************
\documentclass[10pt]{article}
\usepackage[paperwidth=6in,paperheight=9in, margin=1in]{geometry}
\usepackage{MnSymbol}
\usepackage[T1]{fontenc}
\usepackage[latin9]{inputenc}
\usepackage{xparse}
\usepackage{tikz}
\usepackage{libertine}
%********************************************************************************


%********************************************************************************
% Use MnSymbol suit symbols

\DeclareFontFamily{U}{MnSymbolCards}{}

\DeclareFontShape{U}{MnSymbolCards}{m}{n}{
    <-6>  s*[1.1] MnSymbolC5
   <6-7>  s*[1.1] MnSymbolC6
   <7-8>  s*[1.1] MnSymbolC7
   <8-9>  s*[1.1] MnSymbolC8
   <9-10> s*[1.1] MnSymbolC9
  <10-12> s*[1.1] MnSymbolC10
  <12->   s*[1.1] MnSymbolC12}{}

\newcommand{\mndiamond}{{\usefont{U}{MnSymbolCards}{m}{n}\symbol{"A2}}}
\newcommand{\mnheart}{{\usefont{U}{MnSymbolCards}{m}{n}\symbol{"A3}}}
\newcommand{\mnspade}{{\usefont{U}{MnSymbolCards}{m}{n}\symbol{"A4}}}
\newcommand{\mnclub}{{\usefont{U}{MnSymbolCards}{m}{n}\symbol{"A5}}}
%********************************************************************************


%********************************************************************************
% BRIDGE HAND
% macros to produce horizontal and vertical bridge hand

%Defines "hair space" to be used after suit symbols
\newcommand{\cardsep}{\hspace*{0.2em}}

%defines a vertical bridge hand with seat name
\ExplSyntaxOn
\NewDocumentCommand{\hand}{smm}
 {
  \IfBooleanTF{#1}
   {
    \blackened_hand_horizontal:nn { #2 } { #3 }
   }
   {
    \blackened_hand:nn { #2 } { #3 }
   }
 }

\seq_new:N \l_blackened_hand_seq
\clist_new:N \l_blackened_suit_clist

\cs_new_protected:Nn \blackened_hand_horizontal:nn
 {
  \seq_set_split:Nnn \l_blackened_hand_seq { ; } { #2 }
  \mbox{\mnspade   \ \blackened_set_suit:n { 1 } }\quad
  \mbox{\mnheart   \ \blackened_set_suit:n { 2 } }\quad
  \mbox{\mndiamond \ \blackened_set_suit:n { 3 } }\quad
  \mbox{\mnclub    \ \blackened_set_suit:n { 4 } }
 }

\cs_new_protected:Nn \blackened_hand:nn
 {
  \seq_set_split:Nnn \l_blackened_hand_seq { ; } { #2 }
  \begin{minipage}[t]{\textwidth}
  \begin{tabbing}
 \tl_if_blank:nF { #1 } { \textbf{#1} \\ }
  \mnspade   \= \cardsep \= \blackened_set_suit:n { 1 } \\
  \mnheart   \>          \> \blackened_set_suit:n { 2 } \\
  \mndiamond \>          \> \blackened_set_suit:n { 3 } \\
  \mnclub    \>          \> \blackened_set_suit:n { 4 }
  \end{tabbing}
  \end{minipage}
 }

\tl_const:Nn \c_blackened_ten_tl { 10 }
\tl_new:N \l_blackened_suit_tl
\seq_new:N \l_blackened_suit_seq
\cs_new_protected:Nn \blackened_set_suit:n
 {
  \tl_set:Nx \l_blackened_suit_tl { \seq_item:Nn \l_blackened_hand_seq { #1 } }
  \tl_if_blank:VTF \l_blackened_suit_tl
   { --- } % no card in the suit
   {
    \tl_replace_once:Nnn \l_blackened_suit_tl { 10 } { \c_blackened_ten_tl }
    \seq_set_split:NnV \l_blackened_suit_seq { } \l_blackened_suit_tl
    \seq_use:Nn \l_blackened_suit_seq { \cardsep }
   }
 }
\ExplSyntaxOff
%********************************************************************************


%********************************************************************************
% BRIDGE DIAGRAM

\newcommand{\bd}[4]{%
\begin{tabular}[t]{ p{7em} p{7em} p{7em}}
 & #1 & \\
#2 & {\vspace{4pt}\begin{tikzpicture} \draw (0,0) rectangle (1.3,1.3); \end{tikzpicture}} & #3\\
   & #4 &
\end{tabular}
}
%********************************************************************************


%********************************************************************************
% custom minipage (needed for spacial cases)

\newlength{\myminipageparskip}
\newenvironment{bdminipage}
  {\setlength{\myminipageparskip}{1ex}% save the value
   \begin{minipage}{21em}% open the minipage
   \setlength{\parskip}{\myminipageparskip}% restore the value
  }
  {\end{minipage}}
%********************************************************************************


\begin{document}

\begin{center}
\begin{bdminipage}
\bd
{\hand{North}{QJ42; 7; AJ763; 843}}%
{\hand{West}{K1085; AK543; Q4; AJ}}%
{\hand{East}{976; Q862; K10952; K}}%
{\hand{South}{A3; J109; 8; Q1097652}}%
\end{bdminipage}
\end{center}

\end{document}

生成:

在此处输入图片描述

如何修改宏以便我可以生成如下图表:

在此处输入图片描述

示例中只有两种花色,但实际上可能只有一种,花色符号可能不同,我可能不希望包含座位名称,在某些极端情况下,一个座位可能有两种花色,而其他座位只有一种花色,等等。因此,灵活性至关重要,值得无限赞赏。

答案1

添加一个可选参数来\hand指定您想要显示的花色;顺序并不重要,花色按名称调用:S = 黑桃,H = 红心,D = 方块,C = 梅花。

为了实现正确的对齐,存在一些小麻烦,但我认为我已经解决了它们。

    %********************************************************************************
\documentclass[10pt]{article}
\usepackage[paperwidth=6in,paperheight=9in, margin=1in]{geometry}
%\usepackage{MnSymbol} % not needed
\usepackage[T1]{fontenc}
\usepackage[latin9]{inputenc}
\usepackage{array}
\usepackage{xparse}
\usepackage{tikz}
\usepackage{libertine}
%********************************************************************************


%********************************************************************************
% Use MnSymbol suit symbols

\DeclareFontFamily{U}{MnSymbolCards}{}

\DeclareFontShape{U}{MnSymbolCards}{m}{n}{
    <-6>  s*[1.1] MnSymbolC5
   <6-7>  s*[1.1] MnSymbolC6
   <7-8>  s*[1.1] MnSymbolC7
   <8-9>  s*[1.1] MnSymbolC8
   <9-10> s*[1.1] MnSymbolC9
  <10-12> s*[1.1] MnSymbolC10
  <12->   s*[1.1] MnSymbolC12}{}

\newcommand{\mndiamond}{{\usefont{U}{MnSymbolCards}{m}{n}\symbol{"A2}}}
\newcommand{\mnheart}{{\usefont{U}{MnSymbolCards}{m}{n}\symbol{"A3}}}
\newcommand{\mnspade}{{\usefont{U}{MnSymbolCards}{m}{n}\symbol{"A4}}}
\newcommand{\mnclub}{{\usefont{U}{MnSymbolCards}{m}{n}\symbol{"A5}}}
%********************************************************************************


%********************************************************************************
% BRIDGE HAND
% macros to produce horizontal and vertical bridge hand

%Defines "hair space" to be used after suit symbols
\newcommand{\cardsep}{\hspace*{0.2em}}

%defines a vertical bridge hand with seat name
\ExplSyntaxOn
\NewDocumentCommand{\hand}{sO{S,H,D,C}mm}
 {
  \IfBooleanTF{#1}
   {
    \blackened_hand_horizontal:nnn { #2 } { #3 } { #4 }
   }
   {
    \blackened_hand:nnn { #2 } { #3 } { #4 }
   }
 }

\seq_new:N \l_blackened_hand_seq
\clist_new:N \l_blackened_suit_clist

\cs_new_protected:Nn \blackened_hand_horizontal:nnn
 {
  \seq_set_split:Nnn \l_blackened_hand_seq { ; } { #3 }
  \hspace*{-1em}% remove the initial \quad
  \clist_if_in:nnT { #1 } { S }
   { \quad \mbox{\mnspade   \ \blackened_set_suit:n { 1 } } }
  \clist_if_in:nnT { #1 } { H }
   { \quad \mbox{\mnheart   \ \blackened_set_suit:n { 2 } } }
  \clist_if_in:nnT { #1 } { D }
   { \quad \mbox{\mndiamond \ \blackened_set_suit:n { 3 } } }
  \clist_if_in:nnT { #1 } { C }
   { \quad \mbox{\mnclub    \ \blackened_set_suit:n { 4 } } }
 }

\cs_new_protected:Nn \blackened_hand:nnn
 {
  \seq_set_split:Nnn \l_blackened_hand_seq { ; } { #3 }
  \bool_gset_false:N \g_blackened_newline_bool
  \begin{minipage}{\textwidth}
  \begin{tabbing}
  \tl_if_blank:nTF { #2 }
    { \bool_gset_false:N \g_blackened_newline_bool }
    { \bool_gset_true:N \g_blackened_newline_bool \textbf{#2} }
  \clist_if_in:nnT { #1 } { S }
   { \blackened_newline: \mnspade   \= \cardsep \= \blackened_set_suit:n { 1 } }
  \clist_if_in:nnT { #1 } { H }
   { \blackened_newline: \mnheart   \= \cardsep \= \blackened_set_suit:n { 2 } }
  \clist_if_in:nnT { #1 } { D }
   { \blackened_newline: \mndiamond \= \cardsep \= \blackened_set_suit:n { 3 } }
  \clist_if_in:nnT { #1 } { C }
   { \blackened_newline: \mnclub    \= \cardsep \= \blackened_set_suit:n { 4 } }
  \end{tabbing}
  \end{minipage}
  \bool_gset_false:N \g_blackened_newline_bool
 }

\tl_const:Nn \c_blackened_ten_tl { 10 }
\tl_new:N \l_blackened_suit_tl
\seq_new:N \l_blackened_suit_seq
\bool_new:N \g_blackened_newline_bool

\cs_new_protected:Nn \blackened_newline:
 {
  \bool_if:NTF \g_blackened_newline_bool
   { \\ }
   { \bool_gset_true:N \g_blackened_newline_bool }
 }

\cs_new_protected:Nn \blackened_set_suit:n
 {
  \tl_set:Nx \l_blackened_suit_tl { \seq_item:Nn \l_blackened_hand_seq { #1 } }
  \tl_if_blank:VTF \l_blackened_suit_tl
   { --- } % no card in the suit
   {
    \tl_replace_once:Nnn \l_blackened_suit_tl { 10 } { \c_blackened_ten_tl }
    \seq_set_split:NnV \l_blackened_suit_seq { } \l_blackened_suit_tl
    \seq_use:Nn \l_blackened_suit_seq { \cardsep }
   }
 }
\ExplSyntaxOff
%********************************************************************************


%********************************************************************************
% BRIDGE DIAGRAM

\newcommand{\bd}[4]{%
\begin{tabular}{ m{7em} m{7em} m{7em}}
 & #1 & \\
#2 & \parbox{7em}{
       \vspace{1ex}
       \begin{tikzpicture} \draw (0,0) rectangle (1.3,1.3); \end{tikzpicture}
       \vspace{1ex}
     } & #3\\
   & #4 &
\end{tabular}
}
%********************************************************************************


%********************************************************************************
% custom minipage (needed for spacial cases)

\newlength{\myminipageparskip}
\newenvironment{bdminipage}
  {\setlength{\myminipageparskip}{1ex}% save the value
   \begin{minipage}{21em}% open the minipage
   \setlength{\parskip}{\myminipageparskip}% restore the value
  }
  {\end{minipage}}
%********************************************************************************


\begin{document}

\begin{center}
\begin{bdminipage}
\bd
{\hand{North}{QJ42; 7; AJ763; 843}}%
{\hand{West}{K1085; AK543; Q4; AJ}}%
{\hand{East}{976; Q862; K10952; K}}%
{\hand{South}{A3; J109; 8; Q1097652}}%
\end{bdminipage}

\bigskip

\begin{bdminipage}
\bd
{\hand[S,H]{North}{QJ42; 7; AJ763; 843}}%
{\hand[S,H]{West}{K1085; AK543; Q4; AJ}}%
{\hand[S,H]{East}{976; Q862; K10952; K}}%
{\hand[S,H]{South}{A3; J109; 8; Q1097652}}%
\end{bdminipage}

\bigskip

\begin{bdminipage}
\bd
{\hand[S]{}{QJ42; 7; AJ763; 843}}%
{\hand[H]{}{K1085; AK543; Q4; AJ}}%
{\hand[D]{}{976; Q862; K10952; K}}%
{\hand[C]{}{A3; J109; 8; Q1097652}}%
\end{bdminipage}
\end{center}

\end{document}

在此处输入图片描述

带有彩色套装的版本。

\documentclass[10pt]{article}
\usepackage[paperwidth=6in,paperheight=9in, margin=1in]{geometry}
\usepackage[T1]{fontenc}
\usepackage{array}
\usepackage{tikz}
\usepackage{libertine}
\usepackage{xcolor}

% Use FdSymbol suit symbols

\DeclareFontFamily{U}{FdSymbolCards}{}

\DeclareFontShape{U}{FdSymbolCards}{m}{n}{
    <->  s*[0.9] FdSymbolA-Book
}{}
\newcommand{\fddiamondsuit}{{\usefont{U}{FdSymbolCards}{m}{n}\symbol{"B5}}}
\newcommand{\fddiamondredsuit}{\textcolor{red!90!blue}{\usefont{U}{FdSymbolCards}{m}{n}\symbol{"B6}}}
\newcommand{\fdheartsuit}{{\usefont{U}{FdSymbolCards}{m}{n}\symbol{"B7}}}
\newcommand{\fdheartredsuit}{\textcolor{red!90!blue}{\usefont{U}{FdSymbolCards}{m}{n}\symbol{"B8}}}
\newcommand{\fdspadesuit}{{\usefont{U}{FdSymbolCards}{m}{n}\symbol{"B9}}}
\newcommand{\fdclubsuit}{{\usefont{U}{FdSymbolCards}{m}{n}\symbol{"BA}}}
\newif\ifcolorsuits
\newcommand{\fddiamond}{\fddiamondsuit}
\newcommand{\fdheart}{\fdheartsuit}
\newcommand{\fdspade}{\fdspadesuit}
\newcommand{\fdclub}{\fdclubsuit}

\AtBeginDocument{\ifcolorsuits\colorsuits\fi}
\newcommand{\colorsuits}{%
    \renewcommand{\fddiamond}{\fddiamondredsuit}%
    \renewcommand{\fdheart}{\fdheartredsuit}%
}
% BRIDGE HAND
% macros to produce horizontal and vertical bridge hand

%Defines "hair space" to be used after suit symbols
\newcommand{\cardsep}{\hspace*{0.2em}}

%defines a vertical bridge hand with seat name
\ExplSyntaxOn
\NewDocumentCommand{\hand}{sO{S,H,D,C}mm}
 {
  \IfBooleanTF{#1}
   {
    \blackened_hand_horizontal:nnn { #2 } { #3 } { #4 }
   }
   {
    \blackened_hand:nnn { #2 } { #3 } { #4 }
   }
 }

\seq_new:N \l_blackened_hand_seq
\clist_new:N \l_blackened_suit_clist

\cs_new_protected:Nn \blackened_hand_horizontal:nnn
 {
  \seq_set_split:Nnn \l_blackened_hand_seq { ; } { #3 }
  \hspace*{-1em}% remove the initial \quad
  \clist_if_in:nnT { #1 } { S }
   { \quad \mbox{\fdspade   \ \blackened_set_suit:n { 1 } } }
  \clist_if_in:nnT { #1 } { H }
   { \quad \mbox{\fdheart   \ \blackened_set_suit:n { 2 } } }
  \clist_if_in:nnT { #1 } { D }
   { \quad \mbox{\fddiamond \ \blackened_set_suit:n { 3 } } }
  \clist_if_in:nnT { #1 } { C }
   { \quad \mbox{\fdclub    \ \blackened_set_suit:n { 4 } } }
 }

\cs_new_protected:Nn \blackened_hand:nnn
 {
  \seq_set_split:Nnn \l_blackened_hand_seq { ; } { #3 }
  \bool_gset_false:N \g_blackened_newline_bool
  \begin{minipage}{\textwidth}
  \begin{tabbing}
  \tl_if_blank:nTF { #2 }
    { \bool_gset_false:N \g_blackened_newline_bool }
    { \bool_gset_true:N \g_blackened_newline_bool \textbf{#2} }
  \clist_if_in:nnT { #1 } { S }
   { \blackened_newline: \fdspade   \= \cardsep \= \blackened_set_suit:n { 1 } }
  \clist_if_in:nnT { #1 } { H }
   { \blackened_newline: \fdheart   \= \cardsep \= \blackened_set_suit:n { 2 } }
  \clist_if_in:nnT { #1 } { D }
   { \blackened_newline: \fddiamond \= \cardsep \= \blackened_set_suit:n { 3 } }
  \clist_if_in:nnT { #1 } { C }
   { \blackened_newline: \fdclub    \= \cardsep \= \blackened_set_suit:n { 4 } }
  \end{tabbing}
  \end{minipage}
  \bool_gset_false:N \g_blackened_newline_bool
 }

\tl_const:Nn \c_blackened_ten_tl { 10 }
\tl_new:N \l_blackened_suit_tl
\seq_new:N \l_blackened_suit_seq
\bool_new:N \g_blackened_newline_bool

\cs_new_protected:Nn \blackened_newline:
 {
  \bool_if:NTF \g_blackened_newline_bool
   { \\ }
   { \bool_gset_true:N \g_blackened_newline_bool }
 }

\cs_new_protected:Nn \blackened_set_suit:n
 {
  \tl_set:Nx \l_blackened_suit_tl { \seq_item:Nn \l_blackened_hand_seq { #1 } }
  \tl_if_blank:VTF \l_blackened_suit_tl
   { --- } % no card in the suit
   {
    \tl_replace_once:Nnn \l_blackened_suit_tl { 10 } { \c_blackened_ten_tl }
    \seq_set_split:NnV \l_blackened_suit_seq { } \l_blackened_suit_tl
    \seq_use:Nn \l_blackened_suit_seq { \cardsep }
   }
 }
\ExplSyntaxOff
%********************************************************************************


%********************************************************************************
% BRIDGE DIAGRAM

\newcommand{\bd}[4]{%
\begin{tabular}{ m{7em} m{7em} m{7em}}
 & #1 & \\
#2 & \parbox{7em}{
       \vspace{1ex}
       \begin{tikzpicture} \draw (0,0) rectangle (1.3,1.3); \end{tikzpicture}
       \vspace{1ex}
     } & #3\\
   & #4 &
\end{tabular}
}
%********************************************************************************


%********************************************************************************
% custom minipage (needed for spacial cases)

\newlength{\myminipageparskip}
\newenvironment{bdminipage}
  {\setlength{\myminipageparskip}{1ex}% save the value
   \begin{minipage}{21em}% open the minipage
   \setlength{\parskip}{\myminipageparskip}% restore the value
  }
  {\end{minipage}}
%********************************************************************************

\colorsuitstrue

\begin{document}

\begin{center}
\begin{bdminipage}
\bd
{\hand{North}{QJ42; 7; AJ763; 843}}%
{\hand{West}{K1085; AK543; Q4; AJ}}%
{\hand{East}{976; Q862; K10952; K}}%
{\hand{South}{A3; J109; 8; Q1097652}}%
\end{bdminipage}

\bigskip

\begin{bdminipage}
\bd
{\hand[S,H]{North}{QJ42; 7; AJ763; 843}}%
{\hand[S,H]{West}{K1085; AK543; Q4; AJ}}%
{\hand[S,H]{East}{976; Q862; K10952; K}}%
{\hand[S,H]{South}{A3; J109; 8; Q1097652}}%
\end{bdminipage}

\bigskip

\begin{bdminipage}
\bd
{\hand[S]{}{QJ42; 7; AJ763; 843}}%
{\hand[H]{}{K1085; AK543; Q4; AJ}}%
{\hand[D]{}{976; Q862; K10952; K}}%
{\hand[C]{}{A3; J109; 8; Q1097652}}%
\end{bdminipage}
\end{center}

\end{document}

默认情况下,红色套装是空心印刷的,但在文档的\colorsuitstrue序言中或之后,它们显示为红色。\colorsuits

在此处输入图片描述

相关内容