编辑

编辑

我正在尝试从文件中读取两个 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}

相关内容