我刚刚发现这个python
包,并尝试在 Tikz 代码中使用它。不幸的是,这不起作用:
\documentclass[oneside]{memoir}
\usepackage{pgfplots}
\usepackage{python}
\begin{document}
\begin{figure}[H]
\centering
\begin{tikzpicture}
\draw (0, 0) -- (
\begin{python}
print(1) # note that my default Python version is 3.2, so this works outside the tikzpicture environment.
\end{python}
, 0);
\end{tikzpicture}
\caption{Blah.}
\end{figure}
\end{document}
我收到的第一个错误是:
失控参数?{pgf@tempcolor}{\def \@currenvir {python}\edef \@currenvline {\on@line \ETC. ! 段落在 \XC@definec@lor 完成之前结束。\par l.13 print(1)
我怀疑你忘记了一个“}”,导致我将这个控制序列应用于太多文本。我们该如何恢复?我的计划是忘记整件事,并希望一切顺利。
有可能让这样的事情发挥作用吗?也许使用不同的 Python 包?此外,有没有办法让 Python 定义在嵌入式环境之间保持不变?
答案1
你可能对我的感兴趣PythonTeX包。它仅在修改时执行 Python 代码,保存所有 Python 生成的结果,并提供环境/命令之间的持久性。
我认为您在示例中遇到的问题的一部分与 的内部工作有关\draw
。我也无法获得与我的包一起使用的等效示例,并且收到类似的错误。但是,以下示例确实有效。请注意,环境pycode
当前无法缩进,因此格式与您的示例略有不同。此外,当您不需要整个环境时, \py
和可用于内联使用。执行代码,并返回给定内容的字符串表示形式。\pyc
\pyc
\py
\documentclass[oneside]{memoir}
\usepackage{pgfplots}
\usepackage{pythontex}
\begin{document}
\begin{figure}[H]
\centering
\begin{tikzpicture}
\begin{pycode}
a = 2
print(r'\draw (0, 0) -- ({0}, 0);'.format(a))
\end{pycode}
\pyc{b = 3}
\py{r'\draw (0, 0) -- ({0}, 1);'.format(b)}
\end{tikzpicture}
\caption{Blah.}
\end{figure}
\end{document}
2016 年 8 月更新
PythonTeX 现在具有用于变量替换/字符串插值的命令和环境。下面包含使用其中一个重写的示例版本。
环境中的所有内容pysub
都会逐字传递给 Python。替换字段采用以下形式!{<expression>}
。如果<expression>
以文字花括号开头或结尾,则应添加空格以将花括号<expression>
与分隔括号分开。如果<expression>
包含不成对的花括号,则可以使用更多分隔符。例如,!{{{<expression>}}}
将允许包含不成对的、、或(基本上是任何比分隔符更短的括号序列)<expression>
的任意组合。有关更多详细信息,请参阅 PythonTeX 文档。{
{{
}
}}
\documentclass[oneside]{memoir}
\usepackage{pgfplots}
\usepackage{pythontex}
\begin{document}
\begin{figure}[h]
\centering
\begin{pycode}
a = 2
b = 3
\end{pycode}
\begin{pysub}
\begin{tikzpicture}
\draw (0, 0) -- (!{a}, 0);
\draw (0, 0) -- (!{b}, 1);
\end{tikzpicture}
\end{pysub}
\caption{Blah.}
\end{figure}
\end{document}
答案2
我最后写了我自己的 Python 中的 TikZ 生成器。