diff options
Diffstat (limited to 'Master/texmf-dist/tex/luatex')
-rw-r--r-- | Master/texmf-dist/tex/luatex/autopuncitems/autopuncitems.lua | 106 | ||||
-rw-r--r-- | Master/texmf-dist/tex/luatex/autopuncitems/autopuncitems.sty | 56 |
2 files changed, 162 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/luatex/autopuncitems/autopuncitems.lua b/Master/texmf-dist/tex/luatex/autopuncitems/autopuncitems.lua new file mode 100644 index 00000000000..5e8e5b10c64 --- /dev/null +++ b/Master/texmf-dist/tex/luatex/autopuncitems/autopuncitems.lua @@ -0,0 +1,106 @@ +--% Kale Ewasiuk (kalekje@gmail.com) +--% 2021-12-20 +--% Copyright (C) 2021 Kale Ewasiuk +--% +--% 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. + + +local ap = {} -- module table + +function ap.rtrim(s) + return (s:gsub("^(.-)%s*$", "%1")) +end + +ap.punc = {} +ap.punc = {'.', '; and'} -- punctuation table, 1 is last val, 2 is 2nd last val +ap.punc[0] = ';' -- [0] is default punctuation +ap.total = 0 -- total num of items (int) +ap.curr = 0 -- current item we're on (int) +ap.itemp = '\9' -- temporary item, item which WILL be affected by autopunc +ap.item = '\\item' -- item +ap.omit = '\\APomit' -- flag for hiding an item from punc and count, acts as if item is not there +ap.pass = '\\APpass' -- flag for passing item from punc, but still considered in count +ap.code = 0 -- code for skipping punc if > 0, keep in count if == 1, omit from count if == 2 + +ap.autopassnested = true + +function ap.start(s) + ap.curr = 0 + _, ap.total = s:gsub(ap.itemp, '') + local _, omit = s:gsub(ap.omit, '') + ap.total = ap.total - omit +end + +function ap.setcode(s) + local _, code1 = s:gsub(ap.pass, '', 1) + local _, code2 = s:gsub(ap.omit, '', 1) + ap.code = code1 + 2*code2 +end + +function ap.addcount(s) + ap.setcode(s) + if ap.code < 2 then -- if not omitting, we still keep counter going + ap.curr = ap.curr + 1 -- increment counter + end +end + +function ap.getdelim() + local d = '' + if ap.code == 0 then -- d limiter -- if not passing look at punctuation table for delimiter + d = ap.punc[ap.total-ap.curr+1] or ap.punc[0] + end + return d +end + +function ap.protectnest(s) + local x = '' + if ap.autopassnested then x = ap.pass..'{}' end + s = s:gsub("\0", "\0", 0) -- dummy replacement to make code easier + :gsub("\\begin%s*{itemize}", x.."\1%0") -- pad \1 and \2 in inner envirnments + :gsub("\\end%s*{itemize}", "%0\2") + :gsub("\\begin%s*{enumerate}", x.."\1%0") + :gsub("\\end%s*{enumerate}", "%0\2") + :gsub("\\begin%s*{description}", x.."\1%0") + :gsub("\\end%s*{description}", "%0\2") + :gsub("%b\1\2", "\0%0\0") -- use bracket to place \0 (on OUTER) nested lists only + :gsub("(%Z*)%z?(%Z*)%z?", -- only affect matches outside list + function(a, b) return a:gsub(ap.item, ap.itemp)..b:gsub("[\1\2]", "") end) + return s +end + + +function ap.go(s) + s = ap.protectnest(s) + ap.start(s) -- start counters + --texio.write_nl('yooo...'..s) + s = s:gsub(ap.itemp, '\0\0'):gsub('\0', '', 1) -- make all items \0\0 then change first item to one \0 + s = s:gsub('(%z)(%Z*)(%z?)', -- find betwen \0 .. \0 + function(it, s, _it) -- discarding duplicate item '_it' that was made in first gsub + ap.addcount(s) -- add count, helps determine delimiter + return ap.rtrim(it..s)..ap.getdelim()..' ' + end + ) + s = s:gsub('\0', ap.itemp) -- replace items + s = s:gsub(ap.itemp, ap.item) -- replace items + return s +end + +return ap
\ No newline at end of file diff --git a/Master/texmf-dist/tex/luatex/autopuncitems/autopuncitems.sty b/Master/texmf-dist/tex/luatex/autopuncitems/autopuncitems.sty new file mode 100644 index 00000000000..8045fa4737f --- /dev/null +++ b/Master/texmf-dist/tex/luatex/autopuncitems/autopuncitems.sty @@ -0,0 +1,56 @@ +% Kale Ewasiuk (kalekje@gmail.com) +% 2021-12-20 +% Copyright (C) 2021 Kale Ewasiuk +% +% 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. + + +\ProvidesPackage{autopuncitems}[2021-12-20] + +\RequirePackage{enumitem} +\RequirePackage{luacode} + +\luadirect{autopuncitems = require'autopuncitems'} + +\newcommand{\APomit}{} % blank flag used in '\item' to hide it from counting and auto +\newcommand{\APpass}{} % blank flag used in '\item', autopunc is skipped, but count is still + +\newcommand{\disableAPautopassnest}{\luadirect{autopuncitems.autopassnested = false}} +\newcommand{\enableAPautopassnest}{\luadirect{autopuncitems.autopassnested = true}} + +\NewDocumentCommand{\setAPeach}{m m m}{\setAPdef{#1}\setAPseclast{#2}\setAPlast{#3}} % set each one, default, second last, last +\NewDocumentCommand{\setAPall}{m}{\setAPdef{#1}\setAPseclast{#1}\setAPlast{#1}} % set all the same +\NewDocumentCommand{\setAPdef}{m}{\luadirect{autopuncitems.punc[0] = \luastring{#1}}} % default punc value +\NewDocumentCommand{\setAPlast}{m}{\luadirect{autopuncitems.punc[1] = \luastring{#1}}} % second last punc value +\NewDocumentCommand{\setAPseclast}{m}{\luadirect{autopuncitems.punc[2] = \luastring{#1}}} % final punc value + +\NewDocumentEnvironment{AutoPuncItemize}{ +b }{ +% \luadirect{texio.write_nl('auto >>>'..autopuncitems.go(\luastringN{#1}))} + \luadirect{tex.print(autopuncitems.go(\luastringN{#1}))} +}{} + +\SetEnumitemKey{autopunc}{ + first*=\expandafter\AutoPuncItemize, + after=\endAutoPuncItemize, +} + + + |