我已经就这个问题给作者 Alain Matthes 发了电子邮件。但为了那些可能感兴趣的人着想,而且由于 Alain 也是这个网站的活跃成员,我也在这里发布了这个问题。
在我尝试回答这个问题时确定积分动画示例,我借用了 Alain 在他的回答中的代码Tikz-PGF:绘制积分测试图。代码运行正常,但在将值传递1
给number
选项时显示出意外行为,如图所示。
这里, 后面不应该有矩形。但是,当设置为大于 1 时,x=8
代码可以正常工作。number
这是该图的完整代码。
\documentclass[tikz]{standalone}
\usepackage{tkz-fct}
\begin{document}
\begin{tikzpicture}[scale=1.25]
\tkzInit[xmax=8,ymax=4]
\tkzAxeXY[ticks=false]
\tkzGrid
\tkzFct[color = red, domain =0.125:8]{4./x}
\tkzDrawRiemannSumInf[fill=green!60,
opacity=.2,
color=green,
line width=1pt,
interval=1:8,
number=1]
%\foreach \x/\t in {1.5/$a_1$,2.5/$a_2$,3.5/$a_3$,7.5/$a_7$}
%\node[green!50!black] at (\x,{4/(\x+1)-0.25}){\t};
\end{tikzpicture}
\end{document}
有人可以验证这一点并提供解决方法吗?
答案1
看起来这是由于\foreach
列表具有{0,1,...,x}
,因此1
即使 x 为零也要强制处理,而不是具有,因此只旋转一次。我猜代码中{0,...,x}
有一个小拼写错误。我不确定第二点。
\i
i
编辑:事实上,这不是拼写错误,而是一种相当奇怪的语法。来自
fp
自述文件。
注意:不要使用
\
带有 的宏名。请仅使用 和 包围的宏名或(
,)
即不要写\value{}
或value
。(\value)
这是为了避免数字前缀“-”出现问题。
这是修复版本。
\documentclass[tikz]{standalone}
\usepackage{tkz-fct}
\makeatletter
\def\tkz@DrawRiemannSumInf[#1]{%
\begingroup
\pgfkeys{%
/tkzriemann/.cd,
interval = 1:2,
number = 10,
opacity = 0.5,
line width = 1pt}
\pgfqkeys{/tkzriemann}{#1}
\iftkz@init@NO%
\FPdiv{\tkz@x@delta}{\tkz@init@xorigine}{\tkz@init@xstep}%
\FPdiv{\tkz@y@delta}{\tkz@init@yorigine}{\tkz@init@ystep}%
\else
\FPset{\tkz@x@delta}{0}
\FPset{\tkz@y@delta}{0}%
\fi%
\FPadd\tkz@intwd{\tkz@max}{-\tkz@min}
\FPdiv\tkz@delta{\tkz@intwd}{\tkz@fct@nb}
\FPadd\tkz@fct@nb{\tkz@fct@nb}{-1}
\begin{scope}
\foreach \i in {0,...,\tkz@fct@nb}{%
\FPeval\x{(\tkz@min+\i*\tkz@delta)}
\FPeval\tkz@fx{\tkzFcta}
\let\tkz@firstimg\tkz@fx
\let\tkz@firstx\x
\FPadd\tkz@next{\x}{\tkz@delta}
\let\tkzFctTmp\tkzFcta
\FPset\x{\tkz@next}
\FPeval\tkz@fxnext{\tkzFcta}
\ifdim \tkz@fx pt < \tkz@fxnext pt\relax
\draw[opacity=\tkz@fct@opacity,/tkzriemann/.cd,#1] (\tkz@firstx ,0 ) rectangle (\tkz@next , \tkz@firstimg/\tkz@init@ystep );
\else
\draw[opacity=\tkz@fct@opacity,/tkzriemann/.cd,#1] (\tkz@firstx ,0 ) rectangle (\tkz@next , \tkz@fxnext/\tkz@init@ystep );
\fi
}
\end{scope}
\endgroup
}
\makeatother
\begin{document}
\begin{tikzpicture}[scale=1.25]
\tkzInit[xmax=8,ymax=4]
\tkzAxeXY[ticks=false]
\tkzGrid
\tkzFct[color = red, domain =0.125:8]{4./x}
\tkzDrawRiemannSumInf[fill=green!60,
opacity=.2,
color=green,
number=1,
line width=1pt,
interval=1:8,
]
%\foreach \x/\t in {1.5/$a_1$,2.5/$a_2$,3.5/$a_3$,7.5/$a_7$}
%\node[green!50!black] at (\x,{4/(\x+1)-0.25}){\t};
\end{tikzpicture}
\end{document}