我有一些 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}
答案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}