Können Sie Beamer + Minted + Tikz zum Einzelschritt-Code verwenden?

Können Sie Beamer + Minted + Tikz zum Einzelschritt-Code verwenden?

Ich habe C-Zeigercode, den ich gerne „einzeln“ ausführen würde, um zu zeigen, was beispielsweise mit hängenden Zeigern passiert. Ich verwende ihn mintedzur Syntaxhervorhebung, und das scheint das Problem zu verursachen.

Der folgende Code wird (mit -shell-escape) kompiliert, der Code, der maskiert werden sollte, jedoch nicht. Der Grund dafür scheint ein Fehler in zu sein pygments(siehehttps://github.com/gpoore/minted/issues/70). Ich habe auch versucht, die Lösung marvin2kneu zu definieren !, aber es ist mir nicht gelungen, den Code zum Laufen zu bringen. Ich habe auch verschiedene Kombinationen von \begin{minted}[highlightlines=\only<1>{3}\only<2>{5}]{c}ohne Erfolg ausprobiert.

Hat jemand eine Lösung? Bearbeiten: Meine Plattform ist Ubuntu 14.04, Pygmentize 1.6, Minted 2.4.1.

\documentclass{beamer}
\usepackage{minted,tikz}
\begin{document}
\begin{frame}[fragile]{Pointers}
\begin{minted}[linenos,escapeinside=||]{c}
  int main(void) {
    char *p;
    p=(char *)malloc(5); |\only<1>{$\Leftarrow$}|
    /* do stuff */
    p=(char *)malloc(7); |\only<2>{$\Leftarrow$}|
    free(p);
    return 0;
}
\end{minted}
\begin{tikzpicture}
  \node<1->[rectangle,draw] (p) {p};
  \node<1->[rectangle,draw,right of=p] (q1) {q1};
  \draw<1>[->] (p) -- (q1);
  \uncover<2->{\node[rectangle,draw,below right of=p] (q2) {q2};};
  \draw<2->[->] (p) -- (q2);
\end{tikzpicture}
\end{frame}
\end{document}

Erste Folie mit nicht-Escape-LaTeX-Code

Antwort1

Da <und >mit problematisch sind minted, können Sie den \myonlyBefehl definieren:

\newcommand\myonly[2]{\only<#1>{#2}}

MWE:

\documentclass{beamer}
\usepackage{minted,tikz}
\newcommand\myonly[2]{\only<#1>{#2}}
\begin{document}
\begin{frame}[fragile]{Pointers}
\begin{minted}[linenos,escapeinside=||]{c}
  int main(void) {
    char *p;
    p=(char *)malloc(5); |\myonly{1}{$\Leftarrow$}|
    /* do stuff */
    p=(char *)malloc(7); |\myonly{2}{$\Leftarrow$}|
    free(p);
    return 0;
}
\end{minted}
\begin{tikzpicture}
  \node<1->[rectangle,draw] (p) {p};
  \node<1->[rectangle,draw,right of=p] (q1) {q1};
  \draw<1>[->] (p) -- (q1);
  \uncover<2->{\node[rectangle,draw,below right of=p] (q2) {q2};};
  \draw<2->[->] (p) -- (q2);
\end{tikzpicture}
\end{frame}
\end{document}

Bildbeschreibung hier eingeben

Antwort2

overprintDie beste Lösung, die ich bisher habe, basiert auf der Lösung von @VZ. (https://tex.stackexchange.com/a/51618/35602). Es wäre jedoch schön, eine Lösung zu haben, bei der der C-Code nicht wiederholt werden müsste …

\documentclass{beamer}
\usepackage{minted}
\usepackage{tikz}
\begin{document}
\begin{frame}[fragile]{Foo}
\begin{overprint}
\onslide<1>
\begin{minted}[linenos,highlightlines={3}]{c}
  int main(void) {
    char *p;
    p=(char *)malloc(5);
    /* do stuff */
    p=(char *)malloc(7);
    free(p);
    return 0;
  }
\end{minted}
\onslide<2>
\begin{minted}[linenos,highlightlines={5}]{c}
  int main(void) {
    char *p;
    p=(char *)malloc(5);
    /* do stuff */
    p=(char *)malloc(7);
    free(p);
    return 0;
  }
\end{minted}
\end{overprint}
\begin{tikzpicture}
  \node<1->[rectangle,draw] (p) {p};
  \node<1->[rectangle,draw,right of=p] (q1) {q1};
  \draw<1>[->] (p) -- (q1);
  \uncover<2->{\node[rectangle,draw,below right of=p] (q2) {q2};};
  \draw<2->[->] (p) -- (q2);
\end{tikzpicture}
\end{frame}
\end{document}

verwandte Informationen