From 89e8f58007e3fa8841a95b1e3d7efeacced6aed5 Mon Sep 17 00:00:00 2001 From: Norbert Preining Date: Mon, 6 Jun 2022 03:02:07 +0000 Subject: CTAN sync 202206060302 --- macros/luatex/latex/pyluatex/README.md | 6 ++-- macros/luatex/latex/pyluatex/example/beamer.tex | 38 ++++++++++++--------- macros/luatex/latex/pyluatex/example/repl.tex | 4 +-- macros/luatex/latex/pyluatex/pyluatex.lua | 15 +++++---- macros/luatex/latex/pyluatex/pyluatex.pdf | Bin 81863 -> 82658 bytes macros/luatex/latex/pyluatex/pyluatex.sty | 11 ++++-- macros/luatex/latex/pyluatex/pyluatex.tex | 43 +++++++++++++----------- 7 files changed, 69 insertions(+), 48 deletions(-) (limited to 'macros/luatex/latex/pyluatex') diff --git a/macros/luatex/latex/pyluatex/README.md b/macros/luatex/latex/pyluatex/README.md index a6faac70c2..c93a3b8c8b 100644 --- a/macros/luatex/latex/pyluatex/README.md +++ b/macros/luatex/latex/pyluatex/README.md @@ -34,7 +34,7 @@ $\sqrt{371} = \py{math.sqrt(371)}$ ``` **Note:** PyLuaTeX starts Python 3 using the command `python3` by default. If `python3` does not start Python 3 on your system, find the correct command -and replace `\usepackage{pyluatex}` with `\usepackage[executable={your python command}]{pyluatex}`. +and replace `\usepackage{pyluatex}` with `\usepackage[executable=]{pyluatex}`. For example, `\usepackage[executable=python.exe]{pyluatex}`. 2\. Compile using LuaLaTeX (shell escape is required) @@ -49,8 +49,8 @@ executed. For this reason, it is recommended to compile trusted documents only. * Python 3 * Linux, macOS or Windows -Our automated tests currently use TeX Live 2021 and Python 3.7+ on -Ubuntu 20.04, macOS Big Sur 11 and Windows Server 2019. +The automated tests currently use TeX Live 2022 and Python 3.8+ on +Ubuntu 20.04, macOS Big Sur 11 and Windows Server 2022. ## License [LPPL 1.3c](http://www.latex-project.org/lppl.txt) for LaTeX code and diff --git a/macros/luatex/latex/pyluatex/example/beamer.tex b/macros/luatex/latex/pyluatex/example/beamer.tex index 6dea2ea6c9..31ba69db82 100644 --- a/macros/luatex/latex/pyluatex/example/beamer.tex +++ b/macros/luatex/latex/pyluatex/example/beamer.tex @@ -8,7 +8,7 @@ %% and version 1.3c or later is part of all distributions of LaTeX %% version 2005/12/01 or later. -\documentclass{beamer} +\documentclass[t]{beamer} \usepackage{pyluatex} \usepackage{listings} @@ -64,13 +64,17 @@ end %%%%%%%%%%%%%%%%%%%%%% frame \begin{frame}{Important} -Using PyLuaTeX environments (\emph{python} or \emph{pythonq}) inside BEAMER frames -requires the \emph{fragile} option for those frames. +Using PyLuaTeX environments (\texttt{python}, \texttt{pythonq}, or \texttt{pythonrepl}) inside BEAMER frames +requires the \texttt{fragile} option for those frames. + +\medskip +If you don't use overlays in a frame, i.e. the frame contains only a single slide, +you can use the \texttt{fragile=singleslide} option. \end{frame} %%%%%%%%%%%%%%%%%%%%%% frame -\begin{frame}[fragile]{Slide 1} +\begin{frame}[fragile=singleslide]{Python environment inside frame} \begin{pythonq} msg = 'Hello slide 1' @@ -96,27 +100,31 @@ msg = 'Hello slide 2' print(msg) \end{pythonq} -\begin{frame}{Slide 1} +\begin{frame}{Python environment outside frame} \pytypeset -The \emph{fragile} option is not required in this frame because -the \emph{pythonq} environment is outside the frame. -Only the macro \emph{\textbackslash pytypeset} for typesetting the code and output is inside +The \texttt{fragile} option is not required in this frame because +the \texttt{pythonq} environment is outside the frame. +Only the macro \texttt{\textbackslash pytypeset} for typesetting the code and output is inside the frame. + +\medskip +Inline Python still works: The result of \pyq{17 + 300}$\coderaw$ is \outputraw \end{frame} %%%%%%%%%%%%%%%%%%%%%% frame -\newenvironment{typesetpython} - {\PyLTVerbatimEnv\begin{pythonq}} - {\end{pythonq}\pytypeset} - -\begin{frame}[fragile]{Slide 2} -\begin{typesetpython} +\begin{frame}[fragile]{Overlays} +\begin{pythonq} msg = 'Custom environment' print(msg) -\end{typesetpython} +\end{pythonq} +\pytypeset +\pause + +In this frame, \texttt{fragile} is required instead of \texttt{fragile=singleslide}, +because we use overlays. \end{frame} \end{document} diff --git a/macros/luatex/latex/pyluatex/example/repl.tex b/macros/luatex/latex/pyluatex/example/repl.tex index 28de0090cf..8622223ef3 100644 --- a/macros/luatex/latex/pyluatex/example/repl.tex +++ b/macros/luatex/latex/pyluatex/example/repl.tex @@ -57,9 +57,9 @@ 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 IPython 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 printed automatically. +and the results are added to the output buffer automatically. Both code and output are stored in PyLuaTeX's ouput buffer and can be accessed by \verb|pyluatex.get_last_output()|. In this way, you can adjust the typesetting diff --git a/macros/luatex/latex/pyluatex/pyluatex.lua b/macros/luatex/latex/pyluatex/pyluatex.lua index efa80c75f4..0580d25a53 100644 --- a/macros/luatex/latex/pyluatex/pyluatex.lua +++ b/macros/luatex/latex/pyluatex/pyluatex.lua @@ -141,7 +141,7 @@ local function split_lines(str) return t end -function pyluatex.execute(code, auto_print, write, repl_mode) +function pyluatex.execute(code, auto_print, write, repl_mode, store) local full_code if auto_print then full_code = "print(str(" .. code .. "), end='')" @@ -159,14 +159,17 @@ function pyluatex.execute(code, auto_print, write, repl_mode) ignore_errors = pyluatex.ignore_errors } ) - last_code = split_lines(code) - last_output = split_lines(output) + local output_lines = split_lines(output) + if store then + last_code = split_lines(code) + last_output = output_lines + end if success or pyluatex.ignore_errors then if pyluatex.verbose or not success then log_output(output) end if write then - tex.print(last_output) + tex.print(output_lines) end else if not pyluatex.verbose then log_input(full_code) end @@ -195,7 +198,7 @@ local function record_line(line) table.insert(env_lines, code_in_line) end local code = table.concat(env_lines, "\n") - local success = pyluatex.execute(code, false, false, env_repl_mode) + local success = pyluatex.execute(code, false, false, env_repl_mode, true) if success or pyluatex.ignore_errors then return line:sub(s) else @@ -235,7 +238,7 @@ function pyluatex.run_file(path, write, repl_mode) elseif code:sub(-1) == "\n" then code = code:sub(0, -2) end - pyluatex.execute(code, false, write, repl_mode) + pyluatex.execute(code, false, write, repl_mode, true) else tex.sprint(err_cmd("File not found: " .. path)) end diff --git a/macros/luatex/latex/pyluatex/pyluatex.pdf b/macros/luatex/latex/pyluatex/pyluatex.pdf index 82ff4f85bf..c7710f6f78 100644 Binary files a/macros/luatex/latex/pyluatex/pyluatex.pdf and b/macros/luatex/latex/pyluatex/pyluatex.pdf differ diff --git a/macros/luatex/latex/pyluatex/pyluatex.sty b/macros/luatex/latex/pyluatex/pyluatex.sty index 4d8325c807..6e287e5100 100644 --- a/macros/luatex/latex/pyluatex/pyluatex.sty +++ b/macros/luatex/latex/pyluatex/pyluatex.sty @@ -9,7 +9,7 @@ %% version 2005/12/01 or later. \NeedsTeXFormat{LaTeX2e} -\ProvidesPackage{pyluatex}[2022/03/16 v0.4.4 Execute Python code on the fly] +\ProvidesPackage{pyluatex}[2022/06/05 v0.5.0 Execute Python code on the fly] \RequirePackage{expl3} \ExplSyntaxOn @@ -66,7 +66,7 @@ \newenvironment{pythonrepl}{\directlua{pyluatex.record_env("pythonrepl", true)}}{} -\newcommand*{\pyluatex@inline}[3]{\directlua{pyluatex.execute([==[#1]==], #2, #3, false)}} +\newcommand*{\pyluatex@inline}[3]{\directlua{pyluatex.execute([==[#1]==], #2, #3, false, true)}} \newcommand*{\py}[1]{\pyluatex@inline{#1}{true}{true}} \newcommand*{\pyq}[1]{\pyluatex@inline{#1}{true}{false}} @@ -81,4 +81,11 @@ \newcommand*{\pyfileq}[1]{\directlua{pyluatex.run_file([==[#1]==], false, false)}} \newcommand*{\pyfilerepl}[1]{\directlua{pyluatex.run_file([==[#1]==], false, true)}} +\newcommand*{\pyif}[1]{% + \ifnum1=\directlua{pyluatex.execute([==['1' if (#1) else '0']==], true, true, false, false)}\relax + \expandafter\@firstoftwo + \else + \expandafter\@secondoftwo + \fi} + \endinput diff --git a/macros/luatex/latex/pyluatex/pyluatex.tex b/macros/luatex/latex/pyluatex/pyluatex.tex index c4a10738ac..366a7ae8da 100644 --- a/macros/luatex/latex/pyluatex/pyluatex.tex +++ b/macros/luatex/latex/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.4.4 (2022/03/16)} +\date{v0.5.0 (2022/06/05)} \begin{document} \maketitle \raggedright @@ -56,7 +56,7 @@ $\sqrt{371} = \py{math.sqrt(371)}$ \end{tcblisting} \textbf{Note:} PyLuaTeX starts Python 3 using the command \inlcode|python3| by default. If \inlcode|python3| does not start Python 3 on your system, find the correct command -and replace \inlcode|\usepackage{pyluatex}| with \inlcode|\usepackage[executable={your python command}]{pyluatex}|. +and replace \inlcode|\usepackage{pyluatex}| with \inlcode|\usepackage[executable=]{pyluatex}|. For example, \inlcode|\usepackage[executable=python.exe]{pyluatex}|. \item Compile using Lua\LaTeX{} (shell escape is required) \begin{tcblisting}{breakable,listing only, @@ -131,32 +131,35 @@ The package options \inlcode|verbose| and \inlcode|ignoreerrors| can be changed \subsection{Macros} \begin{itemize} -\item \inlcode|\py{code}|\\[0.5ex] - Executes (object-like) \inlcode|code| and writes its string representation to the document.\\[0.5ex] +\item \inlcode|\py{}|\\[0.5ex] + Executes (object-like) \inlcode|| and writes its string representation to the document.\\[0.5ex] \textit{Example:} \inlcode|\py{3 + 7}| -\item \inlcode|\pyq{code}|\\[0.5ex] - Executes (object-like) \inlcode|code|. Any output is suppressed.\\[0.5ex] +\item \inlcode|\pyq{}|\\[0.5ex] + Executes (object-like) \inlcode||. Any output is suppressed.\\[0.5ex] \textit{Example:} \inlcode|\pyq{3 + 7}| -\item \inlcode|\pyc{code}|\\[0.5ex] - Executes \inlcode|code|. Output (e.g. from a call to \inlcode|print()|) is written to the document.\\[0.5ex] +\item \inlcode|\pyc{}|\\[0.5ex] + Executes \inlcode||. Output (e.g. from a call to \inlcode|print()|) is written to the document.\\[0.5ex] \textit{Examples:} \inlcode|\pyc{x = 5}|, \inlcode|\pyc{print('hello')}| -\item \inlcode|\pycq{code}|\\[0.5ex] - Executes \inlcode|code|. Any output is suppressed.\\[0.5ex] +\item \inlcode|\pycq{}|\\[0.5ex] + Executes \inlcode||. Any output is suppressed.\\[0.5ex] \textit{Example:} \inlcode|\pycq{x = 5}| -\item \inlcode|\pyfile{path}|\\[0.5ex] - Executes the Python file specified by \inlcode|path|. Output (e.g. from a call to \inlcode|print()|) is written to the document.\\[0.5ex] +\item \inlcode|\pyfile{}|\\[0.5ex] + Executes the Python file specified by \inlcode||. Output (e.g. from a call to \inlcode|print()|) is written to the document.\\[0.5ex] \textit{Example:} \inlcode|\pyfile{main.py}| -\item \inlcode|\pyfileq{path}|\\[0.5ex] - Executes the Python file specified by \inlcode|path|. Any output is suppressed.\\[0.5ex] +\item \inlcode|\pyfileq{}|\\[0.5ex] + Executes the Python file specified by \inlcode||. Any output is suppressed.\\[0.5ex] \textit{Example:} \inlcode|\pyfileq{main.py}| -\item \inlcode|\pysession{session}|\\[0.5ex] - Selects \inlcode|session| as Python session for subsequent Python code.\\[0.5ex] +\item \inlcode|\pysession{}|\\[0.5ex] + Selects \inlcode|| as Python session for subsequent Python code.\\[0.5ex] The session that is active at the beginning is \inlcode|default|.\\[0.5ex] \textit{Example:} \inlcode|\pysession{main}| -\item \inlcode|\pyoption{option}{value}|\\[0.5ex] - Assigns \inlcode|value| to the package option \inlcode|option| anywhere in the document. For more information consider +\item \inlcode|\pyoption{