\pgfmathdeclarefunction 和 LuaLaTeX

\pgfmathdeclarefunction 和 LuaLaTeX

可以使用 LuaLaTeX 吗\pgfmathdeclarefunction

我尝试了sinhwhich 似乎在 中有效但在andpgfmathsetmacro中无效。我应该如何用 Lua 正确声明 pgf 函数?\pgfmathparsepgfplots

\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}

\makeatletter
\pgfmathdeclarefunction{luasinh}{1}{%
    \begingroup
        \edef\pgfmath@arg{#1}%
        \directlua{tex.setdimen("pgfmath@x", math.sinh(\pgfmath@arg) .. "pt")}%
        \pgfmath@returnone\pgfmath@x%
    \endgroup
}%
\makeatother


\begin{document}

\noindent
Lua: \pgfmathsetmacro\luasinh{luasinh(1)}\luasinh\\
PGF: \pgfmathsetmacro\pgfsinh{sinh(1)}\pgfsinh\\

\begin{tikzpicture}
    \begin{axis}
        \addplot {sinh(x)};
        %\addplot {luasinh(x)}; does not work
    \end{axis}
\end{tikzpicture}

\end{document}

我认为在声明 pgf 函数时能够使用 LuaLuaLaTeX可能会很有用。例如,这个问题“LaTeX 中的 Erf 函数”也许可以不调用 Gnuplot 来回答,而只需调用math.erf(如果存在?)\directlua

答案1

根据@Mark Wibrow的评论,我有一个有效的函数声明。pgfplots但是,从内部语法到Lua可理解的语法的转换感觉不对:

\documentclass{article}
\usepackage{tikz}
\usepackage{pgfplots}

\makeatletter
\pgfmathdeclarefunction{luasinh}{1}{%
    \begingroup
        \pgfkeys{/pgf/fpu,/pgf/fpu/output format=sci}%
        \pgfmathparse{#1}%
        \edef\pgfmathresult{\directlua{tex.print("" .. math.sinh(\pgfmathresult))}}%
        \pgfmathsmuggle\pgfmathresult%
    \endgroup
}%
\makeatother

\newcommand*\printtest[1]{%
    \section*{Test of $\sinh(#1)$}
    Lua: \directlua{tex.print("" .. math.sinh(#1))}~(directlua)\\
    Lua: \pgfmathsetmacro\luasinh{luasinh(#1)}\luasinh~(luasinh())\\
    Lua: \pgfmathparse{luasinh(#1)}\pgfmathresult~(pgfmathresult)\\
    %PGF: \pgfmathsetmacro\pgfsinh{sinh(#1)}\pgfsinh\\
}%

\begin{document}
\printtest{0}
\printtest{1}
\printtest{10}

\begin{tikzpicture}
    \begin{axis}[domain=-10:10]
        \addplot[mark=o] {sinh(x)};
        \addplot[mark=x] {luasinh(x)}; 
    \end{axis}
\end{tikzpicture}

\end{document}

相关内容