Resultados

Resultados

Considere o seguinte MCE que faz uso de:

  • tikzmarkbiblioteca e sua listingsbiblioteca que nos permite adicionar marcas aos lstlistingambientes,
  • a macro de alto nível \balloon(fornecida pelo tikzmarkautor do emhttps://tex.stackexchange.com/a/86457/18401) que coloca um nó sofisticado atrás de certas linhas do código (é aqui um pouco modificado para evitar a sobreposição da linha anterior à primeira desejada, veja o comentário de Jellby em 9 de março de 2014 às 18:26 emhttps://tex.stackexchange.com/a/79787/18401).

A questão é que esse código funciona bem, por exemplo, com a articleclasse, mas não com beameraquela: com a última, o nó não é exibido.

% \documentclass{beamer}
\documentclass{article}\usepackage{beamerarticle}
%
\usepackage{listings}
\usepackage{tikz}
\usetikzlibrary{tikzmark,fit,calc}
\usetikzmarklibrary{listings}
\lstset{basicstyle=\ttfamily}
\tikzset{
  balloon/.style={
    draw,
    fill=blue!20,
    opacity=0.4,
    inner sep=4pt,
    rounded corners=2pt
  },
}
%
\newcommand{\balloon}[4]{%
  \pgfmathtruncatemacro\firstline{%
    #3-1%
  }%
  \iftikzmark{line-#2-\firstline-start}{%
    \iftikzmark{line-#2-#3-first}{%
      \xdef\blines{($ ({pic cs:line-#2-\firstline-start} -| {pic
          cs:line-#2-#3-first})!.5!({pic cs:line-#2-#3-first}) $)}%
    }{%
      \iftikzmark{line-#2-#3-start}{%
        \xdef\blines{({pic cs:line-#2-\firstline-start} -| {pic
            cs:line-#2-#3-start})}%
      }{%
        \xdef\blines{(pic cs:line-#2-\firstline-start)}%
      }%
    }%
  }{%
    \xdef\blines{}%
  }%
  \foreach \k in {#3,...,#4} {%
    \iftikzmark{line-#2-\k-first}{%
      \xdef\blines{\blines (pic cs:line-#2-\k-first) }%
    }{} \iftikzmark{line-#2-\k-end}{%
      \xdef\blines{\blines (pic cs:line-#2-\k-end) }%
    }{}%
  }%
  \ifx\blines\empty
  \else
  \edef\temp{\noexpand\tikz[remember picture,overlay]
    \noexpand\node[fit={\blines},balloon] (#1) {};}%
  \temp
  \fi
}
%
\begin{document}
\begin{frame}[fragile]
  \balloon{comment}{code}{3}{4}
\begin{lstlisting}[name=code]
Foo Bar Baz
Foo Baz Bar
Bar Foo Baz
Bar Baz Foo
Baz Foo Bar
Baz Bar Foo
\end{lstlisting}
\end{frame}
\end{document}

Resultados

Com article(e beamerarticle)

insira a descrição da imagem aqui

Combeamer

insira a descrição da imagem aqui

Responder1

O beamer redefine \pgfmarke adiciona um número para o slide ao nome interno para torná-lo consciente da sobreposição. Se você olhar para o aux, verá que obtém nomes como line-code-6-start-1em vez de line-code-6-start. Isso significa que todos os seus \iftikzmarkfalham.

\documentclass{beamer}
%\documentclass{article}\usepackage{beamerarticle}
%
\usepackage{listings}
\usepackage{tikz}
\usetikzlibrary{tikzmark,fit,calc}
\usetikzmarklibrary{listings}
\lstset{basicstyle=\ttfamily}
\tikzset{
  balloon/.style={
    draw,
    fill=blue!20,
    opacity=0.4,
    inner sep=4pt,
    rounded corners=2pt
  },
}

\makeatletter

%
\newcommand{\balloon}[4]{%
  \pgfmathtruncatemacro\firstline{%
    #3-1%
  }%
  \iftikzmark{line-#2-\firstline-start-\the \beamer@slideinframe}{%
    \iftikzmark{line-#2-#3-first-\the \beamer@slideinframe}{%
      \xdef\blines{($ ({pic cs:line-#2-\firstline-start} -| {pic
          cs:line-#2-#3-first})!.5!({pic cs:line-#2-#3-first}) $)}%
    }{%
      \iftikzmark{line-#2-#3-start-\the \beamer@slideinframe}{%
        \xdef\blines{({pic cs:line-#2-\firstline-start} -| {pic
            cs:line-#2-#3-start})}%
      }{%
        \xdef\blines{(pic cs:line-#2-\firstline-start)}%
      }%
    }%
  }{%
    \xdef\blines{}%
  }%
  \foreach \k in {#3,...,#4} {%
    \iftikzmark{line-#2-\k-first-\the \beamer@slideinframe}{%
      \xdef\blines{\blines (pic cs:line-#2-\k-first) }%
    }{} \iftikzmark{line-#2-\k-end-\the \beamer@slideinframe}{%
      \xdef\blines{\blines (pic cs:line-#2-\k-end) }%
    }{}%
  }%
  \ifx\blines\empty
  \else
  \edef\temp{\noexpand\tikz[remember picture,overlay]
    \noexpand\node[fit={\blines},balloon] (#1) {};}%
  \temp
  \fi
}
%
\begin{document}


\begin{frame}[fragile]
\balloon{comment}{code}{3}{4}

\begin{lstlisting}[name=code]
Foo Bar Baz
Foo Baz Bar
Bar Foo Baz
Bar Baz Foo
Baz Foo Bar
Baz Bar Foo
\end{lstlisting}
\end{frame}
\end{document}

insira a descrição da imagem aqui

Adição

Uma alternativa para a redefinição de \balloné uma redefinição de \iftikzmark:

\makeatletter
\renewcommand\iftikzmark[3]{%
    \@ifundefined{save@pt@#1-\the\beamer@slideinframe}{%
      #3%
    }{%
      #2%
    }%
  }%

Responder2

Parece que este problema foi corrigido no upstream porhttps://github.com/loopspace/tikzmark/commit/1427ccaa0be7932d964d3f51b26b5a4d3444e1afouhttps://github.com/loopspace/tikzmark/commit/00141c09c0b53c14459c206dc23ea6ea90f96b0b

Portanto, se você usar a solução alternativa apresentada acima em uma distribuição TeXlive recente (tentei no Ubuntu 19.04 e 19.10 e no Debian/instável), ela não funciona... Agora você precisa voltar ao primeiro exemplo desta página.

informação relacionada