From 6819cddc8096cb82ba36729daf8237db3485ad9c Mon Sep 17 00:00:00 2001 From: Michael Georg Hansen Date: Wed, 28 Oct 2020 16:24:31 +0100 Subject: [PATCH] Add a way to request two pythontex runs. --- demo-multirun.lyx | 329 +++++++++++++++++++++++++++++++++++++++++++ pythontex-wrapper.sh | 23 +++ 2 files changed, 352 insertions(+) create mode 100644 demo-multirun.lyx diff --git a/demo-multirun.lyx b/demo-multirun.lyx new file mode 100644 index 0000000..2711963 --- /dev/null +++ b/demo-multirun.lyx @@ -0,0 +1,329 @@ +#LyX 2.3 created this file. For more info see http://www.lyx.org/ +\lyxformat 544 +\begin_document +\begin_header +\save_transient_properties true +\origin unavailable +\textclass article +\begin_preamble +\usepackage[gobble=auto]{pythontex} +\end_preamble +\use_default_options true +\maintain_unincluded_children false +\language english +\language_package default +\inputencoding auto +\fontencoding global +\font_roman "default" "default" +\font_sans "default" "default" +\font_typewriter "default" "default" +\font_math "auto" "auto" +\font_default_family default +\use_non_tex_fonts false +\font_sc false +\font_osf false +\font_sf_scale 100 100 +\font_tt_scale 100 100 +\use_microtype false +\use_dash_ligatures true +\graphics default +\default_output_format pdf2 +\output_sync 0 +\bibtex_command default +\index_command default +\paperfontsize default +\spacing single +\use_hyperref true +\pdf_title "pythontex-wrapper for lyx demo document" +\pdf_author "Michael G. Hansen" +\pdf_bookmarks true +\pdf_bookmarksnumbered false +\pdf_bookmarksopen false +\pdf_bookmarksopenlevel 1 +\pdf_breaklinks false +\pdf_pdfborder false +\pdf_colorlinks false +\pdf_backref false +\pdf_pdfusetitle true +\papersize default +\use_geometry false +\use_package amsmath 1 +\use_package amssymb 1 +\use_package cancel 1 +\use_package esint 1 +\use_package mathdots 1 +\use_package mathtools 1 +\use_package mhchem 1 +\use_package stackrel 1 +\use_package stmaryrd 1 +\use_package undertilde 1 +\cite_engine basic +\cite_engine_type default +\biblio_style plain +\use_bibtopic false +\use_indices false +\paperorientation portrait +\suppress_date false +\justification true +\use_refstyle 1 +\use_minted 0 +\index Index +\shortcut idx +\color #008000 +\end_index +\secnumdepth 3 +\tocdepth 3 +\paragraph_separation indent +\paragraph_indentation default +\is_math_indent 0 +\math_numbering_side default +\quotes_style english +\dynamic_quotes 0 +\papercolumns 1 +\papersides 1 +\paperpagestyle default +\tracking_changes false +\output_changes false +\html_math_output 0 +\html_css_as_file 0 +\html_be_strict false +\end_header + +\begin_body + +\begin_layout Title +pythontex-wrapper for lyx demo document +\end_layout + +\begin_layout Itemize +Check how many times Python code was actually executed: +\end_layout + +\begin_deeper +\begin_layout Itemize +\begin_inset ERT +status open + +\begin_layout Plain Layout + + +\backslash +begin{pycode}[sessionA] +\end_layout + +\begin_layout Plain Layout + +import os +\end_layout + +\begin_layout Plain Layout + +import json +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + +myFileName= +\begin_inset Quotes erd +\end_inset + +test.json +\begin_inset Quotes erd +\end_inset + + +\end_layout + +\begin_layout Plain Layout + +if (os.path.exists(myFileName)): +\end_layout + +\begin_layout Plain Layout + + with open(myFileName, +\begin_inset Quotes eld +\end_inset + +r +\begin_inset Quotes erd +\end_inset + +) as myFile: +\end_layout + +\begin_layout Plain Layout + + myData=json.load(myFile) +\end_layout + +\begin_layout Plain Layout + + myFile.close() +\end_layout + +\begin_layout Plain Layout + +else: +\end_layout + +\begin_layout Plain Layout + + myData={ +\begin_inset Quotes eld +\end_inset + +value +\begin_inset Quotes erd +\end_inset + +:0} +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + +myData[ +\begin_inset Quotes eld +\end_inset + +value +\begin_inset Quotes erd +\end_inset + +]=myData[ +\begin_inset Quotes eld +\end_inset + +value +\begin_inset Quotes erd +\end_inset + +]+1 +\end_layout + +\begin_layout Plain Layout + +print( +\begin_inset Quotes eld +\end_inset + +pythontex has been run +\begin_inset Quotes eld +\end_inset + ++str(myData[ +\begin_inset Quotes eld +\end_inset + +value +\begin_inset Quotes erd +\end_inset + +])+ +\begin_inset Quotes erd +\end_inset + + times. +\begin_inset Quotes erd +\end_inset + +) +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + +with open( +\begin_inset Quotes eld +\end_inset + +test.json +\begin_inset Quotes erd +\end_inset + +, +\begin_inset Quotes eld +\end_inset + +w +\begin_inset Quotes erd +\end_inset + +) as myFile: +\end_layout + +\begin_layout Plain Layout + + json.dump(myData, myFile) +\end_layout + +\begin_layout Plain Layout + + myFile.close() +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + +# force two runs of pythontex +\end_layout + +\begin_layout Plain Layout + +signfile=open( +\begin_inset Quotes eld +\end_inset + +pythontex-wrapper-runagain.tmp +\begin_inset Quotes erd +\end_inset + +, +\begin_inset Quotes eld +\end_inset + +w +\begin_inset Quotes erd +\end_inset + +) +\end_layout + +\begin_layout Plain Layout + +signfile.close() +\end_layout + +\begin_layout Plain Layout + +\end_layout + +\begin_layout Plain Layout + + +\backslash +end{pycode} +\end_layout + +\end_inset + + +\end_layout + +\end_deeper +\end_body +\end_document diff --git a/pythontex-wrapper.sh b/pythontex-wrapper.sh index 89cd661..c2f80e3 100755 --- a/pythontex-wrapper.sh +++ b/pythontex-wrapper.sh @@ -8,6 +8,7 @@ # by changing the executable name latexcommand="pdflatex" pythontexcommand="pythontex3" +secondrunfile="pythontex-wrapper-runagain.tmp" if [ "$1" = "--help" ] || [ "$1" = "-h" ] ; then echo "pythontex-wrapper V0.1, licensed CC0-1.0" @@ -49,6 +50,9 @@ if [ ! -e ${pytxcodefilename} ] ; then exit 0 fi +# remove second-run-request file +rm -f ${secondrunfile} + echo -e "\n\npythontex-wrapper: Calling ${pythontexcommand}" echo -e "------------------------------------------\n\n" ${pythontexcommand} $1 @@ -65,6 +69,25 @@ if [ ${lastResult} -gt 0 ]; then exit 1 fi +if [ -e ${secondrunfile} ] ; then + # 2nd run of pythontex requested + echo -e "\n\npythontex-wrapper: Calling ${pythontexcommand} for 2nd run" + echo -e "------------------------------------------\n\n" + ${pythontexcommand} --rerun always $1 + lastResult=$? + echo "pythontex run: ${lastResult}" >> pythontex-wrapper.log + if [ ${lastResult} -gt 0 ]; then + # running pythontex failed + # lyx expects LaTeX error messages in the log file + # Add a fake latex error message which lyx understands + echo "! Undefined control sequence." >>${logfilename} + echo "l.17 \\pythontexError" >>${logfilename} + echo "\\Actually there is a pythontex error, see complete log for details." >>${logfilename} + + exit 1 + fi +fi + # pythontex worked, run latex again echo -e "\n\npythontex-wrapper: Calling ${latexcommand}" echo -e "------------------------------------------\n\n"