
다음을 활용하는 다음 MCE를 고려하십시오.
tikzmark
환경listings
에 표시를 추가할 수 있는 라이브러리와 그 라이브러리,lstlisting
- 상위 수준
\balloon
매크로(tikzmark
의 작성자가 제공)https://tex.stackexchange.com/a/86457/18401) 코드의 특정 줄 뒤에 멋진 노드를 배치합니다(여기서는 원하는 첫 번째 줄 앞의 줄이 겹치는 것을 피하기 위해 약간 수정되었습니다. Jellby의 의견을 참조하세요.https://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에서 시도)에서 위에 제시된 해결 방법을 사용하면 작동하지 않습니다... 이제 이 페이지의 첫 번째 예로 돌아가야 합니다.