此语法evaluate={...}
记录在math
库的第 704/1318 页。我引用手册中的一段话:
/tikz/evaluate=<statements>
(无默认值)此键仅执行\tikzmath{<statements>}
。以下部分描述了此库提供的微型语言,可用于命令
\tikzmath
和evaluate
键。该语言仅由简单的关键字和表达式组成,但微型解析器允许您以相当通用的方式格式化代码(非常类似于蒂克兹解析器)除了 所有关键字后面必须至少有一个空格这是需要记住的第二件最重要的事情(记住在每个语句末尾插入分号之后)。
但它在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}
产生这个结果
- 为什么这个语法
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%
}