我怎样才能将 pythontex 变量传递给 latex

我怎样才能将 pythontex 变量传递给 latex

我想将 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

我在这里发现几个问题:

  1. 您不能\py{}直接在内部使用\addplot gnuplot,因为它不是完全可扩展的,所以 gnuplot 实际上是将\py{coeffA}其作为输入,而不是系数的值。

  2. \coeffA定义和宏的想法\coeffB很好,但是当你将定义放在环境中时,pycode它们不起作用,因为pycode它们不会排版其内容(它不会向 LaTeX 返回任何内容)。

  3. 即使您进一步移动这些定义,它们也不会在第一次运行时出现在文档中,因此您必须对此采取一些措施。在下面的代码中,我只是将它们定义为一些虚拟值,以避免出现错误报告。

为了使使用更加方便,我添加了一些代码,这些代码会自动遍历所有全局数字变量并创建相应的 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}

输出:

在此处输入图片描述

相关内容