我有一个索引变量,但我不知道如何对索引进行简单的数学运算,例如x{\a-1}
。
我使用了\tikzmath
很多;因此,我的 MWE 包括它:
\documentclass[]{standalone}
\usepackage{tikz}
\usetikzlibrary{math}
\begin{document}
\begin{tikzpicture}
\tikzmath{
\x1 = 1;
\x2 = 3;
\x3 = 5;
\x4 = 7;
%Since units are not given in \tikzmat, they will be evaluated as cm in tikz enviroment below.
}
\draw (\x{1},0) -- (10cm,10cm) node[at start, below]{\x{1}}; %This works
%\draw (\x{2-1},0) -- (10cm,10cm) node[at start, below]{\x{2-1}}; %This does not work
%\foreach \ind in {2,...,4}
%\draw (\x{\ind},0) -- (10cm,10cm) node[at start, below]{\x{\ind}}; %This works
%\foreach \ind in {2,...,4}
%\draw (\x{\ind-1},0) -- (10cm,10cm) node[at start, below]{\x{\ind-1}}; %This does not work
\end{tikzpicture}
\end{document}
答案1
宏\x
不对其参数执行算术运算,但您可以让它执行此操作。
\documentclass{standalone}
\usepackage{tikz}
\usetikzlibrary{math}
\newcommand{\usevar}[2]{%
\expandafter#1\expandafter{\the\numexpr#2\relax}%
}
\begin{document}
\begin{tikzpicture}
\tikzmath{
\x1 = 1;
\x2 = 3;
\x3 = 5;
\x4 = 7;
%Since units are not given in \tikzmat, they will be evaluated as cm in tikz enviroment below.
}
\draw (\x{1},0) -- (10,5) node[at start, below]{\x{1}};
\draw[red] (\usevar\x{2-1},0) -- (4,5) node[at start, below]{\usevar\x{2-1}};
\foreach \ind in {2,...,4}
\draw (\x{\ind},0) -- (10,10) node[at start, below]{\x{\ind}};
\foreach \ind in {2,...,4}
\draw[red] (\usevar\x{\ind-1},0) -- (5,5) node[at start, below]{\usevar\x{\ind-1}};
\end{tikzpicture}
\end{document}
解释
当你这样做时\tikzmath{\x<argument>=<expression>}
,TikZ 会定义宏\x
以及内部宏
\tikz@math@var@indexed@x@<argument>
反过来,它又扩展为(计算的)表达式。宏\x
本质上被定义为查看其参数并从中组成内部宏名称。<argument>
不需要是数学表达式,因此不会尝试对其进行求值。
\x
因此,您需要在展开之前执行求值(假设“下标”中只涉及整数) 。这是由执行的任务\usevar
,它将\x
搁置,展开\the\numexpr#2\relax
,返回一个整数,然后返回\x
(通常是它的第一个参数),现在“看到”计算出的参数。