如何在 tikz 中创建列表

如何在 tikz 中创建列表

我想创建列表并在 tikz\foreach循环中使用它们。示例:

\newcommand{\createSquareList}[1]{ this is the part I do not know }

\foreach \n in \createSquareList{5} 
{
     % do something with \n 
}

其中表达式\createSquareList{5}应该创建前 5 个平方数的列表,即{1,4,9,16,25}

答案1

我想我有一个答案应该可以工作,但实际上不行,显然是因为 \pgfmathparse{} 和 \pgfmathresult 宏无法正常工作。以下是我所做的:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{backgrounds}

\newcommand{\listgen}[4]% expression, start, start+step, stop
{   \foreach \n in {#2,#3,...,#4}
    {   \pgfmathparse{#1}
        \node at (0,\n/2) {\pgfmathresult};
        \node at (-1,\n/2) {\pgfmathresult};
        \node at (\n,0) {\pgfmathresult};
        \node at (\n,-1) {\pgfmathresult};
    }   
}

\begin{document}

\begin{tikzpicture}[framed]
    \listgen{\n*\n}{1}{2}{5}
\end{tikzpicture}

\begin{tikzpicture}[framed]
    \foreach \n in {1,2,...,5}
    {   \pgfmathparse{\n*\n}
        \node at (0,\n/2) {\pgfmathresult};
        \node at (-1,\n/2) {\pgfmathresult};
        \node at (\n,0) {\pgfmathresult};
        \node at (\n,-1) {\pgfmathresult};
    }   
\end{tikzpicture}

\end{document}

我定义了一个命令来获取起始值和终止值、步进和表达式。首先用 tikz 计算表达式,然后应该绘制在节点中。但实际发生的情况是 \pgfmathresult 总是返回零。更奇怪的是有条件地更改为节点的 x 坐标为了确保这不是我对 \listgen 的定义,我也手动做了同样的事情,但仍然是同样奇怪的结果。

您能否运行这个来检查错误是否可以重现?

第一个结果来自宏,第二个结果来自手动

编辑:嗯,这很奇怪。我已经成功使用了 \pgfmathresult,如下所示:

\begin{tikzpicture}[framed]
\foreach \x in {70,71,...,79}
        {   \pgfmathparse{(\x-70)*5+25}
            \fill[green!\pgfmathresult!black] (\x/10,1.6-\x/50) rectangle (\x/10+0.1,1.4-\x/50);
        }
\end{tikzpicture}

这应该会给出一个绿色的楼梯状的东西,其中颜色随着 \pgfmathparse 的变量而变化。可能是 tikz 中的一个错误?

编辑2:哇哦,成功了。感谢杰克:D

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{backgrounds}

\newcommand{\listgen}[4]% expression, start, start+step, stop
{   \foreach \n in {#2,#3,...,#4}
    {   \pgfmathsetmacro{\myresult}{#1};
        \node at (0,\n/2) {\myresult};
        \node at (-1,\n/2) {\myresult};
        \node at (\n,0) {\myresult};
        \node at (\n,-1) {\myresult};
    }   
}

\begin{document}

\begin{tikzpicture}[framed]
    \listgen{\n*\n}{1}{2}{5}
\end{tikzpicture}

\end{document}

编辑3:谢谢安德烈·维赫罗夫杰克这个帖子,我可以让它以带括号的字符串形式返回列表:

\documentclass{article}
\usepackage{tikz}
\usepackage{ifthen}
\usetikzlibrary{backgrounds}

\newcommand{\listgen}[4]% expression, start, start+step, stop
{   \gdef\myresult{}%
    \foreach \n in {#2,#3,...,#4}%
    {   \pgfmathsetmacro{\tikzresult}{#1}%
        \ifthenelse{\n=#2}{\global\edef\myresult{(\tikzresult, }}%
        {   \ifthenelse{\n=#4}{\global\edef\myresult{\myresult\tikzresult)}}%
            {   \global\edef\myresult{\myresult\tikzresult, }%
            }%
        }%
    }%
    \myresult%
}

\begin{document}

\listgen{\n*\n}{1}{2}{5}\\

Lorem ipsum dolor sit amet, consectetur adipisici elit, sed eiusmod tempor incidunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquid ex ea commodi consequat. Quis aute iure reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint obcaecat cupiditat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\\

\begin{tikzpicture}
    \draw (0,1) -- (10,1);
    \node[right] at (0,0.5) {\listgen{\n*\n}{1}{2}{5}};
    \draw (0,0) -- (10,0);  
\end{tikzpicture}

\end{document}

返回(1.0, 4.0, 9.0, 16.0, 25.0)

它用于TikZ数学计算,因此可以在环境内部或外部使用。但是,如果我尝试通过命令TikZ将列表放入,它会崩溃。有人知道为什么吗?{}\{ \}

相关内容