索引变量索引中的数学运算

索引变量索引中的数学运算

我有一个索引变量,但我不知道如何对索引进行简单的数学运算,例如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(通常是它的第一个参数),现在“看到”计算出的参数。

答案2

对@egreg 的修复进行了微小补充:

如果我们只想评估与{2*\ind+5}@egreg 的解决方案类似的表达式,则为:

\newcommand{\useevalof}[1]{%
  \the\numexpr#1\relax%
}

例如:考虑$A_{\ind-4}$。如果\ind值为 6,$A_{\useevalof{\ind-4}}$将给出$A_2$

这对我来说真的很有用。我正在为土木工程师开发一个用于结构力学的 Tikz 库。看看下面的图片。级别是完全自动化的。

注意:\expandafter在@egreg 注释后被删除。

在此处输入图片描述

相关内容