マクロ引数に基づくインライン 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 に移転しようとしないでください。
最初は、Donald E. Knuth の TeXbook で紹介されている用語に固執してください。この用語が取り上げられているのは、TeX の基盤となる概念が異なり、その説明には異なる語彙が必要になるためです。他
の言語でのプログラミングに関する知識の移転は、TeX の仕組みを理解し、移転を適切に行う方法を知っていれば行うことができます。
たとえば、「トークン」/「トークン化」や「拡張」などの概念に慣れる必要があります。また、TeX ではさまざまなレベルの実行が絡み合っているという事実に慣れる必要があります。この事実は、TeXbook では、プログラム TeX が目と消化のさまざまな段階 (口、食道、胃など) を持つ消化管を持つ獣として見られるというアナロジーによって学習者の注意を引いています。

関連情報