texlive[57231] Master: puyotikz (26dec20)
commits+karl at tug.org
commits+karl at tug.org
Sat Dec 26 22:41:13 CET 2020
Revision: 57231
http://tug.org/svn/texlive?view=revision&revision=57231
Author: karl
Date: 2020-12-26 22:41:12 +0100 (Sat, 26 Dec 2020)
Log Message:
-----------
puyotikz (26dec20)
Modified Paths:
--------------
trunk/Master/tlpkg/libexec/ctan2tds
Added Paths:
-----------
trunk/Master/texmf-dist/scripts/puyotikz/
trunk/Master/texmf-dist/scripts/puyotikz/puyotikz.py
Removed Paths:
-------------
trunk/Master/texmf-dist/tex/latex/puyotikz/puyotikz.py
Added: trunk/Master/texmf-dist/scripts/puyotikz/puyotikz.py
===================================================================
--- trunk/Master/texmf-dist/scripts/puyotikz/puyotikz.py (rev 0)
+++ trunk/Master/texmf-dist/scripts/puyotikz/puyotikz.py 2020-12-26 21:41:12 UTC (rev 57231)
@@ -0,0 +1,294 @@
+# PuyoTikZ package for LaTeX.
+# Created by amosborne (GitHub) / terramyst (Twitter).
+# MIT License
+
+import numpy as np
+import itertools
+import string
+import re
+
+
+# Wraps a function which returns a string. Prints the result with a ";".
+def print_tikz(func):
+ def wrapper(*args, **kwargs):
+ print(func(*args, **kwargs) + ";")
+
+ return wrapper
+
+
+PUYO_RADIUS, PUYO_JOIN = 0.45, 0.25
+COLORS = {
+ "r": "red",
+ "y": "yellow",
+ "g": "green",
+ "b": "blue",
+ "p": "purple",
+ "n": "gray",
+}
+for key, value in COLORS.items():
+ COLORS[key] = value + "puyo"
+
+
+def puyoboard(cols, rows, hrows, boardpuyos, nextpuyos, label):
+ if not cols > 0:
+ raise UserWarning("{0} columns must be atleast 1.".format(cols))
+ if not rows > 0:
+ raise UserWarning("{0} rows must be atleast 1.".format(rows))
+ if hrows < 0:
+ raise UserWarning("{0} hidden rows must be atleast 0.".format(hrows))
+
+ draw_board(cols, rows, hrows, boardpuyos)
+ draw_nextpuyos(cols, rows, nextpuyos)
+ if label:
+ draw_labels(cols, rows, hrows, nextpuyos)
+
+
+def puyomarker(config):
+ pattern = "^([a-z]+)(\d+)([rygbpn])([A-Z])$"
+
+ @print_tikz
+ def singlemark(subconfig):
+ match = re.search(pattern, subconfig)
+ if match is None:
+ raise UserWarning("Bad puyo marker format string.")
+ else:
+ colid, rowid, puyo, lid = match.groups()
+
+ rowidx = int(rowid) - 1
+ colidx = next(
+ idx for idx, x in enumerate(excel_cols(upper=False)) if x == colid
+ )
+ pos = colidx + 0.5, rowidx + 0.5
+
+ tikz = "\\draw[{0},thick]".format("dark" + COLORS[puyo])
+ tikz += " ({0},{1}) circle ({2});".format(*pos, PUYO_RADIUS)
+ tikz += " \\node[anchor=center, font=\sffamily]"
+ tikz += " at ({0},{1}) {{\\small {2}}}".format(*pos, lid)
+ return tikz
+
+ subconfigs = config.split("/")
+ if subconfigs == [""]:
+ return
+ else:
+ for subconfig in subconfigs:
+ singlemark(subconfig)
+
+
+def draw_board(cols, rows, hrows, boardpuyos):
+ # draw the board grid
+ draw_grid(params=["gray", "ultra thin"], size=(cols, rows))
+ draw_grid(
+ params=["gray", "ultra thin", "line cap=round"],
+ origin=(0, rows),
+ size=(cols, hrows),
+ )
+ draw_grid(
+ params=["black", "line cap=round"], stepsize=(cols, rows), size=(cols, rows)
+ )
+
+ # draw the puyos on the board
+ draw_puyos(puyos=boardpuyos.split("/"), size=(cols, rows), nhidden=hrows)
+
+
+def draw_nextpuyos(cols, rows, nextpuyos):
+ nextpuyos = nextpuyos.split("/")
+ if nextpuyos == [""]:
+ return
+ for idx, puyos in enumerate(nextpuyos):
+ if not len(puyos) == 2:
+ raise UserWarning("Next puyos must be of length 2.")
+ draw_puyos(
+ puyos=[puyos], origin=(cols + 0.75, rows - 1.5 - 3 * idx), size=(1, 2)
+ )
+
+
+def draw_labels(cols, rows, hrows, nextpuyos):
+ @print_tikz
+ def draw_label(pos, text, size="\\normalsize", style="\\rmfamily"):
+ return "\\node[anchor=mid, font={4}] at ({0},{1}) {{{3} {2}}}".format(
+ *pos, text, size, style
+ )
+
+ for idx in range(0, rows + hrows):
+ draw_label((-0.5, 0.5 + idx), idx + 1)
+
+ for idx, label in zip(range(0, cols), excel_cols(upper=False)):
+ draw_label((0.5 + idx, -0.5), label)
+
+ nextpuyoscount = len(nextpuyos.split("/"))
+ if nextpuyos.split("/") == [""]:
+ return
+ for idx, label in zip(range(0, nextpuyoscount), excel_cols(upper=True)):
+ draw_label((cols + 0.75, rows - 1.5 - 3 * idx), label, "\\small", "\\sffamily")
+
+
+ at print_tikz
+def draw_grid(params=[], origin=(0, 0), stepsize=(1, 1), size=(6, 12)):
+ extent = tuple([x + y for x, y in zip(origin, size)])
+ tikz = "\\draw"
+ tikz += "[" + ",".join(params) + "]"
+ tikz += " ({0},{1})".format(*origin)
+ tikz += " grid [xstep={0},ystep={1}]".format(*stepsize)
+ tikz += " ({0},{1})".format(*extent)
+ return tikz
+
+
+def draw_puyos(puyos=[], origin=(0, 0), size=(6, 12), nhidden=0):
+ # construct a 2D matrix of strings (representing puyos)
+ board = np.full((size[0], size[1] + nhidden), "")
+ for ridx, col in enumerate(puyos):
+ for cidx, puyo in enumerate(list(col)):
+ if puyo not in COLORS.keys():
+ raise UserWarning(
+ "{0} is not a valid puyo identifier (rygbpn).".format(puyo)
+ )
+ try:
+ board[ridx, cidx] = puyo
+ except IndexError:
+ raise UserWarning("Puyo layout string has too many rows or columns.")
+
+ # helper function for converting true position
+ def true_pos(pos):
+ return tuple([x + y + 0.5 for x, y in zip(pos, origin)])
+
+ # draw all the puyo circles
+ for pos, puyo in np.ndenumerate(board):
+ if puyo:
+ draw_puyo(true_pos(pos), puyo)
+
+ # connect to adjacent puyos (except nuisance and hidden row)
+ for pos, puyo in np.ndenumerate(board):
+ for direc in {(1, 0), (-1, 0), (0, 1), (0, -1)}:
+ if not 0 <= pos[0] + direc[0] < board.shape[0]:
+ continue
+ elif not 0 <= pos[1] + direc[1] < board.shape[1] - nhidden:
+ continue
+ elif not 0 <= pos[1] < board.shape[1] - nhidden:
+ continue
+
+ other = board[pos[0] + direc[0], pos[1] + direc[1]]
+ if puyo and other == puyo and puyo != "n":
+ connect_puyo(true_pos(pos), direc, puyo)
+
+ # draw all the puyo faces
+ for pos, puyo in np.ndenumerate(board):
+ if puyo:
+ draw_face(true_pos(pos), puyo)
+
+ # outline the puyos with a darker color
+ for pos, puyo in np.ndenumerate(board):
+ for direc in {(1, 0), (-1, 0), (0, 1), (0, -1)}:
+ if not 0 <= pos[0] + direc[0] < board.shape[0]:
+ if puyo:
+ outline_puyo(true_pos(pos), direc, puyo, join=False)
+ continue
+ elif not 0 <= pos[1] + direc[1] < board.shape[1] - nhidden:
+ if puyo:
+ outline_puyo(true_pos(pos), direc, puyo, join=False)
+ continue
+ elif not 0 <= pos[1] < board.shape[1] - nhidden:
+ if puyo:
+ outline_puyo(true_pos(pos), direc, puyo, join=False)
+ continue
+
+ other = board[pos[0] + direc[0], pos[1] + direc[1]]
+ if puyo and other == puyo and puyo != "n":
+ outline_puyo(true_pos(pos), direc, puyo, join=True)
+ elif puyo:
+ outline_puyo(true_pos(pos), direc, puyo, join=False)
+
+
+ at print_tikz
+def draw_face(pos=(0, 0), puyo="r"):
+ def tikz_shift(shift=(0, 0)):
+ total_shift = pos[0] + shift[0], pos[1] + shift[1]
+ return "[xshift={0}cm,yshift={1}cm]".format(*total_shift)
+
+ tikz = "\\draw[white,semithick]"
+ if puyo == "p":
+ tikz += " ({0}150:{1}) -- ({0}-30:{1});".format(tikz_shift(), PUYO_RADIUS)
+ elif puyo == "r":
+ tikz += " ({0}150:{1}) -- ({0}0,0) -- ({0}30:{1});".format(
+ tikz_shift(), PUYO_RADIUS
+ )
+ elif puyo == "g":
+ tikz += " ({0}-90:{1}) arc (-90:0:{1})".format(
+ tikz_shift((-PUYO_RADIUS, PUYO_RADIUS)), PUYO_RADIUS
+ )
+ tikz += " ({0}-90:{1}) arc (-90:-180:{1});".format(
+ tikz_shift((PUYO_RADIUS, PUYO_RADIUS)), PUYO_RADIUS
+ )
+ elif puyo == "b":
+ tikz += " ({0}180:{1}) -- ({0}90:{2}) -- ({0}0:{1});".format(
+ tikz_shift(), PUYO_RADIUS, PUYO_RADIUS * np.sin(np.deg2rad(30))
+ )
+ elif puyo == "y":
+ tikz += " ({0}150:{1}) -- ({0}30:{1});".format(tikz_shift(), PUYO_RADIUS)
+ elif puyo == "n":
+ tikz += " ({0}210:{1}) -- ({0}-30:{1});".format(tikz_shift(), PUYO_RADIUS)
+ else:
+ tikz = ""
+
+ return tikz
+
+
+ at print_tikz
+def draw_puyo(pos=(0, 0), puyo="r"):
+ tikz = "\\draw[{0},fill={0}]".format(COLORS[puyo])
+ tikz += " ({0},{1}) circle ({2})".format(*pos, PUYO_RADIUS)
+ return tikz
+
+
+ at print_tikz
+def connect_puyo(pos=(0, 0), direc=(1, 0), puyo="r"):
+ phi, join1, join2 = connect_puyo_params(pos, direc)
+ tikz = "\\draw[{0},fill={0}]".format(COLORS[puyo])
+ tikz += " ([xshift={0}cm,yshift={1}cm]".format(*pos)
+ tikz += "{0}:{2}) arc ({0}:{1}:{2})".format(phi - 45, phi + 45, PUYO_RADIUS)
+ tikz += " to[out={0},in={1}] ({2},{3})".format(phi - 45, phi - 180, *join1)
+ tikz += " -- ({0},{1})".format(*join2)
+ tikz += " to[out={0},in={1}] cycle".format(phi - 180, phi + 45)
+ return tikz
+
+
+ at print_tikz
+def outline_puyo(pos=(0, 0), direc=(1, 0), puyo="r", join=False):
+ phi, join1, join2 = connect_puyo_params(pos, direc)
+ tikz = "\\draw[{0}]".format("dark" + COLORS[puyo])
+
+ if join:
+ tikz += " ([xshift={0}cm,yshift={1}cm]".format(*pos)
+ tikz += "{0}:{1})".format(phi + 45, PUYO_RADIUS)
+ tikz += " to[out={0},in={1}] ({2},{3})".format(phi - 45, phi - 180, *join1)
+ tikz += " ({0},{1})".format(*join2)
+ tikz += " to[out={0},in={1}]".format(phi - 180, phi + 45)
+ tikz += " ([xshift={0}cm,yshift={1}cm]".format(*pos)
+ tikz += "{0}:{1})".format(phi - 45, PUYO_RADIUS)
+ else:
+ tikz += " ([xshift={0}cm,yshift={1}cm]".format(*pos)
+ tikz += "{0}:{2}) arc ({0}:{1}:{2})".format(phi - 45, phi + 45, PUYO_RADIUS)
+
+ return tikz
+
+
+def connect_puyo_params(pos, direc):
+ """Determine the path angle and midpoint locations."""
+ phi = np.rad2deg(np.arctan2(direc[1], direc[0])) % 360
+ x, y1, y2 = 0.5, PUYO_JOIN, -PUYO_JOIN
+
+ c, s = np.cos(np.deg2rad(phi)), np.sin(np.deg2rad(-phi))
+ j = np.matrix([[c, s], [-s, c]])
+
+ def rotate_point(y):
+ m = np.dot(j, [x, y])
+ return float(m.T[0]) + pos[0], float(m.T[1]) + pos[1]
+
+ return phi, rotate_point(y1), rotate_point(y2)
+
+
+def excel_cols(upper=True):
+ n = 1
+ letters = string.ascii_uppercase if upper else string.ascii_lowercase
+ while True:
+ yield from ("".join(group) for group in itertools.product(letters, repeat=n))
+ n += 1
Property changes on: trunk/Master/texmf-dist/scripts/puyotikz/puyotikz.py
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Deleted: trunk/Master/texmf-dist/tex/latex/puyotikz/puyotikz.py
===================================================================
--- trunk/Master/texmf-dist/tex/latex/puyotikz/puyotikz.py 2020-12-26 00:54:10 UTC (rev 57230)
+++ trunk/Master/texmf-dist/tex/latex/puyotikz/puyotikz.py 2020-12-26 21:41:12 UTC (rev 57231)
@@ -1,294 +0,0 @@
-# PuyoTikZ package for LaTeX.
-# Created by amosborne (GitHub) / terramyst (Twitter).
-# MIT License
-
-import numpy as np
-import itertools
-import string
-import re
-
-
-# Wraps a function which returns a string. Prints the result with a ";".
-def print_tikz(func):
- def wrapper(*args, **kwargs):
- print(func(*args, **kwargs) + ";")
-
- return wrapper
-
-
-PUYO_RADIUS, PUYO_JOIN = 0.45, 0.25
-COLORS = {
- "r": "red",
- "y": "yellow",
- "g": "green",
- "b": "blue",
- "p": "purple",
- "n": "gray",
-}
-for key, value in COLORS.items():
- COLORS[key] = value + "puyo"
-
-
-def puyoboard(cols, rows, hrows, boardpuyos, nextpuyos, label):
- if not cols > 0:
- raise UserWarning("{0} columns must be atleast 1.".format(cols))
- if not rows > 0:
- raise UserWarning("{0} rows must be atleast 1.".format(rows))
- if hrows < 0:
- raise UserWarning("{0} hidden rows must be atleast 0.".format(hrows))
-
- draw_board(cols, rows, hrows, boardpuyos)
- draw_nextpuyos(cols, rows, nextpuyos)
- if label:
- draw_labels(cols, rows, hrows, nextpuyos)
-
-
-def puyomarker(config):
- pattern = "^([a-z]+)(\d+)([rygbpn])([A-Z])$"
-
- @print_tikz
- def singlemark(subconfig):
- match = re.search(pattern, subconfig)
- if match is None:
- raise UserWarning("Bad puyo marker format string.")
- else:
- colid, rowid, puyo, lid = match.groups()
-
- rowidx = int(rowid) - 1
- colidx = next(
- idx for idx, x in enumerate(excel_cols(upper=False)) if x == colid
- )
- pos = colidx + 0.5, rowidx + 0.5
-
- tikz = "\\draw[{0},thick]".format("dark" + COLORS[puyo])
- tikz += " ({0},{1}) circle ({2});".format(*pos, PUYO_RADIUS)
- tikz += " \\node[anchor=center, font=\sffamily]"
- tikz += " at ({0},{1}) {{\\small {2}}}".format(*pos, lid)
- return tikz
-
- subconfigs = config.split("/")
- if subconfigs == [""]:
- return
- else:
- for subconfig in subconfigs:
- singlemark(subconfig)
-
-
-def draw_board(cols, rows, hrows, boardpuyos):
- # draw the board grid
- draw_grid(params=["gray", "ultra thin"], size=(cols, rows))
- draw_grid(
- params=["gray", "ultra thin", "line cap=round"],
- origin=(0, rows),
- size=(cols, hrows),
- )
- draw_grid(
- params=["black", "line cap=round"], stepsize=(cols, rows), size=(cols, rows)
- )
-
- # draw the puyos on the board
- draw_puyos(puyos=boardpuyos.split("/"), size=(cols, rows), nhidden=hrows)
-
-
-def draw_nextpuyos(cols, rows, nextpuyos):
- nextpuyos = nextpuyos.split("/")
- if nextpuyos == [""]:
- return
- for idx, puyos in enumerate(nextpuyos):
- if not len(puyos) == 2:
- raise UserWarning("Next puyos must be of length 2.")
- draw_puyos(
- puyos=[puyos], origin=(cols + 0.75, rows - 1.5 - 3 * idx), size=(1, 2)
- )
-
-
-def draw_labels(cols, rows, hrows, nextpuyos):
- @print_tikz
- def draw_label(pos, text, size="\\normalsize", style="\\rmfamily"):
- return "\\node[anchor=mid, font={4}] at ({0},{1}) {{{3} {2}}}".format(
- *pos, text, size, style
- )
-
- for idx in range(0, rows + hrows):
- draw_label((-0.5, 0.5 + idx), idx + 1)
-
- for idx, label in zip(range(0, cols), excel_cols(upper=False)):
- draw_label((0.5 + idx, -0.5), label)
-
- nextpuyoscount = len(nextpuyos.split("/"))
- if nextpuyos.split("/") == [""]:
- return
- for idx, label in zip(range(0, nextpuyoscount), excel_cols(upper=True)):
- draw_label((cols + 0.75, rows - 1.5 - 3 * idx), label, "\\small", "\\sffamily")
-
-
- at print_tikz
-def draw_grid(params=[], origin=(0, 0), stepsize=(1, 1), size=(6, 12)):
- extent = tuple([x + y for x, y in zip(origin, size)])
- tikz = "\\draw"
- tikz += "[" + ",".join(params) + "]"
- tikz += " ({0},{1})".format(*origin)
- tikz += " grid [xstep={0},ystep={1}]".format(*stepsize)
- tikz += " ({0},{1})".format(*extent)
- return tikz
-
-
-def draw_puyos(puyos=[], origin=(0, 0), size=(6, 12), nhidden=0):
- # construct a 2D matrix of strings (representing puyos)
- board = np.full((size[0], size[1] + nhidden), "")
- for ridx, col in enumerate(puyos):
- for cidx, puyo in enumerate(list(col)):
- if puyo not in COLORS.keys():
- raise UserWarning(
- "{0} is not a valid puyo identifier (rygbpn).".format(puyo)
- )
- try:
- board[ridx, cidx] = puyo
- except IndexError:
- raise UserWarning("Puyo layout string has too many rows or columns.")
-
- # helper function for converting true position
- def true_pos(pos):
- return tuple([x + y + 0.5 for x, y in zip(pos, origin)])
-
- # draw all the puyo circles
- for pos, puyo in np.ndenumerate(board):
- if puyo:
- draw_puyo(true_pos(pos), puyo)
-
- # connect to adjacent puyos (except nuisance and hidden row)
- for pos, puyo in np.ndenumerate(board):
- for direc in {(1, 0), (-1, 0), (0, 1), (0, -1)}:
- if not 0 <= pos[0] + direc[0] < board.shape[0]:
- continue
- elif not 0 <= pos[1] + direc[1] < board.shape[1] - nhidden:
- continue
- elif not 0 <= pos[1] < board.shape[1] - nhidden:
- continue
-
- other = board[pos[0] + direc[0], pos[1] + direc[1]]
- if puyo and other == puyo and puyo != "n":
- connect_puyo(true_pos(pos), direc, puyo)
-
- # draw all the puyo faces
- for pos, puyo in np.ndenumerate(board):
- if puyo:
- draw_face(true_pos(pos), puyo)
-
- # outline the puyos with a darker color
- for pos, puyo in np.ndenumerate(board):
- for direc in {(1, 0), (-1, 0), (0, 1), (0, -1)}:
- if not 0 <= pos[0] + direc[0] < board.shape[0]:
- if puyo:
- outline_puyo(true_pos(pos), direc, puyo, join=False)
- continue
- elif not 0 <= pos[1] + direc[1] < board.shape[1] - nhidden:
- if puyo:
- outline_puyo(true_pos(pos), direc, puyo, join=False)
- continue
- elif not 0 <= pos[1] < board.shape[1] - nhidden:
- if puyo:
- outline_puyo(true_pos(pos), direc, puyo, join=False)
- continue
-
- other = board[pos[0] + direc[0], pos[1] + direc[1]]
- if puyo and other == puyo and puyo != "n":
- outline_puyo(true_pos(pos), direc, puyo, join=True)
- elif puyo:
- outline_puyo(true_pos(pos), direc, puyo, join=False)
-
-
- at print_tikz
-def draw_face(pos=(0, 0), puyo="r"):
- def tikz_shift(shift=(0, 0)):
- total_shift = pos[0] + shift[0], pos[1] + shift[1]
- return "[xshift={0}cm,yshift={1}cm]".format(*total_shift)
-
- tikz = "\\draw[white,semithick]"
- if puyo == "p":
- tikz += " ({0}150:{1}) -- ({0}-30:{1});".format(tikz_shift(), PUYO_RADIUS)
- elif puyo == "r":
- tikz += " ({0}150:{1}) -- ({0}0,0) -- ({0}30:{1});".format(
- tikz_shift(), PUYO_RADIUS
- )
- elif puyo == "g":
- tikz += " ({0}-90:{1}) arc (-90:0:{1})".format(
- tikz_shift((-PUYO_RADIUS, PUYO_RADIUS)), PUYO_RADIUS
- )
- tikz += " ({0}-90:{1}) arc (-90:-180:{1});".format(
- tikz_shift((PUYO_RADIUS, PUYO_RADIUS)), PUYO_RADIUS
- )
- elif puyo == "b":
- tikz += " ({0}180:{1}) -- ({0}90:{2}) -- ({0}0:{1});".format(
- tikz_shift(), PUYO_RADIUS, PUYO_RADIUS * np.sin(np.deg2rad(30))
- )
- elif puyo == "y":
- tikz += " ({0}150:{1}) -- ({0}30:{1});".format(tikz_shift(), PUYO_RADIUS)
- elif puyo == "n":
- tikz += " ({0}210:{1}) -- ({0}-30:{1});".format(tikz_shift(), PUYO_RADIUS)
- else:
- tikz = ""
-
- return tikz
-
-
- at print_tikz
-def draw_puyo(pos=(0, 0), puyo="r"):
- tikz = "\\draw[{0},fill={0}]".format(COLORS[puyo])
- tikz += " ({0},{1}) circle ({2})".format(*pos, PUYO_RADIUS)
- return tikz
-
-
- at print_tikz
-def connect_puyo(pos=(0, 0), direc=(1, 0), puyo="r"):
- phi, join1, join2 = connect_puyo_params(pos, direc)
- tikz = "\\draw[{0},fill={0}]".format(COLORS[puyo])
- tikz += " ([xshift={0}cm,yshift={1}cm]".format(*pos)
- tikz += "{0}:{2}) arc ({0}:{1}:{2})".format(phi - 45, phi + 45, PUYO_RADIUS)
- tikz += " to[out={0},in={1}] ({2},{3})".format(phi - 45, phi - 180, *join1)
- tikz += " -- ({0},{1})".format(*join2)
- tikz += " to[out={0},in={1}] cycle".format(phi - 180, phi + 45)
- return tikz
-
-
- at print_tikz
-def outline_puyo(pos=(0, 0), direc=(1, 0), puyo="r", join=False):
- phi, join1, join2 = connect_puyo_params(pos, direc)
- tikz = "\\draw[{0}]".format("dark" + COLORS[puyo])
-
- if join:
- tikz += " ([xshift={0}cm,yshift={1}cm]".format(*pos)
- tikz += "{0}:{1})".format(phi + 45, PUYO_RADIUS)
- tikz += " to[out={0},in={1}] ({2},{3})".format(phi - 45, phi - 180, *join1)
- tikz += " ({0},{1})".format(*join2)
- tikz += " to[out={0},in={1}]".format(phi - 180, phi + 45)
- tikz += " ([xshift={0}cm,yshift={1}cm]".format(*pos)
- tikz += "{0}:{1})".format(phi - 45, PUYO_RADIUS)
- else:
- tikz += " ([xshift={0}cm,yshift={1}cm]".format(*pos)
- tikz += "{0}:{2}) arc ({0}:{1}:{2})".format(phi - 45, phi + 45, PUYO_RADIUS)
-
- return tikz
-
-
-def connect_puyo_params(pos, direc):
- """Determine the path angle and midpoint locations."""
- phi = np.rad2deg(np.arctan2(direc[1], direc[0])) % 360
- x, y1, y2 = 0.5, PUYO_JOIN, -PUYO_JOIN
-
- c, s = np.cos(np.deg2rad(phi)), np.sin(np.deg2rad(-phi))
- j = np.matrix([[c, s], [-s, c]])
-
- def rotate_point(y):
- m = np.dot(j, [x, y])
- return float(m.T[0]) + pos[0], float(m.T[1]) + pos[1]
-
- return phi, rotate_point(y1), rotate_point(y2)
-
-
-def excel_cols(upper=True):
- n = 1
- letters = string.ascii_uppercase if upper else string.ascii_lowercase
- while True:
- yield from ("".join(group) for group in itertools.product(letters, repeat=n))
- n += 1
Modified: trunk/Master/tlpkg/libexec/ctan2tds
===================================================================
--- trunk/Master/tlpkg/libexec/ctan2tds 2020-12-26 00:54:10 UTC (rev 57230)
+++ trunk/Master/tlpkg/libexec/ctan2tds 2020-12-26 21:41:12 UTC (rev 57231)
@@ -2115,7 +2115,6 @@
'ptex-base', '\.(ini|lib|src)$|(ascii-jplain|kinsoku|ptex).tex$',
'ptex-manual', 'NULL', # keep ptex-manual.sty in doc
'punk', 'NULL', # have separate punk-latex
- 'puyotikz', '\.py|' . $standardtex,
'pwebmac', 'pwebmac.tex',
'qobitree', 'qobitree.tex',
'r_und_s', '\.tex|\.sty',
@@ -3253,6 +3252,7 @@
'pgfmolbio' => '\.lua$',
'placeat' => '\.lua$',
'pst-pdf' => '\.bat(.w95)?$',
+ 'puyotikz' => '\.py$',
'pythontex' => '([23]|_.*)\.py$',
'shipunov' => '\.(bat|sh|pl)$',
'songs' => '\.lua$',
More information about the tex-live-commits
mailing list.