summaryrefslogtreecommitdiff
path: root/graphics/pgf/contrib/tikzdotncross/latex/tikzdotncross.sty
blob: 383d2be49e29e609ff45afb67252b09da89b87d4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
%%%==============================================================================
%% Copyright 2024-present by Alceu Frigeri
%%
%% This work may be distributed and/or modified under the conditions of
%%
%% * The [LaTeX Project Public License](http://www.latex-project.org/lppl.txt),
%%   version 1.3c (or later), and/or
%% * The [GNU Affero General Public License](https://www.gnu.org/licenses/agpl-3.0.html),
%%   version 3 (or later)
%%
%% This work has the LPPL maintenance status *maintained*.
%%
%% The Current Maintainer of this work is Alceu Frigeri
%%
%% This is version {1.0} {2024/01/02}
%%
%% The list of files that compose this work can be found in the README.md file at
%% https://ctan.org/pkg/tikzdotncross
%%
%%%==============================================================================
%% WARNING: These are personal packs/tests
%%          They might and probably will change at will as needed
%% 
%%%==============================================================================
\NeedsTeXFormat{LaTeX2e}[2022/06/01]


\ProvidesExplPackage
    {tikzdotncross}
    {2024/01/02}
    {1.0}
    {Marking coordinates and crossing paths}

\ExplSyntaxOn
%%%%%%%
%%%
%%% Just an attempt of having my packages info in a regular way
%%% Idea being: { <pck-name> / pkg info } for each and all.
%%%
%%%%%%%
\keys_define:nn { tikzdotncross / pkg info}
  {
     name        .code:n = {tikzdotncross} ,
     prefix      .code:n = {tikzdotncross} ,
     date        .code:n = {2024/01/02},
     version     .code:n = {1.0} ,
     description .code:n = {Marking coordinates and crossing paths}

  }
\cs_if_exist:NF \__codedesc_pkg_info:nn 
  {
    \cs_new_protected:Npn \__codedesc_pkg_info:nn #1#2
      { \keys_set:nn {#1 / pkg info}{#2} }
  }
\cs_if_exist:NF \PkgInfo
  { \NewDocumentCommand \PkgInfo {mm} { \keys_set:nn {#1 / pkg info}{#2} } }
\cs_if_exist:NF \PkgDescription
  { 
    \NewDocumentCommand \PkgDescription {m} 
      { 
        \noindent Package~ \textbf{\PkgInfo{#1}{name}}~Version:~\PkgInfo{#1}{version}~ -~ \PkgInfo{#1}{date}\par \emph{\PkgInfo{#1}{description}}~\par 
      } 
  }  
%%%%%%%
%%% End of cut-n-paste
%%%%%%%
\ExplSyntaxOff
\makeatletter
\usetikzlibrary{intersections}

  %%%%%%%%%%%%%%%%%%%
  %%%
  %%% This will 'calculate' the intersection between a line (defined by the coordinates (#3) and (#4) and the path named #5
  %%% at each intersection a coordinate named (#2-i) and a node (n#2-i) will be defined (i stands for a counter from 1 up to the number of crossings)
  %%% A macro named <#1T> will have the number of crossings found.
  %%%
  %%% At each intersection a semi-circle will be drawn.
  %%%
  %%% the first parameter #1, star, flips the semi-circle.
  %%%
  %%%%%%%%%%%%%%%%%%%
\NewDocumentCommand{\pathcross}{sO{cross}mmmO{7pt}}{%
   \IfBooleanTF{#1}{\def\dotncross@@sign{-}}{\def\dotncross@@sign{}}    
   \path[name path=#2 self] (#3) -- (#4);
   \draw[name intersections={of={#5} and {#2 self},name=#2,total=\CrossTotal,sort by={#2 self}}] 
      \pgfextra{\csxdef{#2T}{\CrossTotal}}
      \foreach \aux in {1,...,\CrossTotal}{(#2-\aux) node[minimum size=#6-\pgflinewidth,inner sep=0pt](n#2-\aux){}};  
  \tikzmath{%
    coordinate \Ctmp; real \dx , \dy , \d;
    \Ctmp{from} = (#3);
    \Ctmp{to} = (#4);
    \dx{tmp} = \Ctmpx{to} - \Ctmpx{from};
    \dy{tmp} = \Ctmpy{to} - \Ctmpy{from};
    \d{ang} = atan2(\dy{tmp},\dx{tmp});
  }
  \draw[line width=1.8\pgflinewidth,white,rotate=\d{ang}]
    \foreach \aux in {1,...,\csuse{#2T}}{(#2-\aux) +(-#6/2,0) arc[start angle=\dotncross@@sign180,end angle=0,radius=#6/2]};
  \draw[rotate=\d{ang},line cap=round]
    \foreach \aux in {1,...,\csuse{#2T}}{(#2-\aux) +(-#6/2,0) arc[start angle=\dotncross@@sign180,end angle=0,radius=#6/2]};

  \gdef\dotncross@@tmpA{#3}
  \gdef\dotncross@@ListA{}
  \foreach \x in {1,...,\csuse{#2T}} {\xappto{\dotncross@@ListA}{\dotncross@@tmpA/n#2-\x,}\xdef\dotncross@@tmpA{n#2-\x}}
  \xappto{\dotncross@@ListA}{n#2-\csuse{#2T}/#4}
  \foreach \xa/\xb in \dotncross@@ListA {\draw[line cap=round] (\xa) -- (\xb);}
 }



  %%%%%%%%%%%%%%%%%%%
  %%%%
  %%%% some handy/auxiliary macros to define coordinate/node pairs (and selectively 'pin' them)
  %%%% based on the idea from Redaelli et al. (CircuiTiKz)
  %%%%
  %%%% differences: variable number of paramenters (see below) and it always also adds an empty node n<coord>
  %%%%
  %%%%%%%%%%%%%%%%%%%

    %%
    %% There is no easy and clean way 
    %% to convert this to expl3 (for instance underscore, under expl3 code regimè, is a letter)
    %% spaces (pgf/tikz) and then ':' ... and still being expandable
    %%
\newcommand\showcoordsfalse{\let\ncoord=\dotncross@@coordnode \let\dotcoord=\dotncross@@dotcoordnode \let\odotcoord=\dotncross@@odotcoordnode}
\newcommand\showcoordstrue{\let\ncoord=\dotncross@@coordpin \let\dotcoord=\dotncross@@dotcoordpin \let\odotcoord=\dotncross@@odotcoordpin}

\def\dotncross@@coordpin(#1){\pincoord(#1,red,45)}
\def\dotncross@@coordnode(#1){coordinate(#1)  node(n#1){}}

\def\dotncross@@dotcoordpin(#1){\dotpincoord(#1,red,45)}
\def\dotncross@@dotcoordnode(#1){coordinate(#1)  node[circle,minimum size=1.2pt,inner sep=1.2pt,fill](n#1){}}

\def\dotncross@@odotcoordpin(#1){\odotpincoord(#1,red,45)}
\def\dotncross@@odotcoordnode(#1){coordinate(#1)  node[circle,minimum size=1.2pt,inner sep=1.2pt,fill=white,draw](n#1){}}
    %%%%
    %%
    %%  And some TeX trickery to have a (expandable) variable number of parameters
    %%  \pincoord can be used as
    %%  \pincoord(coord-name) That's case D
    %%  \pincoord(coord-name,color) That's case C
    %%  \pincoord(coord-name,color,angle) That's case B
    %%  \pincoord(coord-name,color,angle,lenght) That's case A
    %%
    %%%%    
\def\dotncross@@pincase#1,#2,#3,#4,#5#6#7#8#9:{#8:#1:#2:#3:#4:}

\def\pincoord(#1){\dotncross@@pincase#1,,,,\dotncross@@pincaseA\dotncross@@pincaseB\dotncross@@pincaseC\dotncross@@pincaseD:}
\def\dotncross@@pincaseA:#1:#2:#3:#4:{\dotncross@@pincoord{#1}{#2}{#3}{#4}{}}
\def\dotncross@@pincaseB:#1:#2:#3:#4:{\dotncross@@pincoord{#1}{#2}{#3}{4}{}}
\def\dotncross@@pincaseC:#1:#2:#3:#4:{\dotncross@@pincoord{#1}{#2}{-45}{4}{}}
\def\dotncross@@pincaseD:#1:#2:#3:#4:{\dotncross@@pincoord{#1}{blue}{-45}{4}{}}

\def\dotpincoord(#1){\dotncross@@pincase#1,,,,\dotncross@@dotpincaseA\dotncross@@dotpincaseB\dotncross@@dotpincaseC\dotncross@@dotpincaseD:}
\def\dotncross@@dotpincaseA:#1:#2:#3:#4:{\dotncross@@pincoord{#1}{#2}{#3}{#4}{circle,fill,}}
\def\dotncross@@dotpincaseB:#1:#2:#3:#4:{\dotncross@@pincoord{#1}{#2}{#3}{4}{circle,fill,}}
\def\dotncross@@dotpincaseC:#1:#2:#3:#4:{\dotncross@@pincoord{#1}{#2}{-45}{4}{circle,fill,}}
\def\dotncross@@dotpincaseD:#1:#2:#3:#4:{\dotncross@@pincoord{#1}{blue}{-45}{4}{circle,fill,}}

\def\odotpincoord(#1){\dotncross@@pincase#1,,,,\dotncross@@odotpincaseA\dotncross@@odotpincaseB\dotncross@@odotpincaseC\dotncross@@odotpincaseD:}
\def\dotncross@@odotpincaseA:#1:#2:#3:#4:{\dotncross@@pincoord{#1}{#2}{#3}{#4}{circle,fill=white,draw,}}
\def\dotncross@@odotpincaseB:#1:#2:#3:#4:{\dotncross@@pincoord{#1}{#2}{#3}{4}{circle,fill=white,draw,}}
\def\dotncross@@odotpincaseC:#1:#2:#3:#4:{\dotncross@@pincoord{#1}{#2}{-45}{4}{circle,fill=white,draw,}}
\def\dotncross@@odotpincaseD:#1:#2:#3:#4:{\dotncross@@pincoord{#1}{blue}{-45}{4}{circle,fill=white,draw,}}

\newcommand\dotncross@@pincoord[5]{%
  coordinate(#1) node[#5minimum size=1.2pt,inner sep=1.2pt](n#1){}
  node[circle, #2,  inner sep=1.2pt, outer sep=0pt, radius=1pt, fill=#2!20!white, fill opacity=0.2, draw opacity=0.4, draw,
    pin={[#2, overlay, inner sep=0pt, outer sep=1pt, font=\tiny, pin distance=#4pt,
    pin edge={#2, overlay}]#3:#1}]{}%
}
  
\showcoordsfalse