我想将 pythontex 计算中的浮点变量传递给 latex,以便该变量可以在 pgfplots 图中使用,如下例所示。示例代码显示了两种不起作用的方法。传递的语法应尽可能简短方便。
\documentclass{article}
\usepackage[gobble=auto]{pythontex}
\usepackage{pgfplots}
\begin{document}
\begin{pycode}
from numpy import *
coeffA = 7
coeffB = sqrt(coeffA)
# print(r'\def\coeffA{%s}' %coeffA)
# print(r'\def\coeffB{%s}' %coeffB)
\end{pycode}
\begin{tikzpicture}
\begin{axis}[xlabel=$x$,ylabel=$y$]
%\addplot gnuplot {\coeffA*x**2 + \coeffB*x}; % Results in undefined control sequence error
\addplot gnuplot {\py{coeffA}*x**2 + \py{coeffB}*x}; %Results in an empty plot without errors
\end{axis}
\end{tikzpicture}
\end{document}
答案1
按照@G.Poore 的评论,您可以pysub
按如下方式使用(从版本 v0.15 开始):
\documentclass{article}
\usepackage[gobble=auto]{pythontex}
\usepackage{pgfplots}
\begin{document}
\begin{pycode}
from numpy import *
coeffA = 7
coeffB = sqrt(coeffA)
\end{pycode}
\begin{pysub}
\begin{tikzpicture}
\begin{axis}[xlabel=$x$,ylabel=$y$]
\addplot gnuplot {!{coeffA}*x**2 + !{coeffB}*x};
\end{axis}
\end{tikzpicture}
\end{pysub}
\end{document}
答案2
我在这里发现几个问题:
您不能
\py{}
直接在内部使用\addplot gnuplot
,因为它不是完全可扩展的,所以 gnuplot 实际上是将\py{coeffA}
其作为输入,而不是系数的值。\coeffA
定义和宏的想法\coeffB
很好,但是当你将定义放在环境中时,pycode
它们不起作用,因为pycode
它们不会排版其内容(它不会向 LaTeX 返回任何内容)。即使您进一步移动这些定义,它们也不会在第一次运行时出现在文档中,因此您必须对此采取一些措施。在下面的代码中,我只是将它们定义为一些虚拟值,以避免出现错误报告。
为了使使用更加方便,我添加了一些代码,这些代码会自动遍历所有全局数字变量并创建相应的 LaTeX 宏。这样,在主文档中使用它们就变得非常简单了\pyvar{varname}
。
代码:
\documentclass{article}
\usepackage[gobble=auto]{pythontex}
\usepackage{pgfplots}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\def\pyvar#1{\csname pythonvar@#1\endcsname}
\begin{pycode}
from numbers import Number
def exposeNumericGlobals():
res = r'\makeatletter '
d = globals()
for key in d.keys():
val = d[key]
if isinstance(val, Number):
res = res + (r'\gdef\pythonvar@%s{%s} ' % (key, val))
res = res + r'\makeatother'
return res
\end{pycode}
\AtBeginDocument{\py{exposeNumericGlobals()}}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\begin{pycode}
from numpy import *
coeffA = 7
coeffB = sqrt(coeffA)
\end{pycode}
\begin{document}
\begin{tikzpicture}
\begin{axis}[xlabel=$x$,ylabel=$y$]
\addplot gnuplot {\pyvar{coeffA}*x**2 + \pyvar{coeffB}*x};
\end{axis}
\end{tikzpicture}
\end{document}
输出: