Pg 65 of the PGF Manual, shows different operations with the intersections library in TikZ. But I am not able to understand the code. What is the meaning of the option by here.

enter image description here

The explanation given is:

The name intersections takes an optional argument by, which lets you specify names for the coordinates and options for them. This creates more compact code.

This is not clear.

  • 1
    forget the label and read as "name intersection of D and E by C"... So, C is the name of the intersection of D and E paths. – koleygr Mar 7 '19 at 15:37
  • 1
    If you do not use the by option, then name of the intersection will be (intersection-1) etc. by=... lets you name the intersection in a more convenient manner. – daleif Mar 7 '19 at 15:37
  • @koleygr do you have any examples of the and options for them part? – daleif Mar 7 '19 at 15:38
  • @daleif I don't... just tried to give a basic answer to the question but I don't use it often... Do you think that I should delete my comment? Seems somehow clear to me but I am not sure about that – koleygr Mar 7 '19 at 15:41
  • 3
    \fill [name intersections={of=curve 1 and curve 2, by={a,b,c,d}}] if exist four intersections, or \fill [name intersections={of=curve 1 and curve 2, name=i, total=\t}] . see tikz \& pgf manual, page 142 (version 3.1). – Zarko Mar 7 '19 at 15:50

The relevant line is

\path [name intersections={of=D and E, by={[label=above:$C$]C, [label=below:$C’$]C’}}];

Compare with this simpler version:

\path [name intersections={of=D and E, by={C, C’}}];

Here the intersection points are computed and named C and C' ("name the intersection points of D and E by the names C and C'").

It is shortcut for

\coordinate (C) at ...;
\coordinate (C') at ...;

for some computed coordinates.

Adding the optional styling [label=above:$C$]C is equivalent to

\coordinate[label=above:$C$] (C) at ...;

and allows you to style the intersection point directly. It would be equivalent, though longer, to write

\path [name intersections={of=D and E, by={C, C’}}];
\node[above] at (C) {$C$};
\node[below] at (C') {$C'$};

Just for completeness. You can name the intersections by C-1 etc. by just using name=C. What is perhaps also worth pointing out is that, if you want so sort the intersections along a straight line, then you have to draw the straight line pretending it is a curve.


    \draw[name path=grid] [xstep=3,ystep=2] (9,8) grid (0,0);
    \draw[->, name path=line] (2,1) to[bend left=0] (7,7);
    \draw[name intersections={of=grid and line, sort by=line, name=C, total=\t}]
        \foreach \s in {1,...,\t}{(C-\s) node {\s}};

enter image description here

  • 1
    Wow! Thanks! Didn't knew that this works like this! Thanks (+1). – koleygr Mar 7 '19 at 17:10
  • Nice explanation, but now we have a compound word, sort by! :P. – manooooh Mar 7 '19 at 18:44
  • 1
    @manooooh As long as the user doesn't use \bye I guess it is fine. ;-) – user121799 Mar 7 '19 at 18:46
  • @marmot how does sort by work in this case. Also sort by=line is only for the intersections on the line and what is the order of sorting ( ascending or descending ) – subham soni Mar 8 '19 at 1:07
  • @subhamsoni Yes, intersections are always between two paths, and you can order along one of them. The slight subtlety is that, if you order along a line that is drawn with \draw (X) -- (Y);, sorting may not always work. And yes, sorting is ascending (which is why I added the arrow head in the example). – user121799 Mar 8 '19 at 1:14

By default, intersections are named (intersection-1), (intersection-2), etc.

When you write by={a,b} the first two intersections will be called (a) and (b).

Let's look at the example on page 142, slightly modified. It displays the 9 intersections of two curves. The total number of intersections is given by total.

By writing by={a,b}, the first 2 intersections now have two names:

  • (a) or (intersection-1)
  • (b) or (intersection-2)

(a) is an alias of (intersection-1), the others do not have aliases and remain accessibles.




\clip (-2,-2) rectangle (2,2);
\draw [name path=curve 1] (-2,-1) .. controls (8,-1) and (-8,1) .. (2,1);
\draw [name path=curve 2] (-1,-2) .. controls (-1,8) and (1,-8) .. (1,2);
\fill [name intersections={of=curve 1 and curve 2, by={a,b}, total=\t}]
[red, opacity=0.5, every node/.style={above left, black, opacity=1}]
\foreach \s in {1,...,\t}{(intersection-\s) circle (2pt) node {\footnotesize\s}};
\draw[fill=blue!50,opacity=.5] (a) circle (4pt);
  • I was looking for a way to name them like "A\i, total=\t" (by using the answer here: tex.stackexchange.com/a/31399/120578) but I couldn't find a way about that "\i" counter (This would improve your answer very much) – koleygr Mar 7 '19 at 16:12
  • I didn't quite understand what you meant. Can you be more explicit? – AndréC Mar 7 '19 at 16:15
  • I mean that it would be more useful if we could name all the intersections by using the internal counter of the tikz when finding them: the 1 of (intersection-1), the 2 of (intersection-2) and so on. This way if we could name that counter "\i" and could use it while giving name with "by={C\i}" (instead of "by={C1,C2,...,C\t}" where many times \t is unknown) we could then use the points as C1, C2, ... C\t... And this would be much better... – koleygr Mar 7 '19 at 16:20
  • This is a request for code improvement to TikZ developers, at our TikZ user level the only thing we can do is follow the syntax ... – AndréC Mar 7 '19 at 16:24
  • I said I was looking for something like this and I am not sure (yet) if this can't be done with the existing TikZ code... this is why I was looking to find some similar syntax like this request... But if not I would also agree that this would be a useful feature request.... Anyway you already have my +1... – koleygr Mar 7 '19 at 16:31

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.