14

I need to increment/decrement variables in TikZ, i.e., I have

\def\a{0}

and then I need to perform

\a=\a-1.5;

The code compiles, but it does not change the value of the variable \a.

How do I do this?

9
  • In which context are you trying to do this? Do you need a loop, for example? Please elaborate a little more. Commented Jun 17, 2013 at 20:32
  • @GonzaloMedina No. I do not need a loop. I am making a drawing in TikZ and the variable stores the coordinates of the center of a piece of the drawing and relative to this, I need to draw the rest. Commented Jun 17, 2013 at 20:34
  • 5
    Simply having \a=\a-1.5; in a TikZ picture doesn’t do anything. (Such text is usually simply discarded as TikZ installs some sort of null font as it simply expands to 0=0-1.5;.) If you want to use the result of that calculation inside of TikZ you mostly can simply say \edef\a{\a-1.5} as TikZ evaluates nearly everything again anyway. Otherwise you need to do \pgfmathsetmacro\a{\a-1.5}. Commented Jun 17, 2013 at 20:47
  • @Qrrbrbirlbel Thanks! \edef is the one I was looking for! Could you add that as an answer? I will accept it. Commented Jun 17, 2013 at 21:59
  • 1
    I think you are doing something inefficient. If you include your use case then it will be much easier to show how to use relative coordinates. Commented Jun 18, 2013 at 11:01

1 Answer 1

20

There's not much to go on in your question. So, I'll do my best here. There are several approaches you can take. You wanted to decrement \a; I increment it in the following examples to visually emphasis how the effects are taking place and being used: just make the necessary changes for decrementing.

The first is to combine a use of \pgfmathparse with \edef

enter image description here

code for above image:

\documentclass{article} \usepackage{tikz} \usetikzlibrary{calc} \begin{document} Use \verb`\pgfmathparse` together with \verb`\edef` \begin{tikzpicture} \edef\mya{0} \pgfmathparse{\mya+1.5} \edef\mya{\pgfmathresult} \node[circle,draw] at (\mya,\mya) {\mya}; \end{tikzpicture} \end{document} 

If you want to remember the changed macro outside of the tikzpicture then you can use \xdef

enter image description here

code for above image:

\documentclass{article} \usepackage{tikz} \usetikzlibrary{calc} \begin{document} To remember outside of the picture use \verb`\xdef` \begin{tikzpicture} \edef\mya{0} \pgfmathparse{\mya+1.5} \xdef\mya{\pgfmathresult} \node[circle,draw] at (\mya,\mya) {\mya}; \end{tikzpicture} \verb`\mya`=\mya \end{document} 

You can use a \foreach loop with the above tricks:

enter image description here

code for above image:

\documentclass{article} \usepackage{tikz} \usetikzlibrary{calc} \begin{document} If used within a \verb`\foreach` loop, you have several choices: Use \verb`\xdef` \begin{tikzpicture} \edef\mya{0} \foreach \x in {1,2,...,8} { \pgfmathparse{\mya+1.5} \xdef\mya{\pgfmathresult} \node[circle,draw,inner sep=\mya pt] at (\mya*0.50cm,\mya*0.25cm) {\makebox[0pt]{\mya}}; } \end{tikzpicture} \end{document} 

Better yet, you can use evaluate=\x as ...

enter image description here

code for above image:

\documentclass{article} \usepackage{tikz} \usetikzlibrary{calc} \begin{document} Using \verb`evaluate=\x as ...` \begin{tikzpicture} \edef\mya{0} \foreach \x [evaluate=\x as \mya using \x*1.5] in {1,2,...,8} { \node[circle,draw,inner sep=\mya pt] at (\mya*0.5cm,\mya*0.25cm) {\makebox[0pt]{\mya}}; } \end{tikzpicture} \end{document} 

Finally, if you need to remember the value outside of the \foreach loop, you can do something like:

enter image description here

code for above image:

\documentclass{article} \usepackage{tikz} \usetikzlibrary{calc} \begin{document} Using \verb`evaluate=\x as ...` and remembering \begin{tikzpicture} \edef\mya{0} \foreach \x [evaluate=\x as \mya using \x*1.5] in {1,2,...,8} { \node[circle,draw,inner sep=\mya pt] at (\mya*0.5cm,\mya*0.25cm) {\makebox[0pt]{\mya}}; \xdef\remembermya{\mya} } \edef\mya{\remembermya} \node at (0,0) {\mya}; \end{tikzpicture} \end{document} 

This should probably be enough to get you started. If you could post a more thorough MWE illustrating how you're trying to use \a, then I could probably give you a more complete answer.

You could also take a rather different approach using coordinate arithmetic:

enter image description here

code for above image:

\documentclass{article} \usepackage{tikz} \usetikzlibrary{calc} \begin{document} Using \verb`calc` package to perform coordinate arithmetic: \verb`($(0,0)+\x*(<coordinate>)$)` \begin{tikzpicture} \coordinate (myinc) at (1.5*0.5cm,0.25cm); \foreach \x in {1,2,...,8} { \pgfmathparse{\x*1.5} \edef\mya{\pgfmathresult} \node[circle,draw,inner sep=\mya pt] at ($(0,0)+\x*(myinc)$) {\makebox[0pt]{\mya}}; } \end{tikzpicture} \end{document} 
2
  • Where do I can look for his to use \def, \xdef, and \edef? They all seem LaTeX macros used for something else in TikZ. Commented Feb 17, 2022 at 7:00
  • 1
    @Atcold I'm unclear about what you're asking. But there are a number of posts on this site about how to use these commands. See for example: What are the differences between \def, \edef, \gdef and \xdef? and the link to the duplicate. Commented Feb 17, 2022 at 21:24

You must log in to answer this question.