You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

377 lines
14 KiB

3 months ago
2 months ago
3 months ago
2 months ago
3 months ago
2 months ago
3 months ago
2 months ago
3 months ago
2 months ago
3 months ago
2 months ago
3 months ago
2 months ago
3 months ago
2 months ago
3 months ago
2 months ago
3 months ago
2 months ago
3 months ago
2 months ago
3 months ago
2 months ago
3 months ago
2 months ago
3 months ago
2 months ago
3 months ago
2 months ago
3 months ago
2 months ago
3 months ago
2 months ago
3 months ago
2 months ago
3 months ago
2 months ago
3 months ago
2 months ago
3 months ago
2 months ago
3 months ago
  1. #import "@preview/cetz:0.2.2"
  2. #import "@preview/fontawesome:0.4.0": *
  3. #set page(
  4. width: 130cm,
  5. height: 130cm,
  6. margin: 0cm,
  7. )
  8. #set text(
  9. font: "Andika",
  10. stylistic-set: 13,
  11. size: 1cm
  12. )
  13. #let thick = 0.5cm
  14. #let transit = fa-icon("bus")
  15. #let c = (
  16. black: color.luma(0%),
  17. white: color.luma(100%),
  18. central: color.rgb(50%, 0%, 0%),
  19. transversal: color.rgb(0%, 50%, 0%),
  20. southern: color.rgb(0%, 0%, 50%),
  21. slab: color.luma(50%),
  22. western: color.rgb("#8f6030"),
  23. aquatic: color.rgb("#ff4000"),
  24. ngafrican: color.rgb("#ff8f8f"),
  25. transfortunate: color.rgb(100%, 0%, 100%),
  26. cuba: color.rgb("#b3b3ff"),
  27. archipelago: color.rgb("#fcba03"),
  28. transamujan: color.rgb("#924e7d"),
  29. forest: color.rgb("#4d8787"),
  30. corner: color.rgb("#be93e3"),
  31. coastal: color.rgb("#397cb3"),
  32. local: color.luma(0%),
  33. )
  34. #let pos = (
  35. above : (x: 0, y: 2.5, anchor: "south"),
  36. below : (x: 0, y: -2, anchor: "north"),
  37. left : (x: -2, y: 0, anchor: "east"),
  38. right : (x: 2, y: 0, anchor: "west"),
  39. above-left : (x: -2, y: 2.5, anchor: "south-east"),
  40. above-right: (x: 2, y: 2.5, anchor: "south-west"),
  41. below-left : (x: -2, y: -2, anchor: "north-east"),
  42. below-right: (x: 2, y: -2, anchor: "north-west")
  43. )
  44. #let mks(x, y, n, po) = (x: x, y: y, name: n, pos: po, phantom: none)
  45. #let mkp(x, y) = (x: x, y:y, phantom: true)
  46. #let stations = (
  47. // Central line 0
  48. tts1: mks( -47.7, 50, [Tantsang], none),
  49. _005: mkp( -35, 50),
  50. _000: mkp( -30, 45),
  51. kcy1: mks( -30, 30, [Yija], none),
  52. kcc1: mks( -30, 10, [Parkow], "below-right"),
  53. _001: mkp( -30, 5),
  54. _002: mkp( -25, 0),
  55. kcm1: mks( -20, 0, [Port Marcy], none),
  56. mzl1: mks( -10, 0, [Liztarp], "above"),
  57. mzs1: mks( 0, 0, [Spawn], "below"),
  58. mzt1: mks( 10, 0, [Tisheongja], "above"),
  59. mzc1: mks( 20, 0, [New Citadel], "below"),
  60. xvh1: mks( 30, 0, [Vee’s Hole], "below-right"),
  61. _003: mkp( 35, 0),
  62. _004: mkp( 40, 5),
  63. kzk1: mks( 40, 10, [Kozdenen #transit], "above-right"),
  64. rer1: mks( 40, 20, [R̦ijeləm], "right"),
  65. epi1: mks( 40, 30, [i Êpcêm], "right"),
  66. // Transversal 1
  67. ort1: mks( -90, 35, [Todoian], "right"),
  68. xg21: mks( -90, 40, [Guam 2], "right"),
  69. xph1: mks( -90, 45, [Phoeŋix], "right"),
  70. ztb1: mks( -90, 50, [Balijom], "right"),
  71. ztz1: mks( -90, 55, [Zotazil], "right"),
  72. dof1: mks( -90, 60, [Froglight Junction #transit], "right"),
  73. _010: mkp( -90, 65),
  74. _011: mkp( -85, 70),
  75. dor1: mks( -80, 70, [Rintìh], "above"),
  76. hen1: mks( -70, 70, [Nóreesá], "below"),
  77. heq1: mks( -60, 70, [Qòhééhinyèè], "above"),
  78. _014: mkp( -55, 70),
  79. _015: mkp( -50, 65),
  80. hep1: mks( -50, 60, [Pámù], "left"),
  81. tts2: mks( -50, 50, [Tantsang], "left"),
  82. hlg1: mks( -50, 45, [Glitter Island], "left"),
  83. hlf1: mks( -50, 40, [Fliegenpilz], "left"),
  84. hlh1: mks( -50, 20, [Mitthumm City], none),
  85. _012: mkp( -50, 15),
  86. _013: mkp( -45, 10),
  87. kcc2: mks( -27.7, 10, [Parkow], none),
  88. imp1: mks( 0, 10, [Imerchal Pfr.], "below"),
  89. kzk2: mks( 42.3, 10, [], none),
  90. ekh1: mks( 70, 10, [Enkavak Harbour], "below-right"),
  91. xio1: mks( 90, 10, [Iopvixen’s Fort], "above"),
  92. xce1: mks( 100, 10, [Cesarea], "below"),
  93. _016: mkp( 105, 10),
  94. _017: mkp( 110, 15),
  95. xsb1: mks( 110, 20, [Sidón y Biblos], "right"),
  96. xmt1: mks( 110, 25, [Mesa Temple], "right"),
  97. xmb1: mks( 110, 30, [Marti’s base], "right"),
  98. xmv1: mks( 110, 35, [Marti’s village], "right"),
  99. // Southern 2
  100. kcm2: mks( -20, -2.3, [Port Marcy], "below"),
  101. _020: mkp( -12.3, -2.3),
  102. _021: mkp( -10, -5),
  103. ttm1: mks( -10, -10, [Moshas], "right"),
  104. tqt1: mks( -10, -20, [Þunan Ŋáce], "right"),
  105. tqs1: mks( -10, -30, [Saxland], "right"),
  106. nan1: mks( -10, -40, [Nārospiňt], "right"),
  107. ary1: mks( -10, -50, [Yuɱa #transit], "right"),
  108. rpk1: mks( -10, -60, [Kanga], "right"),
  109. _022: mkp( -10, -65),
  110. _023: mkp( -15, -70),
  111. ama1: mks( -20, -70, [Drebzha], none),
  112. _024: mkp( -25, -70),
  113. _025: mkp( -30, -65),
  114. xsh1: mks( -30, -60, [Scarecrow Hbr.\ #transit], "right"),
  115. fpa1: mks( -30, -50, [Allium], "left"),
  116. arf1: mks( -30, -40, [Flagstaff], "left"),
  117. nbt1: mks( -30, -30, [Ŋibraltar], "left"),
  118. _026: mkp( -30, -5),
  119. _027: mkp( -27.7, -2.3),
  120. // Slab 3
  121. kcy2: mks(-25.4, 30, [Yija], none),
  122. sxg1: mks( 0, 30, [Slab Exchange], "above"),
  123. edt1: mks( 20, 30, [Tordanniòge], "above"),
  124. // Western 4
  125. vaz1: mks( -90, 10, [The Vazr], "left"),
  126. pet1: mks( -90, 0, [TTPD Era #transit], "left"),
  127. pe11: mks( -90, -10, [1989 Era #transit], "left"),
  128. _040: mkp( -90, -15),
  129. _041: mkp( -85, -20),
  130. zgw1: mks( -80, -20, [Ʒimh Gwynh], "below-left"),
  131. cba1: mks( -70, -20, [Anweigh], "below-right"),
  132. tqn1: mks( -40, -20, [Ŋájaþáw], "below"),
  133. tqt2: mks( -12.3, -20, [Þunan Ŋáce], none),
  134. // Aquatic 5
  135. amm1: mks( -40, -100, [Mawg], "left"),
  136. kzg1: mks( -40, -90, [Blighted Shrine], "left"),
  137. _050: mkp( -40, -79.6),
  138. _051: mkp( -35, -74.6),
  139. ama2: mks( -20, -74.6, [Drebzha], none),
  140. ayk1: mks( 10, -74.6, [Khaath Tran], "below-left"),
  141. ayr1: mks( 20, -74.6, [Ruôy Rûdak], "below"),
  142. fst1: mks( 30, -74.6, [Tarpoenstad], none),
  143. trc1: mks( 40, -74.6, [Czägrÿxyx], "below"),
  144. xcc1: mks( 50, -74.6, [Capitol], "above"),
  145. xci1: mks( 60, -74.6, [Citadel Island], none),
  146. // Ŋafrican 6
  147. mry1: mks( -80, 30, [Maryland], "below"),
  148. hla1: mks( -70, 30, [Auŕol Uraxe], "above-right"),
  149. _060: mkp( -59.6, 30),
  150. _061: mkp( -54.6, 25),
  151. hlh2: mks( -54.6, 20, [Mitthumm City], "left"),
  152. _062: mkp( -54.7, 15),
  153. _063: mkp( -65, 4.7),
  154. spg2: mks( -65, 2.3, [Spansos Gaming], none),
  155. _064: mkp( -65, -5),
  156. _065: mkp( -60, -10),
  157. _066: mkp( -45, -10),
  158. _067: mkp( -40, -15),
  159. tqn2: mks( -40, -17.7, [Ŋájaþáw], none),
  160. // Transfortunate 7
  161. ayk2: mks( 10, -76.9, [Khaath Tran], none),
  162. rmj1: mks( 10, -90, [Madness Junction #transit], "right"),
  163. awv1: mks( 10, -100, [V́aisi], none),
  164. _070: mkp( 10, -105),
  165. _071: mkp( 15, -110),
  166. han1: mks( 20, -110, [Hanebrug], "below"),
  167. // Cuba line 8
  168. hlh3: mks( -52.3, 20, [Mitthum City], none),
  169. obc1: mks( -52.3, 5, [Las\ Cabanetas], "right"),
  170. _080: mkp( -52.3, -12.3),
  171. _081: mkp( -57.7, -17.7),
  172. cba2: mks( -70, -17.7, [Anweigh], none),
  173. _082: mkp( -72.3, -17.7),
  174. _083: mkp( -80, -27.7),
  175. cbv1: mks( -80, -30, [Chillvana], "left"),
  176. cbc1: mks( -80, -40, [Old Cuba], "left"),
  177. cbf1: mks( -80, -50, [Frostanamo Bay], none),
  178. _084: mkp( -80, -55),
  179. _085: mkp( -75, -60),
  180. cbm1: mks( -60, -60, [Faeran], "below-right"),
  181. cbn1: mks( -40, -60, [Mt. Navia], "above"),
  182. xsh2: mks( -32.3, -60, [Scarecrow Harbour], none),
  183. // Archipelago 9
  184. cbm2: mks( -60, -62.3, [Faeran], none),
  185. svs1: mks(-60, -70, [Sta Wejs], "below"),
  186. // Transamujan 10
  187. ama3: mks( -20, -76.9, [Drebzha], "below"),
  188. _100: mkp( -25, -76.9),
  189. _101: mkp( -30, -81.9),
  190. lri1: mks( -30, -90, [Idanopolis], "right"),
  191. // Local -- Enkavak a
  192. eke1: mks( 70, 0, [Ekativak], "right"),
  193. ekh2: mks( 70, 7.3, [Enkavak Harbour], none),
  194. ekn1: mks( 70, 20, [Ngishmgak], "left"),
  195. ekt1: mks( 70, 30, [Thurishgak], "left"),
  196. _a00: mkp( 70, 12),
  197. _a01: mkp( 80, 17),
  198. ekg1: mks( 80, 20, [Enkavak Govt.], "above"),
  199. // Local -- Shingtsun b
  200. kce1: mks( -27.7, 60, [Esasne], "right"),
  201. ung1: mks( -27.7, 50, [United Ŋations HQ], "right"),
  202. kci1: mks( -27.7, 40, [North Yija], "right"),
  203. kcy3: mks( -27.7, 30, [Yija], "above-right"),
  204. _b00: mkp( -27.7, 25),
  205. _b01: mkp( -25, 22.3),
  206. kcs1: mks( -20, 22.3, [Shingtin Xeh], "above-right"),
  207. kcp1: mks( 0, 22.3, [Peregansia], "below"),
  208. vaf1: mks( 20, 22.3, [Cyerin Forest], "above"),
  209. van1: mks( 30, 22.3, [Vanstérelle], "below"),
  210. // Local -- Fishland c
  211. fst2: mks( 30, -72.3, [Tarpoenstad], "above-left"),
  212. fsn1: mks( 30, -60, [Northern Plains], "left"),
  213. // Local -- Kyaw Cen Sheep d
  214. kcc3: mks( -32.3, 10, [Parkow], none),
  215. kch1: mks( -32.3, 0, [Sheep Isl.], "left"),
  216. // Local -- Imerchal e
  217. imc1: mks( -10, 12.3, [West Chalmosique], "above"),
  218. imp2: mks( 0, 12.3, [], none),
  219. imq1: mks( 10, 12.3, [Quépichal], "right"),
  220. _e00: mkp( 17.7, 20),
  221. vaf2: mks( 20, 20, [Cyerin Forest], none),
  222. // Forest 11
  223. ams1: mks( -30, -72.3, [Shangu], "above-left"),
  224. ama4: mks( -20, -72.3, [Drebzha], none),
  225. san1: mks( -10, -72.3, [Ngauzichig], "right"),
  226. // Local -- Aistóv́y f
  227. awr1: mks( 0, -102.3, [Rikížmüs], "below"),
  228. awv2: mks( 10, -102.3, [V́aisi], "above-left"),
  229. awm1: mks( 20, -102.3, [Meǯjaiti], "below"),
  230. awk1: mks( 30, -102.3, [Kentóv́us], "above"),
  231. // Local -- Everglacier g
  232. cbf2: mks(-82.3, -50, [Frostanamo Bay], "left"),
  233. cbe1: mks(-82.3, -60, [Everglacier Nat’l Park], "left"),
  234. // Corner 12
  235. dcj1: mks(62.3, -60, [Dchâjâ Mountain], "right"),
  236. xci2: mks(62.3, -74.6, [Citadel Island], "right"),
  237. crv1: mks(62.3, -90, [Vizdanja], "right"),
  238. // Coastal 13
  239. pet2: mks( -87.7, 0, [TTPD Era], none),
  240. xng1: mks( -75, 0, [Nguhngle], "above"),
  241. spg1: mks( -65, 0, [Spansos\ Gaming\ #h(1.5em)], "below-right"),
  242. _130: mkp(-59.6, 0),
  243. obc2: mks(-54.6, 5, [Las Cabanetas], none),
  244. // Key
  245. _00a: mks(110, -20, [Central], "right"),
  246. _00b: mkp(100, -20),
  247. _01a: mks(110, -25, [Transversal], "right"),
  248. _01b: mkp(100, -25),
  249. _02a: mks(110, -30, [Southern], "right"),
  250. _02b: mkp(100, -30),
  251. _03a: mks(110, -35, [Slab], "right"),
  252. _03b: mkp(100, -35),
  253. _04a: mks(110, -40, [Western], "right"),
  254. _04b: mkp(100, -40),
  255. _05a: mks(110, -45, [Aquatic], "right"),
  256. _05b: mkp(100, -45),
  257. _06a: mks(110, -50, [Ŋafrican], "right"),
  258. _06b: mkp(100, -50),
  259. _07a: mks(110, -55, [Transfortunate], "right"),
  260. _07b: mkp(100, -55),
  261. _08a: mks(110, -60, [Cuba], "right"),
  262. _08b: mkp(100, -60),
  263. _09a: mks(110, -65, [Archipelago], "right"),
  264. _09b: mkp(100, -65),
  265. _10a: mks(110, -70, [Transamujan], "right"),
  266. _10b: mkp(100, -70),
  267. _11a: mks(110, -75, [Forest], "right"),
  268. _11b: mkp(100, -75),
  269. _12a: mks(110, -80, [Corner], "right"),
  270. _12b: mkp(100, -80),
  271. _13a: mks(110, -85, [Coastal], "right"),
  272. _13b: mkp(100, -85),
  273. _x0a: mks(110, -90, [Local], "right"),
  274. _x0b: mkp(100, -90),
  275. _x1a: mks(110, -95, [In Construction], "right"),
  276. _x1b: mkp(100, -95),
  277. )
  278. ======================
  279. #let lines = (
  280. ("central", "tts1", "_005", "_000", "kcy1", "kcc1", "_001", "_002", "kcm1", "mzl1", "mzs1", "mzt1", "mzc1", "xvh1", "_003", "_004", "kzk1", "rer1", "epi1"),
  281. ("transversal", "ort1", "xg21", "xph1", "ztb1", "ztz1", "dof1", "_010", "_011", "dor1", "hen1", "heq1", "_014", "_015", "hep1", "tts2", "hlg1", "hlf1", "hlh1", "_012", "_013", "kcc1", "imp1", "kzk2", "ekh1", "xio1", "xce1", "_016", "_017", "xsb1", "xmt1", "xmt1", "xmb1", "xmv1"),
  282. ("southern", "kcm2", "_020", "_021", "ttm1", "tqt1", "tqs1", "nan1", "ary1", "rpk1", "_022", "_023", "ama1", "_024", "_025", "xsh1", "fpa1", "arf1", "nbt1", "_026", "_027", "kcm2"),
  283. ("slab", "kcy2", "sxg1", "edt1"),
  284. ("western", "pet1", "pe11", "_040", "_041", "zgw1", "cba1", "tqn1", "tqt2"),
  285. ("aquatic", "amm1", "kzg1", "_050", "_051", "ama2", "ayk1", "ayr1", "fst1", "trc1", "xcc1", "xci1"),
  286. ("ngafrican", "mry1", "hla1", "_060", "_061", "hlh2", "_062", "_063", "spg2"),
  287. ("transfortunate", "ayk2", "rmj1", "awv1"),
  288. ("cuba", "hlh3", "obc1", "_080", "_081", "cba2", "_082", "_083", "cbv1", "cbc1", "cbf1"), ("cuba", "cbm1", "cbn1", "xsh2"),
  289. ("archipelago", "cbm2", "svs1"),
  290. ("transamujan", "ama3", "_100", "_101", "lri1"),
  291. ("local", "eke1", "ekh2", "ekn1", "ekt1"), ("local", "ekh2", "_a00", "_a01", "ekg1"),
  292. ("local", "kce1", "ung1", "kci1", "kcy3", "_b00", "_b01", "kcs1", "kcp1", "vaf1", "van1"),
  293. ("local", "fst2", "fsn1"),
  294. ("local", "kcc3", "kch1"),
  295. ("local", "imp2", "imq1", "_e00", "vaf2"),
  296. ("forest", "ams1", "ama4", "san1"),
  297. ("local", "awr1", "awv2", "awm1", "awk1"),
  298. ("local", "cbf2", "cbe1"),
  299. ("corner", "crv1", "xci2", "dcj1"),
  300. ("coastal", "obc2", "_130", "spg1"),
  301. // Key
  302. ("central", "_00a", "_00b"),
  303. ("transversal", "_01a", "_01b"),
  304. ("southern", "_02a", "_02b"),
  305. ("slab", "_03a", "_03b"),
  306. ("western", "_04a", "_04b"),
  307. ("aquatic", "_05a", "_05b"),
  308. ("ngafrican", "_06a", "_06b"),
  309. ("transfortunate", "_07a", "_07b"),
  310. ("cuba", "_08a", "_08b"),
  311. ("archipelago", "_09a", "_09b"),
  312. ("transamujan", "_10a", "_10b"),
  313. ("forest", "_11a", "_11b"),
  314. ("corner", "_12a", "_12b"),
  315. ("local", "_x0a", "_x0b"),
  316. ("coastal", "_13a", "_13b"),
  317. )
  318. #let clines = (
  319. ("western", "vaz1", "pet1"),
  320. ("cuba", "cbf1", "_084", "_085", "cbm1"),
  321. ("transfortunate", "awv1", "_070", "_071", "han1"),
  322. ("local", "imc1", "imp2"),
  323. ("coastal", "pet2", "xng1", "spg1"),
  324. ("ngafrican", "spg2", "_064", "_065", "_066", "_067", "tqn2"),
  325. // Key
  326. ("local", "_x1a", "_x1b")
  327. )
  328. #align(center + horizon, cetz.canvas(
  329. length: 0.5cm,
  330. {
  331. import cetz.draw: *
  332. for (n, ..l) in lines {
  333. let coords = l.map(it => (stations.at(it).x, stations.at(it).y))
  334. line(..coords, stroke: thick + c.at(n),)
  335. }
  336. for (n, ..l) in clines {
  337. let coords = l.map(it => (stations.at(it).x, stations.at(it).y))
  338. line(..coords, stroke: (paint: c.at(n), dash: "loosely-dotted", thickness: thick/2))
  339. }
  340. for (code, s) in stations {
  341. if s.phantom != none {continue}
  342. circle((s.x, s.y), s: none, fill: c.black, radius: 1.5, name: code)
  343. circle((s.x, s.y), s: none, fill: c.white, radius: 0.75)
  344. if s.pos != none {
  345. if code.starts-with("_") {
  346. let label = [#s.name]
  347. content(
  348. (s.x + pos.at(s.pos).x, s.y + pos.at(s.pos).y),
  349. anchor: pos.at(s.pos).anchor,
  350. label
  351. )
  352. } else {
  353. let label = [#s.name *#upper(code.slice(0, 3))*]
  354. content(
  355. (s.x + pos.at(s.pos).x, s.y + pos.at(s.pos).y),
  356. anchor: pos.at(s.pos).anchor,
  357. label
  358. )
  359. }
  360. }
  361. }
  362. content((60, 60), text(size: 5cm,)[*Ŋəcraft Railways*])
  363. content((105, -10), text(size: 2cm)[*Key*])
  364. }
  365. ))