Ergebnisse

Ergebnisse

Betrachten Sie den folgenden MCE, der Folgendes verwendet:

  • tikzmarkBibliothek und ihre listingsBibliothek, mit der wir Markierungen zu lstlistingUmgebungen hinzufügen können,
  • das High-Level- \balloonMakro (bereitgestellt vom tikzmarkAutor von inhttps://tex.stackexchange.com/a/86457/18401), das einen schicken Knoten hinter bestimmte Zeilen des Codes setzt (er ist hier ein wenig modifiziert, um eine Überlappung der Zeile vor der ersten gewünschten Zeile zu vermeiden, siehe Jellbys Kommentar am 9. März 2014 um 18:26 Uhr inhttps://tex.stackexchange.com/a/79787/18401).

Der Punkt ist, dass dieser Code zB mit der articleKlasse gut funktioniert, aber nicht mit der beamer: bei letzterer wird der Knoten nicht angezeigt.

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

Ergebnisse

Mit articleund beamerarticle)

Bildbeschreibung hier eingeben

Mitbeamer

Bildbeschreibung hier eingeben

Antwort1

Beamer definiert neu \pgfmarkund fügt dem internen Namen eine Nummer für die Folie hinzu, um Overlays zu erkennen. Wenn Sie sich Aux ansehen, können Sie sehen, dass Sie Namen wie line-code-6-start-1anstelle von erhalten line-code-6-start. Dies bedeutet, dass alle Ihre \iftikzmarkFehler auftreten.

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

Bildbeschreibung hier eingeben

Zusatz

Eine Alternative zur Neudefinition von \ballonist eine Neudefinition von \iftikzmark:

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

Antwort2

Es sieht so aus, als ob dieses Problem upstream behoben wurde durchhttps://github.com/loopspace/tikzmark/commit/1427ccaa0be7932d964d3f51b26b5a4d3444e1afoderhttps://github.com/loopspace/tikzmark/commit/00141c09c0b53c14459c206dc23ea6ea90f96b0b

Wenn Sie also den oben dargestellten Workaround auf einer aktuellen TeXlive-Distribution verwenden (ich habe es auf Ubuntu 19.04 & 19.10 und Debian/unstable versucht), funktioniert es nicht … Sie müssen jetzt zum ersten Beispiel dieser Seite zurückkehren.

verwandte Informationen