带有 Tikz 的 Lua 代码

带有 Tikz 的 Lua 代码

下面的代码导致错误的原因是什么?

! 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}

这通常会产生更清晰的代码,更容易调试,并且快点. 添加轴和坐标的格式化代码以满足您的要求。例如,使用上面的代码,还可以将值导出为表格并进行您可能需要的任何转换。

相关内容