목록 앞에 왜 그렇게 가짜 수직 공간이 있습니까?

목록 앞에 왜 그렇게 가짜 수직 공간이 있습니까?

내 댓글에서 묻는 질문에 스스로 대답하려고합니다.이 답변, 나는 Ulrike의 코드를 기반으로 했지만 매크로 오버레이를 인식하게 만드는 아래 코드로 끝났습니다 \balloon. 그러나 목록 앞에 사용되면 이 매크로는 가짜 수직 공간을 발생시킵니다. 그것이 어디서 나오는지 아시나요?

업데이트

가짜 수직 공간을 더욱 눈에 띄게 만들기 위해 코드가 약간 변경되었으며 애니메이션이 추가되었습니다.

업데이트 2

실제로 오버레이를 인식할 때 중복으로 인한 문제를 방지하려면 \balloon목록에 고유한 이름이 필요합니다. 이를 위해 슬라이드 번호( \the\beamer@slideinframe)를 사용하면 주어진 프레임 내에서는 충분하지만 전체 문서에서는 충분하지 않습니다. 프레임 번호( \insertframenumber)를 추가하면 됩니다.

\documentclass{beamer}
%
\setbeamertemplate{footline}[page number]
%
\usepackage{listings}
\usepackage[foreground]{pagegrid}
\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
\renewcommand\iftikzmark[3]{%
  \@ifundefined{save@pt@#1-\the\beamer@slideinframe}{%
    #3%
  }{%
    #2%
  }%
}%
\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%
}
%
\newcommand<>{\balloon}[4][code\insertframenumber\the\beamer@slideinframe]{%
  \only#5{\@balloon{#2}{#1}{#3}{#4}}%
}
%
\lstnewenvironment{hllisting}[1][]{%
  \lstset{name=code\insertframenumber\the\beamer@slideinframe,#1}%
}{%
  \lstset{name=}%
}
\makeatother
%
\begin{document}
\begin{frame}[fragile]
\balloon<3>{comment}{5}{6}%
\balloon<4>{comment}{1}{3}%
\begin{hllisting}
1st line of code
2nd line of code
3rd line of code
4th line of code
5th line of code
6th line of code
\end{hllisting}
\end{frame}
\end{document}

여기에 이미지 설명을 입력하세요

답변1

여기에는 마법이 없습니다. 일부 프레임에는 삽입 \tikz[overlay]하고 다른 프레임에는 삽입하지 않습니다. A에는 \tikz[overlay]크기가 없을 수 있지만 그럼에도 불구하고 상자이므로 \mbox{}공백이 생길 수 있습니다. 이는 \tikz[overlay]그러한 상자가 해를 끼치지 않는 장소에서 사용하는 것이 중요하다는 것을 의미합니다 . 또는 모든 프레임에서 유사한 상자를 사용하려면 예를 들어 다음 정의 대신 David an \mbox또는 예를 들어 제안한 대로 사용합니다 .\alt\only\balloon

\documentclass{beamer}
%
\setbeamertemplate{footline}[page number]
%
\usepackage{listings}
\usepackage[foreground]{pagegrid}
\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
\renewcommand\iftikzmark[3]{%
  \@ifundefined{save@pt@#1-\the\beamer@slideinframe}{%
    #3%
  }{%
    #2%
  }%
}%
\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%
}
%
\newcommand<>{\balloon}[4][code\the\beamer@slideinframe]{%
  \alt#5{\@balloon{#2}{#1}{#3}{#4}}{\tikz[overlay,remember picture]\path (0,0);}%
}
%
\lstnewenvironment{hllisting}[1][]{%
  \lstset{name=code\the\beamer@slideinframe,#1}%
}{%
  \lstset{name=}%
}
\makeatother
%
\begin{document}
\begin{frame}
\tikz[overlay]\node{a};

blblb
\end{frame}

\begin{frame}

blblb
\end{frame}



\begin{frame}[fragile]
\balloon<3>{comment}{5}{6}%
\balloon<4>{comment}{1}{3}%
\begin{hllisting}
1st line of code
2nd line of code
3rd line of code
4th line of code
5th line of code
6th line of code
\end{hllisting}
\end{frame}
\end{document}

답변2

이상하게도 나는 betar와 tikzmark가 여기서 무엇을 하고 있는지 정확히 추적하지 못했지만 보이지 않는 추가 기능을 추가했습니다.무슨 일이야?수직 모드에서는 \color항상 \label까다 \tikzmark롭고 부작용을 제어하기 어렵습니다. 모든 경우의 해결책은 까다로운 작업을 수행하기 전에 안전하게 수평 모드로 전환하는 것입니다.

만약 당신이

\mbox{\balloon<3>{comment}{5}{6}%
\balloon<4>{comment}{1}{3}}%

그러면 목록이 4개 슬라이드 모두에서 동일한 위치에 나타납니다. 빈 mbox는 내용을 약간 아래로 이동시키는 가짜 단락을 만듭니다. 그러나 고정된 지점이고 모든 슬라이드에서 동일하므로 필요한 경우 상자 뒤에 빈 줄과 음수 vspace를 사용할 수 있습니다.

관련 정보