Встроенный оператор If-Else на основе макроаргумента

Встроенный оператор If-Else на основе макроаргумента

Как мне реализовать встроенный оператор if-else?

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

Я попытался сделать это на основеэтот ответ, например, но безуспешно:

\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

Я перепробовал много других методов, но ни один из них не сработал.

Вот минимальный полный пример:

\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}

(Почему в TeX существуют десятки способов выполнения операторов if, но все они кажутся слишком привередливыми? TT)

решение1

Вы можете позаимствовать условный оператор из уровня 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}

решение2

Гораздо проще: -blackесть whiteи наоборот.

\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}

Я тоже упростил \drawStone.

введите описание изображения здесь

решение3

На самом деле вам не нужен здесь тест, просто выберите дополнительный цвет.

\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}

решение4

Более громоздкий способ выполнения трюка, при котором используется не так много новых вещей, может быть таким:

\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}

(Почему в TeX существуют десятки способов выполнения операторов if, но все они кажутся слишком привередливыми? TT)

Они кажутся очень придирчивыми, поскольку парадигма программирования языка набора текста TeX отличается от парадигм программирования большинства языков программирования, к которым люди привыкли.

При изучении TeX/LaTeX не пытайтесь переносить знания о программировании на других языках (например, C++ или Java или Scheme) в TeX/LaTeX на слишком раннем этапе обучения.
Вначале придерживайтесь терминологии, введенной в TeXbook Дональда Э. Кнута. Эта терминология приводится, поскольку концепции, лежащие в основе TeX, различаются, и, следовательно, их описание/объяснение требуют разного словаря.
Передача знаний о программировании на других языках может быть осуществлена, когда вы знаете, как работает TeX, и, следовательно, знаете, как правильно выполнять передачу.
Например, вам нужно ознакомиться с такими понятиями, как «токен»/«токенизация» и «расширение». И вам нужно ознакомиться с тем фактом, что в TeX переплетены различные уровни выполнения — факт, который в TeXbook доводится до сведения учащихся посредством аналогии, где программа TeX рассматривается как зверь, у которого есть глаза и пищеварительный тракт с различными стадиями пищеварения (рот, пищевод, желудок, ...).

Связанный контент