在 beamer 文章模式下,pgfplots 将内联数据存储在宏中

在 beamer 文章模式下,pgfplots 将内联数据存储在宏中

我曾经pgfplots.sty在演示文稿中绘制图表。我在循环中生成图表数据\foreach并将其存储在宏中。这在演示文稿模式下运行良好,但使用beamerarticle包和article类时会显示许多错误。

示例代码如下:

%\documentclass{beamer}
\documentclass{article}
\usepackage{beamerarticle}

\usepackage{pgffor}
\usepackage{fp}
\usepackage{pgfplots}
\usepackage{etoolbox}
\usepackage{tikz}

\begin{document}

\def\tablebody{x,y\\}
\makeatletter
\foreach \x in {1,2,3,4}{
  \FPeval\s{clip(x*x)}
  \protected@xappto\tablebody{\x,\s\\} 
}
\makeatother

\begin{frame}{Title}
  \begin{figure}
    \centering
    \begin{tikzpicture}
      \begin{axis}[xmin=0,xmax=5,ymin=0,ymax=20]
        \edef\plotargs{[blue] table[col sep=comma,row sep=\\]{\tablebody}}
        \expandafter\addplot\plotargs;
      \end{axis}
    \end{tikzpicture}
  \end{figure}
\end{frame}

\end{document}

有什么方法可以使用 以文章模式显示情节吗beamerarticle

答案1

明显的问题是\\永远不会存在\edef\xdef。使用\protected@xappto你会得到\protect\\在 的论证中无效的\addplot

可能添加合适的\noexpand标记:

%\documentclass{beamer}
\documentclass{article}
\usepackage{beamerarticle}

\usepackage{pgffor}
\usepackage{fp}
\usepackage{pgfplots}
\usepackage{etoolbox}
\usepackage{tikz}

\begin{document}

\def\tablebody{x,y\noexpand\\}
\makeatletter
\foreach \x in {1,2,3,4}{
  \FPeval\s{clip(x*x)}
  \xappto\tablebody{\x,\s\noexpand\noexpand\noexpand\\} 
}
\makeatother

\begin{frame}{Title}
  \begin{figure}
    \centering
    \begin{tikzpicture}
      \begin{axis}[xmin=0,xmax=5,ymin=0,ymax=20]
        \edef\plotargs{[blue] table[col sep=comma,row sep=\noexpand\\]{\tablebody}}
        \expandafter\addplot\plotargs;
      \end{axis}
    \end{tikzpicture}
  \end{figure}
\end{frame}

\end{document}

这样,您就将其存储\\\noexpand\\内部\tablebody,最后\edef将其转换为\\

答案2

我不确定这种解决方法是否会导致其他问题,但您可以像这样编译您的文档:

%\documentclass{beamer}
\documentclass{article}

\usepackage{beamerarticle}

\makeatletter
\renewcommand<>{\\}{\only#1{\beameroriginal\\}}
\renewcommand<>{\@centercr}{\only#1{\beameroriginal\@centercr}}
\renewcommand<>{\@normalcr}{\only#1{\beameroriginal\@normalcr}}
\makeatother

\usepackage{pgffor}
\usepackage{fp}
\usepackage{pgfplots}
\usepackage{etoolbox}
\usepackage{tikz}

\begin{document}

\def\tablebody{x,y\\}
\makeatletter
\foreach \x in {1,2,3,4}{
  \FPeval\s{clip(x*x)}
  \protected@xappto\tablebody{\x,\s\\} 
}
\makeatother

\begin{frame}{Title}
  \begin{figure}
    \centering

    \begin{tikzpicture}
      \begin{axis}[xmin=0,xmax=5,ymin=0,ymax=20]
        \edef\plotargs{[blue] table[col sep=comma,row sep=\\]{\tablebody}}
        \expandafter\addplot\plotargs;
      \end{axis}
    \end{tikzpicture}
  \end{figure}
\end{frame}

\end{document}

相关内容