
Wie erstelle ich eine Inline-If-Else-Anweisung?
\draw[draw = #1, fill = \if black#1 white \else black \fi, line width = 0.1mm]
(#2, #3) circle [radius = 0.25cm];
Ich habe versucht, es auf der Grundlage vondiese Antwort, jedoch ohne Erfolg:
\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
Ich habe viele andere Methoden ausprobiert, aber keine scheint zu funktionieren.
Hier ist ein minimales vollständiges Beispiel:
\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}
(Warum gibt es in TeX Dutzende von Möglichkeiten, if-Anweisungen zu verwenden, die aber alle extrem umständlich erscheinen? TT)
Antwort1
Sie können eine Bedingung aus der L3-Ebene übernehmen:
\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}
Antwort2
Viel einfacher: -black
ist white
und umgekehrt.
\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}
Ich habe auch vereinfacht \drawStone
.
Antwort3
Hier ist kein Test nötig, sondern nur die Komplementärfarbe
\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}
Antwort4
Eine etwas umständlichere Möglichkeit, den Trick umzusetzen, bei der nicht so viele neue Dinge verwendet werden, könnte sein:
\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}
(Warum gibt es in TeX Dutzende von Möglichkeiten, if-Anweisungen zu verwenden, die aber alle extrem umständlich erscheinen? TT)
Sie scheinen extrem pingelig zu sein, weil das Programmierparadigma der Satzsprache TeX sich von den Programmierparadigmen der meisten Programmiersprachen unterscheidet, an die die Leute gewöhnt sind.
Versuchen Sie beim Erlernen von TeX/LaTeX nicht, Kenntnisse über das Programmieren in anderen Sprachen (z. B. C++, Java oder Scheme) in einem zu frühen Lernstadium auf TeX/LaTeX zu übertragen.
Halten Sie sich zu Beginn an die Terminologie, die in Donald E. Knuths TeXbook eingeführt wurde. Diese Terminologie wird verwendet, weil die TeX zugrunde liegenden Konzepte unterschiedlich sind und ihre Beschreibung/Erklärung daher ein anderes Vokabular erfordert.
Die Übertragung von Kenntnissen über das Programmieren in anderen Sprachen kann erfolgen, wenn Sie wissen, wie TeX funktioniert und daher wissen, wie Sie die Übertragung richtig durchführen.
Sie müssen sich beispielsweise mit Konzepten wie „Token“/„Tokenisierung“ und „Erweiterung“ vertraut machen. Und Sie müssen sich mit der Tatsache vertraut machen, dass in TeX verschiedene Ausführungsebenen miteinander verflochten sind – eine Tatsache, die den Lernenden im TeXbook mithilfe einer Analogie bewusst gemacht wird, in der das Programm TeX als ein Tier betrachtet wird, das Augen und einen Verdauungstrakt mit verschiedenen Verdauungsstadien (Mund, Speiseröhre, Magen usw.) hat.