У меня есть следующий исходный код 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}