
Ich habe etwas, das „funktioniert“, aber ich frage mich, ob es eine elegantere Lösung gibt. Ich möchte nach einer Einzelauflistung in Beamer einen Text einrahmen, also mache ich Folgendes:
\documentclass{beamer}
\begin{document}
\begin{frame}
\begin{itemize}[<+->]
\item Software-as-a-Service?
\item Platform-as-a-Service?
\item \only<-4>{Infrastructure-as-a-Service}\only<5->{\fcolorbox{red}{white}{Infrastructure-as-a-Service}}?
\item Other-stuff-as-a-Service?
\end{itemize}
\end{frame}
\end{document}
Ich erziele den gewünschten Effekt (mit etwas zusätzlichem Platz auf der eingerahmten Folie, was nicht ideal ist), frage mich aber, ob es dafür eine natürlichere Möglichkeit gibt. Ich habe versucht, online und mit dem zuverlässigen zu suchen texdoc beamer
, aber vielleicht suche ich an den falschen Stellen.
Ich habe auch versucht:
\item \fcolorbox<beamer:6>{red}{white}{Infrastructure-as-a-Service}?
aber dann blieb mir nur noch ein schwarzes Kästchen, bis das rote hervorgehoben wurde
Antwort1
Sie könnten die bewährte tikzmark
Idee verwenden
Code
\documentclass{beamer}
\usepackage{tikz}
\usetikzlibrary{calc}
% tikzmark command, for shading over items
\newcommand{\tikzmark}[1]{\tikz[overlay,remember picture] \node (#1) {};}
\begin{document}
\begin{frame}
\begin{itemize}[<+->]
\item Software-as-a-Service?
\item Platform-as-a-Service?
\item \tikzmark{infrastructure}{Infrastructure-as-a-Service}
\item Other-stuff-as-a-Service?
\end{itemize}
\pause\tikz[overlay,remember picture]{\draw[draw=red,thick,double,fill opacity=0.2] ($(infrastructure)+(-0.5,0.4)$) rectangle ($(infrastructure)+(6,-0.2)$);}
\end{frame}
\end{document}
Antwort2
Ein anderer Ansatz könnte darin bestehen, die inHervorhebung in Beamer mithilfe von TikZ-Knoten.
Der Code:
\documentclass{beamer}
\usepackage{lmodern}
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{xparse}
\tikzset{
invisible/.style={opacity=0,text opacity=0},
visible on/.style={alt=#1{}{invisible}},
alt/.code args={<#1>#2#3}{%
\alt<#1>{\pgfkeysalso{#2}}{\pgfkeysalso{#3}}
},
}
\tikzset{
background fill/.style={fill=#1},
background fill/.default={white},
fill on/.style={alt=#1{}{background fill}},
}
\tikzset{
background draw/.style={draw=#1},
background draw/.default={white},
draw on/.style={alt=#1{}{background draw}},
}
\tikzset{
background filldraw/.style args={#1 filled by #2}{draw=#1, fill=#2},
background filldraw/.default=white filled by white,
filldraw on/.style={alt=#1{}{background filldraw}},
}
\tikzset{highlighting/.style={
append after command={
\pgfextra{
\path[rounded corners,
background draw=red,
draw on=<#1>,
overlay] ($(\tikzlastnode.south west)+(-0.015,-0.1)$) % to have some offset
rectangle ($(\tikzlastnode.north east)+(0.015,0.065)$);
}
}
}
}
\NewDocumentCommand{\highlight}{r<> m}{%
\tikz[baseline=(A.base)]
\node[highlighting=#1,
inner sep=0pt] (A) {#2};%
}
\begin{document}
\begin{frame}{Itemize with styles}
\begin{itemize}[<+->]
\item Software-as-a-Service?
\item Platform-as-a-Service?
\item \highlight<5>{Infrastructure-as-a-Service}?
\item Other-stuff-as-a-Service?
\end{itemize}
\end{frame}
\end{document}
Das Ergebnis:
Hinweise zum Code
Der erstellte TikZ-Knoten nimmt dank der Option nicht zu viel Platz ein inner sep=0pt
, aber da seine Abmessungen um den Text herum sehr eng sind, fügt das erstellte Hervorhebungsfeld etwas Platz hinzu (über Offsets, die dank der calc
Bibliothek erstellt wurden). Um zu vermeiden, dass dieser zusätzliche Platz die Ausrichtung beschädigt, overlay
wurde die Option in den Hervorhebungspfad eingeführt.
document
Jetzt ist es möglich, durch Auswahl der verschiedenen Stile unterschiedliche Effekte zu erzielen, ohne irgendetwas im zu ändern :
\tikzset{highlighting/.style={
append after command={
\pgfextra{
\path[rounded corners,
background fill=red!30, % filling
fill on=<#1>, % filling overlay specification
overlay] ($(\tikzlastnode.south west)+(-0.015,-0.1)$) % to have some offset
rectangle ($(\tikzlastnode.north east)+(0.015,0.065)$);
}
}
}
}
gibt:
während:
\tikzset{highlighting/.style={
append after command={
\pgfextra{
\path[rounded corners,
background filldraw=red filled by red!30, % border+filling
filldraw on=<#1>, % overlay specification
overlay] ($(\tikzlastnode.south west)+(-0.015,-0.1)$) % to have some offset
rectangle ($(\tikzlastnode.north east)+(0.015,0.065)$);
}
}
}
}
gibt:
Anpassbare Offsets
Mit dieser verbesserten Version ist es möglich, den hervorgehobenen Bereich (eine Idee, die aus dem Paket übernommen wurde) über Offsets anzupassen hf-tikz
. Diese Offsets sind letztendlich pgfkeys, deren Werte im optionalen Argument des \highlight
Befehls deklariert werden müssen:
\highlight<overlay specification>[offsets]{text}
Wenn keine [offsets]
angegeben sind, werden die Anfangswerte übernommen.
Der Code:
\documentclass{beamer}
\usepackage{lmodern}
\usepackage{tikz}
\usetikzlibrary{calc}
\usepackage{xparse}
\tikzset{
invisible/.style={opacity=0,text opacity=0},
visible on/.style={alt=#1{}{invisible}},
alt/.code args={<#1>#2#3}{%
\alt<#1>{\pgfkeysalso{#2}}{\pgfkeysalso{#3}}
},
}
\tikzset{
background fill/.style={fill=#1},
background fill/.default={white},
fill on/.style={alt=#1{}{background fill}},
}
\tikzset{
background draw/.style={draw=#1},
background draw/.default={white},
draw on/.style={alt=#1{}{background draw}},
}
\tikzset{
background filldraw/.style args={#1 filled by #2}{draw=#1, fill=#2},
background filldraw/.default=white filled by white,
filldraw on/.style={alt=#1{}{background filldraw}},
}
\pgfkeys{/highlight/.cd,
above right offset/.initial={0.015,0.065},
above right offset/.get=\aboverightoffset,
above right offset/.store in=\aboverightoffset,
below left offset/.initial={-0.015,-0.1},
below left offset/.get=\belowleftoffset,
below left offset/.store in=\belowleftoffset,
}
\tikzset{highlighting/.style={
append after command={
\pgfextra{
\path[rounded corners,
background filldraw=red filled by red!30,% border+filling
filldraw on=<#1>, % overlay specification
overlay] ($(\tikzlastnode.south west)+(\belowleftoffset)$) % to have some offset
rectangle ($(\tikzlastnode.north east)+(\aboverightoffset)$);
}
}
}
}
\NewDocumentCommand{\highlight}{r<> O{} m}{%
\pgfkeys{/highlight/.cd,#2}
\tikz[baseline=(A.base)]
\node[highlighting=#1,
inner sep=0pt] (A) {#3};%
}
\begin{document}
\begin{frame}{Itemize with styles}
\begin{itemize}[<+->]
\item Software-as-a-Service?
\item Platform-as-a-Service?
\item \highlight<5>{Infrastructure-as-a-Service}?
\item \highlight<6>[below left offset={-0.1,-0.2},above right offset={0.25,0.15}]{Other-stuff-as-a-Service}?
\end{itemize}
\end{frame}
\end{document}
Das Ergebnis: