可以使用 LuaLaTeX 吗\pgfmathdeclarefunction
?
我尝试了sinh
which 似乎在 中有效但在andpgfmathsetmacro
中无效。我应该如何用 Lua 正确声明 pgf 函数?\pgfmathparse
pgfplots
\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}