![基于宏参数的内联 If-Else 语句](https://linux22.com/image/473597/%E5%9F%BA%E4%BA%8E%E5%AE%8F%E5%8F%82%E6%95%B0%E7%9A%84%E5%86%85%E8%81%94%20If-Else%20%E8%AF%AD%E5%8F%A5.png)
如何编写内联 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 的工作原理并知道如何正确进行转移时,就可以完成其他语言编程知识的转移。
例如,您需要熟悉“token”/“tokenization”和“expansion”等概念。您还需要熟悉 TeX 中不同级别的执行是相互交织的这一事实 - TeXbook 通过类比将 TeX 程序视为一只野兽,它有眼睛和消化道,消化道有不同的消化阶段(嘴、食道、胃……),从而引起了学习者的注意。