Check if a point is right or left of another one in TikZExtract x, y coordinate of an arbitrary point in TikZRotate a node but not its content: the case of the ellipse decorationNumerical conditional within tikz keys?TikZ: Drawing an arc from an intersection to an intersectionDrawing rectilinear curves in Tikz, aka an Etch-a-Sketch drawingReferencing locations within a text boxLine up nested tikz enviroments or how to get rid of themTikz-qtree : graphs in the nodesHow to draw more than 8 edges to one node in tikz-er2Using tikz Calc package to add cordinatesIn Tikz is there a way to make Tikz images begin “exactly” at the leftmost point in the page?
Mathematical cryptic clues
Font hinting is lost in Chrome-like browsers (for some languages )
Fully-Firstable Anagram Sets
Test whether all array elements are factors of a number
Did Shadowfax go to Valinor?
How to find program name(s) of an installed package?
Why "Having chlorophyll without photosynthesis is actually very dangerous" and "like living with a bomb"?
Pattern match does not work in bash script
Email Account under attack (really) - anything I can do?
Schoenfled Residua test shows proportionality hazard assumptions holds but Kaplan-Meier plots intersect
Compress a signal by storing signal diff instead of actual samples - is there such a thing?
Why Is Death Allowed In the Matrix?
To string or not to string
Is a conference paper whose proceedings will be published in IEEE Xplore counted as a publication?
Is it important to consider tone, melody, and musical form while writing a song?
The Clique vs. Independent Set Problem
Why are electrically insulating heatsinks so rare? Is it just cost?
Can a Warlock become Neutral Good?
What do the dots in this tr command do: tr .............A-Z A-ZA-Z <<< "JVPQBOV" (with 13 dots)
In Japanese, what’s the difference between “Tonari ni” (となりに) and “Tsugi” (つぎ)? When would you use one over the other?
Assigning pointers to atomic type to pointers to non atomic type
Theorems that impeded progress
Smoothness of finite-dimensional functional calculus
Fencing style for blades that can attack from a distance
Check if a point is right or left of another one in TikZ
Extract x, y coordinate of an arbitrary point in TikZRotate a node but not its content: the case of the ellipse decorationNumerical conditional within tikz keys?TikZ: Drawing an arc from an intersection to an intersectionDrawing rectilinear curves in Tikz, aka an Etch-a-Sketch drawingReferencing locations within a text boxLine up nested tikz enviroments or how to get rid of themTikz-qtree : graphs in the nodesHow to draw more than 8 edges to one node in tikz-er2Using tikz Calc package to add cordinatesIn Tikz is there a way to make Tikz images begin “exactly” at the leftmost point in the page?
Trying to implement a handy way to check if a TikZ point is right or left of another one, I came up with the following MWE.
documentclass[border=1mm, tikz]standalone
makeatletter
% prints 1 if #1.center is right than #2.center, 0 otherwise
newcommandisRight[2]
%pgfpointdiffab gives b-a
pgfpointdiffpgfpointanchor#2centerpgfpointanchor#1center
pgfmathparsegreater(pgf@x,0)pgfmathresult
% 1 if #1.center is left than #2.center, 0 otherwise -> result in pgfmathresult
newcommandcheckIfLeft[2]
%pgfpointdiffab gives b-a
pgfpointdiffpgfpointanchor#2centerpgfpointanchor#1center%
pgfmathparseless(pgf@x,0)
makeatother
begindocument
begintikzpicture
node[draw] (A) at (0,0) A;
node[draw] (B) at (1,0) B;
checkIfLeftAB
ifnumpgfmathresult=1
node at (0.5,1)A is left of B;
fi
%ifnumisRightBA=1
% node at (0.5,-1)B is right of A;
%fi
endtikzpicture
enddocument
but I am quite unsatisfied with it. What I would like to have is something that may be used in a ifnum ... fi construct, as in the commented code (and I would like not to use packages beyond what pgf loads).
Here my questions:
- In the commented code, what is exactly happening in the
ifnumexpansion, which makes the compilation fail? - How can I fix the
isRightcommand in order to be able to use it together withifnum? - If question 2 is tricky, how can I affect the
ifnumexpansion to achieve what I wish? - Is there in
pgfa smarter/more straightforward way to check if aTikZpoint is left/right of another point? My final goal would be to draw something only if a point is right/left of another.
Bonus question:
- How (and where) is
pdfstrcmpimplemented, since it is harmless to use it in aifnum ... ficonstruct?
tikz-pgf expansion
add a comment |
Trying to implement a handy way to check if a TikZ point is right or left of another one, I came up with the following MWE.
documentclass[border=1mm, tikz]standalone
makeatletter
% prints 1 if #1.center is right than #2.center, 0 otherwise
newcommandisRight[2]
%pgfpointdiffab gives b-a
pgfpointdiffpgfpointanchor#2centerpgfpointanchor#1center
pgfmathparsegreater(pgf@x,0)pgfmathresult
% 1 if #1.center is left than #2.center, 0 otherwise -> result in pgfmathresult
newcommandcheckIfLeft[2]
%pgfpointdiffab gives b-a
pgfpointdiffpgfpointanchor#2centerpgfpointanchor#1center%
pgfmathparseless(pgf@x,0)
makeatother
begindocument
begintikzpicture
node[draw] (A) at (0,0) A;
node[draw] (B) at (1,0) B;
checkIfLeftAB
ifnumpgfmathresult=1
node at (0.5,1)A is left of B;
fi
%ifnumisRightBA=1
% node at (0.5,-1)B is right of A;
%fi
endtikzpicture
enddocument
but I am quite unsatisfied with it. What I would like to have is something that may be used in a ifnum ... fi construct, as in the commented code (and I would like not to use packages beyond what pgf loads).
Here my questions:
- In the commented code, what is exactly happening in the
ifnumexpansion, which makes the compilation fail? - How can I fix the
isRightcommand in order to be able to use it together withifnum? - If question 2 is tricky, how can I affect the
ifnumexpansion to achieve what I wish? - Is there in
pgfa smarter/more straightforward way to check if aTikZpoint is left/right of another point? My final goal would be to draw something only if a point is right/left of another.
Bonus question:
- How (and where) is
pdfstrcmpimplemented, since it is harmless to use it in aifnum ... ficonstruct?
tikz-pgf expansion
your commands are not expandable (they assign a number to pgfmathresult) and will never work in a ifnum.pdfstrcmpis a primitive.
– Ulrike Fischer
Apr 2 at 12:46
Thanks for the comment. I find it a bit cryptic, though. Do you want to say that I should give up and what I got so far is the best I can have? The fact thatpdfstrcmpis a primitive clarifies why I was not finding its implementation... I should have had a look to thepdftexmanual before.
– Axel Krypton
Apr 2 at 13:14
You will have to give up one part - either ifnum or pgfmath commands. You could implement something working with ifnum by using e.g. zrefsavepos (needs two compilations) but not with pgfmathparse.
– Ulrike Fischer
Apr 2 at 13:24
add a comment |
Trying to implement a handy way to check if a TikZ point is right or left of another one, I came up with the following MWE.
documentclass[border=1mm, tikz]standalone
makeatletter
% prints 1 if #1.center is right than #2.center, 0 otherwise
newcommandisRight[2]
%pgfpointdiffab gives b-a
pgfpointdiffpgfpointanchor#2centerpgfpointanchor#1center
pgfmathparsegreater(pgf@x,0)pgfmathresult
% 1 if #1.center is left than #2.center, 0 otherwise -> result in pgfmathresult
newcommandcheckIfLeft[2]
%pgfpointdiffab gives b-a
pgfpointdiffpgfpointanchor#2centerpgfpointanchor#1center%
pgfmathparseless(pgf@x,0)
makeatother
begindocument
begintikzpicture
node[draw] (A) at (0,0) A;
node[draw] (B) at (1,0) B;
checkIfLeftAB
ifnumpgfmathresult=1
node at (0.5,1)A is left of B;
fi
%ifnumisRightBA=1
% node at (0.5,-1)B is right of A;
%fi
endtikzpicture
enddocument
but I am quite unsatisfied with it. What I would like to have is something that may be used in a ifnum ... fi construct, as in the commented code (and I would like not to use packages beyond what pgf loads).
Here my questions:
- In the commented code, what is exactly happening in the
ifnumexpansion, which makes the compilation fail? - How can I fix the
isRightcommand in order to be able to use it together withifnum? - If question 2 is tricky, how can I affect the
ifnumexpansion to achieve what I wish? - Is there in
pgfa smarter/more straightforward way to check if aTikZpoint is left/right of another point? My final goal would be to draw something only if a point is right/left of another.
Bonus question:
- How (and where) is
pdfstrcmpimplemented, since it is harmless to use it in aifnum ... ficonstruct?
tikz-pgf expansion
Trying to implement a handy way to check if a TikZ point is right or left of another one, I came up with the following MWE.
documentclass[border=1mm, tikz]standalone
makeatletter
% prints 1 if #1.center is right than #2.center, 0 otherwise
newcommandisRight[2]
%pgfpointdiffab gives b-a
pgfpointdiffpgfpointanchor#2centerpgfpointanchor#1center
pgfmathparsegreater(pgf@x,0)pgfmathresult
% 1 if #1.center is left than #2.center, 0 otherwise -> result in pgfmathresult
newcommandcheckIfLeft[2]
%pgfpointdiffab gives b-a
pgfpointdiffpgfpointanchor#2centerpgfpointanchor#1center%
pgfmathparseless(pgf@x,0)
makeatother
begindocument
begintikzpicture
node[draw] (A) at (0,0) A;
node[draw] (B) at (1,0) B;
checkIfLeftAB
ifnumpgfmathresult=1
node at (0.5,1)A is left of B;
fi
%ifnumisRightBA=1
% node at (0.5,-1)B is right of A;
%fi
endtikzpicture
enddocument
but I am quite unsatisfied with it. What I would like to have is something that may be used in a ifnum ... fi construct, as in the commented code (and I would like not to use packages beyond what pgf loads).
Here my questions:
- In the commented code, what is exactly happening in the
ifnumexpansion, which makes the compilation fail? - How can I fix the
isRightcommand in order to be able to use it together withifnum? - If question 2 is tricky, how can I affect the
ifnumexpansion to achieve what I wish? - Is there in
pgfa smarter/more straightforward way to check if aTikZpoint is left/right of another point? My final goal would be to draw something only if a point is right/left of another.
Bonus question:
- How (and where) is
pdfstrcmpimplemented, since it is harmless to use it in aifnum ... ficonstruct?
tikz-pgf expansion
tikz-pgf expansion
asked Apr 2 at 12:01
Axel KryptonAxel Krypton
477211
477211
your commands are not expandable (they assign a number to pgfmathresult) and will never work in a ifnum.pdfstrcmpis a primitive.
– Ulrike Fischer
Apr 2 at 12:46
Thanks for the comment. I find it a bit cryptic, though. Do you want to say that I should give up and what I got so far is the best I can have? The fact thatpdfstrcmpis a primitive clarifies why I was not finding its implementation... I should have had a look to thepdftexmanual before.
– Axel Krypton
Apr 2 at 13:14
You will have to give up one part - either ifnum or pgfmath commands. You could implement something working with ifnum by using e.g. zrefsavepos (needs two compilations) but not with pgfmathparse.
– Ulrike Fischer
Apr 2 at 13:24
add a comment |
your commands are not expandable (they assign a number to pgfmathresult) and will never work in a ifnum.pdfstrcmpis a primitive.
– Ulrike Fischer
Apr 2 at 12:46
Thanks for the comment. I find it a bit cryptic, though. Do you want to say that I should give up and what I got so far is the best I can have? The fact thatpdfstrcmpis a primitive clarifies why I was not finding its implementation... I should have had a look to thepdftexmanual before.
– Axel Krypton
Apr 2 at 13:14
You will have to give up one part - either ifnum or pgfmath commands. You could implement something working with ifnum by using e.g. zrefsavepos (needs two compilations) but not with pgfmathparse.
– Ulrike Fischer
Apr 2 at 13:24
your commands are not expandable (they assign a number to pgfmathresult) and will never work in a ifnum.
pdfstrcmp is a primitive.– Ulrike Fischer
Apr 2 at 12:46
your commands are not expandable (they assign a number to pgfmathresult) and will never work in a ifnum.
pdfstrcmp is a primitive.– Ulrike Fischer
Apr 2 at 12:46
Thanks for the comment. I find it a bit cryptic, though. Do you want to say that I should give up and what I got so far is the best I can have? The fact that
pdfstrcmp is a primitive clarifies why I was not finding its implementation... I should have had a look to the pdftex manual before.– Axel Krypton
Apr 2 at 13:14
Thanks for the comment. I find it a bit cryptic, though. Do you want to say that I should give up and what I got so far is the best I can have? The fact that
pdfstrcmp is a primitive clarifies why I was not finding its implementation... I should have had a look to the pdftex manual before.– Axel Krypton
Apr 2 at 13:14
You will have to give up one part - either ifnum or pgfmath commands. You could implement something working with ifnum by using e.g. zrefsavepos (needs two compilations) but not with pgfmathparse.
– Ulrike Fischer
Apr 2 at 13:24
You will have to give up one part - either ifnum or pgfmath commands. You could implement something working with ifnum by using e.g. zrefsavepos (needs two compilations) but not with pgfmathparse.
– Ulrike Fischer
Apr 2 at 13:24
add a comment |
3 Answers
3
active
oldest
votes
Here is some low level code based on this answer that do not use calc.
documentclass[tikz,border=7pt]standalone
newififleft
makeatletter
defisleft(#1)of(#2)?%
tikz@scan@one@pointpgfutil@firstofone(#1)relax%
pgf@xa=pgf@x%
tikz@scan@one@pointpgfutil@firstofone(#2)relax%
ifdimpgf@xa<pgf@xrelaxlefttrueelseleftfalsefi
makeatother
begindocument
begintikzpicture[nodes=circle]
node[draw] (A) at (0,0) A;
node[draw] (B) at (2,1) right of A;
isleft(A)of(B)?
path (A) ifleft edge[latex-] (B) else edge[-latex] (B) fi ;
foreach~in1,...,70
path[ultra thin] (180*rand:1) coordinate(N)
pgfextraisleft(N)of(A)?
ifleft [red] else [blue] fi node[scale=2].
(N) ifleft edge[latex-] (A) else edge[-latex] (A) fi;
endtikzpicture
enddocument

I like your idea a lot! Indeed it is perfect for my needs, up to a tiny adjustment. The comments to the question clarify the other points.
– Axel Krypton
Apr 3 at 8:55
add a comment |
How about
documentclass[border=1mm, tikz]standalone
usetikzlibrarycalc
tikzsetif left/.style n args=4insert path=%
let p1=($#1-#2$) in ifdimx1<0pt
#3
else
#4
fi
begindocument
begintikzpicture
node[draw] (A) at (0,0) A;
node[draw] (B) at (1,0) B;
path[if left=(A)(B)(0.5,1) node A is left of B];
path[if left=(B)(A)(0.5,-1) node B is left of A];
endtikzpicture
enddocument

This is for sure a good idea and I indeed thought about something in this direction at the beginning. However, if I have to draw a lot (nodes, paths, for-loops, etc.) in the if-else branches, then this approach is not handy.
– Axel Krypton
Apr 3 at 8:42
@AxelKrypton I actually beg to disagree. You can definitely use this in loops and so on. Can you please tell me a scenario in which you think this has disadvantages?
– marmot
Apr 3 at 13:46
@AxelKrypton Just addpath foreach X in 1,...,100 (rnd*360:1) coordinate(aux) [if left=(aux)(A) (A) edge[red,-latex] (aux)(A) edge[blue,-latex] (aux)];to my code. I did not have to adjust anything. You can pick whatever answer you like. But making statements about my code that do not apply just to make Kpym happy is IMHO not useful for other users who have a similar problem and want a simple solution without anymakeatletterand so on stuff. All the foreach's of your own post can be done in the very same way.
– marmot
2 days ago
In my comment I actually recognized that your approach is good, I do not know why you think my comment is against you in favour of Kpym. I simply said that if I have to draw a lot, like many nodes, paths, for loops, whatever then your tikzstyle is not as handy as having an if-clause.
– Axel Krypton
2 days ago
And this does not mean that your solution would not work, just that having something very similar to aif ... fiblock makes the conditional code stand out and this in my opinion also increases readability. It was simply better in my use case.
– Axel Krypton
2 days ago
add a comment |
Just for future record, I want to share a tiny elaboration of what Kpym suggested in his answer. Just to avoid having the newif, it is possible to supply two more arguments to the macro. Of course, having the ifleft gives versatility in the usage (as nicely demonstrated in the Kpym's answer), but maybe this is not really needed (like in my case).
documentclass[border=1mm, tikz]standalone
makeatletter
longdefIfLeft(#1)of(#2)#3#4%
tikz@scan@one@pointpgfutil@firstofone(#1)relax%
pgf@xa=pgf@x%
tikz@scan@one@pointpgfutil@firstofone(#2)relax%
ifdimpgf@xa<pgf@xrelax#3else#4fi
makeatother
begindocument
begintikzpicture
node[draw] (A) at (0,0) A;
node[draw] (B) at (1,0) B;
node[draw] (C) at (2,0) C;
IfLeft(A)of(B)%
foreach n in 10,20,...,90
fill[red!n!yellow] (0.5,0) ++(n/100,0.5) circle(1mm);
%
foreach n in 10,20,...,90
fill[black!n!gray] (0.5,0) ++(n/100,-0.5) circle(1mm);
IfLeft(C)of(B)%
foreach n in 10,20,...,90
fill[black!n!gray] (0.5,0) ++(n/100,0.5) circle(1mm);
%
foreach n in 10,20,...,90
fill[blue!n!magenta] (0.5,0) ++(n/100,-0.5) circle(1mm);
endtikzpicture
enddocument

add a comment |
Your Answer
StackExchange.ready(function()
var channelOptions =
tags: "".split(" "),
id: "85"
;
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function()
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled)
StackExchange.using("snippets", function()
createEditor();
);
else
createEditor();
);
function createEditor()
StackExchange.prepareEditor(
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: false,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: null,
bindNavPrevention: true,
postfix: "",
imageUploader:
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
,
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
);
);
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2ftex.stackexchange.com%2fquestions%2f482761%2fcheck-if-a-point-is-right-or-left-of-another-one-in-tikz%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
Here is some low level code based on this answer that do not use calc.
documentclass[tikz,border=7pt]standalone
newififleft
makeatletter
defisleft(#1)of(#2)?%
tikz@scan@one@pointpgfutil@firstofone(#1)relax%
pgf@xa=pgf@x%
tikz@scan@one@pointpgfutil@firstofone(#2)relax%
ifdimpgf@xa<pgf@xrelaxlefttrueelseleftfalsefi
makeatother
begindocument
begintikzpicture[nodes=circle]
node[draw] (A) at (0,0) A;
node[draw] (B) at (2,1) right of A;
isleft(A)of(B)?
path (A) ifleft edge[latex-] (B) else edge[-latex] (B) fi ;
foreach~in1,...,70
path[ultra thin] (180*rand:1) coordinate(N)
pgfextraisleft(N)of(A)?
ifleft [red] else [blue] fi node[scale=2].
(N) ifleft edge[latex-] (A) else edge[-latex] (A) fi;
endtikzpicture
enddocument

I like your idea a lot! Indeed it is perfect for my needs, up to a tiny adjustment. The comments to the question clarify the other points.
– Axel Krypton
Apr 3 at 8:55
add a comment |
Here is some low level code based on this answer that do not use calc.
documentclass[tikz,border=7pt]standalone
newififleft
makeatletter
defisleft(#1)of(#2)?%
tikz@scan@one@pointpgfutil@firstofone(#1)relax%
pgf@xa=pgf@x%
tikz@scan@one@pointpgfutil@firstofone(#2)relax%
ifdimpgf@xa<pgf@xrelaxlefttrueelseleftfalsefi
makeatother
begindocument
begintikzpicture[nodes=circle]
node[draw] (A) at (0,0) A;
node[draw] (B) at (2,1) right of A;
isleft(A)of(B)?
path (A) ifleft edge[latex-] (B) else edge[-latex] (B) fi ;
foreach~in1,...,70
path[ultra thin] (180*rand:1) coordinate(N)
pgfextraisleft(N)of(A)?
ifleft [red] else [blue] fi node[scale=2].
(N) ifleft edge[latex-] (A) else edge[-latex] (A) fi;
endtikzpicture
enddocument

I like your idea a lot! Indeed it is perfect for my needs, up to a tiny adjustment. The comments to the question clarify the other points.
– Axel Krypton
Apr 3 at 8:55
add a comment |
Here is some low level code based on this answer that do not use calc.
documentclass[tikz,border=7pt]standalone
newififleft
makeatletter
defisleft(#1)of(#2)?%
tikz@scan@one@pointpgfutil@firstofone(#1)relax%
pgf@xa=pgf@x%
tikz@scan@one@pointpgfutil@firstofone(#2)relax%
ifdimpgf@xa<pgf@xrelaxlefttrueelseleftfalsefi
makeatother
begindocument
begintikzpicture[nodes=circle]
node[draw] (A) at (0,0) A;
node[draw] (B) at (2,1) right of A;
isleft(A)of(B)?
path (A) ifleft edge[latex-] (B) else edge[-latex] (B) fi ;
foreach~in1,...,70
path[ultra thin] (180*rand:1) coordinate(N)
pgfextraisleft(N)of(A)?
ifleft [red] else [blue] fi node[scale=2].
(N) ifleft edge[latex-] (A) else edge[-latex] (A) fi;
endtikzpicture
enddocument

Here is some low level code based on this answer that do not use calc.
documentclass[tikz,border=7pt]standalone
newififleft
makeatletter
defisleft(#1)of(#2)?%
tikz@scan@one@pointpgfutil@firstofone(#1)relax%
pgf@xa=pgf@x%
tikz@scan@one@pointpgfutil@firstofone(#2)relax%
ifdimpgf@xa<pgf@xrelaxlefttrueelseleftfalsefi
makeatother
begindocument
begintikzpicture[nodes=circle]
node[draw] (A) at (0,0) A;
node[draw] (B) at (2,1) right of A;
isleft(A)of(B)?
path (A) ifleft edge[latex-] (B) else edge[-latex] (B) fi ;
foreach~in1,...,70
path[ultra thin] (180*rand:1) coordinate(N)
pgfextraisleft(N)of(A)?
ifleft [red] else [blue] fi node[scale=2].
(N) ifleft edge[latex-] (A) else edge[-latex] (A) fi;
endtikzpicture
enddocument

edited Apr 2 at 19:33
answered Apr 2 at 18:00
KpymKpym
17.8k24191
17.8k24191
I like your idea a lot! Indeed it is perfect for my needs, up to a tiny adjustment. The comments to the question clarify the other points.
– Axel Krypton
Apr 3 at 8:55
add a comment |
I like your idea a lot! Indeed it is perfect for my needs, up to a tiny adjustment. The comments to the question clarify the other points.
– Axel Krypton
Apr 3 at 8:55
I like your idea a lot! Indeed it is perfect for my needs, up to a tiny adjustment. The comments to the question clarify the other points.
– Axel Krypton
Apr 3 at 8:55
I like your idea a lot! Indeed it is perfect for my needs, up to a tiny adjustment. The comments to the question clarify the other points.
– Axel Krypton
Apr 3 at 8:55
add a comment |
How about
documentclass[border=1mm, tikz]standalone
usetikzlibrarycalc
tikzsetif left/.style n args=4insert path=%
let p1=($#1-#2$) in ifdimx1<0pt
#3
else
#4
fi
begindocument
begintikzpicture
node[draw] (A) at (0,0) A;
node[draw] (B) at (1,0) B;
path[if left=(A)(B)(0.5,1) node A is left of B];
path[if left=(B)(A)(0.5,-1) node B is left of A];
endtikzpicture
enddocument

This is for sure a good idea and I indeed thought about something in this direction at the beginning. However, if I have to draw a lot (nodes, paths, for-loops, etc.) in the if-else branches, then this approach is not handy.
– Axel Krypton
Apr 3 at 8:42
@AxelKrypton I actually beg to disagree. You can definitely use this in loops and so on. Can you please tell me a scenario in which you think this has disadvantages?
– marmot
Apr 3 at 13:46
@AxelKrypton Just addpath foreach X in 1,...,100 (rnd*360:1) coordinate(aux) [if left=(aux)(A) (A) edge[red,-latex] (aux)(A) edge[blue,-latex] (aux)];to my code. I did not have to adjust anything. You can pick whatever answer you like. But making statements about my code that do not apply just to make Kpym happy is IMHO not useful for other users who have a similar problem and want a simple solution without anymakeatletterand so on stuff. All the foreach's of your own post can be done in the very same way.
– marmot
2 days ago
In my comment I actually recognized that your approach is good, I do not know why you think my comment is against you in favour of Kpym. I simply said that if I have to draw a lot, like many nodes, paths, for loops, whatever then your tikzstyle is not as handy as having an if-clause.
– Axel Krypton
2 days ago
And this does not mean that your solution would not work, just that having something very similar to aif ... fiblock makes the conditional code stand out and this in my opinion also increases readability. It was simply better in my use case.
– Axel Krypton
2 days ago
add a comment |
How about
documentclass[border=1mm, tikz]standalone
usetikzlibrarycalc
tikzsetif left/.style n args=4insert path=%
let p1=($#1-#2$) in ifdimx1<0pt
#3
else
#4
fi
begindocument
begintikzpicture
node[draw] (A) at (0,0) A;
node[draw] (B) at (1,0) B;
path[if left=(A)(B)(0.5,1) node A is left of B];
path[if left=(B)(A)(0.5,-1) node B is left of A];
endtikzpicture
enddocument

This is for sure a good idea and I indeed thought about something in this direction at the beginning. However, if I have to draw a lot (nodes, paths, for-loops, etc.) in the if-else branches, then this approach is not handy.
– Axel Krypton
Apr 3 at 8:42
@AxelKrypton I actually beg to disagree. You can definitely use this in loops and so on. Can you please tell me a scenario in which you think this has disadvantages?
– marmot
Apr 3 at 13:46
@AxelKrypton Just addpath foreach X in 1,...,100 (rnd*360:1) coordinate(aux) [if left=(aux)(A) (A) edge[red,-latex] (aux)(A) edge[blue,-latex] (aux)];to my code. I did not have to adjust anything. You can pick whatever answer you like. But making statements about my code that do not apply just to make Kpym happy is IMHO not useful for other users who have a similar problem and want a simple solution without anymakeatletterand so on stuff. All the foreach's of your own post can be done in the very same way.
– marmot
2 days ago
In my comment I actually recognized that your approach is good, I do not know why you think my comment is against you in favour of Kpym. I simply said that if I have to draw a lot, like many nodes, paths, for loops, whatever then your tikzstyle is not as handy as having an if-clause.
– Axel Krypton
2 days ago
And this does not mean that your solution would not work, just that having something very similar to aif ... fiblock makes the conditional code stand out and this in my opinion also increases readability. It was simply better in my use case.
– Axel Krypton
2 days ago
add a comment |
How about
documentclass[border=1mm, tikz]standalone
usetikzlibrarycalc
tikzsetif left/.style n args=4insert path=%
let p1=($#1-#2$) in ifdimx1<0pt
#3
else
#4
fi
begindocument
begintikzpicture
node[draw] (A) at (0,0) A;
node[draw] (B) at (1,0) B;
path[if left=(A)(B)(0.5,1) node A is left of B];
path[if left=(B)(A)(0.5,-1) node B is left of A];
endtikzpicture
enddocument

How about
documentclass[border=1mm, tikz]standalone
usetikzlibrarycalc
tikzsetif left/.style n args=4insert path=%
let p1=($#1-#2$) in ifdimx1<0pt
#3
else
#4
fi
begindocument
begintikzpicture
node[draw] (A) at (0,0) A;
node[draw] (B) at (1,0) B;
path[if left=(A)(B)(0.5,1) node A is left of B];
path[if left=(B)(A)(0.5,-1) node B is left of A];
endtikzpicture
enddocument

answered Apr 2 at 13:24
marmotmarmot
115k5146277
115k5146277
This is for sure a good idea and I indeed thought about something in this direction at the beginning. However, if I have to draw a lot (nodes, paths, for-loops, etc.) in the if-else branches, then this approach is not handy.
– Axel Krypton
Apr 3 at 8:42
@AxelKrypton I actually beg to disagree. You can definitely use this in loops and so on. Can you please tell me a scenario in which you think this has disadvantages?
– marmot
Apr 3 at 13:46
@AxelKrypton Just addpath foreach X in 1,...,100 (rnd*360:1) coordinate(aux) [if left=(aux)(A) (A) edge[red,-latex] (aux)(A) edge[blue,-latex] (aux)];to my code. I did not have to adjust anything. You can pick whatever answer you like. But making statements about my code that do not apply just to make Kpym happy is IMHO not useful for other users who have a similar problem and want a simple solution without anymakeatletterand so on stuff. All the foreach's of your own post can be done in the very same way.
– marmot
2 days ago
In my comment I actually recognized that your approach is good, I do not know why you think my comment is against you in favour of Kpym. I simply said that if I have to draw a lot, like many nodes, paths, for loops, whatever then your tikzstyle is not as handy as having an if-clause.
– Axel Krypton
2 days ago
And this does not mean that your solution would not work, just that having something very similar to aif ... fiblock makes the conditional code stand out and this in my opinion also increases readability. It was simply better in my use case.
– Axel Krypton
2 days ago
add a comment |
This is for sure a good idea and I indeed thought about something in this direction at the beginning. However, if I have to draw a lot (nodes, paths, for-loops, etc.) in the if-else branches, then this approach is not handy.
– Axel Krypton
Apr 3 at 8:42
@AxelKrypton I actually beg to disagree. You can definitely use this in loops and so on. Can you please tell me a scenario in which you think this has disadvantages?
– marmot
Apr 3 at 13:46
@AxelKrypton Just addpath foreach X in 1,...,100 (rnd*360:1) coordinate(aux) [if left=(aux)(A) (A) edge[red,-latex] (aux)(A) edge[blue,-latex] (aux)];to my code. I did not have to adjust anything. You can pick whatever answer you like. But making statements about my code that do not apply just to make Kpym happy is IMHO not useful for other users who have a similar problem and want a simple solution without anymakeatletterand so on stuff. All the foreach's of your own post can be done in the very same way.
– marmot
2 days ago
In my comment I actually recognized that your approach is good, I do not know why you think my comment is against you in favour of Kpym. I simply said that if I have to draw a lot, like many nodes, paths, for loops, whatever then your tikzstyle is not as handy as having an if-clause.
– Axel Krypton
2 days ago
And this does not mean that your solution would not work, just that having something very similar to aif ... fiblock makes the conditional code stand out and this in my opinion also increases readability. It was simply better in my use case.
– Axel Krypton
2 days ago
This is for sure a good idea and I indeed thought about something in this direction at the beginning. However, if I have to draw a lot (nodes, paths, for-loops, etc.) in the if-else branches, then this approach is not handy.
– Axel Krypton
Apr 3 at 8:42
This is for sure a good idea and I indeed thought about something in this direction at the beginning. However, if I have to draw a lot (nodes, paths, for-loops, etc.) in the if-else branches, then this approach is not handy.
– Axel Krypton
Apr 3 at 8:42
@AxelKrypton I actually beg to disagree. You can definitely use this in loops and so on. Can you please tell me a scenario in which you think this has disadvantages?
– marmot
Apr 3 at 13:46
@AxelKrypton I actually beg to disagree. You can definitely use this in loops and so on. Can you please tell me a scenario in which you think this has disadvantages?
– marmot
Apr 3 at 13:46
@AxelKrypton Just add
path foreach X in 1,...,100 (rnd*360:1) coordinate(aux) [if left=(aux)(A) (A) edge[red,-latex] (aux)(A) edge[blue,-latex] (aux)]; to my code. I did not have to adjust anything. You can pick whatever answer you like. But making statements about my code that do not apply just to make Kpym happy is IMHO not useful for other users who have a similar problem and want a simple solution without any makeatletter and so on stuff. All the foreach's of your own post can be done in the very same way.– marmot
2 days ago
@AxelKrypton Just add
path foreach X in 1,...,100 (rnd*360:1) coordinate(aux) [if left=(aux)(A) (A) edge[red,-latex] (aux)(A) edge[blue,-latex] (aux)]; to my code. I did not have to adjust anything. You can pick whatever answer you like. But making statements about my code that do not apply just to make Kpym happy is IMHO not useful for other users who have a similar problem and want a simple solution without any makeatletter and so on stuff. All the foreach's of your own post can be done in the very same way.– marmot
2 days ago
In my comment I actually recognized that your approach is good, I do not know why you think my comment is against you in favour of Kpym. I simply said that if I have to draw a lot, like many nodes, paths, for loops, whatever then your tikzstyle is not as handy as having an if-clause.
– Axel Krypton
2 days ago
In my comment I actually recognized that your approach is good, I do not know why you think my comment is against you in favour of Kpym. I simply said that if I have to draw a lot, like many nodes, paths, for loops, whatever then your tikzstyle is not as handy as having an if-clause.
– Axel Krypton
2 days ago
And this does not mean that your solution would not work, just that having something very similar to a
if ... fi block makes the conditional code stand out and this in my opinion also increases readability. It was simply better in my use case.– Axel Krypton
2 days ago
And this does not mean that your solution would not work, just that having something very similar to a
if ... fi block makes the conditional code stand out and this in my opinion also increases readability. It was simply better in my use case.– Axel Krypton
2 days ago
add a comment |
Just for future record, I want to share a tiny elaboration of what Kpym suggested in his answer. Just to avoid having the newif, it is possible to supply two more arguments to the macro. Of course, having the ifleft gives versatility in the usage (as nicely demonstrated in the Kpym's answer), but maybe this is not really needed (like in my case).
documentclass[border=1mm, tikz]standalone
makeatletter
longdefIfLeft(#1)of(#2)#3#4%
tikz@scan@one@pointpgfutil@firstofone(#1)relax%
pgf@xa=pgf@x%
tikz@scan@one@pointpgfutil@firstofone(#2)relax%
ifdimpgf@xa<pgf@xrelax#3else#4fi
makeatother
begindocument
begintikzpicture
node[draw] (A) at (0,0) A;
node[draw] (B) at (1,0) B;
node[draw] (C) at (2,0) C;
IfLeft(A)of(B)%
foreach n in 10,20,...,90
fill[red!n!yellow] (0.5,0) ++(n/100,0.5) circle(1mm);
%
foreach n in 10,20,...,90
fill[black!n!gray] (0.5,0) ++(n/100,-0.5) circle(1mm);
IfLeft(C)of(B)%
foreach n in 10,20,...,90
fill[black!n!gray] (0.5,0) ++(n/100,0.5) circle(1mm);
%
foreach n in 10,20,...,90
fill[blue!n!magenta] (0.5,0) ++(n/100,-0.5) circle(1mm);
endtikzpicture
enddocument

add a comment |
Just for future record, I want to share a tiny elaboration of what Kpym suggested in his answer. Just to avoid having the newif, it is possible to supply two more arguments to the macro. Of course, having the ifleft gives versatility in the usage (as nicely demonstrated in the Kpym's answer), but maybe this is not really needed (like in my case).
documentclass[border=1mm, tikz]standalone
makeatletter
longdefIfLeft(#1)of(#2)#3#4%
tikz@scan@one@pointpgfutil@firstofone(#1)relax%
pgf@xa=pgf@x%
tikz@scan@one@pointpgfutil@firstofone(#2)relax%
ifdimpgf@xa<pgf@xrelax#3else#4fi
makeatother
begindocument
begintikzpicture
node[draw] (A) at (0,0) A;
node[draw] (B) at (1,0) B;
node[draw] (C) at (2,0) C;
IfLeft(A)of(B)%
foreach n in 10,20,...,90
fill[red!n!yellow] (0.5,0) ++(n/100,0.5) circle(1mm);
%
foreach n in 10,20,...,90
fill[black!n!gray] (0.5,0) ++(n/100,-0.5) circle(1mm);
IfLeft(C)of(B)%
foreach n in 10,20,...,90
fill[black!n!gray] (0.5,0) ++(n/100,0.5) circle(1mm);
%
foreach n in 10,20,...,90
fill[blue!n!magenta] (0.5,0) ++(n/100,-0.5) circle(1mm);
endtikzpicture
enddocument

add a comment |
Just for future record, I want to share a tiny elaboration of what Kpym suggested in his answer. Just to avoid having the newif, it is possible to supply two more arguments to the macro. Of course, having the ifleft gives versatility in the usage (as nicely demonstrated in the Kpym's answer), but maybe this is not really needed (like in my case).
documentclass[border=1mm, tikz]standalone
makeatletter
longdefIfLeft(#1)of(#2)#3#4%
tikz@scan@one@pointpgfutil@firstofone(#1)relax%
pgf@xa=pgf@x%
tikz@scan@one@pointpgfutil@firstofone(#2)relax%
ifdimpgf@xa<pgf@xrelax#3else#4fi
makeatother
begindocument
begintikzpicture
node[draw] (A) at (0,0) A;
node[draw] (B) at (1,0) B;
node[draw] (C) at (2,0) C;
IfLeft(A)of(B)%
foreach n in 10,20,...,90
fill[red!n!yellow] (0.5,0) ++(n/100,0.5) circle(1mm);
%
foreach n in 10,20,...,90
fill[black!n!gray] (0.5,0) ++(n/100,-0.5) circle(1mm);
IfLeft(C)of(B)%
foreach n in 10,20,...,90
fill[black!n!gray] (0.5,0) ++(n/100,0.5) circle(1mm);
%
foreach n in 10,20,...,90
fill[blue!n!magenta] (0.5,0) ++(n/100,-0.5) circle(1mm);
endtikzpicture
enddocument

Just for future record, I want to share a tiny elaboration of what Kpym suggested in his answer. Just to avoid having the newif, it is possible to supply two more arguments to the macro. Of course, having the ifleft gives versatility in the usage (as nicely demonstrated in the Kpym's answer), but maybe this is not really needed (like in my case).
documentclass[border=1mm, tikz]standalone
makeatletter
longdefIfLeft(#1)of(#2)#3#4%
tikz@scan@one@pointpgfutil@firstofone(#1)relax%
pgf@xa=pgf@x%
tikz@scan@one@pointpgfutil@firstofone(#2)relax%
ifdimpgf@xa<pgf@xrelax#3else#4fi
makeatother
begindocument
begintikzpicture
node[draw] (A) at (0,0) A;
node[draw] (B) at (1,0) B;
node[draw] (C) at (2,0) C;
IfLeft(A)of(B)%
foreach n in 10,20,...,90
fill[red!n!yellow] (0.5,0) ++(n/100,0.5) circle(1mm);
%
foreach n in 10,20,...,90
fill[black!n!gray] (0.5,0) ++(n/100,-0.5) circle(1mm);
IfLeft(C)of(B)%
foreach n in 10,20,...,90
fill[black!n!gray] (0.5,0) ++(n/100,0.5) circle(1mm);
%
foreach n in 10,20,...,90
fill[blue!n!magenta] (0.5,0) ++(n/100,-0.5) circle(1mm);
endtikzpicture
enddocument

answered Apr 3 at 8:53
Axel KryptonAxel Krypton
477211
477211
add a comment |
add a comment |
Thanks for contributing an answer to TeX - LaTeX Stack Exchange!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2ftex.stackexchange.com%2fquestions%2f482761%2fcheck-if-a-point-is-right-or-left-of-another-one-in-tikz%23new-answer', 'question_page');
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
your commands are not expandable (they assign a number to pgfmathresult) and will never work in a ifnum.
pdfstrcmpis a primitive.– Ulrike Fischer
Apr 2 at 12:46
Thanks for the comment. I find it a bit cryptic, though. Do you want to say that I should give up and what I got so far is the best I can have? The fact that
pdfstrcmpis a primitive clarifies why I was not finding its implementation... I should have had a look to thepdftexmanual before.– Axel Krypton
Apr 2 at 13:14
You will have to give up one part - either ifnum or pgfmath commands. You could implement something working with ifnum by using e.g. zrefsavepos (needs two compilations) but not with pgfmathparse.
– Ulrike Fischer
Apr 2 at 13:24