我正在尝试从文件中读取两个 x 函数,然后使用 获取 f(8) / g(8) 的结果pgfmathparse
。
这是一个最小(不)工作的例子:
\begin{filecontents}{data.dat}
f(x) g(x)
x x+1
\end{filecontents}
\documentclass{article}
\usepackage{xstring,pgfplotstable,filecontents}
\begin{document}
\newcommand{\getfx}[1]{
\pgfplotstablegetelem{#1}{f(x)}\of{data.dat}
}
\newcommand{\getgx}[1]{
\pgfplotstablegetelem{#1}{g(x)}\of{data.dat}
}
\def\feight{
\getfx{0}
\StrSubstitute[0]{\pgfplotsretval}{x}{8}
}
\def\geight{
\getgx{0}
\StrSubstitute[0]{\pgfplotsretval}{x}{8}
}
\pgfmathparse{
(\feight)/(\geight)
}
\pgfmathresult
\end{document}
使用这个,我可以轻松地打印 f(8)/g(8)(也就是说,“8/(8+1)”),但是pgfmathparse
在 L30 上编译时出现“未定义的控制序列”错误。
我该怎么做才能修复这个代码?
答案1
编辑
xstring
如果您对输入稍作修改,则可以不执行此操作。 前面的代码失败了,因为pgfmath
不像\x{}
。 所以我简单地将其更改为(\x)
。 (您不能保留\x
,否则将看不到和pgfplotstable
之间的空格。)\x
\x+1
\documentclass{article}
\usepackage{pgfplotstable,filecontents}
\begin{filecontents}{data.dat}
f(\x) g(\x) h(\x)
(\x) \x+1 f(\x)/g(\x)
\end{filecontents}
\begin{document}
{
\def\x{variable x}
\def\DeclareFunctionFromTable#1{
\pgfplotstablegetelem{0}{#1}\of{data.dat}
\expandafter\DeclareFunctionFromTableAux\expandafter{\pgfplotsretval}{#1}
}
\def\DeclareFunctionFromTableAux#1#2{\tikzset{declare function={#2=#1;}}}
\DeclareFunctionFromTable{f(\x)}
\DeclareFunctionFromTable{g(\x)}
\DeclareFunctionFromTable{h(\x)}
\begin{tikzpicture}
\begin{axis}
\addplot(\x,{f(\x)});
\addplot(\x,{g(\x)});
\addplot(\x,{h(\x)});
\end{axis}
\end{tikzpicture}
\end{document}
xstring
如果您对输入稍加修改,则无需执行此操作。
\documentclass{article}
\usepackage{pgfplotstable,filecontents}
\begin{filecontents}{data.dat}
f(\x) g(\x) h(\x)
\x{} \x+1 f(\x)/g(\x)
\end{filecontents}
\begin{document}
\def\x{x}
\def\DeclareFunctionFromTable#1{
\pgfplotstablegetelem{0}{#1}\of{data.dat}
\expandafter\DeclareFunctionFromTableAux\expandafter{\pgfplotsretval}{#1}
}
\def\DeclareFunctionFromTableAux#1#2{\pgfkeys{/pgf/declare function={#2=#1;}}}
\DeclareFunctionFromTable{f(\x)}
\DeclareFunctionFromTable{g(\x)}
\DeclareFunctionFromTable{h(\x)}
\pgfmathparse{h(8)}
\pgfmathresult
\end{document}
答案2
正在进行一些扩展工作(我不明白,所以不会尝试解释)。但是,这里有一种方法可以实现所需的结果:
代码:
\begin{filecontents}{data.dat}
f(x) g(x)
x x+1
\end{filecontents}
\documentclass{article}
\usepackage{xstring,pgfplotstable,filecontents}
\begin{document}
\newcommand{\getfx}[1]{
\pgfplotstablegetelem{#1}{f(x)}\of{data.dat}
}
\newcommand{\getgx}[1]{
\pgfplotstablegetelem{#1}{g(x)}\of{data.dat}
}
\def\SetFeightValue{%
\getfx{0}%
\StrSubstitute[0]{\pgfplotsretval}{x}{8}[\feightValue]%
}
\def\SetGeightValue{%
\getgx{0}%
\StrSubstitute[0]{\pgfplotsretval}{x}{8}[\geightValue]%
}
\SetFeightValue
\SetGeightValue
\pgfmathsetmacro{\MyResults}{(\feightValue)/(\geightValue)}
(\feightValue)/(\geightValue)=\MyResults
\end{document}