Declaração If-Else embutida com base no argumento macro

Declaração If-Else embutida com base no argumento macro

Como faço uma instrução if-else embutida?

\draw[draw = #1, fill = \if black#1 white \else black \fi, line width = 0.1mm]
  (#2, #3) circle [radius = 0.25cm];

Eu tentei fazer isso com base emesta resposta, por exemplo, mas sem sucesso:

\begingroup
  \def\color{#1}
  \def\black{black}

  \draw[draw = #1, fill = \ifx\color\black white \else black \fi, line width = 0.1mm]
    (#2, #3) circle [radius = 0.25cm]; % chktex 1
\endgroup

Eu tentei muitos outros métodos, mas nenhum parece funcionar.

Aqui está um exemplo mínimo completo:

\documentclass{article}

\usepackage{tikz}

% Parameters
%
% 1: dimension (in cm)
% 2: board size (square)
% 
% Example: A 19x19 board with size 10cm x 10cm: `\gogrid{10}{19}'
\newcommand{\goGrid}[2]{
  \pgfmathsetmacro{\step}{#1 / (#2 - 1)} % chktex 1

  \draw[step=\step] (0, 0) grid (#1, #1);
}

\newcommand{\drawStone}[3]{
  \draw[draw = #1, fill = \if black#1 white \else black \fi, line width = 0.1mm]
    (#2, #3) circle [radius = 0.25cm];
}

\begin{document}
  \begin{tikzpicture}
    \goGrid{10}{19}

    \drawStone{white}{2 * 10cm / 18}{3 * 10cm / 18}
  \end{tikzpicture}
\end{document}

(Por que existem dezenas de maneiras de fazer declarações if no TeX, mas todas elas parecem super complicadas? TT)

Responder1

Você pode pegar emprestada uma condicional da camada L3:

\documentclass{article}

\usepackage{tikz}

% Parameters
%
% 1: dimension (in cm)
% 2: board size (square)
% 
% Example: A 19x19 board with size 10cm x 10cm: `\gogrid{10}{19}'
\newcommand{\goGrid}[2]{
  \pgfmathsetmacro{\step}{#1 / (#2 - 1)} % chktex 1

  \draw[step=\step] (0, 0) grid (#1, #1);
}

\ExplSyntaxOn
\cs_new_eq:NN \myIfStrEqTF \str_if_eq:nnTF
\ExplSyntaxOff

\newcommand{\drawStone}[3]{
  \draw[draw = #1, fill = \myIfStrEqTF{black}{#1}{white}{black}, line width = 0.1mm]
    (#2, #3) circle [radius = 0.25cm];
}

\begin{document}
  \begin{tikzpicture}
    \goGrid{10}{19}

    \drawStone{white}{2 * 10cm / 18}{3 * 10cm / 18}
  \end{tikzpicture}
\end{document}

Responder2

Muito mais simples: -blacké whitee vice-versa.

\documentclass{article}

\usepackage{tikz}

% Parameters
%
% 1: dimension (in cm)
% 2: board size (square)
%
% Example: A 19x19 board with size 10cm x 10cm: `\gogrid{10}{19}'
\newcommand{\goGrid}[2]{%
  \pgfmathsetmacro{\step}{#1 / (#2 - 1)} % chktex 1
  \draw[step=\step] (0, 0) grid (#1, #1);%
}

\newcommand{\drawStone}[3]{% -#1 is the complementary color
  \draw[draw = #1, fill = -#1, line width = 0.1mm]
    (#2*\step, #3*\step) circle [radius = 0.25cm];
}

\begin{document}
  \begin{tikzpicture}
    \goGrid{10}{19}
    \drawStone{white}{2}{3}
    \drawStone{black}{4}{5}
  \end{tikzpicture}
\end{document}

Eu também simplifiquei \drawStone.

insira a descrição da imagem aqui

Responder3

Você realmente não precisa de um teste aqui, basta selecionar a cor complementar

\documentclass{article}

\usepackage{tikz}

\newcommand\notwhite{black}
\newcommand\notblack{white}
% Parameters
%
% 1: dimension (in cm)
% 2: board size (square)
% 
% Example: A 19x19 board with size 10cm x 10cm: `\gogrid{10}{19}'
\newcommand{\goGrid}[2]{%
  \pgfmathsetmacro{\step}{#1 / (#2 - 1)} % chktex 1
%
  \draw[step=\step] (0, 0) grid (#1, #1);%
}

\newcommand{\drawStone}[3]{%
  \draw[draw = #1, fill = \UseName{not#1}, line width = 0.1mm]
    (#2, #3) circle [radius = 0.25cm];
}

\begin{document}
  \begin{tikzpicture}
    \goGrid{10}{19}

    \drawStone{white}{2 * 10cm / 18}{3 * 10cm / 18}
  \end{tikzpicture}
\end{document}

Responder4

Uma maneira mais complicada de fazer o truque, onde não são usadas tantas coisas novas, poderia ser:

\documentclass{article}

\usepackage{tikz}

% Parameters
%
% 1: dimension (in cm)
% 2: board size (square)
% 
% Example: A 19x19 board with size 10cm x 10cm: `\gogrid{10}{19}'
\newcommand{\goGrid}[2]{
  \pgfmathsetmacro{\step}{#1 / (#2 - 1)} % chktex 1

  \draw[step=\step] (0, 0) grid (#1, #1);
}

% Paraphernalia ;-)
\newcommand\Exchange[2]{#2#1}%
\newcommand\FirstOfTwo[2]{#1}%
\newcommand\SecondOfTwo[2]{#2}%

\newcommand{\drawStone}[3]{%
  \begingroup
  \edef\tempa{\unexpanded{#1}}%
  \def\tempb{black}%
  \expandafter\endgroup
  \ifx\tempa\tempb\expandafter\FirstOfTwo\else\expandafter\SecondOfTwo\fi
  {\Exchange{white}}%
  {\Exchange{black}}%
  {\draw[draw = #1, fill = }, line width = 0.1mm]
    (#2, #3) circle [radius = 0.25cm];
}

\begin{document}
  \begin{tikzpicture}
    \goGrid{10}{19}

    \drawStone{white}{2 * 10cm / 18}{3 * 10cm / 18}
  \end{tikzpicture}
\end{document}

(Por que existem dezenas de maneiras de fazer declarações if no TeX, mas todas elas parecem super complicadas? TT)

Eles parecem muito meticulosos porque o paradigma de programação da linguagem tipográfica TeX é diferente dos paradigmas de programação da maioria das linguagens de programação com as quais as pessoas estão acostumadas.

Ao aprender TeX/LaTeX, não tente transferir conhecimento sobre programação em outras linguagens (por exemplo, C++ ou Java ou Scheme) para TeX/LaTeX em um estágio de aprendizagem muito precoce.
No início, siga a terminologia introduzida no TeXbook de Donald E. Knuth. Essa terminologia é trazida à tona porque os conceitos subjacentes ao TeX diferem e, portanto, sua descrição/explicação requer vocabulário diferente.
A transferência de conhecimento sobre programação em outras linguagens pode ser feita quando você conhece como funciona o TeX e assim sabe fazer a transferência corretamente.
Por exemplo, você precisa se familiarizar com conceitos como "token"/"tokenização" e "expansão". E você precisa se familiarizar com o fato de que no TeX diferentes níveis de execução estão interligados - fato que no TeXbook é trazido à atenção dos alunos por meio de uma analogia onde o programa TeX é visto como uma fera que tem olhos e um trato digestivo com diferentes fases de digestão (boca, esófago, estômago, ...).

informação relacionada