![使用 TikZ 定义 \foreach 循环的限制](https://linux22.com/image/367558/%E4%BD%BF%E7%94%A8%20TikZ%20%E5%AE%9A%E4%B9%89%20%5Cforeach%20%E5%BE%AA%E7%8E%AF%E7%9A%84%E9%99%90%E5%88%B6.png)
我想\foreach
使用该let
语句计算 TikZ 循环的上限和下限。不幸的是,当我尝试以下代码时,这会引发错误:
\draw
let \n{lo}={<computation>},
\n{hi}={<computation>}
in
\foreach \var in {\n{lo},...,\n{hi}} { <STUFF> }
我可以轻松定义一个尾递归宏来执行我想要的操作,但理想情况下,我想使用 TikZ 的\foreach
语句。有趣的是,这\n{lo}
不会造成问题(就我而言),但\n{hi}
……
任何指向解决方案的指示都值得赞赏。
这是一个简单的例子:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{calc}
\begin{document}
\begin{tikzpicture}
\draw
let \p{bl}=(0,0),
\p{br}=(1,0),
% THIS COMPUTATION IS RELATED TO THE PROBLEM
% \n{line width}={1} % WORKS FINE
\n{line width}={\x{br}-\x{bl}},
\n{x height}={1.2},
\n{line density}={2},
\n{x heights}={\n{line width}/\n{x height}},
\n{aid lines}={ceil(\n{line density} * \n{x heights})},
\n{aid line factor}={\n{x height} / \n{line density}},
\n{first}={-10},
\n{last}={\n{aid lines}-\n{first}}
in
% DOESN'T WORK
\foreach \cpcnt in {\n{first},...,\n{last}} {%
(\p{bl}) -- + (\cpcnt * \n{aid line factor},0)
};%
\end{tikzpicture}
\end{document}
答案1
您可以从中看到工作版本和非工作版本之间的区别
\begin{tikzpicture}
\draw
let \p{bl}=(0,0),
\p{br}=(1,0),
\n{a}={1},
\n{b}={\x{br}-\x{bl}}
in
node {$a=\n{a}$, $b=\n{b}$};
\end{tikzpicture}
输出
\n
宏可以是无量纲数或有量纲数,参见手册第 160 页(针对版本 3.0.1a,第 14.15 节)Let 操作因为有维度,\n{b}
所以才变成维度。\x
您可以使用该函数去除尺寸scalar
,但之后可能需要缩放它:
\begin{tikzpicture}
\draw
let \p{bl}=(0,0),
\p{br}=(1,0),
\n{a}={1},
\n{b}={scalar(\x{br}-\x{bl})},
\n{c}={scalar(\x{br}-\x{bl})*2.54/72.27} % scale from points to cm
in
node {$a=\n{a}$, $b=\n{b}$, $c=\n{c}$};
\end{tikzpicture}
因此,在您的示例中,您可能想要使用
\n{line width}={scalar(\x{br}-\x{bl})*2.54/72.27},