我想将参数传递给 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 后,第二次编译会给出结果。