
如何執行內嵌 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 程式被視為有眼睛和眼睛的野獸。口腔、食道、胃…)。