TikZ:哪里记录了 foreach 循环中使用的语法“evaluate={...}”?

TikZ:哪里记录了 foreach 循环中使用的语法“evaluate={...}”?

此语法evaluate={...}记录在math库的第 704/1318 页。我引用手册中的一段话:

/tikz/evaluate=<statements>(无默认值)此键仅执行 \tikzmath{<statements>}

示例页面

以下部分描述了此库提供的微型语言,可用于命令\tikzmathevaluate键。该语言仅由简单的关键字和表达式组成,但微型解析器允许您以相当通用的方式格式化代码(非常类似于蒂克兹解析器)除了 所有关键字后面必须至少有一个空格这是需要记住的第二件最重要的事情(记住在每个语句末尾插入分号之后)。

但它在foreach循环内工作无需加载图书馆math

这里的许多答案都使用 foreach 循环内的语法,evaluate={...}而不是使用手册第 1003/1318 页上记录的语法,我记得:

/pgf/foreach/evaluate=<variable> as <macro> using <formula>

例如这里,Peter Grill 在这里使用它

手册在第 1045/1318 页展示了它的用法,以说明宏

\pgfmathtodigitlist{<macro>}{<number>}

使用以下代码:

\documentclass[margin=2mm,tikz]{standalone}
\begin{document}

\pgfmathsetbasenumberlength{8}
\begin{tikzpicture}[x=0.25cm, y=0.25cm]
\foreach \n [count=\y] in {0, 60, 102, 102, 126, 102, 102, 102, 0}{
\pgfmathdectobase{\binary}{\n}{2}
\pgfmathtodigitlist{\digitlist}{\binary}
\foreach \digit [count=\x, evaluate={\c=\digit*50+15;}] in \digitlist
\fill [fill=black!\c] (\x, -\y) rectangle ++(1,1);
}
\end{tikzpicture}
\end{document}

产生这个结果

第 1045 页

  • 为什么这个语法evaluate={...}定义(除非我弄错了)math图书馆、工作没有这个库正在循环加载foreach

翻译www.DeepL.com/Translator(免费版)

答案1

/pgf/foreach/evaluate已编码pgffor.code.tex并且与 tikz 库无关math

从代码来看

evaluate/.code=\pgffor@assign@evaluatetrue\pgffor@assign@oncefalse\pgffor@assign@parse{#1}

您可以看到语句evaluate\pgffor@assign@parse

\def\pgffor@assign@parse#1{%
    \pgfutil@in@;{#1}%
    \ifpgfutil@in@%
    \else%
        \pgfutil@in@={#1}%
    \fi%
    \ifpgfutil@in@%
        \pgffor@assign@@parse#1;\pgffor@stop;%
    \else%
        \pgffor@assign@parse@old#1\pgffor@stop%%
    \fi%
}

;如果参数中有一个,则解析器为\pgffor@assign@@parse,否则\pgffor@assign@parse@old对应于语法/pgf/foreach/evaluate=<variable> as <macro> using <formula>

在 中\pgffor@assign@@parse,根据语句中\pgffor@assign@@@parse是否有 来调用具有不同参数的。=

\def\pgffor@assign@@parse#1;{%
    \def\pgffor@test{#1}%
    \ifx\pgffor@test\pgffor@stop%
        \let\pgffor@next=\relax%
    \else%
        \let\pgffor@next=\pgffor@assign@@parse%
        \ifx\pgffor@test\pgfutil@empty%
        \else%
            \pgfutil@in@={#1}%
            \ifpgfutil@in@%
                \pgffor@assign@@@parse#1\pgffor@stop%
            \else%
                \pgffor@assign@@@parse#1=#1\pgffor@stop%
            \fi%
        \fi%
    \fi%
    \pgffor@next}


\def\pgffor@assign@@@parse#1=#2\pgffor@stop{%
    \ifpgffor@assign@evaluate%
        \ifpgffor@assign@once%
            \pgfutil@append@tomacro{\pgffor@assign@once@code}{\pgfmathparse{#2}\let#1=\pgfmathresult}%
            \pgfutil@append@tomacro{\pgffor@remember@once@code}{\noexpand\def\noexpand#1{#2}}%
        \else
            \pgfutil@append@tomacro{\pgffor@assign@before@code}{\pgfmathparse{#2}\let#1=\pgfmathresult}%
        \fi%
    \else%
        \ifpgffor@assign@once%
            \pgfutil@append@tomacro{\pgffor@assign@once@code}{\def#1{#2}}%
            \pgfutil@append@tomacro{\pgffor@remember@once@code}{\noexpand\def\noexpand#1{#2}}%
        \else
            \pgfutil@append@tomacro{\pgffor@assign@before@code}{\def#1{#2}}%
        \fi%
    \fi%
}

相关内容