下面的代码导致错误的原因是什么?
! Illegal unit of measure (pt inserted).
<to be read again>
e
l.16 ...t [domain=-.1:.1,samples = 100] (\x,{G(\x)})
\documentclass[tikz]{standalone}
\directlua{
function G (x)
return (-(x^2)/3)
end
}
\pgfmathdeclarefunction{G}{1}{%
\edef\pgfmathresult{\directlua{tex.print("" .. G(#1))}}%
}
\begin{document}
\begin{tikzpicture}
\draw [blue] plot [domain=-.1:.1,samples = 100] (\x,{G(\x)});
\end{tikzpicture}
\end{document}
答案1
如果将函数修改为
\pgfmathdeclarefunction{G}{1}{%
\edef\pgfmathresult{\directlua{tex.print("" .. G(#1))}}%
\show\pgfmathresult
\edef\pgfmathresult{1}%
}
然后绘图会绘制(错误:-)函数,不会出现错误,但您可以看到绘制的内容。前几个值没问题,但随后:
> \pgfmathresult=macro:
->-9.5052e-06.
假设 pgf 不期望该e
符号。假设 lua 有一些数字格式化函数可以阻止它使用该符号?
编辑啊是的:
\makeatletter
\pgfmathdeclarefunction{G}{1}{%
\edef\pgfmathresult{\directlua{tex.print(string.format("\@percentchar f",G(#1)))}}%
}
\makeatother
答案2
我建议使用 Lua 进行所有计算,并创建相关的 LaTeX 代码。当然,正如 Dave 建议的那样,使用string.format('% .2f','number')
它来格式化数字。两位小数对于绘图来说已经足够了。
\documentclass[tikz]{standalone}
\usepackage{luacode}
\begin{document}
\begin{luacode}
local function G (x)
return string.format('% .2f',-(x^2)/3)
end
tex.print('\\begin{tikzpicture}[scale=.3]')
tex.print('\\draw[color=red] (0,0)')
local z=-.1
for i=1,50 do
tex.sprint('-- (' .. i .. ',' .. G(z)..') ')
z=z+.2
end
tex.sprint(';')
tex.print('\\end{tikzpicture}')
\end{luacode}
\end{document}
这通常会产生更清晰的代码,更容易调试,并且快点. 添加轴和坐标的格式化代码以满足您的要求。例如,使用上面的代码,还可以将值导出为表格并进行您可能需要的任何转换。