好的,所以有很多问题与我想要解决的问题非常接近,但我找不到方法组合来完成这项工作(如果这个问题已经在其他地方得到解答,我很抱歉---我不确定我真的知道要搜索什么)。
我的问题是,一旦我将所有内容添加到中\mymatrixcontent
,最终计算结果就会显示在每个插槽中。
我不得不想象这个问题与我在哪里/如何扩展事物有关,但我无法弄清楚。
\usepackage{tikz}
\usetikzlibrary{matrix}
\usepackage{etoolbox}
\usepackage{pythontex}
\begin{pycode}
def foobar(number):
return 2 * number
\end{pycode}
% commands so I can use the variable in the pycode
\newcommand {\inttopy}[2]{ \expandafter \inttopytwo \expandafter {#2}{#1}}
\newcommand {\inttopytwo }[2]{\pyc{#2=#1}}
\begin{document}
\begin{tikzpicture}
\let\mymatrixcontent\empty
\foreach \n in {1,...,30}{
\inttopy{changingNumber}{\n} % so I can use the year later in calculations
\xdef\myVariable{\py{foobar(changingNumber)}}
\xappto\mymatrixcontent{|[draw, circle,minimum size=1.5em,inner sep=2pt]|\n \expandonce{\&} \expandonce{\myVariable}}
\gappto\mymatrixcontent{\\}
}
\matrix[matrix of nodes, ampersand replacement=\&,
column sep=2ex, label={Matrix}
] (m){
\mymatrixcontent
};
\end{tikzpicture}
\end{document}
答案1
该命令\py
非常强大,这意味着它不会在\edef
/中扩展\xdef
。
第二列永远都是\py{foobar(changingNumber)}
,但是当实际排版时(循环之后和矩阵内部),changingNumber
最后设置为 30。(并且这些 Python 作业不会按循环分组,\foreach
因为类似情况下的其他内容通常会引发错误。)
在这个简单的例子中
\edef\myVariable{\py{foobar(\n)}}
就足够了,因为\n
将扩展到它的价值。
我进一步简化了循环。我们可以直接使用低级\pgfmatrix…
宏,而不必担心替换符号。
代码
% arara: pdflatex
% arara: pythontex
% arara: pdflatex
%\documentclass{article}
\documentclass[tikz]{standalone}
\usepackage{tikz}
\usetikzlibrary{matrix}
\usepackage{etoolbox}
\usepackage{pythontex}
\begin{pycode}
def foobar(number):
return 2 * number
\end{pycode}
\begin{document}
\begin{tikzpicture}
\let\mymatrixcontent\empty
\foreach \n in {1,...,30}{
\xappto\mymatrixcontent{\n \noexpand\pgfmatrixnextcell
\py{foobar(\n)} \noexpand\pgfmatrixendrow}
}
\matrix[
matrix of nodes,
column sep=2ex,
column 1/.append style={
nodes={
draw, circle, minimum size=1.5em, inner sep=2pt}},
label={Matrix}
] (m){\mymatrixcontent};
\end{tikzpicture}
\end{document}