将 pgfmath 和函数中的“

将 pgfmath 和函数中的“

我正在使用这种方法为 PGFplots 定义分段函数并希望明确定义端点处的函数值为 1,而不是 0。当我将<中的更改为时,我得到and<=计量单位非法(插入 pt)

此 MWE产生此输出(1,1)但正常工作时应该有黑色圆圈。

\documentclass{article}
\usepackage{amsmath}
\usepackage{pgfplots}

\newcommand{\pLabel}{
$p(x)=
\begin{cases}
    x & 0 < x {\textcolor{red}{{}\leq{}}} 1\\
    0 & \text{otherwise}
\end{cases}$
}
\tikzstyle{MyStyle}=[domain=-0.5:1.5, samples=100, ultra thick,blue]
\tikzstyle{pLabelStyle}=[above, yshift=25ex, xshift=-28ex]


\pgfmathdeclarefunction{p}{1}{%
  \pgfmathparse{(and(#1>0, #1<1)*#1)}% This compiles with the "<"
  %\pgfmathparse{(and(#1>0, #1<=1)*#1)}% This is what I want: note the "<="
}

% Compute point of interest
\newcommand*{\XValue}{1}%
\pgfmathsetmacro{\QatXValue}{p(\XValue)}

\begin{document}
\begin{tikzpicture}
  \begin{axis}
    \addplot[MyStyle]{p(x)} node [pLabelStyle] {\pLabel};
    \fill (axis cs: \XValue,\QatXValue)  circle (4pt)
        node [right, yshift=1.0ex] {$(1,p(1))$};
\end{axis}
\end{tikzpicture}
\end{document}

有简单的解决办法吗?

答案1

此问题类似于在 pgfmath 中使用 ifthenelse:这是 fpu 库的问题。作为解决方法,您可以定义一个新函数,该函数仅对该less函数取反。您可以将这个新函数分配给运算符,例如!>“不大于”(与“小于或等于”相同):

\documentclass{article}
\usepackage{amsmath}
\usepackage{pgfplots}

\newcommand{\pLabel}{
$p(x)=
\begin{cases}
    x & 0 < x {\textcolor{red}{{}\leq{}}} 1\\
    0 & \text{otherwise}
\end{cases}$
}
\tikzstyle{MyStyle}=[domain=-0.5:1.5, samples=100, ultra thick,blue]
\tikzstyle{pLabelStyle}=[above, yshift=25ex, xshift=-28ex]

\pgfmathdeclarefunction{floatnotgreater}{2}{%
    \pgfmathparse{!(#1>#2)}%
}

\pgfmathdeclareoperator{!>}{floatnotgreater}{2}{infix} {250}

\pgfmathdeclarefunction{p}{1}{%
  \pgfmathparse{(and(#1>0, #1!>1)*#1)}%
}

% Compute point of interest
\newcommand*{\XValue}{1}%
\pgfmathsetmacro{\QatXValue}{p(\XValue)}

\begin{document}
\begin{tikzpicture}
  \begin{axis}
    \addplot[MyStyle]{p(x)} node [pLabelStyle] {\pLabel};
    \fill (axis cs: \XValue,\QatXValue)  circle (4pt)
        node [right, yshift=1.0ex] {$(1,p(1))$};
\end{axis}
\end{tikzpicture}
\end{document}

相关内容