brunnian.sty 47 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311131213131314131513161317131813191320132113221323132413251326132713281329133013311332
  1. %%
  2. %% This is file `brunnian.sty',
  3. %% generated with the docstrip utility.
  4. %%
  5. %% The original source files were:
  6. %%
  7. %% brunnian.dtx (with options: `package')
  8. %% ----------------------------------------------------------------
  9. %% brunnian --- a style file for drawing link diagrams with TikZ/PGF
  10. %% E-mail: stacey@math.ntnu.no
  11. %% Released under the LaTeX Project Public License v1.3c or later
  12. %% See http://www.latex-project.org/lppl.txt
  13. %% ----------------------------------------------------------------
  14. %%
  15. \NeedsTeXFormat{LaTeX2e}
  16. \ProvidesPackage{brunnian}[2011/03/10 v1.0 Tikz/PGF commands for drawing knots and links]
  17. \ProvidesPackage{brunnian}
  18. \newif\ifsvg
  19. \@ifpackageloaded{tex4ht}{
  20. \svgtrue
  21. }{}
  22. \ifsvg
  23. \def\pgfsysdriver{pgfsys-tex4ht.def}
  24. \fi
  25. \RequirePackage[svgnames]{xcolor}
  26. \RequirePackage{tikz}
  27. \RequirePackage{colorinfo}
  28. \usetikzlibrary{calc}
  29. \xglobal\colorlet{background}{white}
  30. \newcommand{\resetbgcolour}[1]{%
  31. \xglobal\colorlet{background}{#1}
  32. \colorInfo{background}
  33. \edef\br@white{\colorValue}
  34. }
  35. \AtBeginDocument{%
  36. \colorInfo{background}%
  37. \edef\br@white{\colorValue}%
  38. }
  39. \xglobal\colorlet{ring1}{Red}
  40. \xglobal\colorlet{ring2}{Green}
  41. \xglobal\colorlet{ring3}{Blue}
  42. \xglobal\colorlet{ring4}{Orange}
  43. \xglobal\colorlet{ring5}{Purple}
  44. \xglobal\colorlet{ring6}{Chartreuse}
  45. \xglobal\colorlet{ring7}{Sienna}
  46. \xglobal\colorlet{ring8}{DeepPink}
  47. \xglobal\colorlet{ring9}{Gold}
  48. \xglobal\colorlet{ring10}{DarkViolet}
  49. \foreach \k in {1,2,3,4} {
  50. \foreach \m in {1,2,3,4} {
  51. \pgfmathparse{int(Mod(\m + \k - 2,4) + 1)}
  52. \xglobal\colorlet{ring\k\m}{ring\k!50!ring\pgfmathresult}
  53. \foreach \l in {1,2,3,4} {
  54. \pgfmathparse{int(Mod(\l + \k - 2,4) + 1)}
  55. \xglobal\colorlet{ring\k\m\l}{ring\k\m!50!ring\pgfmathresult}
  56. }
  57. }
  58. }
  59. \pgfdeclarelayer{back}
  60. \pgfdeclarelayer{front}
  61. \pgfsetlayers{back,main,front}
  62. \pgfmathsetmacro{\br@step}{1/4}
  63. \pgfmathsetmacro{\br@theta}{10}
  64. \let\brstep=\br@step
  65. \edef\br@one{1}
  66. \edef\br@zero{0}
  67. \newcommand{\setbrstep}[1]{%
  68. \def\br@step{#1}}
  69. \tikzset{knot/.style={double distance=1pt,line width=2pt,background}}
  70. \tikzset{thin knot/.style={double distance=.5pt,line width=1pt,background}}
  71. \tikzset{thick knot/.style={double distance=2pt,line width=4pt,background}}
  72. \tikzset{string/.style={line width=1pt}}
  73. \newcommand{\getangle}[5]{%
  74. \pgfmathsetmacro{\br@num}{int(4 ^ (#1 - 1) + .5)}
  75. \pgfmathsetmacro{\br@dir}{#3}
  76. \pgfmathsetmacro{\br@innersep}{#1 == 1 ? 4 : 0}
  77. \pgfmathsetmacro{\br@mr}{#2 -\br@step + (2*\br@num + .5) *\br@step * (1 - \br@dir)}
  78. \pgfmathsetmacro{\br@angle}{atan((6 * \br@num + 2*\br@innersep) * \br@step/\br@mr)}
  79. \ifx\relax#4\relax
  80. \pgfmathparse{ceil(\br@angle)}
  81. \else
  82. \pgfmathparse{int(#4 > \br@angle ? #4 : ceil(\br@angle))}
  83. \fi
  84. \xdef\clockangle{\pgfmathresult}
  85. \ifx\relax#5\relax
  86. \pgfmathparse{ceil(\br@angle)}
  87. \else
  88. \pgfmathparse{int(#5 > \br@angle ? #5 : ceil(\br@angle))}
  89. \fi
  90. \xdef\aclockangle{\pgfmathresult}
  91. \pgfmathparse{int(\clockangle + \aclockangle)}
  92. \xdef\totalangle{\pgfmathresult}
  93. }
  94. \newcommand{\junction}[5]{%
  95. \pgfmathsetmacro{\br@midpt}{#3}
  96. \pgfmathsetmacro{\br@dir}{(\br@midpt == 0 ? 1 : \br@midpt)}
  97. \begin{scope}[xscale=\br@dir]
  98. \pgfmathsetmacro{\br@num}{int(4 ^ (#1 - 1) + .5)}
  99. \pgfmathsetmacro{\br@innersep}{#1 == 1 ? 4 : 0}
  100. \pgfmathsetmacro{\br@mr}{#2 -\br@step + (2*\br@num + .5) *\br@step * (1 - \br@dir)}
  101. \pgfmathsetmacro{\br@angle}{atan((6 * \br@num + 2*\br@innersep) * \br@step/\br@mr)}
  102. \ifx\relax#4\relax
  103. \pgfmathsetmacro{\br@outerangle}{ceil(\br@angle)}
  104. \else
  105. \pgfmathsetmacro{\br@outerangle}{#4 > \br@angle ? #4 : ceil(\br@angle)}
  106. \fi
  107. \ifx\relax#5\relax
  108. \pgfmathsetmacro{\br@innerangle}{ceil(\br@angle)}
  109. \else
  110. \pgfmathsetmacro{\br@innerangle}{#5 > \br@angle ? #5 : ceil(\br@angle)}
  111. \fi
  112. \pgfmathsetmacro{\br@sin}{sin(\br@angle)}
  113. \pgfmathsetmacro{\br@cos}{cos(\br@angle)}
  114. \path (0,0) circle (2pt);
  115. \edef\br@itstart{1}
  116. \pgfmathsetmacro{\br@itend}{2*\br@num}
  117. \edef\br@mcolor{outer}
  118. \foreach \br@m in {\br@itstart,...,\br@itend} {
  119. \@ifundefinedcolor{outer\br@m}{%
  120. }{%
  121. \global\edef\br@mcolor{outer\br@m}
  122. }
  123. \pgfmathsetmacro{\br@inr}{\br@mr + \br@m * \br@dir * \br@step}
  124. \pgfmathsetmacro{\br@outr}{\br@mr + (\br@num * 4 + 1 - \br@m) * \br@dir * \br@step}
  125. \pgfmathsetmacro{\br@x}{-1*\br@inr *\br@sin}
  126. \pgfmathsetmacro{\br@y}{-1*\br@inr *\br@cos}
  127. \pgfmathsetmacro{\br@xx}{-1*\br@outr *\br@sin}
  128. \pgfmathsetmacro{\br@yy}{-1*\br@outr *\br@cos}
  129. \pgfmathsetmacro{\br@r}{(6*\br@num - 2*\br@m + \br@innersep)*\br@step/2}
  130. \pgfmathsetmacro{\br@midr}{(\br@midpt == 0 ? (\br@inr + \br@outr)/2 + \br@r: \br@outr)}
  131. \colorInfo{\br@mcolor}
  132. \ifx\colorValue\br@white
  133. \else
  134. \draw[knot,double=\br@mcolor] (\br@xx,\br@yy) to[out=-\br@angle,in=180] (0,-\br@midr) arc(-\br@dir * 90:\br@dir * 90:\br@r) to[out=180,in=-\br@angle] (\br@x,\br@y);
  135. \draw[knot,double=\br@mcolor] (\br@x,\br@y) arc(-90-\br@angle:-90-\br@outerangle:\br@inr);
  136. \draw[knot,double=\br@mcolor] (\br@xx,\br@yy) arc(-90-\br@angle:-90-\br@outerangle:\br@outr);
  137. \fi
  138. }
  139. \edef\br@itstart{1}
  140. \pgfmathsetmacro{\br@itend}{2*\br@num}
  141. \edef\br@mcolor{inner}
  142. \foreach \br@m in {\br@itstart,...,\br@itend} {
  143. \@ifundefinedcolor{inner\br@m}{%
  144. }{%
  145. \global\edef\br@mcolor{inner\br@m}
  146. }
  147. \pgfmathsetmacro{\br@inward}{2 * (-.5 + (\br@m > \br@num))}
  148. \pgfmathsetmacro{\br@inr}{\br@mr + (\br@num+\br@m) * \br@dir * \br@step}
  149. \pgfmathsetmacro{\br@outr}{\br@mr + (3*\br@num + 1 + \br@inward * 2*\br@num - \br@m) * \br@dir * \br@step}
  150. \pgfmathsetmacro{\br@inmidr}{\br@inr - \br@midpt * \br@innersep * \br@step / 2 - \br@num * \br@midpt * \br@step + .5*\br@midpt * \br@step}
  151. \pgfmathsetmacro{\br@outmidr}{\br@outr - \br@midpt * \br@innersep * \br@step /2 + \br@inward * \br@dir * \br@innersep * \br@step/2 - \br@num * \br@midpt * \br@step + .5*\br@midpt * \br@step}
  152. \pgfmathsetmacro{\br@x}{\br@inr *\br@sin}
  153. \pgfmathsetmacro{\br@y}{-1*\br@inr *\br@cos}
  154. \pgfmathsetmacro{\br@xx}{\br@outr *\br@sin}
  155. \pgfmathsetmacro{\br@yy}{-1*\br@outr *\br@cos}
  156. \pgfmathsetmacro{\br@r}{(\br@num * (1 + \br@inward) - \br@inward * (\br@m - .5)) *\br@step + \br@innersep * \br@step/4}
  157. \colorInfo{\br@mcolor}
  158. \ifx\colorValue\br@white
  159. \else
  160. \begin{pgfonlayer}{front}
  161. \draw[knot,double=\br@mcolor] (\br@xx,\br@yy) to[out=180+\br@angle,in=0] (0,-\br@outmidr) arc(\br@inward *\br@dir * 270:\br@inward *\br@dir * 90:\br@r);
  162. \draw[knot,double=\br@mcolor] (\br@xx,\br@yy) arc(-90+\br@angle:-90+\br@innerangle:\br@outr);
  163. \end{pgfonlayer}
  164. \begin{pgfonlayer}{back}
  165. \draw[knot,double=\br@mcolor] (\br@x,\br@y) to[out=180+\br@angle,in=0] (0,-\br@inmidr);
  166. \draw[knot,double=\br@mcolor] (\br@x,\br@y) arc(-90+\br@angle:-90+\br@innerangle:\br@inr);
  167. \end{pgfonlayer}
  168. \fi
  169. }
  170. \end{scope}
  171. }
  172. \newcommand{\flatjunction}[5]{%
  173. \begin{scope}[xscale=#3]
  174. \pgfmathsetmacro{\br@num}{4 ^ (#1 - 1)}
  175. \pgfmathsetmacro{\br@dir}{#3}
  176. \pgfmathsetmacro{\br@innersep}{#1 == 1 ? 4 : 0}
  177. \pgfmathsetmacro{\br@mr}{0}%#2 -\br@step + (2*\br@num + .5) *\br@step * (1 - \br@dir)}
  178. \edef\br@itstart{1}
  179. \pgfmathsetmacro{\br@itend}{2*\br@num}
  180. \edef\br@mcolor{outer}
  181. \foreach \br@m in {\br@itstart,...,\br@itend} {
  182. \@ifundefinedcolor{outer\br@m}{%
  183. }{%
  184. \global\edef\br@mcolor{outer\br@m}
  185. }
  186. \pgfmathsetmacro{\br@inr}{\br@mr + \br@m * \br@dir * \br@step}
  187. \pgfmathsetmacro{\br@outr}{\br@mr + (\br@num * 4 + 1 - \br@m) * \br@dir * \br@step}
  188. \pgfmathsetmacro{\br@x}{-8*\br@step}
  189. \pgfmathsetmacro{\br@y}{-1*\br@inr}
  190. \pgfmathsetmacro{\br@xx}{-8*\br@step}
  191. \pgfmathsetmacro{\br@yy}{-1*\br@outr}
  192. \pgfmathsetmacro{\br@r}{(6*\br@num - 2*\br@m + \br@innersep)*\br@step/2}
  193. \colorInfo{\br@mcolor}
  194. \ifx\colorValue\br@white
  195. \else
  196. \draw[knot,double=\br@mcolor] (\br@xx,\br@yy) -- ++(8*\br@step,0) arc(-90:-90:\br@outr) arc(-\br@dir * 90:\br@dir * 90:\br@r) to[out=180,in=0] (\br@x,\br@y);
  197. \fi
  198. }
  199. \edef\br@itstart{1}
  200. \pgfmathsetmacro{\br@itend}{2*\br@num}
  201. \edef\br@mcolor{inner}
  202. \foreach \br@m in {\br@itstart,...,\br@itend} {
  203. \@ifundefinedcolor{inner\br@m}{%
  204. }{%
  205. \global\edef\br@mcolor{inner\br@m}
  206. }
  207. \pgfmathsetmacro{\br@inward}{2 * (-.5 + (\br@m > \br@num))}
  208. \pgfmathsetmacro{\br@inr}{\br@mr + (\br@num+\br@m) * \br@dir * \br@step}
  209. \pgfmathsetmacro{\br@outr}{\br@mr + (3*\br@num + 1 + \br@inward * 2*\br@num - \br@m) * \br@dir * \br@step}
  210. \pgfmathsetmacro{\br@inmidr}{\br@inr - \br@dir * \br@innersep * \br@step / 2 - \br@num * \br@dir * \br@step + .5*\br@dir * \br@step}
  211. \pgfmathsetmacro{\br@outmidr}{\br@outr - \br@dir * \br@innersep * \br@step /2 + \br@inward * \br@dir * \br@innersep * \br@step/2 - \br@num * \br@dir * \br@step + .5*\br@dir * \br@step}
  212. \pgfmathsetmacro{\br@x}{8*\br@step}
  213. \pgfmathsetmacro{\br@y}{-1*\br@inr}
  214. \pgfmathsetmacro{\br@xx}{8*\br@step}
  215. \pgfmathsetmacro{\br@yy}{-1*\br@outr}
  216. \pgfmathsetmacro{\br@r}{(\br@num * (1 + \br@inward) - \br@inward * (\br@m - .5)) *\br@step + \br@innersep * \br@step/4}
  217. \colorInfo{\br@mcolor}
  218. \ifx\colorValue\br@white
  219. \else
  220. \draw[knot,double=\br@mcolor] (\br@xx,\br@yy) to[out=180,in=0] (0,-\br@outmidr) arc(\br@inward *\br@dir * 270:\br@inward *\br@dir * 90:\br@r);
  221. \begin{pgfonlayer}{back}
  222. \draw[knot,double=\br@mcolor] (\br@x,\br@y) to[out=180,in=0] (0,-\br@inmidr);
  223. \end{pgfonlayer}
  224. \fi
  225. }
  226. \end{scope}
  227. }
  228. \newcommand{\gethopfangle}[5]{%
  229. \pgfmathsetmacro{\br@num}{2 ^ (#1 - 1)}
  230. \pgfmathsetmacro{\br@dir}{#3}
  231. \pgfmathsetmacro{\br@innersep}{2}%{#1 == 1 ? 2 : 0}
  232. \pgfmathsetmacro{\br@mr}{#2 -\br@step + (\br@num + .5) *\br@step * (1 - \br@dir)}
  233. \pgfmathsetmacro{\br@angle}{atan((3 * \br@num + 2*\br@innersep) * \br@step/\br@mr)}
  234. \ifx\relax#4\relax
  235. \pgfmathparse{ceil(\br@angle)}
  236. \else
  237. \pgfmathparse{int(#4 > \br@angle ? #4 : ceil(\br@angle))}
  238. \fi
  239. \xdef\clockangle{\pgfmathresult}
  240. \ifx\relax#5\relax
  241. \pgfmathparse{ceil(\br@angle)}
  242. \else
  243. \pgfmathparse{int(#5 > \br@angle ? #5 : ceil(\br@angle))}
  244. \fi
  245. \xdef\aclockangle{\pgfmathresult}
  246. \pgfmathparse{int(\clockangle + \aclockangle)}
  247. \xdef\totalangle{\pgfmathresult}
  248. }
  249. \newcommand{\hopfjunction}[5]{%
  250. \begin{scope}[xscale=#3]
  251. \pgfmathsetmacro{\br@num}{2 ^ (#1 - 1)}
  252. \pgfmathsetmacro{\br@dir}{#3}
  253. \pgfmathsetmacro{\br@innersep}{2}%{#1 < 3 ? 2 : 0}
  254. \pgfmathsetmacro{\br@mr}{#2 -\br@step + (\br@num + .5) *\br@step * (1 - \br@dir)}
  255. \pgfmathsetmacro{\br@angle}{atan((3 * \br@num + 2*\br@innersep) * \br@step/\br@mr)}
  256. \ifx\relax#4\relax
  257. \pgfmathsetmacro{\br@outerangle}{ceil(\br@angle)}
  258. \else
  259. \pgfmathsetmacro{\br@outerangle}{#4 > \br@angle ? #4 : ceil(\br@angle)}
  260. \fi
  261. \ifx\relax#5\relax
  262. \pgfmathsetmacro{\br@innerangle}{ceil(\br@angle)}
  263. \else
  264. \pgfmathsetmacro{\br@innerangle}{#5 > \br@angle ? #5 : ceil(\br@angle)}
  265. \fi
  266. \pgfmathsetmacro{\br@sin}{sin(\br@angle)}
  267. \pgfmathsetmacro{\br@cos}{cos(\br@angle)}
  268. \path (0,0) circle (2pt);
  269. \edef\br@itstart{1}
  270. \pgfmathsetmacro{\br@itend}{\br@num}
  271. \edef\br@mcolor{outer}
  272. \foreach \br@m in {\br@itstart,...,\br@itend} {
  273. \@ifundefinedcolor{outer\br@m}{%
  274. }{%
  275. \global\edef\br@mcolor{outer\br@m}
  276. }
  277. \pgfmathsetmacro{\br@inr}{\br@mr + \br@m * \br@dir * \br@step}
  278. \pgfmathsetmacro{\br@outr}{\br@mr + (\br@num * 2 + 1 - \br@m) * \br@dir * \br@step}
  279. \pgfmathsetmacro{\br@x}{-1*\br@inr *\br@sin}
  280. \pgfmathsetmacro{\br@y}{-1*\br@inr *\br@cos}
  281. \pgfmathsetmacro{\br@xx}{-1*\br@outr *\br@sin}
  282. \pgfmathsetmacro{\br@yy}{-1*\br@outr *\br@cos}
  283. \pgfmathsetmacro{\br@r}{(\br@num - \br@m + \br@innersep + .5)*\br@step}
  284. \colorInfo{\br@mcolor}
  285. \ifx\colorValue\br@white
  286. \else
  287. \draw[knot,double=\br@mcolor] (\br@xx,\br@yy) arc(-90-\br@angle:-90:\br@outr) arc(-\br@dir * 90:\br@dir * 90:\br@r) to[out=180,in=-\br@angle] (\br@x,\br@y);
  288. \draw[knot,double=\br@mcolor] (\br@x,\br@y) arc(-90-\br@angle:-90-\br@outerangle:\br@inr);
  289. \draw[knot,double=\br@mcolor] (\br@xx,\br@yy) arc(-90-\br@angle:-90-\br@outerangle:\br@outr);
  290. \fi
  291. }
  292. \edef\br@itstart{1}
  293. \pgfmathsetmacro{\br@itend}{\br@num}
  294. \edef\br@mcolor{inner}
  295. \foreach \br@m in {\br@itstart,...,\br@itend} {
  296. \@ifundefinedcolor{inner\br@m}{%
  297. }{%
  298. \global\edef\br@mcolor{inner\br@m}
  299. }
  300. \pgfmathsetmacro{\br@inr}{\br@mr + \br@m * \br@dir * \br@step}
  301. \pgfmathsetmacro{\br@outr}{\br@mr + (\br@num * 2 + 1 - \br@m) * \br@dir * \br@step}
  302. \pgfmathsetmacro{\br@x}{\br@inr *\br@sin}
  303. \pgfmathsetmacro{\br@y}{-1*\br@inr *\br@cos}
  304. \pgfmathsetmacro{\br@xx}{\br@outr *\br@sin}
  305. \pgfmathsetmacro{\br@yy}{-1*\br@outr *\br@cos}
  306. \pgfmathsetmacro{\br@r}{-(\br@num - \br@m + \br@innersep + .5)*\br@step}
  307. \colorInfo{\br@mcolor}
  308. \ifx\colorValue\br@white
  309. \else
  310. \draw[knot,double=\br@mcolor] (\br@xx,\br@yy) arc(-90+\br@angle:-90:\br@outr) arc(\br@dir * 90:0:\br@r);
  311. \begin{pgfonlayer}{back}
  312. \draw[knot,double=\br@mcolor] (\br@x,\br@y) to[out=180+\br@angle,in=0] (0,-\br@outr - \br@dir * 2*\br@r) arc(-\br@dir * 90:0:\br@r);
  313. \end{pgfonlayer}
  314. \draw[knot,double=\br@mcolor] (\br@x,\br@y) arc(-90+\br@angle:-90+\br@innerangle:\br@inr);
  315. \draw[knot,double=\br@mcolor] (\br@xx,\br@yy) arc(-90+\br@angle:-90+\br@innerangle:\br@outr);
  316. \fi
  317. }
  318. \end{scope}
  319. }
  320. \newcommand{\brunnian}[3][1]{%
  321. \pgfmathsetmacro{\br@n}{#3}
  322. \pgfmathsetmacro{\br@phi}{360/\br@n}
  323. \pgfmathsetmacro{\br@psi}{180/\br@n}
  324. \foreach \br@k in {1,...,\br@n} {
  325. \pgfmathparse{int(\br@k == 1 ? \br@n : \br@k - 1)}
  326. \edef\br@m{\pgfmathresult}
  327. \begin{scope}[rotate=\br@m * \br@phi]
  328. \colorlet{outer}{ring\br@m}
  329. \colorlet{inner}{ring\br@k}
  330. \junction{#1}{#2}{1}{\br@psi}{\br@psi}
  331. \end{scope}
  332. }
  333. }
  334. \newcommand{\outbrunnian}[3][1]{%
  335. \pgfmathsetmacro{\br@n}{#3}
  336. \pgfmathsetmacro{\br@phi}{360/\br@n}
  337. \pgfmathsetmacro{\br@psi}{180/\br@n}
  338. \foreach \br@k in {1,...,\br@n} {
  339. \pgfmathparse{int(\br@k == 1 ? \br@n : \br@k - 1)}
  340. \edef\br@m{\pgfmathresult}
  341. \begin{scope}[rotate=\br@m * \br@phi]
  342. \colorlet{inner}{ring\br@m}
  343. \colorlet{outer}{ring\br@k}
  344. \junction{#1}{#2}{-1}{\br@psi}{\br@psi}
  345. \end{scope}
  346. }
  347. }
  348. \newcommand{\midbrunnian}[3][1]{%
  349. \pgfmathsetmacro{\br@n}{#3}
  350. \pgfmathsetmacro{\br@phi}{360/\br@n}
  351. \pgfmathsetmacro{\br@psi}{180/\br@n}
  352. \foreach \br@k in {1,...,\br@n} {
  353. \pgfmathparse{int(\br@k == 1 ? \br@n : \br@k - 1)}
  354. \edef\br@m{\pgfmathresult}
  355. \begin{scope}[rotate=\br@m * \br@phi]
  356. \colorlet{outer}{ring\br@m}
  357. \colorlet{inner}{ring\br@k}
  358. \junction{#1}{#2}{0}{\br@psi}{\br@psi}
  359. \end{scope}
  360. }
  361. }
  362. \newcommand{\brunniantwo}[3]{%
  363. \edef\br@p{#3}
  364. \edef\br@q{#2}
  365. \pgfmathsetmacro{\br@radius}{#1}
  366. \pgfmathparse{int(mod(\br@q,2))}
  367. \edef\br@qodd{\pgfmathresult}
  368. \pgfmathparse{int(\br@q - 1 + \br@qodd)}
  369. \edef\br@qmo{\pgfmathresult}
  370. \pgfmathparse{int(\br@q == 1 ? 1 : 2)}
  371. \edef\br@qtwo{\pgfmathresult}
  372. \pgfmathsetmacro{\br@phi}{360/\br@p}
  373. \pgfmathsetmacro{\br@psi}{180/(\br@p * (ceil(\br@q/2)+1))}
  374. \foreach \br@k in {1,...,\br@p} {
  375. \pgfmathparse{int(\br@k == 1 ? \br@p : \br@k - 1)}
  376. \edef\br@m{\pgfmathresult}
  377. \begin{scope}[rotate=\br@m * \br@phi]
  378. \colorlet{outer}{ring\br@k\br@qtwo}
  379. \colorlet{outer5}{ring\br@k\br@qmo}
  380. \colorlet{inner}{ring\br@m\br@qmo}
  381. \junction{2}{\br@radius}{-1}{\br@psi}{\br@psi}
  382. \begin{scope}[rotate=\br@phi/2]
  383. \foreach \br@i in {1,...,\br@q} {
  384. \pgfmathsetmacro{\br@rho}{(\br@i - (1 - mod(\br@i,2))*(1 - \br@qodd) - ceil(\br@q/2)) * \br@psi}
  385. \begin{scope}[rotate=\br@rho]
  386. \pgfmathsetmacro{\br@mi}{mod(\br@i,2)}
  387. \pgfmathsetmacro{\br@modi}{(-1)^\br@mi}
  388. \pgfmathparse{int(\br@i == 1 || \br@i == \br@q - \br@qodd ? \br@i + \br@qtwo - 1 - 2*(1 - \br@qodd)*(1 - \br@mi) : \br@i + \br@modi * 2)}
  389. \edef\br@j{\pgfmathresult}
  390. \colorlet{outer}{ring\br@k\br@i}
  391. \colorlet{inner}{ring\br@k\br@j}
  392. \junction{1}{\br@radius+12 * \br@mi * \br@step}{\br@modi}{\br@psi}{\br@psi}
  393. \end{scope}
  394. }
  395. \end{scope}
  396. \ifx\br@qodd\br@one
  397. \fillin{\br@radius}{1}{4}{\br@psi}{(1.5 + \br@qodd/2)*\br@psi}{ring\br@k\br@qtwo}
  398. \fillin{\br@radius}{1}{4}{\br@phi -\br@psi}{\br@phi - (1.5 + \br@qodd/2)*\br@psi}{ring\br@k\br@qmo}
  399. \fi
  400. \fillin{\br@radius}{5}{12}{\br@psi}{\br@phi - \br@psi}{ring\br@k\br@qmo}
  401. \end{scope}
  402. }
  403. }
  404. \newcommand{\fillin}[6]{%
  405. \colorInfo{#6}
  406. \ifx\colorValue\br@white
  407. \else
  408. \pgfmathsetmacro{\br@sin}{sin(#4)};
  409. \pgfmathsetmacro{\br@cos}{cos(#4)}
  410. \foreach \br@fk in {#2,...,#3} {
  411. \pgfmathsetmacro{\br@r}{#1 + (\br@fk - 1) * \br@step}
  412. \draw[knot,double=#6] (\br@r * \br@sin, -\br@r * \br@cos) arc(-90+#4:-90+#5:\br@r);
  413. }
  414. \fi
  415. }
  416. \newcommand{\hopfring}[2]{%
  417. \pgfmathsetmacro{\br@n}{#2}
  418. \pgfmathsetmacro{\br@phi}{360/\br@n}
  419. \gethopfangle{1}{#1}{1}{}{}
  420. \pgfmathsetmacro{\br@psi}{360/\br@n - \clockangle}
  421. \foreach \br@k in {1,...,\br@n} {
  422. \pgfmathparse{int(\br@k == 1 ? \br@n : \br@k - 1)}
  423. \edef\br@m{\pgfmathresult}
  424. \begin{scope}[rotate=\br@m * \br@phi]
  425. \colorlet{outer}{ring\br@m}
  426. \colorlet{inner}{ring\br@k}
  427. \hopfjunction{1}{#1}{1}{}{}
  428. \pgfmathparse{Mod(\br@k,2) == 0 ? "\noexpand\fillin{#1}{1}{2}{\clockangle}{\br@psi}{inner}" : ""}
  429. \begin{pgfonlayer}{back}
  430. \pgfmathresult
  431. \end{pgfonlayer}
  432. \pgfmathparse{Mod(\br@k,2) == 0 ? "" : "\noexpand\fillin{#1}{1}{2}{\clockangle}{\br@psi}{inner}"}
  433. \pgfmathresult
  434. \end{scope}
  435. }
  436. }
  437. \newcommand{\hopftwo}[3]{%
  438. \edef\br@p{#3}
  439. \edef\br@q{#2}
  440. \pgfmathsetmacro{\br@radius}{#1}
  441. \pgfmathsetmacro{\br@qodd}{mod(\br@q,2)}
  442. \pgfmathparse{int(\br@q - 1 + \br@qodd)}
  443. \edef\br@qmo{\pgfmathresult}
  444. \pgfmathparse{int(\br@q == 1 ? 1 : 2)}
  445. \edef\br@qtwo{\pgfmathresult}
  446. \pgfmathsetmacro{\br@phi}{360/\br@p}
  447. \pgfmathsetmacro{\br@psi}{180/(\br@p * (ceil(\br@q/2)+1))}
  448. \foreach \br@k in {1,...,\br@p} {
  449. \pgfmathparse{int(\br@k == 1 ? \br@p : \br@k - 1)}
  450. \edef\br@m{\pgfmathresult}
  451. \begin{scope}[rotate=\br@m * \br@phi]
  452. \colorlet{outer}{ring\br@k\br@qtwo}
  453. \colorlet{outer5}{ring\br@k\br@qmo}
  454. \colorlet{inner}{ring\br@m\br@qmo}
  455. \hopfjunction{2}{\br@radius}{-1}{\br@psi}{\br@psi}
  456. \begin{scope}[rotate=\br@phi/2]
  457. \foreach \br@i in {1,...,\br@q} {
  458. \pgfmathsetmacro{\br@rho}{(\br@i - (1 - mod(\br@i,2))*(1 - \br@qodd) - ceil(\br@q/2)) * \br@psi}
  459. \begin{scope}[rotate=\br@rho]
  460. \pgfmathsetmacro{\br@mi}{mod(\br@i,2)}
  461. \pgfmathsetmacro{\br@modi}{(-1)^\br@mi}
  462. \pgfmathparse{int(\br@i == 1 || \br@i == \br@q - \br@qodd ? \br@i + \br@qtwo - 1 - 2*(1 - \br@qodd)*(1 - \br@mi) : \br@i + \br@modi * 2)}
  463. \edef\br@j{\pgfmathresult}
  464. \colorlet{outer}{ring\br@k\br@i}
  465. \colorlet{inner}{ring\br@k\br@j}
  466. \hopfjunction{1}{\br@radius+2 * \br@mi * \br@step}{\br@modi}{\br@psi}{\br@psi}
  467. \end{scope}
  468. }
  469. \end{scope}
  470. \fillin{\br@radius}{1}{2}{\br@psi}{(1.5 + \br@qodd/2)*\br@psi}{ring\br@k\br@qtwo}
  471. \fillin{\br@radius}{1}{2}{\br@phi -\br@psi}{\br@phi - (1.5 + \br@qodd/2)*\br@psi}{ring\br@k\br@qmo}
  472. \end{scope}
  473. }
  474. }
  475. \newcommand{\chain}{%
  476. \begin{scope}
  477. \begin{pgfonlayer}{back}
  478. \draw[knot,double=chain] (-1.1,0.7) -- ++(0,-1.8) -- ++(.3,0);
  479. \draw[knot,double=chain] (1.1,0.7) -- ++(0,-1.8) -- ++(-.3,0);
  480. \draw[knot,double=chain] (-.9,0.7) -- ++(0,-1.6) -- ++(.1,0);
  481. \draw[knot,double=chain] (.9,0.7) -- ++(0,-1.6) -- ++(-.1,0);
  482. \end{pgfonlayer}
  483. \begin{pgfonlayer}{front}
  484. \draw[knot,double=chain] (-.8,-.9) -- ++(1.6,0);
  485. \draw[knot,double=chain] (-.8,-1.1) -- ++(1.6,0);
  486. \end{pgfonlayer}
  487. \draw[knot,double=chain] (-1,1) circle (.4);
  488. \draw[background,line width=1.8mm] (-1,0.5) -- ++(0,.2);
  489. \draw[knot,double=chain] (-1.1,0.5) -- ++(0,.1);
  490. \draw[knot,double=chain] (-.9,0.5) -- ++(0,.1);
  491. \draw[knot,double=chain] (1,1) circle (.4);
  492. \draw[background,line width=1.8mm] (1,0.5) -- ++(0,.2);
  493. \draw[knot,double=chain] (1.1,0.5) -- ++(0,.1);
  494. \draw[knot,double=chain] (.9,0.5) -- ++(0,.1);
  495. \end{scope}
  496. }
  497. \newcommand{\leftchain}{%
  498. \begin{scope}
  499. \begin{pgfonlayer}{back}
  500. \draw[knot,double=chain] (-1.1,2.7) -- ++(0,-3.8) -- ++(.3,0);
  501. \draw[knot,double=chain] (1.1,0.7) -- ++(0,-1.8) -- ++(-.3,0);
  502. \draw[knot,double=chain] (-.9,2.7) -- ++(0,-3.6) -- ++(.1,0);
  503. \draw[knot,double=chain] (.9,0.7) -- ++(0,-1.6) -- ++(-.1,0);
  504. \end{pgfonlayer}
  505. \begin{pgfonlayer}{front}
  506. \draw[knot,double=chain] (-.8,-.9) -- ++(1.6,0);
  507. \draw[knot,double=chain] (-.8,-1.1) -- ++(1.6,0);
  508. \end{pgfonlayer}
  509. \draw[knot,double=chain] (-1,3) circle (.4);
  510. \draw[background,line width=1.8mm] (-1,2.5) -- ++(0,.2);
  511. \draw[knot,double=chain] (-1.1,2.5) -- ++(0,.1);
  512. \draw[knot,double=chain] (-.9,2.5) -- ++(0,.1);
  513. \draw[knot,double=chain] (1,1) circle (.4);
  514. \draw[background,line width=1.8mm] (1,0.5) -- ++(0,.2);
  515. \draw[knot,double=chain] (1.1,0.5) -- ++(0,.1);
  516. \draw[knot,double=chain] (.9,0.5) -- ++(0,.1);
  517. \end{scope}
  518. }
  519. \newcommand{\rightchain}{%
  520. \begin{scope}
  521. \begin{pgfonlayer}{back}
  522. \draw[knot,double=chain] (1.1,2.7) -- ++(0,-3.8) -- ++(-.3,0);
  523. \draw[knot,double=chain] (-1.1,0.7) -- ++(0,-1.8) -- ++(.3,0);
  524. \draw[knot,double=chain] (.9,2.7) -- ++(0,-3.6) -- ++(-.1,0);
  525. \draw[knot,double=chain] (-.9,0.7) -- ++(0,-1.6) -- ++(.1,0);
  526. \end{pgfonlayer}
  527. \begin{pgfonlayer}{front}
  528. \draw[knot,double=chain] (-.8,-.9) -- ++(1.6,0);
  529. \draw[knot,double=chain] (-.8,-1.1) -- ++(1.6,0);
  530. \end{pgfonlayer}
  531. \draw[knot,double=chain] (1,3) circle (.4);
  532. \draw[background,line width=1.8mm] (1,2.5) -- ++(0,.2);
  533. \draw[knot,double=chain] (1.1,2.5) -- ++(0,.1);
  534. \draw[knot,double=chain] (.9,2.5) -- ++(0,.1);
  535. \draw[knot,double=chain] (-1,1) circle (.4);
  536. \draw[background,line width=1.8mm] (-1,0.5) -- ++(0,.2);
  537. \draw[knot,double=chain] (-1.1,0.5) -- ++(0,.1);
  538. \draw[knot,double=chain] (-.9,0.5) -- ++(0,.1);
  539. \end{scope}
  540. }
  541. \newcommand{\leftcornerchain}{%
  542. \begin{scope}
  543. \begin{pgfonlayer}{back}
  544. \draw[knot,double=chain] (.5,3.1) -- ++(-1.6,0) -- ++(0,-4.2) -- ++(.3,0);
  545. \draw[knot,double=chain] (1.1,0.7) -- ++(0,-1.8) -- ++(-.3,0);
  546. \draw[knot,double=chain] (.5,2.9) -- ++(-1.4,0) -- ++(0,-3.8) -- ++(.1,0);
  547. \draw[knot,double=chain] (.9,0.7) -- ++(0,-1.6) -- ++(-.1,0);
  548. \end{pgfonlayer}
  549. \begin{pgfonlayer}{front}
  550. \draw[knot,double=chain] (-.8,-.9) -- ++(1.6,0);
  551. \draw[knot,double=chain] (-.8,-1.1) -- ++(1.6,0);
  552. \end{pgfonlayer}
  553. \draw[knot,double=chain] (1,3) circle (.4);
  554. \draw[background,line width=1.8mm] (.5,3) -- ++(.2,0);
  555. \draw[knot,double=chain] (.5,3.1) -- ++(.1,0);
  556. \draw[knot,double=chain] (.5,2.9) -- ++(.1,0);
  557. \draw[knot,double=chain] (1,1) circle (.4);
  558. \draw[background,line width=1.8mm] (1,0.5) -- ++(0,.2);
  559. \draw[knot,double=chain] (1.1,0.5) -- ++(0,.1);
  560. \draw[knot,double=chain] (.9,0.5) -- ++(0,.1);
  561. \end{scope}
  562. }
  563. \newcommand{\rightcornerchain}{%
  564. \begin{scope}
  565. \begin{pgfonlayer}{back}
  566. \draw[knot,double=chain] (-.5,3.1) -- ++(1.6,0) -- ++(0,-4.2) -- ++(-.3,0);
  567. \draw[knot,double=chain] (-1.1,0.7) -- ++(0,-1.8) -- ++(.3,0);
  568. \draw[knot,double=chain] (-.5,2.9) -- ++(1.4,0) -- ++(0,-3.8) -- ++(-.1,0);
  569. \draw[knot,double=chain] (-.9,0.7) -- ++(0,-1.6) -- ++(.1,0);
  570. \end{pgfonlayer}
  571. \begin{pgfonlayer}{front}
  572. \draw[knot,double=chain] (-.8,-.9) -- ++(1.6,0);
  573. \draw[knot,double=chain] (-.8,-1.1) -- ++(1.6,0);
  574. \end{pgfonlayer}
  575. \draw[knot,double=chain] (-1,3) circle (.4);
  576. \draw[background,line width=1.8mm] (-.5,3) -- ++(-.2,0);
  577. \draw[knot,double=chain] (-.5,3.1) -- ++(-.1,0);
  578. \draw[knot,double=chain] (-.5,2.9) -- ++(-.1,0);
  579. \draw[knot,double=chain] (-1,1) circle (.4);
  580. \draw[background,line width=1.8mm] (-1,0.5) -- ++(0,.2);
  581. \draw[knot,double=chain] (-1.1,0.5) -- ++(0,.1);
  582. \draw[knot,double=chain] (-.9,0.5) -- ++(0,.1);
  583. \end{scope}
  584. }
  585. \newcommand{\brunnianhopf}[3]{%
  586. \edef\br@p{#3}
  587. \edef\br@q{#2}
  588. \pgfmathsetmacro{\br@radius}{#1}
  589. \pgfmathparse{int(mod(\br@q,2))}
  590. \edef\br@qodd{\pgfmathresult}
  591. \pgfmathparse{int(\br@q - 1 + \br@qodd)}
  592. \edef\br@qmo{\pgfmathresult}
  593. \pgfmathparse{int(\br@q == 1 ? 1 : 2)}
  594. \edef\br@qtwo{\pgfmathresult}
  595. \pgfmathsetmacro{\br@phi}{360/\br@p}
  596. \pgfmathsetmacro{\br@psi}{180/(\br@p * (ceil(\br@q/2)+1))}
  597. \foreach \br@k in {1,...,\br@p} {
  598. \pgfmathparse{int(\br@k == 1 ? \br@p : \br@k - 1)}
  599. \edef\br@m{\pgfmathresult}
  600. \begin{scope}[rotate=\br@m * \br@phi]
  601. \colorlet{outer}{ring\br@k\br@qtwo}
  602. \colorlet{outer3}{ring\br@k\br@qmo}
  603. \colorlet{inner}{ring\br@m\br@qmo}
  604. \junction{1.5}{\br@radius}{-1}{\br@psi}{\br@psi}
  605. \begin{scope}[rotate=\br@phi/2]
  606. \foreach \br@i in {1,...,\br@q} {
  607. \pgfmathsetmacro{\br@rho}{(\br@i - (1 - mod(\br@i,2))*(1 - \br@qodd) - ceil(\br@q/2)) * \br@psi}
  608. \begin{scope}[rotate=\br@rho]
  609. \pgfmathsetmacro{\br@mi}{mod(\br@i,2)}
  610. \pgfmathsetmacro{\br@modi}{(-1)^\br@mi}
  611. \pgfmathparse{int(\br@i == 1 || \br@i == \br@q - \br@qodd ? \br@i + \br@qtwo - 1 - 2*(1 - \br@qodd)*(1 - \br@mi) : \br@i + \br@modi * 2)}
  612. \edef\br@j{\pgfmathresult}
  613. \colorlet{outer}{ring\br@k\br@i}
  614. \colorlet{inner}{ring\br@k\br@j}
  615. \hopfjunction{1}{\br@radius+6 * \br@mi * \br@step}{\br@modi}{\br@psi}{\br@psi}
  616. \end{scope}
  617. }
  618. \end{scope}
  619. \ifx\br@qodd\br@one
  620. \fillin{\br@radius}{1}{2}{\br@psi}{(1.5 + \br@qodd/2)*\br@psi}{ring\br@k\br@qtwo}
  621. \fillin{\br@radius}{1}{2}{\br@phi -\br@psi}{\br@phi - (1.5 + \br@qodd/2)*\br@psi}{ring\br@k\br@qmo}
  622. \fi
  623. \fillin{\br@radius}{3}{6}{\br@psi}{\br@phi - \br@psi}{ring\br@k\br@qmo}
  624. \end{scope}
  625. }
  626. }
  627. \newcommand{\hopfbrunnian}[3]{%
  628. \edef\br@p{#3}
  629. \edef\br@q{#2}
  630. \pgfmathsetmacro{\br@radius}{#1}
  631. \pgfmathparse{int(mod(\br@q,2))}
  632. \edef\br@qodd{\pgfmathresult}
  633. \pgfmathparse{int(\br@q - 1 + \br@qodd)}
  634. \edef\br@qmo{\pgfmathresult}
  635. \pgfmathparse{int(\br@q == 1 ? 1 : 2)}
  636. \edef\br@qtwo{\pgfmathresult}
  637. \pgfmathsetmacro{\br@phi}{360/\br@p}
  638. \pgfmathsetmacro{\br@psi}{180/(\br@p * (ceil(\br@q/2)+1))}
  639. \foreach \br@k in {1,...,\br@p} {
  640. \pgfmathparse{int(\br@k == 1 ? \br@p : \br@k - 1)}
  641. \edef\br@m{\pgfmathresult}
  642. \begin{scope}[rotate=\br@m * \br@phi]
  643. \colorlet{outer}{ring\br@k\br@qtwo}
  644. \colorlet{inner}{ring\br@m\br@qmo}
  645. \hopfjunction{3}{\br@radius}{-1}{\br@psi}{\br@psi}
  646. \begin{scope}[rotate=\br@phi/2]
  647. \foreach \br@i in {1,...,\br@q} {
  648. \pgfmathsetmacro{\br@rho}{(\br@i - (1 - mod(\br@i,2))*(1 - \br@qodd) - ceil(\br@q/2)) * \br@psi}
  649. \begin{scope}[rotate=\br@rho]
  650. \pgfmathsetmacro{\br@mi}{mod(\br@i,2)}
  651. \pgfmathsetmacro{\br@modi}{(-1)^\br@mi}
  652. \pgfmathparse{int(\br@i == 1 || \br@i == \br@q - \br@qodd ? \br@i + \br@qtwo - 1 - 2*(1 - \br@qodd)*(1 - \br@mi) : \br@i + \br@modi * 2)}
  653. \edef\br@j{\pgfmathresult}
  654. \colorlet{outer}{ring\br@k\br@i}
  655. \colorlet{inner}{ring\br@k\br@j}
  656. \junction{1}{\br@radius+4 * \br@mi * \br@step}{\br@modi}{\br@psi}{\br@psi}
  657. \end{scope}
  658. }
  659. \end{scope}
  660. \ifx\br@qodd\br@one
  661. \fillin{\br@radius}{1}{4}{\br@psi}{(1.5 + \br@qodd/2)*\br@psi}{ring\br@k\br@qtwo}
  662. \fillin{\br@radius}{1}{4}{\br@phi -\br@psi}{\br@phi - (1.5 + \br@qodd/2)*\br@psi}{ring\br@k\br@qmo}
  663. \fi
  664. \end{scope}
  665. }
  666. }
  667. \newcommand{\outerhopftwo}[3]{%
  668. \edef\br@p{#3}
  669. \edef\br@q{#2}
  670. \pgfmathsetmacro{\br@radius}{#1}
  671. \pgfmathsetmacro{\br@qodd}{mod(\br@q,2)}
  672. \pgfmathparse{int(\br@q - 1 + \br@qodd)}
  673. \edef\br@qmo{\pgfmathresult}
  674. \pgfmathparse{int(\br@q == 1 ? 1 : 2)}
  675. \edef\br@qtwo{\pgfmathresult}
  676. \pgfmathsetmacro{\br@phi}{360/\br@p}
  677. \pgfmathsetmacro{\br@psi}{180/(\br@p * (\br@q+1))}
  678. \foreach \br@k in {1,...,\br@p} {
  679. \pgfmathparse{int(\br@k == 1 ? \br@p : \br@k - 1)}
  680. \edef\br@m{\pgfmathresult}
  681. \begin{scope}[rotate=\br@m * \br@phi]
  682. \colorlet{outer}{ring\br@k\br@qtwo}
  683. \colorlet{outer5}{ring\br@k\br@qmo}
  684. \colorlet{inner}{ring\br@m\br@qtwo}
  685. \hopfjunction{2}{\br@radius}{-1}{\br@psi}{\br@psi}
  686. \begin{scope}[rotate=\br@phi/2]
  687. \foreach \br@i in {1,...,\br@q} {
  688. \pgfmathsetmacro{\br@rho}{2*(\br@i - (\br@q+1)/2 ) * \br@psi}
  689. \begin{scope}[rotate=\br@rho]
  690. \pgfmathsetmacro{\br@mi}{mod(\br@i,2)}
  691. \pgfmathsetmacro{\br@modi}{(-1)^\br@mi}
  692. \pgfmathparse{int(\br@i == 1 || \br@i == \br@q - \br@qodd ? \br@i + \br@qtwo - 1 - 2*(1 - \br@qodd)*(1 - \br@mi) : \br@i + \br@modi * 2)}
  693. \edef\br@j{\pgfmathresult}
  694. \colorlet{outer}{ring\br@k\br@i}
  695. \colorlet{inner}{ring\br@k\br@j}
  696. \hopfjunction{1}{\br@radius+2 * \br@step}{-1}{\br@psi}{\br@psi}
  697. \end{scope}
  698. }
  699. \end{scope}
  700. \fillin{\br@radius}{1}{2}{\br@psi}{180 - \br@psi}{ring\br@k\br@qtwo}
  701. \end{scope}
  702. }
  703. }
  704. \newcommand{\outerbrunniantwo}[3]{%
  705. \edef\br@p{#3}
  706. \edef\br@q{#2}
  707. \pgfmathsetmacro{\br@radius}{#1}
  708. \pgfmathsetmacro{\br@qodd}{mod(\br@q,2)}
  709. \pgfmathparse{int(\br@q - 1 + \br@qodd)}
  710. \edef\br@qmo{\pgfmathresult}
  711. \pgfmathparse{int(\br@q == 1 ? 1 : 2)}
  712. \edef\br@qtwo{\pgfmathresult}
  713. \pgfmathsetmacro{\br@phi}{360/\br@p}
  714. \pgfmathsetmacro{\br@psi}{180/(\br@p * (\br@q+1))}
  715. \foreach \br@k in {1,...,\br@p} {
  716. \pgfmathparse{int(\br@k == 1 ? \br@p : \br@k - 1)}
  717. \edef\br@m{\pgfmathresult}
  718. \begin{scope}[rotate=\br@m * \br@phi]
  719. \colorlet{outer}{ring\br@k\br@qtwo}
  720. \colorlet{inner}{ring\br@m\br@qtwo}
  721. \junction{2}{\br@radius}{-1}{\br@psi}{\br@psi}
  722. \begin{scope}[rotate=\br@phi/2]
  723. \foreach \br@i in {1,...,\br@q} {
  724. \pgfmathsetmacro{\br@rho}{2*(\br@i - (\br@q+1)/2 ) * \br@psi}
  725. \begin{scope}[rotate=\br@rho]
  726. \pgfmathsetmacro{\br@mi}{mod(\br@i,2)}
  727. \pgfmathsetmacro{\br@modi}{(-1)^\br@mi}
  728. \pgfmathparse{int(\br@i == 1 || \br@i == \br@q - \br@qodd ? \br@i + \br@qtwo - 1 - 2*(1 - \br@qodd)*(1 - \br@mi) : \br@i + \br@modi * 2)}
  729. \edef\br@j{\pgfmathresult}
  730. \colorlet{outer}{ring\br@k\br@i}
  731. \colorlet{inner}{ring\br@k\br@j}
  732. \junction{1}{\br@radius+12 * \br@step}{-1}{\br@psi}{\br@psi}
  733. \end{scope}
  734. }
  735. \end{scope}
  736. \fillin{\br@radius}{1}{12}{\br@psi}{180 - \br@psi}{ring\br@k\br@qtwo}
  737. \end{scope}
  738. }
  739. }
  740. \def\pgf@sh@@knotanchor#1#2{%
  741. \anchor{#2 north west}{%
  742. \csname pgf@anchor@knot #1@north west\endcsname%
  743. \pgf@x=#2\pgf@x%
  744. \pgf@y=#2\pgf@y%
  745. }%
  746. \anchor{#2 north east}{%
  747. \csname pgf@anchor@knot #1@north east\endcsname%
  748. \pgf@x=#2\pgf@x%
  749. \pgf@y=#2\pgf@y%
  750. }%
  751. \anchor{#2 south west}{%
  752. \csname pgf@anchor@knot #1@south west\endcsname%
  753. \pgf@x=#2\pgf@x%
  754. \pgf@y=#2\pgf@y%
  755. }%
  756. \anchor{#2 south east}{%
  757. \csname pgf@anchor@knot #1@south east\endcsname%
  758. \pgf@x=#2\pgf@x%
  759. \pgf@y=#2\pgf@y%
  760. }%
  761. \anchor{#2 north}{%
  762. \csname pgf@anchor@knot #1@north\endcsname%
  763. \pgf@x=#2\pgf@x%
  764. \pgf@y=#2\pgf@y%
  765. }%
  766. \anchor{#2 east}{%
  767. \csname pgf@anchor@knot #1@east\endcsname%
  768. \pgf@x=#2\pgf@x%
  769. \pgf@y=#2\pgf@y%
  770. }%
  771. \anchor{#2 west}{%
  772. \csname pgf@anchor@knot #1@west\endcsname%
  773. \pgf@x=#2\pgf@x%
  774. \pgf@y=#2\pgf@y%
  775. }%
  776. \anchor{#2 south}{%
  777. \csname pgf@anchor@knot #1@south\endcsname%
  778. \pgf@x=#2\pgf@x%
  779. \pgf@y=#2\pgf@y%
  780. }%
  781. }
  782. \pgfdeclareshape{knot crossing}
  783. {
  784. \inheritsavedanchors[from=circle] % this is nearly a circle
  785. \inheritanchorborder[from=circle]
  786. \inheritanchor[from=circle]{north}
  787. \inheritanchor[from=circle]{north west}
  788. \inheritanchor[from=circle]{north east}
  789. \inheritanchor[from=circle]{center}
  790. \inheritanchor[from=circle]{west}
  791. \inheritanchor[from=circle]{east}
  792. \inheritanchor[from=circle]{mid}
  793. \inheritanchor[from=circle]{mid west}
  794. \inheritanchor[from=circle]{mid east}
  795. \inheritanchor[from=circle]{base}
  796. \inheritanchor[from=circle]{base west}
  797. \inheritanchor[from=circle]{base east}
  798. \inheritanchor[from=circle]{south}
  799. \inheritanchor[from=circle]{south west}
  800. \inheritanchor[from=circle]{south east}
  801. \inheritanchorborder[from=circle]
  802. \pgf@sh@@knotanchor{crossing}{2}
  803. \pgf@sh@@knotanchor{crossing}{3}
  804. \pgf@sh@@knotanchor{crossing}{4}
  805. \pgf@sh@@knotanchor{crossing}{8}
  806. \pgf@sh@@knotanchor{crossing}{16}
  807. \pgf@sh@@knotanchor{crossing}{32}
  808. \backgroundpath{
  809. \pgfutil@tempdima=\radius%
  810. \pgfmathsetlength{\pgf@xb}{\pgfkeysvalueof{/pgf/outer xsep}}%
  811. \pgfmathsetlength{\pgf@yb}{\pgfkeysvalueof{/pgf/outer ysep}}%
  812. \ifdim\pgf@xb<\pgf@yb%
  813. \advance\pgfutil@tempdima by-\pgf@yb%
  814. \else%
  815. \advance\pgfutil@tempdima by-\pgf@xb%
  816. \fi%
  817. }
  818. }
  819. \pgfdeclareshape{knot over cross}
  820. {
  821. \inheritsavedanchors[from=rectangle] % this is nearly a circle
  822. \inheritanchorborder[from=rectangle]
  823. \inheritanchor[from=rectangle]{north}
  824. \inheritanchor[from=rectangle]{north west}
  825. \inheritanchor[from=rectangle]{north east}
  826. \inheritanchor[from=rectangle]{center}
  827. \inheritanchor[from=rectangle]{west}
  828. \inheritanchor[from=rectangle]{east}
  829. \inheritanchor[from=rectangle]{mid}
  830. \inheritanchor[from=rectangle]{mid west}
  831. \inheritanchor[from=rectangle]{mid east}
  832. \inheritanchor[from=rectangle]{base}
  833. \inheritanchor[from=rectangle]{base west}
  834. \inheritanchor[from=rectangle]{base east}
  835. \inheritanchor[from=rectangle]{south}
  836. \inheritanchor[from=rectangle]{south west}
  837. \inheritanchor[from=rectangle]{south east}
  838. \inheritanchorborder[from=rectangle]
  839. \backgroundpath{
  840. \southwest \pgf@xa=\pgf@x \pgf@ya=\pgf@y
  841. \northeast \pgf@xb=\pgf@x \pgf@yb=\pgf@y
  842. \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@ya}}
  843. \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yb}}
  844. }
  845. \foregroundpath{
  846. \southwest \pgf@xa=\pgf@x \pgf@ya=\pgf@y
  847. \northeast \pgf@xb=\pgf@x \pgf@yb=\pgf@y
  848. \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@yb}}
  849. \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@ya}}
  850. }
  851. }
  852. \pgfdeclareshape{knot under cross}
  853. {
  854. \inheritsavedanchors[from=rectangle] % this is nearly a circle
  855. \inheritanchorborder[from=rectangle]
  856. \inheritanchor[from=rectangle]{north}
  857. \inheritanchor[from=rectangle]{north west}
  858. \inheritanchor[from=rectangle]{north east}
  859. \inheritanchor[from=rectangle]{center}
  860. \inheritanchor[from=rectangle]{west}
  861. \inheritanchor[from=rectangle]{east}
  862. \inheritanchor[from=rectangle]{mid}
  863. \inheritanchor[from=rectangle]{mid west}
  864. \inheritanchor[from=rectangle]{mid east}
  865. \inheritanchor[from=rectangle]{base}
  866. \inheritanchor[from=rectangle]{base west}
  867. \inheritanchor[from=rectangle]{base east}
  868. \inheritanchor[from=rectangle]{south}
  869. \inheritanchor[from=rectangle]{south west}
  870. \inheritanchor[from=rectangle]{south east}
  871. \inheritanchorborder[from=rectangle]
  872. \backgroundpath{
  873. \southwest \pgf@xa=\pgf@x \pgf@ya=\pgf@y
  874. \northeast \pgf@xb=\pgf@x \pgf@yb=\pgf@y
  875. \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@yb}}
  876. \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@ya}}
  877. }
  878. \foregroundpath{
  879. \southwest \pgf@xa=\pgf@x \pgf@ya=\pgf@y
  880. \northeast \pgf@xb=\pgf@x \pgf@yb=\pgf@y
  881. \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@ya}}
  882. \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yb}}
  883. }
  884. }
  885. \pgfdeclareshape{knot vert}
  886. {
  887. \inheritsavedanchors[from=rectangle] % this is nearly a circle
  888. \inheritanchorborder[from=rectangle]
  889. \inheritanchor[from=rectangle]{north}
  890. \inheritanchor[from=rectangle]{north west}
  891. \inheritanchor[from=rectangle]{north east}
  892. \inheritanchor[from=rectangle]{center}
  893. \inheritanchor[from=rectangle]{west}
  894. \inheritanchor[from=rectangle]{east}
  895. \inheritanchor[from=rectangle]{mid}
  896. \inheritanchor[from=rectangle]{mid west}
  897. \inheritanchor[from=rectangle]{mid east}
  898. \inheritanchor[from=rectangle]{base}
  899. \inheritanchor[from=rectangle]{base west}
  900. \inheritanchor[from=rectangle]{base east}
  901. \inheritanchor[from=rectangle]{south}
  902. \inheritanchor[from=rectangle]{south west}
  903. \inheritanchor[from=rectangle]{south east}
  904. \inheritanchorborder[from=rectangle]
  905. \backgroundpath{
  906. \southwest \pgf@xa=\pgf@x \pgf@ya=\pgf@y
  907. \northeast \pgf@xb=\pgf@x \pgf@yb=\pgf@y
  908. \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@ya}}
  909. \pgfpathlineto{\pgfqpoint{\pgf@xa}{\pgf@yb}}
  910. \pgfpathmoveto{\pgfqpoint{\pgf@xb}{\pgf@yb}}
  911. \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@ya}}
  912. }
  913. }
  914. \pgfdeclareshape{knot horiz}
  915. {
  916. \inheritsavedanchors[from=rectangle] % this is nearly a circle
  917. \inheritanchorborder[from=rectangle]
  918. \inheritanchor[from=rectangle]{north}
  919. \inheritanchor[from=rectangle]{north west}
  920. \inheritanchor[from=rectangle]{north east}
  921. \inheritanchor[from=rectangle]{center}
  922. \inheritanchor[from=rectangle]{west}
  923. \inheritanchor[from=rectangle]{east}
  924. \inheritanchor[from=rectangle]{mid}
  925. \inheritanchor[from=rectangle]{mid west}
  926. \inheritanchor[from=rectangle]{mid east}
  927. \inheritanchor[from=rectangle]{base}
  928. \inheritanchor[from=rectangle]{base west}
  929. \inheritanchor[from=rectangle]{base east}
  930. \inheritanchor[from=rectangle]{south}
  931. \inheritanchor[from=rectangle]{south west}
  932. \inheritanchor[from=rectangle]{south east}
  933. \inheritanchorborder[from=rectangle]
  934. \foregroundpath{
  935. \southwest \pgf@xa=\pgf@x \pgf@ya=\pgf@y
  936. \northeast \pgf@xb=\pgf@x \pgf@yb=\pgf@y
  937. \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@ya}}
  938. \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@ya}}
  939. \pgfpathmoveto{\pgfqpoint{\pgf@xa}{\pgf@yb}}
  940. \pgfpathlineto{\pgfqpoint{\pgf@xb}{\pgf@yb}}
  941. }
  942. }
  943. \newcommand{\flatbrunnianlink}[1]{%
  944. \pgfmathsetmacro{\br@scale}{#1}%
  945. \pgfmathsetmacro{\br@ctwenty}{cos(20)}
  946. \pgfmathsetmacro{\br@stwenty}{sin(20)}
  947. \draw[knot,double=chain] (-.5*\br@scale,0) arc(180:270:.5*\br@scale) node[coordinate] (a) {};
  948. \draw[knot,double=chain] (-.6*\br@scale,0) arc(180:270:.6*\br@scale) node[coordinate] (c) {};
  949. \begin{pgfonlayer}{front}
  950. \draw[knot,double=chain] (1.6*\br@scale,0) ++(-.9*\br@scale *\br@ctwenty,-.9*\br@scale *\br@stwenty) arc(0:-90:.2*\br@scale) to[out=180,in=0] (c);
  951. \end{pgfonlayer}
  952. \begin{pgfonlayer}{back}
  953. \draw[knot,double=chain] (-.5*\br@scale,0) arc(180:90:.5*\br@scale) node[coordinate] (b) {};
  954. \draw[knot,double=chain] (-.6*\br@scale,0) arc(180:90:.6*\br@scale) node[coordinate] (d) {};
  955. \draw[knot,double=chain] (1.6*\br@scale,0) ++(-.9*\br@scale *\br@ctwenty,-.9*\br@scale *\br@stwenty) arc(0:135:.2*\br@scale) to[out=-135,in=0] (a);
  956. \draw[knot,double=chain] (1.6*\br@scale,0) ++(-.9*\br@scale *\br@ctwenty,.9*\br@scale *\br@stwenty) arc(0:-135:.2*\br@scale) to[out=135,in=0] (b);
  957. \end{pgfonlayer}
  958. \begin{pgfonlayer}{front}
  959. \draw[knot,double=chain] (1.6*\br@scale,0) ++(-.9*\br@scale *\br@ctwenty,.9*\br@scale *\br@stwenty) arc(0:90:.2*\br@scale) to[out=180,in=0] (d);
  960. \end{pgfonlayer}
  961. }
  962. \newcommand{\brunnianlink}[2]{%
  963. \pgfmathsetmacro{\br@scale}{#1}
  964. \pgfmathsetmacro{\br@angle}{#2}
  965. \begin{scope}[every path/.style={knot,double=chain}]
  966. \begin{scope}[rotate=-\br@angle + 5]
  967. \draw (0,-\br@scale) arc (90:270:2.5*\br@step);
  968. \draw (0,-\br@scale-\br@step) arc (90:270:1.5*\br@step);
  969. \draw (0,-\br@scale) arc (-90:-85:\br@scale) coordinate (a);
  970. \draw (0,-\br@scale-\br@step) arc (-90:-85:\br@scale+\br@step) coordinate (b);
  971. \draw (0,-\br@scale-4*\br@step) arc (-90:-85:\br@scale+3*\br@step) coordinate (c);
  972. \draw (0,-\br@scale-5*\br@step) arc (-90:-85:\br@scale+4*\br@step) coordinate (d);
  973. \end{scope}
  974. \begin{pgfonlayer}{back}
  975. \draw (0,-\br@scale-2*\br@step) arc(-90:-100:\br@scale+2*\br@step) coordinate (B);
  976. \draw (0,-\br@scale-3*\br@step) arc(-90:-100:\br@scale+3*\br@step) coordinate (C);
  977. \end{pgfonlayer}
  978. \begin{pgfonlayer}{front}
  979. \draw (0,-\br@scale) arc (90:-90:\br@step);
  980. \draw (0,-\br@scale) arc (-90:-100:\br@scale) coordinate (A);
  981. \draw (0,-\br@scale-3*\br@step) arc (90:-90:\br@step);
  982. \draw (0,-\br@scale-5*\br@step) arc (-90:-100:\br@scale+5*\br@step)coordinate (D);
  983. \end{pgfonlayer}
  984. \pgfmathsetmacro{\br@loose}{\br@angle == 180 ? 1.5 : 1}
  985. \draw (a) to[out=-\br@angle+10,in=170,looseness=\br@loose] (A);
  986. \draw (b) to[out=-\br@angle+10,in=170,looseness=\br@loose] (B);
  987. \draw (c) to[out=-\br@angle+10,in=170,looseness=\br@loose] (C);
  988. \draw (d) to[out=-\br@angle+10,in=170,looseness=\br@loose] (D);
  989. \end{scope}
  990. }
  991. \newcommand{\brunniantwocpt}[4]{%
  992. \edef\br@p{#3}
  993. \edef\br@q{#2}
  994. \edef\br@colour{#4}
  995. \pgfmathsetmacro{\br@radius}{#1}
  996. \pgfmathparse{int(mod(\br@q,2))}
  997. \edef\br@qodd{\pgfmathresult}
  998. \pgfmathparse{int(\br@q - 1 + \br@qodd)}
  999. \edef\br@qmo{\pgfmathresult}
  1000. \pgfmathparse{int(\br@q == 1 ? 1 : 2)}
  1001. \edef\br@qtwo{\pgfmathresult}
  1002. \pgfmathsetmacro{\br@phi}{360/\br@p}
  1003. \pgfmathsetmacro{\br@psi}{180/(\br@p * (ceil(\br@q/2)+1))}
  1004. \begin{scope}%[rotate=\br@m * \br@phi]
  1005. \colorlet{outer}{\br@colour\br@qtwo}
  1006. \colorlet{outer5}{\br@colour\br@qmo}
  1007. \colorlet{inner}{background}
  1008. \junction{2}{\br@radius}{-1}{\br@psi}{\br@psi}
  1009. \begin{scope}[rotate=\br@phi]
  1010. \colorlet{outer}{background}
  1011. \colorlet{outer5}{background}
  1012. \colorlet{inner}{\br@colour\br@qmo}
  1013. \junction{2}{\br@radius}{-1}{\br@psi}{\br@psi}
  1014. \end{scope}
  1015. \begin{scope}[rotate=\br@phi/2]
  1016. \foreach \br@i in {1,...,\br@q} {
  1017. \pgfmathsetmacro{\br@rho}{(\br@i - (1 - mod(\br@i,2))*(1 - \br@qodd) - ceil(\br@q/2)) * \br@psi}
  1018. \begin{scope}[rotate=\br@rho]
  1019. \pgfmathsetmacro{\br@mi}{mod(\br@i,2)}
  1020. \pgfmathsetmacro{\br@modi}{(-1)^\br@mi}
  1021. \pgfmathparse{int(\br@i == 1 || \br@i == \br@q - \br@qodd ? \br@i + \br@qtwo - 1 - 2*(1 - \br@qodd)*(1 - \br@mi) : \br@i + \br@modi * 2)}
  1022. \edef\br@j{\pgfmathresult}
  1023. \colorlet{outer}{\br@colour\br@i}
  1024. \colorlet{inner}{\br@colour\br@j}
  1025. \junction{1}{\br@radius+12 * \br@mi * \br@step}{\br@modi}{\br@psi}{\br@psi}
  1026. \end{scope}
  1027. }
  1028. \end{scope}
  1029. \ifx\br@qodd\br@one
  1030. \fillin{\br@radius}{1}{4}{\br@psi}{(1.5 + \br@qodd/2)*\br@psi}{\br@colour\br@qtwo}
  1031. \fillin{\br@radius}{1}{4}{\br@phi -\br@psi}{\br@phi - (1.5 + \br@qodd/2)*\br@psi}{\br@colour\br@qmo}
  1032. \fi
  1033. \fillin{\br@radius}{5}{12}{\br@psi}{\br@phi - \br@psi}{\br@colour\br@qmo}
  1034. \end{scope}
  1035. }
  1036. \newcommand{\brunniancpt}[3][1]{%
  1037. \pgfmathsetmacro{\br@n}{#3}
  1038. \pgfmathsetmacro{\br@phi}{360/\br@n}
  1039. \pgfmathsetmacro{\br@psi}{180/\br@n}
  1040. \colorlet{outer}{brunnian}
  1041. \colorlet{inner}{background}
  1042. \junction{#1}{#2}{1}{\br@psi}{\br@psi}
  1043. \begin{scope}[rotate=-\br@phi]
  1044. \colorlet{inner}{brunnian}
  1045. \colorlet{outer}{background}
  1046. \junction{#1}{#2}{1}{\br@psi}{\br@psi}
  1047. \end{scope}
  1048. }
  1049. \newcommand{\brunniancptouter}[3][1]{%
  1050. \pgfmathsetmacro{\br@n}{#3}
  1051. \pgfmathsetmacro{\br@phi}{360/\br@n}
  1052. \pgfmathsetmacro{\br@psi}{180/\br@n}
  1053. \colorlet{outer}{brunnian}
  1054. \colorlet{inner}{background}
  1055. \junction{#1}{#2}{-1}{\br@psi}{\br@psi}
  1056. \begin{scope}[rotate=\br@phi]
  1057. \colorlet{inner}{brunnian}
  1058. \colorlet{outer}{background}
  1059. \junction{#1}{#2}{-1}{\br@psi}{\br@psi}
  1060. \end{scope}
  1061. }
  1062. \newcommand{\brunnianlinkage}{%
  1063. \node (0) at (0,-\brlen) {};
  1064. \foreach \bri/\brdir/\brnud/\brv in {
  1065. 1/1/1/-1,
  1066. 2/-1/2/-1,
  1067. 3/-1/1/-1,
  1068. 4/1/1/1,
  1069. 5/1/1/-1,
  1070. 6/-1/1/1,
  1071. 7/-1/2/1,
  1072. 8/1/1/1
  1073. } {
  1074. \coordinate (\bri) at (\brover * \brdir * \brnud,-\bri * \brsep + \brv * \bradj);
  1075. \draw (\bri) -- ++(0,-\brv * \bradj) -- +(-\brdir * \brlen - \brover * \brdir * \brnud,0);
  1076. }
  1077. \draw (1) -- (4);
  1078. \draw (2) -- (7);
  1079. \draw (3) -- (6);
  1080. \draw (5) -- (8);
  1081. }
  1082. \newcommand{\brunniantwoside}{%
  1083. \foreach \bri/\brdir/\brnud/\brv in {
  1084. 1/1/1/-1,
  1085. 2/-1/2/-1,
  1086. 3/-1/1/-1,
  1087. 4/1/1/1,
  1088. 5/1/1/-1,
  1089. 6/-1/1/1,
  1090. 7/-1/2/1,
  1091. 8/1/1/1
  1092. } {
  1093. \coordinate (l\bri) at (\brover * \brdir * \brnud,-\bri * \brsep + \brv * \bradj);
  1094. \draw (l\bri) -- ++(0,-\brv * \bradj) -- +(-\brdir * \brlen - \brover * \brdir * \brnud,0) coordinate (le\bri);
  1095. }
  1096. \draw (l1) -- (l4);
  1097. \draw (l2) -- (l7);
  1098. \draw (l3) -- (l6);
  1099. \draw (l5) -- (l8);
  1100. \begin{scope}[xshift=4cm]
  1101. \foreach \bri/\brdir/\brnud/\brv in {
  1102. 1/1/1/-1,
  1103. 2/-1/2/-1,
  1104. 3/-1/1/-1,
  1105. 4/1/1/1,
  1106. 5/1/1/-1,
  1107. 6/-1/1/1,
  1108. 7/-1/2/1,
  1109. 8/1/1/1
  1110. } {
  1111. \coordinate (r\bri) at (\brover * \brdir * \brnud,-\bri * \brsep + \brv * \bradj);
  1112. \draw (r\bri) -- ++(0,-\brv * \bradj) -- +(-\brdir * \brlen - \brover * \brdir * \brnud,0) coordinate (re\bri);
  1113. }
  1114. \draw (r1) -- (r4);
  1115. \draw (r2) -- (r7);
  1116. \draw (r3) -- (r6);
  1117. \draw (r5) -- (r8);
  1118. \end{scope}
  1119. \draw
  1120. (le2) -- ++(\brsep,0) coordinate (1)
  1121. (le7) -- ++(\brsep,0) coordinate (4)
  1122. (re1) -- ++(-\brsep,0) coordinate (5)
  1123. (re8) -- ++(-\brsep,0) coordinate (8)
  1124. ;
  1125. \path
  1126. coordinate (2) at (le3)
  1127. coordinate (3) at (le6)
  1128. coordinate (6) at (re4)
  1129. coordinate (7) at (re5)
  1130. coordinate (lb) at ($(4)!.5!(8)+(0,-1)$)
  1131. ;
  1132. }
  1133. \newcommand{\dblhopftwoside}{%
  1134. \foreach \bri/\brdir/\brnud/\brv in {
  1135. 1/-1/2/-1,
  1136. 2/-1/1/-1,
  1137. 3/1/2/-1,
  1138. 4/1/1/-1,
  1139. 5/-1/1/1,
  1140. 6/-1/2/1,
  1141. 7/1/1/1,
  1142. 8/1/2/1
  1143. } {
  1144. \coordinate (l\bri) at (\brover * \brdir * \brnud,-\bri * \brsep + \brv * \bradj);
  1145. \draw (l\bri) -- ++(0,-\brv * \bradj) -- +(-\brdir * \brlen - \brover * \brdir * \brnud,0) coordinate (le\bri);
  1146. }
  1147. \draw (l1) -- (l6);
  1148. \draw (l2) -- (l5);
  1149. \draw (l3) -- (l8);
  1150. \draw (l4) -- (l7);
  1151. \begin{scope}[xshift=4cm]
  1152. \foreach \bri/\brdir/\brnud/\brv in {
  1153. 1/-1/2/-1,
  1154. 2/-1/1/-1,
  1155. 3/1/2/-1,
  1156. 4/1/1/-1,
  1157. 5/-1/1/1,
  1158. 6/-1/2/1,
  1159. 7/1/1/1,
  1160. 8/1/2/1
  1161. } {
  1162. \coordinate (r\bri) at (\brover * \brdir * \brnud,-\bri * \brsep + \brv * \bradj);
  1163. \draw (r\bri) -- ++(0,-\brv * \bradj) -- +(-\brdir * \brlen - \brover * \brdir * \brnud,0) coordinate (re\bri);
  1164. }
  1165. \draw (r1) -- (r6);
  1166. \draw (r2) -- (r5);
  1167. \draw (r3) -- (r8);
  1168. \draw (r4) -- (r7);
  1169. \end{scope}
  1170. \draw
  1171. (le1) -- ++(\brsep,0) coordinate (1)
  1172. (le6) -- ++(\brsep,0) coordinate (4)
  1173. (re3) -- ++(-\brsep,0) coordinate (5)
  1174. (re8) -- ++(-\brsep,0) coordinate (8)
  1175. ;
  1176. \path
  1177. coordinate (2) at (le2)
  1178. coordinate (3) at (le5)
  1179. coordinate (6) at (re4)
  1180. coordinate (7) at (re7)
  1181. coordinate (lb) at ($(4)!.5!(8)+(0,-1)$)
  1182. ;
  1183. }
  1184. \newcommand{\dblhopfrctwoside}{%
  1185. \foreach \bri/\brdir/\brnud/\brv in {
  1186. 1/-1/2/-1,
  1187. 2/-1/1/-1,
  1188. 3/1/2/-1,
  1189. 4/1/1/-1,
  1190. 5/-1/1/1,
  1191. 6/-1/2/1,
  1192. 7/1/1/1,
  1193. 8/1/2/1
  1194. } {
  1195. \coordinate (l\bri) at (\brover * \brdir * \brnud,-\bri * \brsep + \brv * \bradj);
  1196. \draw (l\bri) -- ++(0,-\brv * \bradj) -- +(-\brdir * \brlen - \brover * \brdir * \brnud,0) coordinate (le\bri);
  1197. }
  1198. \draw (l1) -- (l6);
  1199. \draw (l2) -- (l5);
  1200. \draw (l3) -- (l8);
  1201. \draw (l4) -- (l7);
  1202. \begin{scope}[xshift=4cm]
  1203. \foreach \bri/\brdir/\brnud/\brv in {
  1204. 1/-1/2/-1,
  1205. 2/-1/1/-1,
  1206. 3/1/2/-1,
  1207. 4/1/1/-1,
  1208. 5/-1/1/1,
  1209. 6/-1/2/1,
  1210. 7/1/1/1,
  1211. 8/1/2/1
  1212. } {
  1213. \coordinate (r\bri) at (\brover * \brdir * \brnud,-\bri * \brsep + \brv * \bradj);
  1214. \draw (r\bri) -- ++(0,-\brv * \bradj) -- +(-\brdir * \brlen - \brover * \brdir * \brnud,0) coordinate (re\bri);
  1215. }
  1216. \draw (r1) -- (r6);
  1217. \draw (r2) -- (r5);
  1218. \draw (r3) -- (r8);
  1219. \draw (r4) -- (r7);
  1220. \end{scope}
  1221. \draw
  1222. (le1) -- ++(\brsep,0) coordinate (1)
  1223. (le6) -- ++(\brsep,0) coordinate (4)
  1224. (re3) -- ++(-\brsep,0) coordinate (5)
  1225. (re8) -- ++(-\brsep,0) coordinate (8)
  1226. ;
  1227. \path
  1228. coordinate (2) at (le2)
  1229. coordinate (3) at (le5)
  1230. coordinate (6) at (re4)
  1231. coordinate (7) at (re7)
  1232. coordinate (lb) at ($(4)!.5!(8)+(0,-1)$)
  1233. ;
  1234. \draw[double=none,Red,line width=2pt] (2) -- (3);
  1235. }
  1236. \newcommand{\brunnianhalftwoside}{%
  1237. \foreach \bri/\brdir/\brnud/\brv in {
  1238. 1/1/1/-1,
  1239. 2/-1/2/-1,
  1240. 3/-1/1/-1,
  1241. 4/1/1/1,
  1242. 5/1/1/-1,
  1243. 6/-1/1/1,
  1244. 7/-1/2/1,
  1245. 8/1/1/1
  1246. } {
  1247. \coordinate (l\bri) at (\brover * \brdir * \brnud,-\bri * \brsep + \brv * \bradj);
  1248. \draw (l\bri) -- ++(0,-\brv * \bradj) -- +(-\brdir * \brlen - \brover * \brdir * \brnud,0) coordinate (le\bri);
  1249. }
  1250. \draw (l1) -- (l4);
  1251. \draw (l2) -- (l7);
  1252. \draw (l3) -- (l6);
  1253. \draw (l5) -- (l8);
  1254. \begin{scope}[xshift=4cm]
  1255. \foreach \bri/\brdir/\brnud/\brv in {
  1256. 1/1/1/-1,
  1257. 2/-1/2/-1,
  1258. 3/-1/1/-1,
  1259. 4/1/1/1,
  1260. 5/1/1/-1,
  1261. 6/-1/1/1,
  1262. 7/-1/2/1,
  1263. 8/1/1/1
  1264. } {
  1265. \coordinate (r\bri) at (\brover * \brdir * \brnud,-\bri * \brsep + \brv * \bradj);
  1266. \draw (r\bri) -- ++(0,-\brv * \bradj) -- +(-\brdir * \brlen - \brover * \brdir * \brnud,0) coordinate (re\bri);
  1267. }
  1268. \draw (r1) -- (r4);
  1269. \draw (r2) -- (r7);
  1270. \draw (r3) -- (r6);
  1271. \draw (r5) -- (r8);
  1272. \end{scope}
  1273. \draw
  1274. (le2) -- ++(\brsep,0) coordinate (1)
  1275. (le7) -- ++(\brsep,0) coordinate (4)
  1276. (re1) -- ++(-\brsep,0) coordinate (5)
  1277. (re8) coordinate (6)
  1278. ;
  1279. \path
  1280. coordinate (2) at (le3)
  1281. coordinate (3) at (le6)
  1282. coordinate (8) at (re4)
  1283. coordinate (7) at (re5)
  1284. coordinate (lb) at ($(4)!.5!(8)+(0,-1)$)
  1285. ;
  1286. \draw[double=none,Red,line width=2pt] (6) -- (7);
  1287. }
  1288. \newcommand{\brunnianringonetwoside}{
  1289. \fill[gray] (-\brlen,-.5*\brsep) rectangle (\brlen, .5*\brsep);
  1290. \draw[double=none,Red,line width=2pt]
  1291. (-\brlen,-.5*\brsep)
  1292. ++(-\brsep,-\brsep) coordinate (1)
  1293. ++(-\brsep,-\brsep) coordinate (2)
  1294. ++(-\brsep,-\brsep) coordinate (c3) -- +(\brsep,0) coordinate (3)
  1295. ++(-\brsep,-\brsep) coordinate (c4) -- +(4*\brsep,0) coordinate (4)
  1296. (\brlen,-.5*\brsep)
  1297. ++(\brsep,-\brsep) coordinate (5)
  1298. ++(\brsep,-\brsep) coordinate (6)
  1299. ++(\brsep,-\brsep) coordinate (c7) -- +(-\brsep,0) coordinate (7)
  1300. ++(\brsep,-\brsep) coordinate (c8) -- +(-4*\brsep,0) coordinate (8)
  1301. ;
  1302. \draw[double=none,Red,line width=2pt]
  1303. (1) -- ++(0,3*\brsep) -| (5)
  1304. (2) -- ++(0,5*\brsep) -| (6)
  1305. (c3) -- ++(0,7*\brsep) -| (c7)
  1306. (c4) -- ++(0,9*\brsep) -| (c8)
  1307. ;
  1308. }
  1309. %%
  1310. %% Copyright (C) 2011 by Andrew Stacey <stacey@math.ntnu.no>
  1311. %%
  1312. %% This work may be distributed and/or modified under the
  1313. %% conditions of the LaTeX Project Public License (LPPL), either
  1314. %% version 1.3c of this license or (at your option) any later
  1315. %% version. The latest version of this license is in the file:
  1316. %%
  1317. %% http://www.latex-project.org/lppl.txt
  1318. %%
  1319. %% This work is "maintained" (as per LPPL maintenance status) by
  1320. %% Andrew Stacey.
  1321. %%
  1322. %% This work consists of the file brunnian.dtx
  1323. %% and the derived files brunnian.ins,
  1324. %% brunnain.pdf, and
  1325. %% brunnian.sty.
  1326. %%
  1327. %%
  1328. %% End of file `brunnian.sty'.