summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKarl Berry <karl@freefriends.org>2022-05-07 20:39:53 +0000
committerKarl Berry <karl@freefriends.org>2022-05-07 20:39:53 +0000
commit66cf44c488603214d7931e3d90f74717a8a36d2c (patch)
tree92f4faae737f11ddf67c3a4af3e132eeda029210
parent500ad93a0613967b960c8b732851c7135de2d440 (diff)
runcode (7may22)
git-svn-id: svn://tug.org/texlive/trunk@63252 c570f23f-e606-0410-a88d-b1316a301751
-rw-r--r--Master/texmf-dist/doc/latex/runcode/README6
-rw-r--r--Master/texmf-dist/doc/latex/runcode/runcode.pdfbin170764 -> 186652 bytes
-rw-r--r--Master/texmf-dist/doc/latex/runcode/runcode.tex28
-rw-r--r--Master/texmf-dist/tex/latex/runcode/runcode.sty75
4 files changed, 104 insertions, 5 deletions
diff --git a/Master/texmf-dist/doc/latex/runcode/README b/Master/texmf-dist/doc/latex/runcode/README
index 4ab7c5c2c39..15a32aa794c 100644
--- a/Master/texmf-dist/doc/latex/runcode/README
+++ b/Master/texmf-dist/doc/latex/runcode/README
@@ -1,11 +1,11 @@
-LaTeX Package: runcode 2020/10/04 v1.0
+LaTeX Package: runcode 2022/05/03 v1.2
----------------------------------------
The runcode package enables the execution of source code (e.g., R,
-Julia, Matlab, shell, etc.) and embed the results in the pdf file
+Julia, Matlab, shell, Python, etc.) and embed the results in the pdf file
when compiling the LaTeX file. To use this package the shell-escape
option must be enabled.
-Copyright (C) 2020
+Copyright (C) 2020-2022
Haim Bar and HaiYing Wang https://github.com/Ossifragus/runcode
Files:
diff --git a/Master/texmf-dist/doc/latex/runcode/runcode.pdf b/Master/texmf-dist/doc/latex/runcode/runcode.pdf
index 13fcdea4da3..f80903c471f 100644
--- a/Master/texmf-dist/doc/latex/runcode/runcode.pdf
+++ b/Master/texmf-dist/doc/latex/runcode/runcode.pdf
Binary files differ
diff --git a/Master/texmf-dist/doc/latex/runcode/runcode.tex b/Master/texmf-dist/doc/latex/runcode/runcode.tex
index 977a41bc244..1d1dccdf947 100644
--- a/Master/texmf-dist/doc/latex/runcode/runcode.tex
+++ b/Master/texmf-dist/doc/latex/runcode/runcode.tex
@@ -15,9 +15,9 @@
\documentclass{ltxdoc}
\usepackage[hyphens]{url}
%\usepackage{runcode}
-\ProvidesPackage{runcode}[2021/04/17 runcode v1.1]
+\ProvidesPackage{runcode}[2022/05/03 runcode v1.1]
\begin{document}
- \title{The \textsf{runcode} package\thanks{This document corresponds to \textsf{runcode}~v1.1, dated~2021/04/17.}}
+ \title{The \textsf{runcode} package\thanks{This document corresponds to \textsf{runcode}~v1.2, dated~2022/05/03.}}
\author{Haim Bar and HaiYing Wang \\ \texttt{haim.bar@uconn.edu}, \texttt{haiying.wang@uconn.edu}}
\maketitle
@@ -141,8 +141,32 @@ Available options are:
\end{itemize}
+\bigskip
+\noindent \verb|\runPython[Arg1]{Arg2}{Arg3}[Arg4]| runs an external Python code file.
+\begin{itemize}
+\item \texttt{Arg1} is optional and uses \textit{talk2stat]}'s Python server by default.
+\item \texttt{Arg2}, \texttt{Arg3}, and \texttt{Arg4} have the same effects as those of the basic command \verb|\runExtCode|.
+\end{itemize}
+
+\noindent \verb|\inlnPython[Arg1]{Arg2}[Arg3]| runs Python source code (\texttt{Arg2}) and displays the output in line.
+\begin{itemize}
+\item \texttt{Arg1} is optional and uses the Python server by default.
+\item \texttt{Arg2} is the R source code to run. If the Python source code is wrapped between \verb|```| on both sides (as in the markdown grammar), then it will be implemented directly; otherwise the code will be written to a file on the disk and then be called.
+\item \texttt{Arg3} has the same effect as that of the basic command \verb|\inln|.
+\end{itemize}
+
+\noindent \verb|\runPythonBatch[Arg1][Arg2]| runs an external Python source code (\texttt{Arg1}) in batch mode (without a server running). Python (at least currently), unlike the other languages we use, does not have an option to save and restore a session, which means that once a Python session ends, the working environment (variable, functions) is deleted. In order to allow a batch-mode in Python, we implemented such capability. It requires the dill module (https://pypi.org/project/dill/) module, which has to be installed via `pip3 install dill`.
+\begin{itemize}
+\item \texttt{Arg1} is the Python source code to run.
+\item \texttt{Arg2} is the output file name.
+\end{itemize}
+
+
+
+
\section{Revisions}
\begin{itemize}
+\item v1.2, May 3, 2022: Added python options (server and batch).
\item v1.1, April 17, 2021: Added a nohup option; improved error handling (missing code files, zero bytes in output files.)
\end{itemize}
diff --git a/Master/texmf-dist/tex/latex/runcode/runcode.sty b/Master/texmf-dist/tex/latex/runcode/runcode.sty
index 6737fd213f6..187bd77b0a2 100644
--- a/Master/texmf-dist/tex/latex/runcode/runcode.sty
+++ b/Master/texmf-dist/tex/latex/runcode/runcode.sty
@@ -79,12 +79,33 @@
\fi
}
+\DeclareOption{python}{
+ % create a configuration file for Python server if it does not exist.
+ \IfFileExists{python.config}{}{
+ \newwrite\tempfile
+ \immediate\openout\tempfile=python.config
+ \immediate\write\tempfile{[SERVERCONFIG]}
+ \immediate\write\tempfile{PORT = 65433}
+ \immediate\write\tempfile{DEBUGFILE = pythondebug.txt}
+ \immediate\write\tempfile{PIPETIMEOUT = 300}
+ \immediate\closeout\tempfile
+ }
+ % Start the server. Need to run just once. Can comment out after the first
+ % compilation, but remember to terminate the server
+ \ifnotnohup
+ {\immediate\write18{python3 -c 'from talk2stat.talk2stat import server,client; server("./","python") if not client("./","python","``` ```") else print("server is already running")'}}
+ \else
+ {\immediate\write18{nohup python3 -c 'from talk2stat.talk2stat import server,client; server("./","python") if not client("./","python","``` ```") else print("server is already running")' &}}
+ \fi
+}
+
\DeclareOption{stopserver}{
\AtEndDocument{
%% stop the server when the pdf compilation is done.
\immediate\write18{python3 -c 'from talk2stat.talk2stat import client; client("./","R","QUIT")'}
\immediate\write18{python3 -c 'from talk2stat.talk2stat import client; client("./","julia","QUIT")'}
\immediate\write18{python3 -c 'from talk2stat.talk2stat import client; client("./","matlab","QUIT")'}
+ \immediate\write18{python3 -c 'from talk2stat.talk2stat import client; client("./","python","QUIT")'}
}}
\ProcessOptions*
@@ -294,4 +315,58 @@
\NewDocumentCommand{\inlnMatlab}{O{python3 -c 'from talk2stat.talk2stat import client; client("./","matlab","\tmpname.txt")'} m O{inline}}{\IfBeginWith{#2}{```}{\inln{python3 -c 'from talk2stat.talk2stat import client;client("./","matlab","#2")'}{#2}[#3]}{\inln{#1}{#2}[#3]}}
+
+\NewDocumentCommand{\runPython}{O{python3 -c 'from talk2stat.talk2stat import client; client("./","python","#2")'} m m O{}}
+{
+ \def\runcmd{python3 -c 'from talk2stat.talk2stat import client; client("./","python","#2")'}
+ \ifstrequal{#1}{\runcmd}
+ {\runExtCode{#1}{}{#3}[#4]}
+ {\runExtCode{#1}{#2}{#3}[#4]}
+}
+
+\NewDocumentCommand{\inlnPython}{O{python3 -c 'from talk2stat.talk2stat import client; client("./","python","\tmpname.txt")'} m O{inline}}{\IfBeginWith{#2}{```}{\inln{python3 -c 'from talk2stat.talk2stat import client;client("./","python","#2")'}{#2}[#3]}{\inln{#1}{#2}[#3]}}
+
+
+%%%%%%%%
+% For Python batch mode, implement saving and restoring session
+% Arg #1 is the source file name,
+% Arg #2 is the output file name
+
+\NewDocumentCommand{\runPythonBatch}{m m}{%\-\\
+ \stepcounter{codeOutput}
+ \ifthenelse{\isempty{#2}} % set the output file name
+ { \setvalue{\tmpname}{tmp/\jobname_tmp\thecodeOutput.tex} }
+ { \setvalue{\tmpname}{tmp/#2.tex} }
+
+ \IfFileExists{#1}{
+ \ifruncode
+ \newwrite\tempfile
+ \immediate\openout\tempfile=tmp/\jobname_#1
+ \immediate\write\tempfile{import dill}
+ \immediate\write\tempfile{from os.path import exists}
+ \immediate\write\tempfile{if exists('tmp/session'):}
+ \immediate\write\tempfile{ dill.load_session('tmp/session')}
+ \immediate\write\tempfile{}
+ \newread\infile
+ \openin\infile=#1
+ \begingroup\endlinechar=-1
+ \loop\unless\ifeof\infile
+ \read\infile to\fileline % Read one line and store it into \fileline
+ \immediate\write\tempfile{\unexpanded\expandafter{\fileline}} % print the content to copy.txt
+ \repeat
+ \endgroup
+ \closein\infile
+ \immediate\write\tempfile{dill.dump_session('tmp/session')}
+ \immediate\write\tempfile{}
+ \immediate\closeout\tempfile
+ \immediate\write18{python3 tmp/\jobname_#1 > \tmpname}
+ \fi
+ }
+ {
+ \immediate\write18{cat /dev/null > \tmpname}
+ \textcolor{red}{\textbf{runPythonBatch: File #1 does not exist!}}
+ }
+}
+
+
\endinput