Setzen Sie Funktionen mit PythonTeX und führen Sie sie anschließend in der Konsole aus

Setzen Sie Funktionen mit PythonTeX und führen Sie sie anschließend in der Konsole aus

Ich habe den folgenden Python-Quellcode:

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

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

Die erste Funktionsdefinition gibt einen Hinweis auf die Implementierung und die folgenden Aufrufe zeigen eine beispielhafte Verwendung/Ausgabe.

Ich möchte dies folgendermaßen setzen (damit die Leute die Implementierung kopieren und einfügen und eine Live-Ausgabe sehen können):

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

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

Ich konnte dies mit PythonTeX nicht erstellen.

\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}

Das gibt mir

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

DerDokumentationerwähnt Sitzungen, in denen Code parallel ausgeführt wird, deshalb habe ich diese Codeausschnitte explizit in dieselbe Sitzung eingefügt (obwohl standardmäßig beide in ausgeführt werden default).

Ich brauche unbedingt einePythonTeXLösung. Irgendwelche Ideen?

Antwort1

Konsolencode und normaler Code haben jeweils ihre eigenenseparate defaultSitzungen. Alle Befehle/Umgebungen, die mit beginnen, werden pyconvollständig getrennt von denen ausgeführt, die mit beginnen py. Es gibt keine Überschneidungen zwischen ihnen.

Eine Funktion, mit der Sie tun können, was Sie wollenwurde angefordertund wird in einer kommenden Version von PythonTeX implementiert. In der Zwischenzeit können Sie wahrscheinlich mit diesem Workaround machen, was Sie wollen,aus dieser Funktionsanforderung kopiert.

\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}

verwandte Informationen