From 39716eb000e94233660cbfec4da9957bb47859b8 Mon Sep 17 00:00:00 2001 From: Karl Berry Date: Sun, 7 Jan 2024 21:28:53 +0000 Subject: pyluatex (6jan24) git-svn-id: svn://tug.org/texlive/trunk@69341 c570f23f-e606-0410-a88d-b1316a301751 --- Master/texmf-dist/doc/lualatex/pyluatex/README.md | 4 +- .../doc/lualatex/pyluatex/example/beamer.tex | 2 +- .../pyluatex/example/data-visualization.tex | 2 +- .../pyluatex/example/matplotlib-external.tex | 2 +- .../lualatex/pyluatex/example/matplotlib-pgf.tex | 2 +- .../pyluatex/example/readme-custom-env.tex | 2 +- .../lualatex/pyluatex/example/readme-example.tex | 2 +- .../doc/lualatex/pyluatex/example/repl.tex | 4 +- .../doc/lualatex/pyluatex/example/sessions.tex | 2 +- .../pyluatex/example/typesetting-example.tex | 2 +- .../pyluatex/example/typesetting-listings.tex | 2 +- .../pyluatex/example/typesetting-minted.tex | 2 +- .../texmf-dist/doc/lualatex/pyluatex/pyluatex.pdf | Bin 83051 -> 83317 bytes .../texmf-dist/doc/lualatex/pyluatex/pyluatex.tex | 9 +- .../tex/lualatex/pyluatex/pyluatex-interpreter.py | 2 +- .../texmf-dist/tex/lualatex/pyluatex/pyluatex.lua | 140 ++++++++------------- .../texmf-dist/tex/lualatex/pyluatex/pyluatex.sty | 54 ++++---- 17 files changed, 92 insertions(+), 141 deletions(-) (limited to 'Master') diff --git a/Master/texmf-dist/doc/lualatex/pyluatex/README.md b/Master/texmf-dist/doc/lualatex/pyluatex/README.md index f753b5850d6..3f7f30ebcc8 100644 --- a/Master/texmf-dist/doc/lualatex/pyluatex/README.md +++ b/Master/texmf-dist/doc/lualatex/pyluatex/README.md @@ -35,7 +35,7 @@ $\sqrt{371} = \py{math.sqrt(371)}$ 2\. Compile using LuaLaTeX (shell escape is required) ``` -lualatex -shell-escape example.tex +lualatex --shell-escape example.tex ``` **Note:** PyLuaTeX starts Python 3 using the command `python3` by default. @@ -53,7 +53,7 @@ executed. For this reason, it is recommended to compile trusted documents only. ## License [LPPL 1.3c](http://www.latex-project.org/lppl.txt) for LaTeX code and -[MIT license](https://opensource.org/licenses/MIT) for Python and Lua code. +[MIT license](https://opensource.org/licenses/MIT) for Python and Lua code and other files. ## Further Information Author: Tobias Enderle diff --git a/Master/texmf-dist/doc/lualatex/pyluatex/example/beamer.tex b/Master/texmf-dist/doc/lualatex/pyluatex/example/beamer.tex index 3592a56922a..804721df852 100644 --- a/Master/texmf-dist/doc/lualatex/pyluatex/example/beamer.tex +++ b/Master/texmf-dist/doc/lualatex/pyluatex/example/beamer.tex @@ -1,4 +1,4 @@ -%% Copyright 2021-2023 Tobias Enderle +%% Copyright 2021-2024 Tobias Enderle %% %% This work may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either version 1.3c diff --git a/Master/texmf-dist/doc/lualatex/pyluatex/example/data-visualization.tex b/Master/texmf-dist/doc/lualatex/pyluatex/example/data-visualization.tex index 2d43cb946bf..1a6869c8ad2 100644 --- a/Master/texmf-dist/doc/lualatex/pyluatex/example/data-visualization.tex +++ b/Master/texmf-dist/doc/lualatex/pyluatex/example/data-visualization.tex @@ -1,4 +1,4 @@ -%% Copyright 2021-2023 Tobias Enderle +%% Copyright 2021-2024 Tobias Enderle %% %% This work may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either version 1.3c diff --git a/Master/texmf-dist/doc/lualatex/pyluatex/example/matplotlib-external.tex b/Master/texmf-dist/doc/lualatex/pyluatex/example/matplotlib-external.tex index 9289d1c6d7b..d4f4f2b1f5d 100644 --- a/Master/texmf-dist/doc/lualatex/pyluatex/example/matplotlib-external.tex +++ b/Master/texmf-dist/doc/lualatex/pyluatex/example/matplotlib-external.tex @@ -1,4 +1,4 @@ -%% Copyright 2021-2023 Tobias Enderle +%% Copyright 2021-2024 Tobias Enderle %% %% This work may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either version 1.3c diff --git a/Master/texmf-dist/doc/lualatex/pyluatex/example/matplotlib-pgf.tex b/Master/texmf-dist/doc/lualatex/pyluatex/example/matplotlib-pgf.tex index 9172bbe0de2..990645aaf3f 100644 --- a/Master/texmf-dist/doc/lualatex/pyluatex/example/matplotlib-pgf.tex +++ b/Master/texmf-dist/doc/lualatex/pyluatex/example/matplotlib-pgf.tex @@ -1,4 +1,4 @@ -%% Copyright 2021-2023 Tobias Enderle +%% Copyright 2021-2024 Tobias Enderle %% %% This work may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either version 1.3c diff --git a/Master/texmf-dist/doc/lualatex/pyluatex/example/readme-custom-env.tex b/Master/texmf-dist/doc/lualatex/pyluatex/example/readme-custom-env.tex index 115299264ee..d6dc87e4406 100644 --- a/Master/texmf-dist/doc/lualatex/pyluatex/example/readme-custom-env.tex +++ b/Master/texmf-dist/doc/lualatex/pyluatex/example/readme-custom-env.tex @@ -1,4 +1,4 @@ -%% Copyright 2021-2023 Tobias Enderle +%% Copyright 2021-2024 Tobias Enderle %% %% This work may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either version 1.3c diff --git a/Master/texmf-dist/doc/lualatex/pyluatex/example/readme-example.tex b/Master/texmf-dist/doc/lualatex/pyluatex/example/readme-example.tex index 63ba160acea..130e553eee4 100644 --- a/Master/texmf-dist/doc/lualatex/pyluatex/example/readme-example.tex +++ b/Master/texmf-dist/doc/lualatex/pyluatex/example/readme-example.tex @@ -1,4 +1,4 @@ -%% Copyright 2021-2023 Tobias Enderle +%% Copyright 2021-2024 Tobias Enderle %% %% This work may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either version 1.3c diff --git a/Master/texmf-dist/doc/lualatex/pyluatex/example/repl.tex b/Master/texmf-dist/doc/lualatex/pyluatex/example/repl.tex index fd56dbc91a5..52aef0a358e 100644 --- a/Master/texmf-dist/doc/lualatex/pyluatex/example/repl.tex +++ b/Master/texmf-dist/doc/lualatex/pyluatex/example/repl.tex @@ -1,4 +1,4 @@ -%% Copyright 2021-2023 Tobias Enderle +%% Copyright 2021-2024 Tobias Enderle %% %% This work may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either version 1.3c @@ -57,7 +57,7 @@ square(5) \maketitle PyLuaTeX allows you to run and typeset Python code in an interactive console -or read–eval–print loop (REPL) fashion. Very much like in an interactive python session, +or read–eval–print loop (REPL) fashion. Very much like in an interactive Python session, code is prefixed with \verb|>>>| (or \verb|...| in case of multi-line commands) and the results are added to the output buffer automatically. diff --git a/Master/texmf-dist/doc/lualatex/pyluatex/example/sessions.tex b/Master/texmf-dist/doc/lualatex/pyluatex/example/sessions.tex index 49f49c4ddb0..e6b071c30c3 100644 --- a/Master/texmf-dist/doc/lualatex/pyluatex/example/sessions.tex +++ b/Master/texmf-dist/doc/lualatex/pyluatex/example/sessions.tex @@ -1,4 +1,4 @@ -%% Copyright 2021-2023 Tobias Enderle +%% Copyright 2021-2024 Tobias Enderle %% %% This work may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either version 1.3c diff --git a/Master/texmf-dist/doc/lualatex/pyluatex/example/typesetting-example.tex b/Master/texmf-dist/doc/lualatex/pyluatex/example/typesetting-example.tex index 435c02973a8..ade107e5fed 100644 --- a/Master/texmf-dist/doc/lualatex/pyluatex/example/typesetting-example.tex +++ b/Master/texmf-dist/doc/lualatex/pyluatex/example/typesetting-example.tex @@ -1,4 +1,4 @@ -%% Copyright 2021-2023 Tobias Enderle +%% Copyright 2021-2024 Tobias Enderle %% %% This work may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either version 1.3c diff --git a/Master/texmf-dist/doc/lualatex/pyluatex/example/typesetting-listings.tex b/Master/texmf-dist/doc/lualatex/pyluatex/example/typesetting-listings.tex index 116ebc2fc8e..e251fe86b21 100644 --- a/Master/texmf-dist/doc/lualatex/pyluatex/example/typesetting-listings.tex +++ b/Master/texmf-dist/doc/lualatex/pyluatex/example/typesetting-listings.tex @@ -1,4 +1,4 @@ -%% Copyright 2021-2023 Tobias Enderle +%% Copyright 2021-2024 Tobias Enderle %% %% This work may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either version 1.3c diff --git a/Master/texmf-dist/doc/lualatex/pyluatex/example/typesetting-minted.tex b/Master/texmf-dist/doc/lualatex/pyluatex/example/typesetting-minted.tex index 760d1a1355f..930f8018dd5 100644 --- a/Master/texmf-dist/doc/lualatex/pyluatex/example/typesetting-minted.tex +++ b/Master/texmf-dist/doc/lualatex/pyluatex/example/typesetting-minted.tex @@ -1,4 +1,4 @@ -%% Copyright 2021-2023 Tobias Enderle +%% Copyright 2021-2024 Tobias Enderle %% %% This work may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either version 1.3c diff --git a/Master/texmf-dist/doc/lualatex/pyluatex/pyluatex.pdf b/Master/texmf-dist/doc/lualatex/pyluatex/pyluatex.pdf index d357f153852..c3623287ddf 100644 Binary files a/Master/texmf-dist/doc/lualatex/pyluatex/pyluatex.pdf and b/Master/texmf-dist/doc/lualatex/pyluatex/pyluatex.pdf differ diff --git a/Master/texmf-dist/doc/lualatex/pyluatex/pyluatex.tex b/Master/texmf-dist/doc/lualatex/pyluatex/pyluatex.tex index 908fb04c772..5080c4b52f1 100644 --- a/Master/texmf-dist/doc/lualatex/pyluatex/pyluatex.tex +++ b/Master/texmf-dist/doc/lualatex/pyluatex/pyluatex.tex @@ -15,7 +15,7 @@ \usepackage{url} \title{The \emph{pyluatex} package} \author{Tobias Enderle\\\url{https://github.com/tndrle/PyLuaTeX}} -\date{v0.6.1 (2023/02/15)} +\date{v0.6.2 (2024/01/07)} \begin{document} \maketitle \raggedright @@ -57,7 +57,7 @@ $\sqrt{371} = \py{math.sqrt(371)}$ \item Compile using Lua\LaTeX{} (shell escape is required) \begin{tcblisting}{breakable,listing only, size=fbox,colframe=black!8,boxrule=3pt,colback=black!8} -lualatex -shell-escape example.tex +lualatex --shell-escape example.tex \end{tcblisting} \end{enumerate} \textbf{Note:} PyLuaTeX starts Python 3 using the command \inlcode|python3| by default. @@ -122,7 +122,8 @@ For an example, see the Typesetting Code section. \item \inlcode|shutdown|\\[0.5ex] Specifies when the Python process is shut down. (default: \inlcode|veryveryend|)\\[0.5ex] \textit{Options:} \inlcode|veryveryend|, \inlcode|veryenddocument|, \inlcode|off|\\[0.5ex] - PyLuaTeX uses the hooks of the package \textit{atveryend} to shut down the Python interpreter when the compilation is done. With the option \inlcode|veryveryend|, Python is shut down in the \inlcode|\AtVeryVeryEnd| hook. With the option \inlcode|veryenddocument|, Python is shut down in the \inlcode|\AtVeryEndDocument| hook. With the option \inlcode|off|, Python is not shut down explicitly. However, the Python process will shut down when the LuaTeX process finishes even if \inlcode|off| is selected. Using \inlcode|off| on Windows might lead to problems with SyncTeX, though.\\[0.5ex] + PyLuaTeX shuts down the Python interpreter when the compilation is done. With the option \inlcode|veryveryend|, Python is shut down in the \inlcode|enddocument/end| hook. With the option \inlcode|veryenddocument|, Python is shut down in the \inlcode|enddocument/afteraux| hook. With the option \inlcode|off|, Python is not shut down explicitly. However, the Python process will shut down when the LuaTeX process finishes even if \inlcode|off| is selected. Using \inlcode|off| on Windows might lead to problems with SyncTeX, though.\\[0.5ex] + Before v0.6.2, PyLuaTeX used the hooks \inlcode|\AtVeryVeryEnd| and \inlcode|\AtVeryEndDocument| of the package \textit{atveryend}. The new hooks \inlcode|enddocument/end| and \inlcode|enddocument/afteraux| are equivalent to those of the \textit{atveryend} package.\\[0.5ex] \textit{Example:} \inlcode|\usepackage[shutdown=veryenddocument]{pyluatex}| \item \inlcode|verbose|\\[0.5ex] If this option is set, Python input and output is written to the \LaTeX{} log file.\\[0.5ex] @@ -285,5 +286,5 @@ No placeholders have to be inserted. \section{License} LPPL 1.3c\footnote{\url{http://www.latex-project.org/lppl.txt}} for \LaTeX{} code and -MIT license\footnote{\url{https://opensource.org/licenses/MIT}} for Python and Lua code. +MIT license\footnote{\url{https://opensource.org/licenses/MIT}} for Python and Lua code and other files. \end{document} diff --git a/Master/texmf-dist/tex/lualatex/pyluatex/pyluatex-interpreter.py b/Master/texmf-dist/tex/lualatex/pyluatex/pyluatex-interpreter.py index 13256ba3863..020412ff731 100644 --- a/Master/texmf-dist/tex/lualatex/pyluatex/pyluatex-interpreter.py +++ b/Master/texmf-dist/tex/lualatex/pyluatex/pyluatex-interpreter.py @@ -1,7 +1,7 @@ """ MIT License -Copyright (c) 2021-2023 Tobias Enderle +Copyright (c) 2021-2024 Tobias Enderle Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), diff --git a/Master/texmf-dist/tex/lualatex/pyluatex/pyluatex.lua b/Master/texmf-dist/tex/lualatex/pyluatex/pyluatex.lua index c12faa5cc80..7ec06f8ea69 100644 --- a/Master/texmf-dist/tex/lualatex/pyluatex/pyluatex.lua +++ b/Master/texmf-dist/tex/lualatex/pyluatex/pyluatex.lua @@ -1,7 +1,7 @@ --[[ MIT License -Copyright (c) 2021-2023 Tobias Enderle +Copyright (c) 2021-2024 Tobias Enderle Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), @@ -22,7 +22,7 @@ FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. --]] -require("lualibs-util-jsn") +require("lualibs") local socket = require("socket") pyluatex = pyluatex or { @@ -31,8 +31,6 @@ pyluatex = pyluatex or { session = "default" } -local dir_sep = package.config:sub(1,1) - -- status.filename: path to pyluatex.sty local folder = file.pathpart(file.collapsepath(status.filename, true)) local tcp = nil @@ -40,15 +38,13 @@ local tcp = nil local env_end = nil local env_lines = nil local parent_env = nil -local env_repl_mode = false -local env_success = true local last_code = nil local last_output = nil local function get_tex_file_folder() - for k, v in ipairs(arg) do - if not v:find("^%-") then + for _, v in ipairs(arg) do + if v:sub(1, 1) ~= "-" then local path = file.collapsepath(v, true) if lfs.isfile(path) then return file.pathpart(path) @@ -63,27 +59,26 @@ local function get_tex_file_folder() return nil end -local function trim(s) - return (s:gsub("^%s*(.-)%s*$", "%1")) +local function show_err(message) + tex.sprint("\\PackageError{PyLuaTeX}{" .. message .. "}{}") end -local function err_cmd(message) - return "\\PackageError{PyLuaTeX}{" .. message .. "}{}" +local function not_empty(str) + return str ~= nil and str ~= "" end function pyluatex.start(executable, local_imports) local script = file.join(folder, "pyluatex-interpreter.py") - local is_windows = dir_sep ~= "/" local cmd = "" if local_imports then local tex_file_folder = get_tex_file_folder() if tex_file_folder ~= nil then - cmd = " \"" .. tex_file_folder .. "\"" + cmd = ' "' .. tex_file_folder .. '"' end end - cmd = executable .. " \"" .. script .. "\"" .. cmd - if is_windows then + cmd = executable .. ' "' .. script .. '"' .. cmd + if os.type == "windows" then cmd = "start /B " .. cmd else cmd = cmd .. " &" @@ -92,15 +87,15 @@ function pyluatex.start(executable, local_imports) local port = f:read("*l") f:close() - function err(message) - tex.sprint(err_cmd("Python backend could not be started (" .. message .. ")")) + local function err(message) + show_err("Python backend could not be started (" .. message .. ")") end if port == nil then err("executable: " .. executable) return end - port = trim(port) + port = port:fullstrip() if port:match("^%d+$") == nil then err("invalid TCP port: " .. port) return @@ -121,26 +116,6 @@ local function request(data) return utilities.json.tolua(output) end -local function log_input(code) - texio.write_nl("PyLuaTeX input for session \"" .. pyluatex.session .. "\": " .. code) -end - -local function log_output(code) - texio.write_nl("PyLuaTeX output: " .. code) -end - -local function split_lines(str) - if str:sub(-1) ~= "\n" then - str = str .. "\n" - end - - local t = {} - for s in str:gmatch("(.-)\r?\n") do - table.insert(t, s) - end - return t -end - function pyluatex.execute(code, auto_print, write, repl_mode, store) local full_code if auto_print then @@ -149,77 +124,62 @@ function pyluatex.execute(code, auto_print, write, repl_mode, store) full_code = code end - if pyluatex.verbose then log_input(full_code) end - - local resp = request( - { - session = pyluatex.session, - code = full_code, - repl_mode = repl_mode, - ignore_errors = pyluatex.ignore_errors - } - ) - local output_lines = split_lines(resp.output) + local resp = request({ + session = pyluatex.session, + code = full_code, + repl_mode = repl_mode, + ignore_errors = pyluatex.ignore_errors + }) + local code_lines = code:splitlines() + local output_lines = resp.output:splitlines() if store then - last_code = split_lines(code) + last_code = code_lines last_output = output_lines end - if resp.success or pyluatex.ignore_errors then - if pyluatex.verbose or not resp.success then log_output(resp.output) end + if pyluatex.verbose or not resp.success then + texio.write_nl('PyLuaTeX input for session "' .. pyluatex.session .. + '": ' .. full_code) + texio.write_nl("PyLuaTeX output: " .. resp.output) + end - if write then - tex.print(output_lines) - end + if resp.success or pyluatex.ignore_errors then + if write then tex.print(output_lines) end else - if not pyluatex.verbose then log_input(full_code) end - log_output(resp.output) - if write then - tex.sprint(err_cmd("Python error (see above)")) - end + show_err("Python error (see above)") end - if resp.log_msg ~= "" then texio.write(resp.log_msg) end - - return resp.success + if not_empty(resp.log_msg) then texio.write(resp.log_msg) end end -function pyluatex.print_env() - if last_output ~= nil and (env_success or pyluatex.ignore_errors) then - tex.print(last_output) - end +function pyluatex.execute_env(write, repl_mode) + local code = table.concat(env_lines, "\n") + pyluatex.execute(code, false, write, repl_mode, true) end local function record_line(line) - local s, e = line:find(env_end, 1, true) + local s = line:find(env_end) if s ~= nil then luatexbase.remove_from_callback("process_input_buffer", "pyluatex_record_line") - local code_in_line = line:sub(1, s - 1) - if trim(code_in_line):len() > 0 then + local code = line:sub(1, s - 1) + if code:strip():len() > 0 then -- only include this line if it contains non-whitespace characters - table.insert(env_lines, code_in_line) - end - local code = table.concat(env_lines, "\n") - env_success = pyluatex.execute(code, false, false, env_repl_mode, true) - if env_success or pyluatex.ignore_errors then - return line:sub(s) - else - return env_end .. err_cmd("Python error (see above)") .. line:sub(e + 1) + table.insert(env_lines, code) end + return line:sub(s) else table.insert(env_lines, line) return "" end end -function pyluatex.record_env(name, repl_mode) +function pyluatex.record_env(name) if parent_env ~= nil then name = parent_env parent_env = nil end - env_end = "\\end{" .. name .. "}" + env_end = "\\end%s*{" .. name:escapedpattern() .. "}" env_lines = {} - env_repl_mode = repl_mode luatexbase.add_to_callback("process_input_buffer", record_line, "pyluatex_record_line") end @@ -236,13 +196,13 @@ function pyluatex.run_file(path, write, repl_mode) f:close() -- ignore trailing new line if present if code:sub(-2) == "\r\n" then - code = code:sub(0, -3) + code = code:sub(1, -3) elseif code:sub(-1) == "\n" then - code = code:sub(0, -2) + code = code:sub(1, -2) end pyluatex.execute(code, false, write, repl_mode, true) else - tex.sprint(err_cmd("File not found: " .. path)) + show_err("File not found: " .. path) end end @@ -255,26 +215,24 @@ function pyluatex.get_last_output() end local function parse_bool(name, value) + value = value:fullstrip() if value == "true" then return true elseif value == "false" then return false else - tex.sprint( - err_cmd("Invalid value '" .. value .. "' for option " .. name) - ) + show_err('Invalid value "' .. value .. '" for option "' .. name .. '"') end end function pyluatex.set_option(name, value) - name = trim(name) - value = trim(value) + name = name:fullstrip() if name == "ignoreerrors" then pyluatex.ignore_errors = parse_bool(name, value) elseif name == "verbose" then pyluatex.verbose = parse_bool(name, value) else - tex.sprint(err_cmd("Unknown option '" .. name .. "'")) + show_err('Unknown option "' .. name .. '"') end end diff --git a/Master/texmf-dist/tex/lualatex/pyluatex/pyluatex.sty b/Master/texmf-dist/tex/lualatex/pyluatex/pyluatex.sty index 11b9261709a..2b0575a8301 100644 --- a/Master/texmf-dist/tex/lualatex/pyluatex/pyluatex.sty +++ b/Master/texmf-dist/tex/lualatex/pyluatex/pyluatex.sty @@ -1,4 +1,4 @@ -%% Copyright 2021-2023 Tobias Enderle +%% Copyright 2021-2024 Tobias Enderle %% %% This work may be distributed and/or modified under the %% conditions of the LaTeX Project Public License, either version 1.3c @@ -9,15 +9,15 @@ %% version 2005/12/01 or later. \NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{pyluatex}[2023/02/15 v0.6.1 Execute Python code on the fly] +\ProvidesPackage{pyluatex}[2024/01/07 v0.6.2 Execute Python code on the fly] \RequirePackage{expl3} \ExplSyntaxOn -\sys_if_engine_luatex:TF{}{ +\sys_if_engine_luatex:F{ \PackageError{PyLuaTeX}{LuaTeX~is~required}{} } -\sys_if_shell_unrestricted:TF{}{ - \PackageError{PyLuaTeX}{Shell~escape~required~(add~-shell-escape~option)}{} +\sys_if_shell_unrestricted:F{ + \PackageError{PyLuaTeX}{Shell~escape~is~required~(add~--shell-escape~option)}{} } \ExplSyntaxOff @@ -31,40 +31,32 @@ \DeclareStringOption[veryveryend]{shutdown} \ProcessKeyvalOptions* -\directlua{pyluatex.ignore_errors = \ifpyluatex@ignoreerrors true\else false\fi} -\directlua{pyluatex.verbose = \ifpyluatex@verbose true\else false\fi} -\directlua{pyluatex.start( - [==[\pyluatex@executable]==], - \ifpyluatex@localimports true\else false\fi -)} +\newcommand*{\pyluatex@boolopt}[1]{\csname ifpyluatex@#1\endcsname true\else false\fi} + +\directlua{pyluatex.ignore_errors = \pyluatex@boolopt{ignoreerrors}} +\directlua{pyluatex.verbose = \pyluatex@boolopt{verbose}} +\directlua{pyluatex.start([==[\pyluatex@executable]==], \pyluatex@boolopt{localimports})} \ExplSyntaxOn -\cs_generate_variant:Nn \tl_if_eq:nnTF { V } -\tl_if_eq:VnTF{\pyluatex@shutdown}{veryveryend}{ - \RequirePackage{atveryend} - \AtVeryVeryEnd{\directlua{pyluatex.shutdown()}} -}{ - \tl_if_eq:VnTF{\pyluatex@shutdown}{veryenddocument}{ - \RequirePackage{atveryend} - \AtVeryEndDocument{\directlua{pyluatex.shutdown()}} - }{ - \tl_if_eq:VnTF{\pyluatex@shutdown}{off}{}{ - \PackageError{PyLuaTeX}{ - Invalid~value~for~package~option~"shutdown":~\pyluatex@shutdown - }{} - } - } -} +\str_case_e:nnF{\pyluatex@shutdown}{ + {veryveryend}{ + \AddToHook{enddocument/end}{\directlua{pyluatex.shutdown()}} + }{veryenddocument}{ + \AddToHook{enddocument/afteraux}{\directlua{pyluatex.shutdown()}} + }{off}{} +}{\PackageError{PyLuaTeX}{Invalid~value~for~package~option~"shutdown":~\pyluatex@shutdown}{}} \ExplSyntaxOff \newcommand*{\PyLTVerbatimEnv}{\directlua{pyluatex.set_parent_env([==[\@currenvir]==])}} -\newenvironment{python}{\directlua{pyluatex.record_env("python", false)}} -{\directlua{pyluatex.print_env()}} +\newenvironment{python}{\directlua{pyluatex.record_env("python")}} +{\directlua{pyluatex.execute_env(true, false)}} -\newenvironment{pythonq}{\directlua{pyluatex.record_env("pythonq", false)}}{} +\newenvironment{pythonq}{\directlua{pyluatex.record_env("pythonq")}} +{\directlua{pyluatex.execute_env(false, false)}} -\newenvironment{pythonrepl}{\directlua{pyluatex.record_env("pythonrepl", true)}}{} +\newenvironment{pythonrepl}{\directlua{pyluatex.record_env("pythonrepl")}} +{\directlua{pyluatex.execute_env(false, true)}} \newcommand*{\pyluatex@inline}[3]{\directlua{pyluatex.execute([==[#1]==], #2, #3, false, true)}} -- cgit v1.2.3