使用 sageTeX 为 TikZ 图片定义变量

使用 sageTeX 为 TikZ 图片定义变量

我想将参数传递给 TikZ 图片。参数的计算很长,并且使用 sage 完成。所以我想同时使用 TikZ 和 sageTeX。编译要么进入无限循环,要么我收到非显式错误消息:“\XC@define@color 有一个额外的 }”。

错误消息:

    \documentclass{article}
\usepackage{sagetex} 
    \usepackage{tikz}
\begin{document}

Begin sagesilent, \ldots
    \begin{sagesilent} 
    x=2.1 
    y=3.1 
    \end{sagesilent}

After sagesilent:

 print $\sage{x}$

 print $\sage{y}$

\def \xf{\sage{x}}
\def \yf{\sage{y}}

we get \xf \,  and  \, \yf. 
    \begin{tikzpicture} 
    \coordinate (P) at (\xf,\yf);   
    \fill[black] (P) circle [radius=10pt];  
    \end{tikzpicture}

\end{document}

无限循环:

\documentclass{article}
\usepackage{sagetex} 
    \usepackage{tikz}

\begin{document}

Begin sagesilent, \ldots 
    \begin{sagesilent}
    r=2.1 
    \end{sagesilent}

After sagesilent we print $\sage{r}$

\def \cr{\sage{r}}

and we get $r=\cr$. 
    \begin{tikzpicture} 
    \draw circle (\cr);  
    \end{tikzpicture}

\end{document} 

如果我在 TikZ 环境中定义变量或使用 \newcommand,结果是相同的。如果我使用整数 2 而不是 2.1,结果也是一样的。新命令似乎在文本环境中有效,但在图形环境中无效。

答案1

有一件事可能有效,那就是将 TikZ 代码的生成也拉进 Sage 中:

\begin{sagesilent}
# code to compute x and y

def mytikz(x, y):
    ret = [r'\begin{tikzpicture}']
    # ret.append() more tikz code, some of which presumably uses x and y
    ret.append(r'\end{tikzpicture}')

    return '\n'.join(ret)
\end{sagesilent}

然后,当您想要照片时:

\sagestr{mytikz(x, y)}

这可能不起作用;TikZ 做了很多奇怪的低级 TeX 事情,而且它并不总是能与 LaTeX\ref\label系统很好地兼容。

答案2

由于 TikZ 处理命令的方式,将 TikZ 与 SageTeX 和允许代码执行的类似软件包混合使用非常棘手。通常最简单的方法是在 LaTeX 之外组装所有 TikZ 命令,只将完全组装的版本传递给 LaTeX。

PythonTeX 的最新版本 (0.15) 为此类情况添加了字符串插值/变量替换环境,并且还添加了 Sage 支持,因此它可能是一个取决于您需要做什么的选项。

\documentclass{article}

\usepackage[usefamily=sage]{pythontex} 
\usepackage{tikz}

\begin{document}

Define variables \ldots
\begin{sagecode} 
x = 2.1 
y = 3.1 
\end{sagecode}

After sagecode we get \sage{x} and \sage{y}. 

\begin{sagesub}
\begin{tikzpicture} 
\coordinate (P) at (!{x},!{y});   
\fill[black] (P) circle [radius=10pt];  
\end{tikzpicture}
\end{sagesub}

\end{document}

这将使用如下命令序列进行编译

pdflatex file.tex
pythontex file.tex
pdflatex file.tex

假设它sage位于您的 PATH 上;否则,您可能需要使用pythontex--interpreter选项来指定可执行文件的位置。

环境中的替换/插值字段sagesub用 表示!{<variable or expression>}<variable or expression>可以包含花括号,只要它们成对出现且深度不超过 5 层即可。如果需要不成对的花括号,则可以使用一串括号作为分隔符,只要该序列比最长的不成对序列长且不超过 6。例如,!{{{<variable or expression>}}}允许不成对的{{{}}}

答案3

这是使用上述 Dan Drake 建议的解决方案的有效代码。它解决了无限循环的情况。

\documentclass{article}
\usepackage{sagetex}
\usepackage{tikz}
\begin{document}
Begin sagesilent, \ldots

\begin{sagesilent}
reset()
var('rd')
def mytikz(rd):
    ret = [r'\begin{tikzpicture}']
    ret.append(r'\draw circle (') 
    ret.append(str(rd)) 
    ret.append(r');') 
    ret.append(r'\end{tikzpicture}')
    return '\n'.join(ret)
rd=2.1
#ret=mytikz(rd)
\end{sagesilent}

After sagesilent we print $\sage{rd}$

\sagestr{mytikz(rd)}

\end{document}

当然,第一次编译会导致错误,因为在给 TikZ 的 sage 字符串中 rd 是未知的。运行 sagetex 后,第二次编译会给出结果。

相关内容