arrayjobx配列からtikzノード名を取得する

arrayjobx配列からtikzノード名を取得する

私は、2 人のプレイヤーと各プレイヤーのさまざまなアクション セットを含む通常形式のゲームをタイプセットするためのコマンドを作成しようとしています。これまでのところ、次のコードがあります。

\documentclass{article}
\usepackage{tikz}
\usepackage{arrayjobx}

\newcommand \Length [1] {%
  \csname total@#1\endcsname
}

\newcommand{\nfgrid}[2]{
\newarray\row
\readarray{row}{#1}
\newarray\col
\readarray{col}{#2}
\draw[-,very thick] (0,0) to (2*\Length{col},0);
\foreach \i in {1,2,...,\Length{row}}{
        \draw[-,very thick] (0,2*\i) to (2*\Length{col},2*\i);
        \node (A) at (-1,2*\i-1) {\row(\the\numexpr\Length{row}-\i+1\relax)};
    }
\draw[-,very thick] (0,0) to (0,2*\Length{row});
\foreach \i in {1,2,...,\Length{col}}{
        \draw[-,very thick] (2*\i,0) to (2*\i,2*\Length{row});
        \node (A) at (2*\i-1,2*\Length{row}+1) {\col(\the\numexpr\i\relax)};
    }
\foreach \i in {1,2,...,\Length{row}}{
    \foreach \j in {1,2,...,\Length{col}}{
        \node (A) at (2*\j-1.5,2*\i-1.5) {R\row(\the\numexpr\Length{row}-\i+1\relax)\col(\the\numexpr \j\relax)};
        \node (A) at (2*\j-0.5,2*\i-0.5) {C\row(\the\numexpr\Length{row}-\i+1\relax)\col(\the\numexpr \j\relax)};
        \draw[-,very thin] (2*\j,2*\i-2) to (2*\j-2,2*\i);
        }
    }
}

\begin{document}
\begin{tikzpicture}
\nfgrid{A&B&C}{W&X&Y&Z}
\end{tikzpicture}
\end{document}

すると次の図が表示されます。 3 行 4 列のグリッドの画像。列には W、X、Y、Z のインデックスが付けられ、行には A、B、C のインデックスが付けられます。グリッドの各正方形は対角線で半分に分割され、左下半分には R と行と列のラベルが付けられ、右上半分には同様に C から始まるラベルが付けられます。

ペイオフを設定するための別のコマンドを作成したいと思います。これは、現在 RAW、CAW などのラベルが付けられているノードのラベルを意味します。そのためには、これらのノードに、現在ラベルとして設定している文字列を名前として付けたいと考えていました。基本的に、22 行目から 23 行目のこのコードを使用するつもりでした (これは機能していません)。

\node (R\row(\the\numexpr#1-\i+1\relax)\col(\the\numexpr \j\relax)) at (2*\j-1.5,2*\i-1.5) {};
\node (C\row(\the\numexpr#1-\i+1\relax)\col(\the\numexpr \j\relax)) at (2*\j-0.5,2*\i-0.5) {};

しかし、私が試した方法では、arrayjobx 配列値を tikz ノードの名前として使用することはできませんでした。回避策はありますか? コマンド入力から行/列名の配列を簡単に読み取ることができる限り、arrayjobx 以外のパッケージを使用することは可能です。

答え1

(R\row(\the\numexpr#1-\i+1\relax)\col(\the\numexpr \j\relax))の名前に提案されたコードは、以下に示すように、拡張できない\nodeため機能しません。\row(1)

\documentclass[border=6pt]{standalone}
\usepackage{arrayjobx}
\begin{document}
\newarray\row
\readarray{row}{a&b&c}
\def\testA{\row(1)}%\def works but \edef does not work
\testA
\end{document}

以下のコードexpl3では の代わりにを使用しますarrayjobx

フレームは 1 つの で描画されますgrid

このコマンドは\seq_map_indexed_inline:Nn、シーケンスをループし、インデックスを追跡するために使用されます。

\documentclass[border=6pt]{standalone}
\usepackage{tikz}
\ExplSyntaxOn
\seq_new:N \l__Chip_row_seq
\seq_new:N \l__Chip_column_seq
\NewDocumentCommand \nfgrid { m m }
  {
    \seq_set_from_clist:Nn \l__Chip_row_seq {#1}
    \seq_set_from_clist:Nn \l__Chip_column_seq {#2}
    \draw [ very~thick , step = 2 ] ( 0 , 0 ) grid ( 2 * \seq_count:N \l__Chip_column_seq , 2 * \seq_count:N \l__Chip_row_seq ) ;
    \seq_map_indexed_inline:Nn \l__Chip_row_seq
      {
        \node (##2) at ( -1 , { 2 * ( \seq_count:N \l__Chip_row_seq - ##1 ) + 1 } ) {##2};
      }
    \seq_map_indexed_inline:Nn \l__Chip_column_seq
      {
        \node (##2) at ( 2 * ##1 - 1 , 2 * \seq_count:N \l__Chip_row_seq + 1 ) {##2};
      }
    \seq_map_indexed_inline:Nn \l__Chip_row_seq
      {
        \seq_map_indexed_inline:Nn \l__Chip_column_seq
          {
            \node ( R ##2 ####2 ) at ( 2 * ####1 - 1.5 , { 2 * ( \seq_count:N \l__Chip_row_seq - ##1 ) + 0.5 } ) { R ##2 ####2 };
            \node ( C ##2 ####2 ) at ( 2 * ####1 - 0.5 , { 2 * ( \seq_count:N \l__Chip_row_seq - ##1 ) + 1.5 } ) { C ##2 ####2 };
            \draw [ very~thin ] ( 2 * ####1 - 2 , 2 * ##1 ) -- ++ ( 2 , -2 ) ;
          }
      }
  }
\ExplSyntaxOff
\begin{document}
\begin{tikzpicture}
\nfgrid{A,B,C}{W,X,Y,Z}
\end{tikzpicture}
\end{document}

ここに画像の説明を入力してください

関連情報