你可以使用beamer + minted + tikz來單步驟程式碼嗎?

你可以使用beamer + minted + tikz來單步驟程式碼嗎?

我有一些 C 指標程式碼,我想「單步」來展示例如懸空指標會發生什麼。我用於minted語法突出顯示,這似乎是導致問題的原因。

下面的程式碼可以編譯(使用-shell-escape),但應該轉義的程式碼則不能。原因似乎是個錯誤pygments(參見https://github.com/gpoore/minted/issues/70)。我也嘗試過marvin2k重新定義的解決方案!,但未能使該程式碼正常運作\begin{minted}[highlightlines=\only<1>{3}\only<2>{5}]{c}

有沒有人有辦法解決嗎?編輯:我的平台是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}

第一張投影片顯示非轉義 LaTeX 代碼

答案1

由於<>存在問題minted,您可以定義\myonly命令:

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

微量元素:

\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}

在此輸入影像描述

答案2

迄今為止我擁有的最好的解決方案是基於@VZ.的overprint解決方案(https://tex.stackexchange.com/a/51618/35602)。然而,如果有一個不需要重複 C 程式碼的解決方案就好了…

\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}

相關內容