diff options
-rw-r--r-- | Master/texmf-dist/doc/context/third/squares/LICENSE | 21 | ||||
-rw-r--r-- | Master/texmf-dist/doc/context/third/squares/README.md | 43 | ||||
-rw-r--r-- | Master/texmf-dist/doc/context/third/squares/VERSION | 1 | ||||
-rw-r--r-- | Master/texmf-dist/tex/context/third/squares/t-squares.lua | 306 | ||||
-rw-r--r-- | Master/texmf-dist/tex/context/third/squares/t-squares.mklx | 194 | ||||
-rwxr-xr-x | Master/tlpkg/bin/tlpkg-ctan-check | 2 | ||||
-rwxr-xr-x | Master/tlpkg/bin/tlpkginfo | 1 | ||||
-rwxr-xr-x | Master/tlpkg/libexec/ctan2tds | 3 | ||||
-rw-r--r-- | Master/tlpkg/tlpsrc/collection-context.tlpsrc | 1 | ||||
-rw-r--r-- | Master/tlpkg/tlpsrc/context-squares.tlpsrc | 2 |
10 files changed, 573 insertions, 1 deletions
diff --git a/Master/texmf-dist/doc/context/third/squares/LICENSE b/Master/texmf-dist/doc/context/third/squares/LICENSE new file mode 100644 index 00000000000..abb812c0164 --- /dev/null +++ b/Master/texmf-dist/doc/context/third/squares/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2023 Jairo A. del Rio + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Master/texmf-dist/doc/context/third/squares/README.md b/Master/texmf-dist/doc/context/third/squares/README.md new file mode 100644 index 00000000000..9fd88f81d6b --- /dev/null +++ b/Master/texmf-dist/doc/context/third/squares/README.md @@ -0,0 +1,43 @@ +# squares + +This module only provides two commands: + +1. `\magicsquare` typesets a magic square. +2. `\latinsquare` typesets a Latin square. + +Both `\magicsquare` and `\latinsquare` understand the same set of +parameters: + +```tex +\setupmagicsquare + [size=2em, + align={middle,lohi}, + renderingsetup=none, + n=5] % and \setupTABLE parameters... +``` + +Magic and Latin squares are typesets via natural tables, i.e., by using a +`\bTABLE` ... `\eTABLE` environment. I'd rather use `setups`, but it'd +clash with another key already taken by `\setupTABLE`. + +Currently only two rendering setups are available: `none` (it does +nothing), and `color` (cells colorfully painted across the HSV hue range). +I promise more setups will be available soon, though. + +You might be more impatient and want to define your own. So, this is how: + +```tex +\unprotect +\startsetups[\????magicsquare:\c!renderingsetup:mysetup] +% Idk, something like this? +% \setupTABLE[r][odd][background=color,backgroundcolor=red] +% For natural table tuning, see https://wiki.contextgarden.net/TABLE +% etc. +\stopsetups +\protect + +\magicsquare[n=7,renderingsetup=mysetup] +``` + +_Caveat emptor_: this module is only for ConTeXt LMTX. I no longer use +ConTeXt MKIV, so no support is provided, sorry. diff --git a/Master/texmf-dist/doc/context/third/squares/VERSION b/Master/texmf-dist/doc/context/third/squares/VERSION new file mode 100644 index 00000000000..5425d1161a2 --- /dev/null +++ b/Master/texmf-dist/doc/context/third/squares/VERSION @@ -0,0 +1 @@ +2023-08-01 diff --git a/Master/texmf-dist/tex/context/third/squares/t-squares.lua b/Master/texmf-dist/tex/context/third/squares/t-squares.lua new file mode 100644 index 00000000000..c0e613a3e01 --- /dev/null +++ b/Master/texmf-dist/tex/context/third/squares/t-squares.lua @@ -0,0 +1,306 @@ +if not modules then modules = {} end modules["t-squares"] = { + version = "2023-08-01", + comment = "Magic and Latin squares", + author = "Jairo A. del Rio", + copyright = "Jairo A. del Rio", + license = "MIT License", +} + +local interfaces = interfaces +local implement = interfaces.implement +local magic_reporter = logs.reporter("squares", "magic") +local latin_reporter = logs.reporter("squares", "latin") +local random = math.random + +-- https://www.iupindia.in/910/IJCM_Magic_Square_Construction_Algorithms34.pdf +-- https://arxiv.org/pdf/1402.3273.pdf +-- https://en.wikipedia.org/wiki/Conway%27s_LUX_method_for_magic_squares + +-- Helpers +local function init(s) + local q = {} + for j = 1, s do + q[j] = {} + local c = q[j] + for i = 1, s do + c[i] = 0 + end + end + return q +end + +-- Odd numbers + +local function magic_01(n) + local res = init(n) + local i, j = 1 + (n >> 1), 1 + local k, l + res[i][j] = 1 + for key = 2, n * n do + k = 2 <= i and i - 1 or n + l = 2 <= j and j - 1 or n + if res[k][l] > 0 then + i = i % n + 1 + else + i, j = k, l + end + res[i][j] = key + end + return res +end + +local function magic_02(N) + local res = init(N) + local n = N // 2 + local lux = init(n) + local L, U, X = 1, 2, 4 + local x1, x2, x3, x4 = -1, 0, -1, 0 + for i = 1, n do + for j = 1, n // 2 + 1 do + lux[i][j] = L + end + end + for i = 1, n do + lux[i][n // 2 + 2] = U + end + for j = n // 2 + 3, n do + for i = 1, n do + lux[i][j] = X + end + end + lux[n // 2 + 1][n // 2 + 1] = U + lux[n // 2 + 1][n // 2 + 2] = L + local i, j = 1, 1 + (n >> 1) + local k, l + res[2 * i + x1][2 * j - 1] = 1 + res[2 * i + x2][2 * j] = 2 + res[2 * i + x3][2 * j] = 3 + res[2 * i + x4][2 * j - 1] = 4 + for key = 2, n * n do + k = 2 <= i and i - 1 or n + l = 2 <= j and j - 1 or n + if res[2 * k][2 * l] > 0 then + i = i % n + 1 + else + i, j = k, l + end + if lux[i][j] == L then + x1, x2, x3, x4 = -1, 0, -1, 0 + elseif lux[i][j] == U then + x1, x2, x3, x4 = 0, 0, -1, -1 + else + x1, x2, x3, x4 = 0, -1, 0, -1 + end + res[2 * i + x1][2 * j] = 4 * (key - 1) + 1 + res[2 * i + x2][2 * j - 1] = 4 * (key - 1) + 2 + res[2 * i + x3][2 * j - 1] = 4 * (key - 1) + 3 + res[2 * i + x4][2 * j] = 4 * key + end + return res +end + +local function magic_03(n) + local res = init(n) + for x = 1, n, 4 do + for y = 1, n, 4 do + local q = 0 + for i = x, x + 3 do + q = q + 1 + local q1 = 0 + for j = y, y + 3 do + q1 = q1 + 1 + if i == j or i + j == 5 or q + q1 == 5 or q == q1 then + res[i][j] = n * (i - 1) + j + else + res[i][j] = n * n - ((i - 1) * n + j) + 1 + end + end + end + end + end + return res +end + +local currentsquare = nil + +local function magicsquare(n) + local r = n & 3 + if r == 0 then + return magic_03(n) + elseif r == 2 then + return magic_02(n) + end + return magic_01(n) +end + +local bTR, eTR = context.bTR, context.eTR +local bTD, eTD = context.bTD, context.eTD + +implement({ + name = "magicsquarecell", + arguments = { "integer", "integer" }, + actions = function(x, y) + context(currentsquare and currentsquare[x][y] or "") + end, +}) + +implement({ + name = "magicsquareinit", + arguments = { "integer" }, + actions = function(n) + if n > 0 and n ~= 2 then + currentsquare = magicsquare(n) + else + magic_reporter(("Invalid number %d: nothing will be provided"):format(n)) + end + end, +}) + +implement({ + name = "magicsquarereset", + actions = function() + currentsquare = nil + end, +}) + +implement({ + name = "magicsquare", + actions = function() + local r = currentsquare + if r then + local n = #r + for i = 1, n do + bTR() + for j = 1, n do + bTD() + context(r[i][j]) + eTD() + end + eTR() + end + else + magic_reporter("Magic square not initialized...") + return + end + end, +}) + +local function rand2(a, b) + if random(2) == 1 then + return a, b + else + return b, a + end +end + +local function latinsquare(n) + local xy, xz, yz = {}, {}, {} + local mxy, mxz, myz + local m + local proper = true + local min = n * n * n + for i = 1, n do + xy[i] = {} + yz[i] = {} + xz[i] = {} + end + for i = 1, n do + for j = 1, n do + local k = (i + j - 2) % n + 1 + xy[i][j] = k + xz[i][k] = j + yz[j][k] = i + end + end + for _ = 1, min do + local i, j, k, i2, j2, k2, i2_, j2_, k2_ + if proper then + i, j, k = random(n), random(n), random(n) + while xy[i][j] == k do + i, j, k = random(n), random(n), random(n) + end + i2 = yz[j][k] + j2 = xz[i][k] + k2 = xy[i][j] + i2_, j2_, k2_ = i, j, k + else + i, j, k = m[1], m[2], m[3] + i2, i2_ = rand2(yz[j][k], myz) + j2, j2_ = rand2(xz[i][k], mxz) + k2, k2_ = rand2(xy[i][j], mxy) + end + proper = xy[i2][j2] == k2 + if not proper then + m = { i2, j2, k2 } + mxy = xy[i2][j2] + myz = yz[j2][k2] + mxz = xz[i2][k2] + end + xy[i][j] = k2_ + xy[i][j2] = k2 + xy[i2][j] = k2 + xy[i2][j2] = k + + yz[j][k] = i2_ + yz[j][k2] = i2 + yz[j2][k] = i2 + yz[j2][k2] = i + + xz[i][k] = j2_ + xz[i][k2] = j2 + xz[i2][k] = j2 + xz[i2][k2] = j + end + return xy +end + +local currentlatin = nil + +implement({ + name = "latinsquarecell", + arguments = { "integer", "integer" }, + actions = function(x, y) + context(currentlatin and currentlatin[x][y] or "") + end, +}) + +implement({ + name = "latinsquareinit", + arguments = { "integer" }, + actions = function(n) + if n > 0 then + currentlatin = latinsquare(n) + else + latin_reporter(("Invalid number %d: nothing will be provided"):format(n)) + end + end, +}) + +implement({ + name = "latinsquarereset", + actions = function() + currentlatin = nil + end, +}) + +implement({ + name = "latinsquare", + actions = function() + local r = currentlatin + if r then + local n = #r + for i = 1, n do + bTR() + for j = 1, n do + bTD() + context(r[i][j]) + eTD() + end + eTR() + end + else + latin_reporter("Latin square not initialized...") + return + end + end, +}) diff --git a/Master/texmf-dist/tex/context/third/squares/t-squares.mklx b/Master/texmf-dist/tex/context/third/squares/t-squares.mklx new file mode 100644 index 00000000000..967ba97a74f --- /dev/null +++ b/Master/texmf-dist/tex/context/third/squares/t-squares.mklx @@ -0,0 +1,194 @@ +%D \module +%D [ file=t-squares, +%D version=2023-08-01, +%D title=\CONTEXT\ User Module, +%D subtitle=Squares for ConTeXt, +%D author=Jairo A. del Rio, +%D date=\currentdate, +%D copyright=Jairo A. del Rio, +%D email=jairoadelrio6@gmail.com, +%D license=MIT License] + +%C Copyright (c) 2023 Jairo A. del Rio +%C +%C Permission is hereby granted, free of charge, to any person obtaining +%C a copy of this software and associated documentation files (the +%C "Software"), to deal in the Software without restriction, including +%C without limitation the rights to use, copy, modify, merge, publish, +%C distribute, sublicense, and/or sell copies of the Software, and to +%C permit persons to whom the Software is furnished to do so, subject to +%C the following conditions: +%C +%C The above copyright notice and this permission notice shall be +%C included in all copies or substantial portions of the Software. +%C +%C THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +%C EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +%C MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +%C IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +%C CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +%C TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +%C SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +\writestatus{loading}{Squares for ConTeXt!} + +\startmodule[squares] + +\unprotect + +\registerctxluafile{t-squares}{autosuffix} + +\installnamespace {magicsquare} +\installsimplecommandhandler\????magicsquare{magicsquare}\????magicsquare + +\startsetups[\????magicsquare:\c!renderingsetup:\v!color] +\dorecurse{\numexpr\magicsquareparameter\c!n}{ + \dorecurse{\numexpr\magicsquareparameter\c!n}{ + \definecolor[\????magicsquare:\v!color:##1:####1] + [h=\the\numexpr(360*\clf_magicsquarecell\numexpr##1\relax\numexpr####1\relax):(\magicsquareparameter\c!n*\magicsquareparameter\c!n)\relax, + v=1, + s=0.5]% + \setupTABLE[####1][##1] + [\c!background=\v!color, + \c!backgroundcolor=\????magicsquare:\v!color:##1:####1]% + } +} +\stopsetups + +\setupmagicsquare + [\c!n=5, + \c!size=2em, + \c!align={\v!middle,\v!lohi}, + \c!renderingsetup=\v!none] + +\tolerant\protected\def\magicsquare[#parameters]% +{\begingroup% + \ifarguments\or + \setupmagicsquare[#parameters]% + \fi + \clf_magicsquareinit\numexpr\magicsquareparameter\c!n\relax% + \ifcstok{\magicsquareparameter\c!renderingsetup}\emptytoks + \else + \directsetup{\????magicsquare:\c!renderingsetup:\magicsquareparameter\c!renderingsetup}% + \fi + \bTABLE + [#parameters, + \c!width=\magicsquareparameter\c!size, + \c!height=\magicsquareparameter\c!size, + \c!align=\magicsquareparameter\c!align]% + \clf_magicsquare% + \eTABLE% + \clf_magicsquarereset% + \endgroup} + +\installnamespace{latinsquare} +\installsimplecommandhandler\????latinsquare{latinsquare}\????latinsquare + +\startsetups[\????latinsquare:\c!renderingsetup:\v!none] +\stopsetups + +\startsetups[\????latinsquare:\c!renderingsetup:\v!color] +\dorecurse{\numexpr\latinsquareparameter\c!n}{ + \definecolor[\????latinsquare:\v!color:##1][h=\the\numexpr(360*##1):(\magicsquareparameter\c!n)\relax,v=1,s=0.5]% + \dorecurse{\numexpr\latinsquareparameter\c!n}{ + \setupTABLE[####1][##1] + [\c!background=\v!color, + \c!backgroundcolor=\????latinsquare:\v!color:\clf_latinsquarecell\numexpr##1\relax\numexpr####1\relax]% + } +} +\stopsetups + +\setuplatinsquare + [\c!n=5, + \c!size=2em, + \c!align={\v!middle,\v!lohi}, + \c!renderingsetup=\v!none] + +\tolerant\protected\def\latinsquare[#parameters]% +{\begingroup% + \ifarguments\or + \setuplatinsquare[#parameters]% + \fi + \clf_latinsquareinit\numexpr\latinsquareparameter\c!n\relax% + \ifcstok{\latinsquareparameter\c!renderingsetup}\emptytoks + \else + \directsetup{\????latinsquare:\c!renderingsetup:\latinsquareparameter\c!renderingsetup}% + \fi + \bTABLE + [#parameters, + \c!width=\latinsquareparameter\c!size, + \c!height=\latinsquareparameter\c!size, + \c!align=\latinsquareparameter\c!align]% + \clf_latinsquare% + \eTABLE% + \clf_latinsquarereset% + \endgroup} + +\protect + +\stopmodule + +\continueifinputfile{t-squares.mklx} + +\starttext + +\startsection[title=\type{\magicsquare}] + +% Magic squares + +\startbuffer +\magicsquare[n=6,renderingsetup=color] +\stopbuffer + +\typebuffer + +\getbuffer + +\startbuffer +\magicsquare[n=7,renderingsetup=color] +\stopbuffer + +\typebuffer + +\getbuffer + +\startbuffer +\magicsquare[n=8,renderingsetup=color] +\stopbuffer + +\typebuffer + +\getbuffer + +\startbuffer +\magicsquare[n=2] +\stopbuffer + +\typebuffer + +\getbuffer + +\stopsection + +% Latin squares + +\startsection[title=\type{\latinsquare}] + +\startbuffer +\latinsquare[n=7] +\stopbuffer + +\typebuffer + +\getbuffer + +\startbuffer +\latinsquare[n=5,renderingsetup=color] +\stopbuffer + +\typebuffer + +\getbuffer + +\stopsection +\stoptext diff --git a/Master/tlpkg/bin/tlpkg-ctan-check b/Master/tlpkg/bin/tlpkg-ctan-check index 0067ac5897c..8bf5ca4196d 100755 --- a/Master/tlpkg/bin/tlpkg-ctan-check +++ b/Master/tlpkg/bin/tlpkg-ctan-check @@ -216,7 +216,7 @@ my @TLP_working = qw( context-gnuplot context-handlecsv context-letter context-mathsets context-notes-zh-cn context-pocketdiary - context-simpleslides context-sudoku + context-simpleslides context-squares context-sudoku context-transliterator context-typescripts context-vim context-visualcounter continue contour contracard conv-xkv convbkmk diff --git a/Master/tlpkg/bin/tlpkginfo b/Master/tlpkg/bin/tlpkginfo index c275afd2470..252cd9aedbc 100755 --- a/Master/tlpkg/bin/tlpkginfo +++ b/Master/tlpkg/bin/tlpkginfo @@ -159,6 +159,7 @@ sub find_ctan_dir { "macros/latex/contrib/$me", # most everything "macros/generic/diagrams/$me", # circ "macros/generic/$me", # abbr + "macros/context/contrib/$me", # context-* "language/vietnamese/$me/unpacked", # vntex "language/polish/$me", # cc-pl "language/japanese/$me", # e.g., jfontmaps diff --git a/Master/tlpkg/libexec/ctan2tds b/Master/tlpkg/libexec/ctan2tds index 71f56e528f5..bd7a62460d2 100755 --- a/Master/tlpkg/libexec/ctan2tds +++ b/Master/tlpkg/libexec/ctan2tds @@ -351,6 +351,7 @@ chomp (my $ctan_root = `tlpkginfo --ctan-root`); 'context-construction-plan', "die 'skipping, obsolete on CTAN'", 'context-cyrillicnumbers', "&MAKEcopy", 'context-degrade', "die 'skipping, obsolete on CTAN'", + 'context-enigma', "die 'skipping, use separate enigma package on CTAN'", 'context-fancybreak', "die 'skipping, obsolete on CTAN'", 'context-filter', "&MAKEcopy", 'context-fixme', "die 'skipping, obsolete per author'", @@ -366,6 +367,7 @@ chomp (my $ctan_root = `tlpkginfo --ctan-root`); 'context-letter', "&MAKEcopy", 'context-lettrine', "die 'skipping, obsolete per author'", 'context-lilypond', "die 'skipping, obsolete per author'", + 'context-lua-widow-control', "die 'skipping, use separate lua-widow-control package on CTAN'", 'context-lucida-bright-support', "die 'skipping, nonfree font'", 'context-mathsets', "&MAKEcopy", 'context-pocketdiary', "&MAKEcopy", @@ -374,6 +376,7 @@ chomp (my $ctan_root = `tlpkginfo --ctan-root`); 'context-sgf', "die 'skipping, obsolete per author'", 'context-simplefonts', "die 'skipping, obsolete on CTAN'", 'context-simpleslides',"&MAKEcopy", + 'context-squares', "&MAKEcopy", 'context-sudoku', "&MAKEcopy", 'context-taspresent', "&MAKEcopy", 'context-texlive', "die 'skipping, maintained in TL, see .tlpsrc'", diff --git a/Master/tlpkg/tlpsrc/collection-context.tlpsrc b/Master/tlpkg/tlpsrc/collection-context.tlpsrc index 3445d818019..19bcf5cb688 100644 --- a/Master/tlpkg/tlpsrc/collection-context.tlpsrc +++ b/Master/tlpkg/tlpsrc/collection-context.tlpsrc @@ -20,6 +20,7 @@ depend context-mathsets depend context-notes-zh-cn depend context-pocketdiary depend context-simpleslides +depend context-squares depend context-sudoku depend context-transliterator depend context-typescripts diff --git a/Master/tlpkg/tlpsrc/context-squares.tlpsrc b/Master/tlpkg/tlpsrc/context-squares.tlpsrc new file mode 100644 index 00000000000..80e71c2e536 --- /dev/null +++ b/Master/tlpkg/tlpsrc/context-squares.tlpsrc @@ -0,0 +1,2 @@ +category ConTeXt +depend context |