So führen Sie ein if nach einem „exp:args“ in expl3 aus

So führen Sie ein if nach einem „exp:args“ in expl3 aus

Gefolgtdiese Antwort von @JasperHabicht, in meinem Code möchte ich diesem Makro eine Option hinzufügen, sodass ich je nach Flag entweder \drawMoveFromSgfCoordsoder ausführen kann \drawStoneFromSgfCoords. Ich weiß noch nicht viel über expl3, also ist dies sozusagen mein Pseudocode:

% Parameters
%
% 1: array of {<black | white>, <coordinates}
%
% Example usage: `drawStonesOrMovesFromSgfCoords{{black, ab}, {white, cd}}{true}`
\ExplSyntaxOn
  \NewExpandableDocumentCommand{\drawStonesOrMovesFromSgfCoords}{ m }{ m }{
    \clist_set:Nn \l_tmpa_clist { #1 }
    \clist_map_inline:Nn \l_tmpa_clist {
      \clist_set:Nn \l_tmpb_clist { ##1 }
      \clist_pop:NN \l_tmpb_clist \l_tmpa_tl 
      \clist_pop:NN \l_tmpb_clist \l_tmpb_tl 
      % I'm trying to fix what's in-between parentheses below:
      \exp_args:Noo (\bool_if:NN ##2 \drawStoneFromSgfCoords \drawMoveFromSgfCoords) { \l_tmpa_tl } { \l_tmpb_tl }
    }
  }
\ExplSyntaxOff

Hier ist ein mehr oder weniger vollständiges Beispiel (wenn Sie die Syntax kennen, ist dies wahrscheinlich nicht erforderlich):

\documentclass{article}

\usepackage{tikz}

% From [this answer by @DavidCarlisle](https://tex.stackexchange.com/a/708876/64441).
\newcommand\notwhite{black}
\newcommand\notblack{white}

% From [this answer by @DavidCarlisle](https://tex.stackexchange.com/a/708893/64441).
\ExplSyntaxOn
  \cs_generate_variant:Nn \int_from_alph:n {e}

  \NewExpandableDocumentCommand{\stringToCoordX}{ m }{
    \int_from_alph:e { \use_i:nn #1 }
  }
  \NewExpandableDocumentCommand{\stringToCoordY}{ m }{
    \int_from_alph:e { \use_ii:nn #1 }
  }
\ExplSyntaxOff

\newcommand{\drawStoneFromSgfCoords}[2]{
  \pgfmathsetmacro{\x}{\stringToCoordX{#2} - 1}
  \pgfmathsetmacro{\y}{\stringToCoordY{#2} - 1}

  \draw[draw = \UseName{not#1}, fill = #1, line width = 0.1mm]
    (\x * 10cm / 18, \y * 10cm / 18)
    circle [radius = 0.2575cm];
}

\newcounter{moveCounter}
\setcounter{moveCounter}{1}
\newcommand{\drawMoveFromSgfCoords}[2]{
  \pgfmathsetmacro{\x}{\stringToCoordX{#2} - 1}
  \pgfmathsetmacro{\y}{\stringToCoordY{#2} - 1}

  \draw[draw = \UseName{not#1}, fill = #1, line width = 0.1mm]
    (\x * 10cm / 18, \y * 10cm / 18)
    circle [radius = 0.2575cm]
    node[color = \UseName{not#1}]
      {\themoveCounter};

  \stepcounter{moveCounter}
}

\ExplSyntaxOn
  % Example usage: `drawMovesOrStonesFromSgfCoords{{black, ab}, {white, cd}}`
  \NewExpandableDocumentCommand{\drawMovesOrStonesFromSgfCoords}{ m }{
    \clist_set:Nn \l_tmpa_clist { #1 }
    \clist_map_inline:Nn \l_tmpa_clist {
      \clist_set:Nn \l_tmpb_clist { ##1 }
      \clist_pop:NN \l_tmpb_clist \l_tmpa_tl 
      \clist_pop:NN \l_tmpb_clist \l_tmpb_tl 
      \exp_args:Noo \drawStoneFromSgfCoords { \l_tmpa_tl } { \l_tmpb_tl }
      
    }
  }
\ExplSyntaxOff

\begin{document}
  \begin{tikzpicture}
    \pgfmathsetmacro{\step}{10 / 18}

    \draw[step=\step] (0, 0) grid (10, 10);

    %\drawStoneFromSgfCoords{black}{ab}
    %\drawStoneFromSgfCoords{white}{cd}
    \drawMovesOrStonesFromSgfCoords{{black, ab}, {white, cd}}
  \end{tikzpicture}
\end{document}

Antwort1

Du kannst tun:

\ExplSyntaxOn
  % There is no point in doing \NewExpandableDocument as \clist_set:Nn and
  % \clist_pop:NN and \clist_map_inline:Nn are not fully expandable.
  \NewDocumentCommand{\drawMovesOrStonesFromSgfCoords}{ s m }{
    % The s argument, denoted by #1, is "true" in case a star was provided.
    % The s argument, denoted by #1, is "false" in case no star was provided.
    \clist_set:Nn \l_tmpa_clist { #2 }
    \clist_map_inline:Nn \l_tmpa_clist {
      \clist_set:Nn \l_tmpb_clist { ##1 }
      \clist_pop:NN \l_tmpb_clist \l_tmpa_tl 
      \clist_pop:NN \l_tmpb_clist \l_tmpb_tl 
      \IfBooleanTF {#1} { \exp_args:NVV \drawStoneFromSgfCoords } 
                        { \exp_args:NVV \drawMoveFromSgfCoords } 
      \l_tmpa_tl  \l_tmpb_tl
    }
  }
\ExplSyntaxOff

Oder:

\ExplSyntaxOn
  % There is no point in doing \NewExpandableDocument as \clist_set:Nn and
  % \clist_pop:NN and \clist_map_inline:Nn are not fully expandable.
  \NewDocumentCommand{\drawMovesOrStonesFromSgfCoords}{ s m }{
    % The s argument, denoted by #1, is "true" in case a star was provided.
    % The s argument, denoted by #1, is "false" in case no star was provided.
    \clist_set:Nn \l_tmpa_clist { #2 }
    \clist_map_inline:Nn \l_tmpa_clist {
      \clist_set:Nn \l_tmpb_clist { ##1 }
      \clist_pop:NN \l_tmpb_clist \l_tmpa_tl 
      \clist_pop:NN \l_tmpb_clist \l_tmpb_tl 
      \exp_args:Nc
      \exp_args:NVV
      {draw\IfBooleanTF {#1}{Stone}{Move}FromSgfCoords}
      \l_tmpa_tl  \l_tmpb_tl
    }
  }
\ExplSyntaxOff

Wenn Sie es komplizierter mögen, können Sie \exp_args:NnV \use:n {...} \Variableinnerhalb des n-Arguments von verschachteln \exp_args:NnV:

\ExplSyntaxOn
  % There is no point in doing \NewExpandableDocument as \clist_set:Nn and
  % \clist_pop:NN and \clist_map_inline:Nn are not fully expandable.
  \NewDocumentCommand{\drawMovesOrStonesFromSgfCoords}{ s m }{
    % The s argument, denoted by #1, is "true" in case a star was provided.
    % The s argument, denoted by #1, is "false" in case no star was provided.
    \clist_set:Nn \l_tmpa_clist { #2 }
    \clist_map_inline:Nn \l_tmpa_clist {
      \clist_set:Nn \l_tmpb_clist { ##1 }
      \clist_pop:NN \l_tmpb_clist \l_tmpa_tl 
      \clist_pop:NN \l_tmpb_clist \l_tmpb_tl 
      \exp_args:NnV 
         \use:n 
         {
           \exp_args:NnV 
              \use:n 
              { \IfBooleanTF {#1} {\drawStoneFromSgfCoords} {\drawMoveFromSgfCoords} } 
              \l_tmpa_tl
         } 
         \l_tmpb_tl
    }
  }
\ExplSyntaxOff

Hier ist ein vollständiges Beispiel:

\documentclass{article}

\usepackage{tikz}

% From [this answer by @DavidCarlisle](https://tex.stackexchange.com/a/708876/64441).
\newcommand\notwhite{black}
\newcommand\notblack{white}

% From [this answer by @DavidCarlisle](https://tex.stackexchange.com/a/708893/64441).
\ExplSyntaxOn
  \cs_generate_variant:Nn \int_from_alph:n {e}

  \NewExpandableDocumentCommand{\stringToCoordX}{ m }{
    \int_from_alph:e { \use_i:nn #1 }
  }
  \NewExpandableDocumentCommand{\stringToCoordY}{ m }{
    \int_from_alph:e { \use_ii:nn #1 }
  }
\ExplSyntaxOff

\newcommand{\drawStoneFromSgfCoords}[2]{
  \pgfmathsetmacro{\x}{\stringToCoordX{#2} - 1}
  \pgfmathsetmacro{\y}{\stringToCoordY{#2} - 1}

  \draw[draw = \UseName{not#1}, fill = #1, line width = 0.1mm]
    (\x * 10cm / 18, \y * 10cm / 18)
    circle [radius = 0.2575cm];
}

\newcounter{moveCounter}
\setcounter{moveCounter}{1}
\newcommand{\drawMoveFromSgfCoords}[2]{
  \pgfmathsetmacro{\x}{\stringToCoordX{#2} - 1}
  \pgfmathsetmacro{\y}{\stringToCoordY{#2} - 1}

  \draw[draw = \UseName{not#1}, fill = #1, line width = 0.1mm]
    (\x * 10cm / 18, \y * 10cm / 18)
    circle [radius = 0.2575cm]
    node[color = \UseName{not#1}]
      {\themoveCounter};

  \stepcounter{moveCounter}
}

\ExplSyntaxOn
  % There is no point in doing \NewExpandableDocument as \clist_set:Nn and
  % \clist_pop:NN and \clist_map_inline:Nn are not fully expandable.
  \NewDocumentCommand{\drawMovesOrStonesFromSgfCoords}{ s m }{
    % The s argument, denoted by #1, is "true" in case a star was provided.
    % The s argument, denoted by #1, is "false" in case no star was provided.
    \clist_set:Nn \l_tmpa_clist { #2 }
    \clist_map_inline:Nn \l_tmpa_clist {
      \clist_set:Nn \l_tmpb_clist { ##1 }
      \clist_pop:NN \l_tmpb_clist \l_tmpa_tl 
      \clist_pop:NN \l_tmpb_clist \l_tmpb_tl 
      \IfBooleanTF {#1} { \exp_args:NVV \drawStoneFromSgfCoords } 
                        { \exp_args:NVV \drawMoveFromSgfCoords } 
      \l_tmpa_tl  \l_tmpb_tl
    }
  }
\ExplSyntaxOff

\begin{document}
  \begin{tikzpicture}
    \pgfmathsetmacro{\step}{10 / 18}

    \draw[step=\step] (0, 0) grid (10, 10);

    %\drawStoneFromSgfCoords{black}{ab}
    %\drawStoneFromSgfCoords{white}{cd}
    % The unstarred variant does \drawMoveFromSgfCoords:
    \drawMovesOrStonesFromSgfCoords{{black, ab}, {white, cd}}
  \end{tikzpicture}

  \begin{tikzpicture}
    \pgfmathsetmacro{\step}{10 / 18}

    \draw[step=\step] (0, 0) grid (10, 10);

    %\drawStoneFromSgfCoords{black}{ab}
    %\drawStoneFromSgfCoords{white}{cd}
    % The starred variant does \drawStoneFromSgfCoords:
    \drawMovesOrStonesFromSgfCoords*{{black, ab}, {white, cd}}
  \end{tikzpicture}

\end{document}

Antwort2

Ich selbst würde es nicht so machen, aber der folgende Code funktioniert mit relativ konservativen Änderungen an Ihrem Original.

\documentclass{standalone}
\usepackage{tikz}

% From [this answer by @DavidCarlisle](https://tex.stackexchange.com/a/708876/64441).
\newcommand\notwhite{black}
\newcommand\notblack{white}

% From [this answer by @DavidCarlisle](https://tex.stackexchange.com/a/708893/64441).
\ExplSyntaxOn

\NewExpandableDocumentCommand{\stringToCoordX}{ mm }{
  \int_from_alph:n {  #1 }
}
\NewExpandableDocumentCommand{\stringToCoordY}{ mm }{
  \int_from_alph:n { #2 }
}
\ExplSyntaxOff

\newcommand{\drawStoneFromSgfCoords}[2]{
  \pgfmathsetmacro{\x}{\stringToCoordX#2 - 1}
  \pgfmathsetmacro{\y}{\stringToCoordY#2 - 1}
  
  \draw[draw = \UseName{not#1}, fill = #1, line width = 0.1mm]
  ({\x * 1.8cm},{\y * 1.8cm})
  circle [radius = 0.2575cm];
}

\newcounter{moveCounter}
\setcounter{moveCounter}{1}
\newcommand{\drawMoveFromSgfCoords}[2]{
  \pgfmathsetmacro{\x}{\stringToCoordX#2 - 1}
  \pgfmathsetmacro{\y}{\stringToCoordY#2 - 1}
  \draw[draw = \UseName{not#1}, fill = #1, line width = 0.1mm]
  ({\x * 1.8cm},{\y * 1.8cm})
  circle [radius = 0.2575cm]
  node[color = \UseName{not#1}]
  {\themoveCounter};
  \stepcounter{moveCounter}
}

\ExplSyntaxOn
% Example usage: `drawMovesOrStonesFromSgfCoords{{black, ab}, {white, cd}}`
\NewExpandableDocumentCommand{\drawMovesOrStonesFromSgfCoords}{ sm }{
  \clist_set:Nn \l_tmpa_clist { #2 }
  \clist_map_inline:Nn \l_tmpa_clist {
    \clist_set:Nn \l_tmpb_clist { ##1 }
    \clist_pop:NN \l_tmpb_clist \l_tmpa_tl 
    \clist_pop:NN \l_tmpb_clist \l_tmpb_tl 
    \IfBooleanTF { #1 }
    {
      \ExpandArgs { VV } \drawStoneFromSgfCoords \l_tmpa_tl \l_tmpb_tl 
    }{
      \ExpandArgs { VV } \drawMoveFromSgfCoords \l_tmpa_tl \l_tmpb_tl  
    }   
  }
}
\ExplSyntaxOff

\begin{document}
\begin{tikzpicture}
  \pgfmathsetmacro{\step}{10 / 18}

  \draw[step=\step] (0, 0) grid (10, 10);

  \drawMovesOrStonesFromSgfCoords{{black,ab}, {white, cd}}
\end{tikzpicture}
\begin{tikzpicture}
  \pgfmathsetmacro{\step}{10 / 18}

  \draw[step=\step] (0, 0) grid (10, 10);

  \drawMovesOrStonesFromSgfCoords*{{black, ab}, {white, cd}}
\end{tikzpicture}
\end{document}

zwei Bretter mit Steinen

verwandte Informationen