У меня есть код указателя на 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
overprint
Лучшее решение, которое у меня есть на данный момент, основано на решении @VZ. (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}