josephwright / beamer

A LaTeX class for producing presentations and slides
Other
1.4k stars 141 forks source link

Emojis are not usable in overlay-aware slides #769

Open stone-zeng opened 2 years ago

stone-zeng commented 2 years ago

From https://github.com/stone-zeng/latex-emoji/issues/12

The emoji characters will not disappear (or have opacity) when beamer covered item style is set to transparent:

\documentclass{beamer}
\usepackage{fontspec}
\setbeamercovered{transparent=0}
\begin{document}
\begin{frame}{Test}
\begin{itemize}[<+->]
\item This will appear on the first slide.
\item This will appear on the second slide.
  {\fontspec{Noto Color Emoji}[Renderer=HarfBuzz] 🩸}
\end{itemize}
\end{frame}
\end{document}
First Second
1 png-000001 1 png-000002
samcarter commented 2 years ago

You can avoid the problem with

% !TeX TS-program = lualatex

\documentclass{beamer}
\usepackage{fontspec}
\setbeamercovered{transparent=0}
\begin{document}
\begin{frame}{Test}
\begin{itemize}[<+->]
\item This will appear on the first slide.
\item This will appear on the second slide.
  \visible<.->{ \fontspec{Noto Color Emoji}[Renderer=HarfBuzz] 🩸}
\end{itemize}
\end{frame}
\end{document}
stone-zeng commented 2 years ago

Yeah, but it clearly only works for transparent=0

samcarter commented 2 years ago

yes, but that's what the code in your question was using.

For other transparencies, you can overlay it with a semi-transparent shape, e.g. https://tex.stackexchange.com/a/354033/36296

% !TeX TS-program = lualatex

\documentclass{beamer}
\usepackage{fontspec}
\setbeamercovered{transparent=50}
\usepackage{tikz}
\begin{document}
\begin{frame}{Test}
\begin{itemize}[<+->]
\item This will appear on the first slide.
\item This will appear on the second slide.
      \begin{tikzpicture}
      \node[anchor=south west,inner sep=0] (B) at (4,0) {\fontspec{Noto Color Emoji}[Renderer=HarfBuzz] 🩸};
      \only<-1>{%
          \fill [draw=none, fill=white, fill opacity=0.5] (B.north west) -- (B.north east) -- (B.south east) -- (B.south west) -- (B.north west) -- cycle;
      }
      \end{tikzpicture}  
\end{itemize}
\end{frame}
\end{document}

document

u-fischer commented 2 years ago

beamer doesn't use real transparency here but mixes in colors to give it the same color as the background and so it doesn't affect graphics (and emoji are basically graphics). But one could probably use real transparency:

\documentclass{beamer}
\usepackage{fontspec}
\usepackage{transparent}
\setbeamercovered{transparent=30}

\makeatletter
\def\beamer@startcovered{%
  \beamer@smuggle{%
  \global\advance\beamer@coveringdepth by 1\relax%
  \beamer@actions{\pgfsys@begininvisible\aftergroup\beamer@@spacingcover}{%
     \pgfsys@endinvisible\aftergroup\beamer@@spacingcover%
     }%
  \def\opaqueness<##1>##2{%
    \only<##1>{%
      \beamer@actions{%
    \transparent{\fpeval{##2/100}}%
      }%
      {% end code needed???
      }}}%
  \ifnum\beamer@slideinframe<\beamer@minimum %ok, at beginning
    \begingroup
      \beamer@saveanother
      \advance\beamer@minimum by-\beamer@slideinframe
      \beamer@slideinframe=\beamer@minimum
      \beamer@uncoverbeforeactions
      \beamer@restoreanother
    \endgroup
  \else
    \begingroup
      \beamer@saveanother
      \advance\beamer@slideinframe by-\beamer@minimum
      \beamer@uncoverafteractions
      \beamer@restoreanother
    \endgroup
  \fi
  \beamer@do
  }%
}

\begin{document}
\begin{frame}{}
\begin{itemize}[<+->]
\item XX
\item 
  {\includegraphics[width=2cm]{example-image}\fontspec{Noto Color Emoji}[Renderer=HarfBuzz] 🩸}

\item xxxx  

\end{itemize}
\end{frame}
\end{document}

image