diff options
author | Karl Berry <karl@freefriends.org> | 2022-09-14 20:06:26 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2022-09-14 20:06:26 +0000 |
commit | 3a713bb64ca48f58c12e5a9cdabd1b6a3669bd94 (patch) | |
tree | b281608d49f0a3a99f7a7ea045c222792ab0069b /Master/texmf-dist/tex/lualatex | |
parent | 78a6ee41fa408e6132e77a658b396bf8d5998a99 (diff) |
piton (14sep22)
git-svn-id: svn://tug.org/texlive/trunk@64393 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/tex/lualatex')
-rw-r--r-- | Master/texmf-dist/tex/lualatex/piton/piton.lua | 473 | ||||
-rw-r--r-- | Master/texmf-dist/tex/lualatex/piton/piton.sty | 288 |
2 files changed, 761 insertions, 0 deletions
diff --git a/Master/texmf-dist/tex/lualatex/piton/piton.lua b/Master/texmf-dist/tex/lualatex/piton/piton.lua new file mode 100644 index 00000000000..8ef48f45b1f --- /dev/null +++ b/Master/texmf-dist/tex/lualatex/piton/piton.lua @@ -0,0 +1,473 @@ +-- -*- coding: utf-8 ; -*- +-- +-- This is file 'piton.lua' which is a part of the Latex package 'piton' +-- Copyright (C) 2022 by F. Pantigny + +-- This file may be distributed and/or modified under the +-- conditions of the Latex Project Public License, either +-- version 1.3 of this license or (at your option) any later +-- version. The latest version of this license is in: +-- +-- http://www.Latex-project.org/lppl.txt +-- +-- and version 1.3 or later is part of all distributions of +-- Latex version 2005/12/01 or later. + + +-- This file is part of the version 0.55 of the package 'piton' + +local P, S, V , C , Ct, Cc, Cf = lpeg.P, lpeg.S, lpeg.V, lpeg.C, lpeg.Ct, lpeg.Cc, lpeg.Cf + + +--[[ By convention, a capture which provides as value a table (and not a string), provides, in fact, +a string (the first element of the table) which is a formatting LaTeX instruction (it will be +thrown back to TeX with normal catcodes (ant not ``other'' catcode for everybody).]] + +local function L(string) + return lpeg.Cc ( { string } ) +end + +local function K(pattern, style) + return + L ( "{\\PitonStyle{" .. style .. "}{" ) + * lpeg.C(pattern) + * L ( "}}" ) +end + + +--[[ The text in "escape" (between begin_escape and end_escape) is captured +and put in a table (with only one component). Indeed, we have decided that a capture +which is encapsulated in a table must be transmitted to TeX with the normal TeX catcodes.]] + +local Escape = P(begin_escape) + * Ct ( C ( ( 1 - P(end_escape) ) ^ 1 ) ) + * P(end_escape) + +local EOL = ( P "\r" ) * L ( "\\pitonEOL" ) + + + +lpeg.locale(lpeg) -- mandatory + +local alpha , digit , space , punct = lpeg.alpha , lpeg.digit , lpeg.space , lpeg.punct + +local letter = alpha + S"âàçéèêëïîôûüÂÀÇÉÈÊËÏÎÔÛÜ_" + +local alphanum = letter + digit + +local identifier = letter * alphanum ^ 0 + +local Identifier = C ( identifier ) + +local Space = C ( ( space - P "\r" ) ^ 1 ) + +local SkipSpace = C ( ( space - P "\r" ) ^ 0 ) + +local Punct = C ( punct ) + + +local Number = + K ( + ( digit^1 * P "." * digit^0 + digit^0 * P "." * digit^1 + digit^1 ) + * ( S "eE" * S "+-" ^ -1 * digit^1 ) ^ -1 + + digit^1 + , 'Number' ) + +local Word = C ( ( ( 1 - space ) - S "'\"\r[()]" - digit ) ^ 1 ) + +local Delim = C ( S "[()]" ) + + +local Keyword = + K ( P "assert" + P "break" + P "case" + P "continue" + P "del" + + P "elif" + P "else" + P "except" + P "exec" + P "finally" + P "for" + P "from" + + P "global" + P "if" + P "import" + P "lambda" + P "non local" + + P "pass" + P "return" + P "try" + P "while" + + P "with" + P "yield" + P "yield from" , + 'Keyword' ) + + K ( P "True" + P "False" + P "None" , 'Keyword.Constant' ) + + +local Builtin = + K ( P "__import__" + P "abs" + P "all" + P "any" + P "bin" + P "bool" + P "bytearray" + + P "bytes" + P "chr" + P "classmethod" + P "compile" + P "complex" + P "delattr" + + P "dict" + P "dir" + P "divmod" + P "enumerate" + P "eval" + P "filter" + + P "float" + P "format" + P "frozenset" + P "getattr" + P "globals" + P "hasattr" + + P "hash" + P "hex" + P "id" + P "input" + P "int" + P "isinstance" + P "issubclass" + + P "iter" + P "len" + P "list" + P "locals" + P "map" + P "max" + P "memoryview" + P "min" + + P "next" + P "object" + P "oct" + P "open" + P "ord" + P "pow" + P "print" + P "property" + + P "range" + P "repr" + P "reversed" + P "round" + P "set" + P "setattr" + P "slice" + + P "sorted" + P "staticmethod" + P "str" + P "sum" + P "super" + P "tuple" + P "type" + + P "vars" + P "zip" , + 'Name.Builtin' ) + + +local Exception = + K ( "ArithmeticError" + P "AssertionError" + P "AttributeError" + + P "BaseException" + P "BufferError" + P "BytesWarning" + P "DeprecationWarning" + + P "EOFError" + P "EnvironmentError" + P "Exception" + P "FloatingPointError" + + P "FutureWarning" + P "GeneratorExit" + P "IOError" + P "ImportError" + + P "ImportWarning" + P "IndentationError" + P "IndexError" + P "KeyError" + + P "KeyboardInterrupt" + P "LookupError" + P "MemoryError" + P "NameError" + + P "NotImplementedError" + P "OSError" + P "OverflowError" + + P "PendingDeprecationWarning" + P "ReferenceError" + P "ResourceWarning" + + P "RuntimeError" + P "RuntimeWarning" + P "StopIteration" + + P "SyntaxError" + P "SyntaxWarning" + P "SystemError" + P "SystemExit" + + P "TabError" + P "TypeError" + P "UnboundLocalError" + P "UnicodeDecodeError" + + P "UnicodeEncodeError" + P "UnicodeError" + P "UnicodeTranslateError" + + P "UnicodeWarning" + P "UserWarning" + P "ValueError" + P "VMSError" + + P "Warning" + P "WindowsError" + P "ZeroDivisionError" + + P "BlockingIOError" + P "ChildProcessError" + P "ConnectionError" + + P "BrokenPipeError" + P "ConnectionAbortedError" + P "ConnectionRefusedError" + + P "ConnectionResetError" + P "FileExistsError" + P "FileNotFoundError" + + P "InterruptedError" + P "IsADirectoryError" + P "NotADirectoryError" + + P "PermissionError" + P "ProcessLookupError" + P "TimeoutError" + + P "StopAsyncIteration" + P "ModuleNotFoundError" + P "RecursionError" , + 'Exception' ) + +local RaiseException = K ( P "raise" , 'Keyword' ) * SkipSpace * Exception * C ( P "(" ) + +local ExceptionInConsole = Exception * C ( ( 1 - P "\r" ) ^ 0 ) * EOL + + +local Namespace = + K ( P "from" , 'Keyword' ) * Space * K ( alphanum^1 , 'Name.Namespace' ) + * ( Space * K ( P "import" , 'Keyword' ) ) ^ -1 + + +local ImportAs = K ( P "import" , 'Keyword' ) + * Space + * K ( identifier , 'Name.Namespace' ) + * ( SkipSpace * C ( P "," ) * SkipSpace * K ( identifier , 'Name.Namespace' ) ) ^ 0 + * ( + Space * K ( P "as" , 'Keyword' ) * Space * K ( identifier , 'Name.Namespace' ) + ) ^ 0 + +local Class = K ( P "class" , 'Keyword' ) * Space * K ( identifier , 'Name.Class' ) + +local Decorator = K ( P "@" * letter^1 , 'Name.Decorator' ) + +local SingleShortInterpol = + K ( P "{" , 'String.Interpol') + * K ( ( 1 - S "}':" ) ^ 0 , 'Interpol.Inside' ) + * C ( P ":" * (1 - S "}:'") ^ 0 ) ^ -1 + * K ( P "}" , 'String.Interpol' ) + +local DoubleShortInterpol = + K ( P "{" , 'String.Interpol' ) + * K ( ( 1 - S "}\":" ) ^ 0 , 'Interpol.Inside' ) + * ( K ( P ":" , 'String.Interpol' ) * C ( (1 - S "}:\"") ^ 0 ) ) ^ -1 + * K ( P "}" , 'String.Interpol' ) + +local SingleLongInterpol = + K ( P "{" , 'String.Interpol' ) + * K ( ( 1 - S "}:\r" - P "'''" ) ^ 0 , 'Interpol.Inside' ) + * C ( P ":" * (1 - S "}:\r" - P "'''" ) ^ 0 ) ^ -1 + * K ( P "}" , 'String.Interpol' ) + +local DoubleLongInterpol = + K ( P "{" , 'String.Interpol' ) + * K ( ( 1 - S "}:\r" - P "\"\"\"" ) ^ 0 , 'Interpol.Inside' ) + * C ( P ":" * (1 - S "}:\r" - P "\"\"\"" ) ^ 0 ) ^ -1 + * K ( P "}" , 'String.Interpol' ) + +local SingleShortPureString = C ( ( P "\\'" + P "{{" + P "}}" + 1 - S "{}'" ) ^ 1 ) + +local DoubleShortPureString = C ( ( P "\\\"" + P "{{" + P "}}" + 1 - S "{}\"" ) ^ 1 ) + +local SingleLongPureString = C ( ( 1 - P "'''" - S "{}'\r" ) ^ 1 ) + +local DoubleLongPureString = C ( ( 1 - P "\"\"\"" - S "{}\"\r" ) ^ 1 ) + +local SingleShortString = + L ( "{\\PitonStyle{String.Short}{" ) + * ( + C ( P "f'" + P "F'" ) + * ( SingleShortInterpol + SingleShortPureString ) ^ 0 + * C ( P "'" ) + + + C ( ( P "'" + P "r'" + P "R'" ) * ( P "\\'" + 1 - S "'\r" ) ^ 0 * P "'" ) + ) + * L ( "}}" ) + +local DoubleShortString = + L ( "{\\PitonStyle{String.Short}{" ) + * ( + C ( P "f\"" + P "F\"" ) + * ( DoubleShortInterpol + DoubleShortPureString ) ^ 0 + * C ( P "\"" ) + + + C ( ( P "\"" + P "r\"" + P "R\"" ) * ( P "\\\"" + 1 - S "\"\r" ) ^ 0 * P "\"" ) + ) + * L ( "}}" ) + + +local ShortString = SingleShortString + DoubleShortString + + +local SingleLongString = + L "{\\PitonStyle{String.Long}{" + * ( + C ( S "fF" * P "'''" ) + * ( SingleLongInterpol + SingleLongPureString ) ^ 0 + * L "}}" + * ( + EOL + + + L "{\\PitonStyle{String.Long}{" + * ( SingleLongInterpol + SingleLongPureString ) ^ 0 + * L "}}" + * EOL + ) ^ 0 + * L "{\\PitonStyle{String.Long}{" + * ( SingleLongInterpol + SingleLongPureString ) ^ 0 + + + C ( ( S "rR" ) ^ -1 * P "'''" * ( 1 - P "'''" - P "\r" ) ^ 0 ) + * L "}}" + * ( + L "{\\PitonStyle{String.Long}{" + * C ( ( 1 - P "'''" - P "\r" ) ^ 0 ) + * L "}}" + * EOL + ) ^ 0 + * L "{\\PitonStyle{String.Long}{" + * C ( ( 1 - P "'''" - P "\r" ) ^ 0 ) + ) + * C ( P "'''" ) + * L "}}" + + +local DoubleLongString = + L "{\\PitonStyle{String.Long}{" + * ( + C ( S "fF" * P "\"\"\"" ) + * ( DoubleLongInterpol + DoubleLongPureString ) ^ 0 + * L "}}" + * ( + EOL + + + L "{\\PitonStyle{String.Long}{" + * ( DoubleLongInterpol + DoubleLongPureString ) ^ 0 + * L "}}" + * EOL + ) ^ 0 + * L "{\\PitonStyle{String.Long}{" + * ( DoubleLongInterpol + DoubleLongPureString ) ^ 0 + + + C ( ( S "rR" ) ^ -1 * P "\"\"\"" * ( 1 - P "\"\"\"" - P "\r" ) ^ 0 ) + * L "}}" + * ( + L "{\\PitonStyle{String.Long}{" + * C ( ( 1 - P "\"\"\"" - P "\r" ) ^ 0 ) + * L "}}" + * EOL + ) ^ 0 + * L "{\\PitonStyle{String.Long}{" + * C ( ( 1 - P "\"\"\"" - P "\r" ) ^ 0 ) + ) + * C ( P "\"\"\"" ) + * L "}}" + + + +local LongString = SingleLongString + DoubleLongString + + +local Expression = + P { "E" , + E = ( 1 - S "{}()[]\r," ) ^ 0 + * ( + ( P "{" * V "F" * P "}" + + P "(" * V "F" * P ")" + + P "[" * V "F" * P "]" ) * ( 1 - S "{}()[]\r," ) ^ 0 + ) ^ 0 , + F = ( 1 - S "{}()[]\r\"'" ) ^ 0 + * ( ( + P "'" * (P "\\'" + 1 - S"'\r" )^0 * P "'" + + P "\"" * (P "\\\"" + 1 - S"\"\r" )^0 * P "\"" + + P "{" * V "F" * P "}" + + P "(" * V "F" * P ")" + + P "[" * V "F" * P "]" + ) * ( 1 - S "{}()[]\r\"'" ) ^ 0 ) ^ 0 , + } + +local Param = SkipSpace * K ( identifier , '' ) * SkipSpace + * ( K ( P "=" * Expression , 'InitialValues' ) + + K ( P ":" , '' ) * SkipSpace * K ( letter^1 , 'Name.Type' )) + + SkipSpace * K ( alphanum ^ 1 , '' ) * SkipSpace + +local Params = Param * ( K ( P "," , '' ) * Param ) ^ 0 + +local StringDoc = K ( P "\"\"\"" , 'String.Doc' ) + * ( K ( (1 - P "\"\"\"" - P "\r" ) ^ 0 , 'String.Doc' ) * EOL ) ^ 0 + * K ( ( 1 - P "\"\"\"" - P "\r" ) ^ 0 * P "\"\"\"" , 'String.Doc' ) + + K ( P "'''" , 'String.Doc' ) + * ( K ( (1 - P "'''" - P "\r")^0 , 'String.Doc' ) * EOL ) ^ 0 + * K ( ( 1 - P "'''" - P "\r")^0 * P "'''" , 'String.Doc' ) + +local CommentMath = P "$" * K ( ( 1 - S "$\r" ) ^ 1 , 'Comment.Math' ) * P "$" + + +local Comment = L ( "{\\pitonStyleComment {" ) + * C ( P "#" ) * ( CommentMath + C ( ( 1 - S "$\r" ) ^ 1 ) ) ^ 0 + * L ( "}}" ) + * ( EOL + -1 ) + +local CommentLaTeX = + P "##" + * L "{\\PitonStyle{Comment.LaTeX}{" + * Ct ( C ( ( 1 - P "\r" ) ^ 0 ) ) + * L "}}" + * ( EOL + -1 ) + +local DefFunction = + K ( P "def" , 'Keyword' ) + * Space + * K ( identifier , 'Name.Function' ) + * ( SkipSpace * K ( P "(" , '' ) * Params * K ( P ")" , '' ) ) ^ -1 + * ( SkipSpace + * K ( ( 1 - S ":\r" )^0 , 'Post.Function' ) + * K ( P ":" , 'Keyword' ) + * SkipSpace + * ( EOL + CommentLaTeX + Comment ) + * SkipSpace + * StringDoc ) ^ -1 + +local ItemDict = ShortString * SkipSpace * C ( P ":" ) * K ( Expression , 'Dict.Value' ) + +local ItemOfSet = SkipSpace * ( ItemDict + ShortString ) * SkipSpace + +local Set = C ( P "{" ) + * ItemOfSet * ( C ( P "," ) * ItemOfSet ) ^ 0 + * C ( P "}" ) + + +local Operator = K ( P "!=" + P "==" + P "<<" + P ">>" + S "-~+/*%=<>&.@|" , 'Operator') + +local OperatorWord = K ( P "in" + P "is" + P "and" + P "or" + P "not" , 'Operator.Word') + +local SyntaxPython = + ( ( space - P "\r" ) ^0 * P "\r" ) ^ -1 * space ^ -1 * + ( ( space^1 * -1 ) + + EOL + + Space + + Escape + + CommentLaTeX + + LongString + + Comment + + ExceptionInConsole + + Set + + Delim + + Class * ( Space + Punct + EOL ) + + Namespace * ( Space + Punct + EOL ) + + ImportAs + + RaiseException + + Keyword * ( Space + Punct + EOL ) + + DefFunction + + ShortString + + Decorator * ( Space + Punct + EOL ) + + Operator + + OperatorWord * ( Space + Punct + EOL ) + + Builtin * ( Space + Punct + EOL ) + + Identifier + + Number + + Word + ) ^0 * -1 + + +local MinimalSyntax = + P { "S" ; + S = K ( (1 - P "\r" ) ^ 0 , '') + EOL * S + } + + +--- with cctab, all characters including spaces have catcode 12 +local cctab = luatexbase.catcodetables.CatcodeTableOther + +function Parse(code) + local t = Ct(SyntaxPython) : match(code) + if t then else t = Ct(MinimalSyntax) : match(code) end + for i = 1 , #t do + if type(t[i]) == 'string' + then + tex.sprint(cctab, t[i]) + else + tex.sprint( t[i][1] ) + end + end +end + +function ParseFile(name) + s = '' + for line in io.lines(name) do s = s .. '\r' .. line end + Parse(s) +end + + +function define_gobble_syntax(n) + GobbleSyntax = ( 1 - P "\r" ) ^ (-n) * C ( ( 1 - P "\r" ) ^0 ) + * ( C ( P "\r" ) + * ( 1 - P "\r" ) ^ (-n) + * C ( ( 1 - P "\r" ) ^0 ) + ) ^ 0 +end + +function GobbleParse(code) + local t = Ct(GobbleSyntax):match(code) + local new_code = "" + for i = 1 , #t do + new_code = new_code .. t[i] + end + Parse(new_code) +end + + +function min(x,y) + if x <= y + then return x + else return y + end +end + +function add(acc,new_value) + return acc + new_value +end + + +--[[ The following LPEG returns as capture the minimal number of spaces at +the beginning of the lines of code]] +AutoGobbleSyntax = + ( space ^ 0 * P "\r" ) ^ -1 + * Cf ( + ( + ( P " " ) ^ 0 * P "\r" + + + Cf ( Cc(0) * ( P " " * Cc(1) ) ^ 0 , add ) + * ( 1 - P " " ) * ( 1 - P "\r" ) ^ 0 * P "\r" + ) ^ 0 + * + ( Cf ( Cc(0) * ( P " " * Cc(1) ) ^ 0 , add ) + * ( 1 - P " " ) * ( 1 - P "\r" ) ^ 0 ) ^ -1 , + min + ) + + +function AutoGobbleParse(code) + local n = AutoGobbleSyntax:match(code) + if n==0 + then Parse(code) + else define_gobble_syntax(n) + GobbleParse(code) + end +end + + + + + + + + + + + diff --git a/Master/texmf-dist/tex/lualatex/piton/piton.sty b/Master/texmf-dist/tex/lualatex/piton/piton.sty new file mode 100644 index 00000000000..5a3ac8cd0cb --- /dev/null +++ b/Master/texmf-dist/tex/lualatex/piton/piton.sty @@ -0,0 +1,288 @@ +%% +%% This is file `piton.sty', +%% generated with the docstrip utility. +%% +%% The original source files were: +%% +%% piton.dtx (with options: `package') +%% +%% Copyright (C) 2022 by F. Pantigny +%% +%% This file may be distributed and/or modified under the +%% conditions of the LaTeX Project Public License, either +%% version 1.3 of this license or (at your option) any later +%% version. The latest version of this license is in: +%% +%% http://www.latex-project.org/lppl.txt +%% +%% and version 1.3 or later is part of all distributions of +%% LaTeX version 2005/12/01 or later. +%% +\def\myfileversion{0.6} +\def\myfiledate{2022/09/14} + + +\NeedsTeXFormat{LaTeX2e} +\RequirePackage{l3keys2e} +\ProvidesExplPackage + {piton} + {\myfiledate} + {\myfileversion} + {Highlight Python codes with LPEG on LuaLaTeX} +\keys_define:nn { piton / package } + { + escape-inside .tl_set:N = \c__piton_escape_inside_tl , + unknown .code:n = \msg_error:nn { piton } { unknown~key~for~package } + } +\msg_new:nnn { piton } { unknown~key~for~package } + { + Unknown~key\\ + You~have~used~the~key~'\l_keys_key_str'~but~the~only~key~available~here~ + is~the~key~'escape-inside'.\\ + That~key~will~be~ignored. + } +\tl_clear_new:N \c__piton_escape_inside_tl +\ProcessKeysOptions { piton / package } +\begingroup +\cs_new_protected:Npn \__piton_set_escape_char:nn #1 #2 + { + \directlua { begin_escape = "#1" } + \directlua { end_escape = "#2" } + } +\cs_generate_variant:Nn \__piton_set_escape_char:nn { x x } +\__piton_set_escape_char:xx + { \tl_head:V \c__piton_escape_inside_tl } + { \tl_tail:V \c__piton_escape_inside_tl } +\endgroup +\msg_new:nnn { piton } { LuaLaTeX~mandatory } + { The~package~'piton'~must~be~used~with~LuaLaTeX.\\ It~won't~be~loaded. } +\sys_if_engine_luatex:F { \msg_critical:nn { piton } { LuaLaTeX~mandatory } } +\RequirePackage { luatexbase } +\msg_new:nnn { piton } { piton.lua~not~found } + { + The~file~'piton.lua'~can't~be~found.\\ + The package~'piton'~won't be loaded. + } +\file_if_exist:nF { piton.lua } + { \msg_critical:nn { piton } { piton.lua~not~found} } +\lua_now:e { require("piton.lua") } +\cs_new:Npn \pitonEOL + { + \par \leavevmode + \__piton_print_number: + } +\cs_new_protected:Npn \__piton_print_number: + { \bool_if:NT \l__piton_line_numbers_bool \__piton_actually_print_number: } +\cs_new_protected:Npn \__piton_actually_print_number: + { + \bool_if:NF \l__piton_all_line_numbers_bool + { \peek_meaning:NF \pitonEOL } + \__piton_actually_print_number_i: + } +\cs_new_protected:Npn \__piton_actually_print_number_i: + { + \int_incr:N \l__piton_lineno_int + \hbox_overlap_left:n + { + { \color{gray} \footnotesize \int_to_arabic:n \l__piton_lineno_int } + \quad + } + } +\int_new:N \l__piton_lineno_int +\int_new:N \l__piton_gobble_int +\cs_new_protected:Npn \__piton_define_trim_syntax:n #1 + { \lua_now:n { define_trim_syntax(#1) } } +\NewDocumentCommand { \piton } { v } + { + \group_begin: + \ttfamily + \lua_now:e { Parse(token.scan_argument()) } { #1 } + \group_end: + } +\NewDocumentCommand { \PitonInputFile } { m } + { + \group_begin: + \ttfamily + \bool_if:NT \l__piton_line_numbers_bool + { + \__piton_actually_print_number: + \vspace{-\baselineskip} + } + \lua_now:e { ParseFile(token.scan_argument()) } { #1 } + \group_end: + } +\bool_new:N \l__piton_line_numbers_bool +\bool_new:N \l__piton_all_line_numbers_bool +\keys_define:nn { piton / PitonOptions } + { + gobble .int_set:N = \l__piton_gobble_int , + gobble .value_required:n = true , + auto-gobble .code:n = \int_set:Nn \l__piton_gobble_int { -1 } , + auto-gobble .value_forbidden:n = true , + line-numbers .bool_set:N = \l__piton_line_numbers_bool , + line-numbers .default:n = true , + all-line-numbers .code:n = + \bool_set_true:N \l__piton_line_numbers_bool + \bool_set_true:N \l__piton_all_line_numbers_bool , + all-line-numbers .value_forbidden:n = true + } +\NewDocumentCommand \PitonOptions { } + { \keys_set:nn { piton / PitonOptions } } +\NewDocumentCommand { \NewPitonEnvironment } { m m m m } + { + \use:x + { + \cs_set_protected:Npn + \use:c { __piton_collect_ #1 :w } + ####1 + \c_backslash_str end \c_left_brace_str #1 \c_right_brace_str + } + { + \group_end: + \par \addvspace { 0.5 em } + { + \dim_set_eq:NN \parindent \c_zero_dim + \ttfamily + \bool_if:NT \l__piton_line_numbers_bool + { + \__piton_actually_print_number: + \vspace{-\baselineskip} + } + \int_case:nnF \l__piton_gobble_int + { + 0 + { \lua_now:e { Parse(token.scan_argument()) } } + { -1 } + { \lua_now:e { AutoGobbleParse(token.scan_argument()) } } + } + { + \exp_args:NV \__piton_define_trim_syntax:n \l__piton_gobble_int + \lua_now:e { GobbleParse(token.scan_argument()) } + } + { ##1 } + } + \par \addvspace { 0.5 em } + \end { #1 } + } + \NewDocumentEnvironment { #1 } { #2 } + { + #3 + \group_begin: + \tl_map_function:nN + { \ \\ \{ \} \$ \& \# \^ \_ \% \~ \^^M } + \char_set_catcode_other:N + \use:c { __piton_collect_ #1 :w } + } + { #4 } + } +\NewPitonEnvironment { Piton } { } { } { } +\NewDocumentCommand { \PitonStyle } { m } { \csname pitonStyle#1\endcsname } +\NewDocumentCommand { \SetPitonStyle } { } { \keys_set:nn { piton } } +\cs_new_protected:Npn \__piton_math_scantokens:n #1 + { \normalfont \scantextokens { $#1$ } } +\keys_define:nn { piton } + { + String.Interpol .tl_set:c = pitonStyle String.Interpol , + String.Interpol .value_required:n = true , + FormattingType .tl_set:c = pitonStyle FormattingType , + FormattingType .value_required:n = true , + Dict.Value .tl_set:c = pitonStyle Dict.Value , + Dict.Value .value_required:n = true , + Name.Decorator .tl_set:c = pitonStyle Name.Decorator , + Name.Decorator .value_required:n = true , + Name.Function .tl_set:c = pitonStyle Name.Function , + Name.Function .value_required:n = true , + Keyword .tl_set:c = pitonStyle Keyword , + Keyword .value_required:n = true , + Keyword.Constant .tl_set:c = pitonStyle Keyword.Constant , + Keyword.constant .value_required:n = true , + String.Doc .tl_set:c = pitonStyle String.Doc , + String.Doc .value_required:n = true , + Interpol.Inside .tl_set:c = pitonStyle Interpol.Inside , + Interpol.Inside .value_required:n = true , + String.Long .tl_set:c = pitonStyle String.Long , + String.Long .value_required:n = true , + String.Short .tl_set:c = pitonStyle String.Short , + String.Short .value_required:n = true , + String .meta:n = { String.Long = #1 , String.Short = #1 } , + Comment.Math .tl_set:c = pitonStyle Comment.Math , + Comment.Math .default:n = \__piton_math_scantokens:n , + Comment.Math .initial:n = , + Comment .tl_set:c = pitonStyle Comment , + Comment .value_required:n = true , + InitialValues .tl_set:c = pitonStyle InitialValues , + InitialValues .value_required:n = true , + Number .tl_set:c = pitonStyle Number , + Number .value_required:n = true , + Name.Namespace .tl_set:c = pitonStyle Name.Namespace , + Name.Namespace .value_required:n = true , + Name.Class .tl_set:c = pitonStyle Name.Class , + Name.Class .value_required:n = true , + Name.Builtin .tl_set:c = pitonStyle Name.Builtin , + Name.Builtin .value_required:n = true , + Name.Type .tl_set:c = pitonStyle Name.Type , + Name.Type .value_required:n = true , + Operator .tl_set:c = pitonStyle Operator , + Operator .value_required:n = true , + Operator.Word .tl_set:c = pitonStyle Operator.Word , + Operator.Word .value_required:n = true , + Post.Function .tl_set:c = pitonStyle Post.Function , + Post.Function .value_required:n = true , + Exception .tl_set:c = pitonStyle Exception , + Exception .value_required:n = true , + Comment.LaTeX .tl_set:c = pitonStyle Comment.LaTeX , + Comment.LaTeX .value_required:n = true , + unknown .code:n = \msg_error:nn { piton }{ Unknown~key~for~SetPitonStyle } + } +\msg_new:nnn { piton } { Unknown~key~for~SetPitonStyle } { + The~style~'\l_keys_key_str'~is~unknown.\\ + This~key~will~be~ignored.\\ + The~available~styles~are~(in~alphabetic~order):~ + Comment,~ + Comment.LaTeX,~ + Dict.Value,~ + Exception,~ + InitialValues,~ + Keyword,~ + Keyword.Constant,~ + Name.Builtin,~ + Name.Class,~ + Name.Decorator,~ + Name.Function,~ + Name.Namespace,~ + Number,~ + Operator,~ + Operator.Word,~ + String,~ + String.Doc,~ + String.Long,~ + String.Short,~and~ + String.Interpol. } +\SetPitonStyle + { + Comment = \color[HTML]{0099FF} \itshape , + Exception = \color[HTML]{CC0000} , + Keyword = \color[HTML]{006699} \bfseries , + Keyword.Constant = \color[HTML]{006699} \bfseries , + Name.Builtin = \color[HTML]{336666} , + Name.Decorator = \color[HTML]{9999FF}, + Name.Class = \color[HTML]{00AA88} \bfseries , + Name.Function = \color[HTML]{CC00FF} , + Name.Namespace = \color[HTML]{00CCFF} , + Number = \color[HTML]{FF6600} , + Operator = \color[HTML]{555555} , + Operator.Word = \bfseries , + String = \color[HTML]{CC3300} , + String.Doc = \color[HTML]{CC3300} \itshape , + String.Interpol = \color[HTML]{AA0000} , + Comment.LaTeX = \normalfont \color[rgb]{.468,.532,.6} , + Name.Type = \color[HTML]{336666} , + InitialValues = \piton , + Dict.Value = \piton , + Post.Function = \piton , + Interpol.Inside = \color{black}\piton , + } + +\endinput +%% +%% End of file `piton.sty'. |