
以下を利用する MCE を検討してください。
tikzmark
ライブラリとそのlistings
ライブラリは環境にマークを追加することができますlstlisting
。- 高レベル
\balloon
マクロ(tikzmark
の著者によって提供された)https://tex.stackexchange.com/a/86457/18401)は、コードの特定の行の後ろに派手なノードを配置します(ここでは、最初の行の前の行が重複しないように少し変更されています。Jellbyのコメントを参照してください。2014年3月9日18:26https://tex.stackexchange.com/a/79787/18401)。
重要なのは、このコードは、たとえば クラスではうまく機能しますarticle
が、 では機能しないということですbeamer
。後者の場合、ノードは表示されません。
% \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}
結果
article
(およびbeamerarticle
)
とbeamer
答え1
\pgfmark
ビーマーは、オーバーレイを認識できるように、スライドの番号を内部名に再定義して追加します。aux を見ると、line-code-6-start-1
の代わりに のような名前が付けられていることがわかりますline-code-6-start
。これは、すべての\iftikzmark
失敗を意味します。
\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}
追加
の再定義の代わりとなるのは、\ballon
の再定義です\iftikzmark
。
\makeatletter
\renewcommand\iftikzmark[3]{%
\@ifundefined{save@pt@#1-\the\beamer@slideinframe}{%
#3%
}{%
#2%
}%
}%
答え2
この問題はアップストリームによって修正されたようですhttps://github.com/loopspace/tikzmark/commit/1427ccaa0be7932d964d3f51b26b5a4d3444e1afまたはhttps://github.com/loopspace/tikzmark/commit/00141c09c0b53c14459c206dc23ea6ea90f96b0b
したがって、上記の回避策を最近の TeXlive ディストリビューション (Ubuntu 19.04 および 19.10、Debian/unstable で試しました) で使用すると、機能しません... このページの最初の例に戻る必要があります。