Наберите функции с помощью PythonTeX и затем выполните их в консоли

Наберите функции с помощью PythonTeX и затем выполните их в консоли

У меня есть следующий исходный код Python:

def modulo(a, n):
    return a % n

print(modulo(3, 10))
print(modulo(10, 10))
print(modulo(11, 10))

Первое определение функции дает подсказку о реализации, а вызовы ниже демонстрируют примерное использование/вывод.

Я хочу оформить это следующим образом (чтобы люди могли скопировать и вставить реализацию и увидеть живой результат):

def modulo(a, n):
    return a % n

>>> print(modulo(3, 10))
3
>>> print(modulo(10, 10))
0
>>> print(modulo(11, 10))
1

Мне не удалось создать это с помощью PythonTeX.

\begin{pyblock}[mysession][]
def modulo(a, n):
    return a % n

\end{pyblock}

\begin{pyconsole}[mysession][]
print(modulo(3, 10))
print(modulo(10, 10))
print(modulo(11, 10))

\end{pyconsole}

Это дает мне

def modulo(a, n):
    return a % n

>>> print(modulo(3, 10))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'modulo' is not defined
>>> print(modulo(10, 10))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'modulo' is not defined
>>> print(modulo(11, 10))
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'modulo' is not defined

Theдокументацияупоминает сеансы, в которых код выполняется параллельно, поэтому я явно помещаю эти фрагменты кода в один и тот же сеанс (хотя по умолчанию оба выполняются в default).

Мне определенно нужноPythonTeXрешение. Есть идеи?

решение1

Консольный код и обычный код имеют свои собственныеотдельный defaultсеансы. Все команды/среды, начинающиеся с , pyconвыполняются полностью отдельно от тех, которые начинаются с py. Между ними нет перекрытия.

Функция, позволяющая делать то, что вы хотитебыл запрошени будет реализовано в предстоящем выпуске PythonTeX. В то же время, вы, вероятно, можете делать то, что хотите с этим обходным путем,скопировано из этого запроса на функцию.

\documentclass{article}

\usepackage{pythontex}

\newenvironment{pyconcodeblock}%
 {\VerbatimEnvironment
  \begin{VerbatimOut}{temp.py}}%
 {\end{VerbatimOut}%
  \pyconc{exec(compile(open('temp.py', 'rb').read(), 'temp.py', 'exec'))}%
  \inputpygments{python}{temp.py}}

\begin{document}

\begin{pyconcodeblock}
def foo(x):
    return 2*x
\end{pyconcodeblock}

\begin{pyconsole}
x = 10
foo(x)
\end{pyconsole}

\end{document}

Связанный контент