
Estoy escribiendo un libro basado en notas de conferencias que escribí usando Beamer. En estas notas tengo figuras dibujadas usando TikZ que me gustaría transferir al libro. Sin embargo, algunos de ellos usan \only para mostrar diferentes subfiguras. Esto no funciona en la clase de memorias. ¿Hay alguna forma de emularlo, por ejemplo, con un entorno en el que especifico la diapositiva particular que quiero \begin{selectslide}{2} ... \end{selectslide}
? Mi alternativa es extraer la diapositiva correcta manualmente, lo cual es tedioso y propenso a errores.
Respuesta1
Si solo desea emular \only
, especialmente en el contexto de TikZ, entonces podríamos escribir un pequeño analizador para hacer esto.
\documentclass[12pt]{article}
\usepackage{tikz}
\makeatletter
\newcounter{only@begin}%
\newcounter{only@end}%
\def\@only@hyphen{-}%
\def\only<#1>#2{%
\bgroup
\def\only@test{#1}%
\ifx\only@test\@only@hyphen
\c@only@begin=-100\relax
\c@only@end=100\relax
\else
\parseonlybegin\only@relax#1-\endparseonly
\parseonlyend\only@relax#1-\endparseonly
\fi
\advance\c@only@begin by -1\relax
\advance\c@only@end by 1\relax
\ifnum\c@only@begin<\slide\relax
\ifnum\c@only@end>\slide\relax
#2\relax
\fi
\fi
\egroup
}
\def\@only@relax{\only@relax}%
\def\only@striponetoken#1{}%
\def\only@gobblehyphen#1-{#1}
\def\parseonlybegin#1-#2\endparseonly{%
\def\only@test{#1}%
\ifx\only@test\@only@relax
\setcounter{only@begin}{-100}%
\else
\expandafter\c@only@begin\only@striponetoken#1\relax%
\fi
}
\def\parseonlyend#1-#2\endparseonly{%
\def\only@test{#2}%
\ifx\only@test\@empty
% No hyphen in original.
\c@only@end=\c@only@begin%
\else
\ifx\only@test\@only@hyphen
% \only<a->
\setcounter{only@end}{100}%
\else
% \only<a-b> or \only<-b>; #2 contains 'b-'
\expandafter\c@only@end\only@gobblehyphen#2\relax%
\fi
\fi
}
\makeatother
\begin{document}
\def\mypic#1{%
\def\slide{#1}%
\begin{tikzpicture}[every node/.style={anchor=base,circle, draw}]
\draw (0,0) rectangle (6,2);
\node at (1,1) {a};
\only<2->{ \node at (2,1) {b}; }
\only<2-3>{ \node at (3,1) {c}; }
\only<3>{ \node at (4,1) {d}; }
\only<-4>{ \node at (5,1) {e}; }
\end{tikzpicture}%
\par
}
\mypic{1}%
\mypic{2}%
\mypic{3}%
\mypic{4}%
\mypic{5}%
\end{document}
No pretendo tener un buen estilo de codificación TeX, pero esto se compila para
Respuesta2
Lamentablemente no sé cómo hacerlo con las especificaciones de superposición del proyector. PeroEstilos TikZson muy poderosos y pueden usarse para emular un comportamiento similar, aunque no conozco una manera de cortar el código repetitivo.
A continuación se muestra un ejemplo documentado. Déjeme saber si usted tiene preguntas.
\documentclass{article}
\usepackage{tikz}
\begin{document}
\tikzset{
% Define the 'none'-style, which hopefully ensures that nothing is being drawn visibly.
none/.style = {
draw = none,
fill = none,
text opacity = 0
},
% --------------------------
% Boilerplate code to roughly emulate beamer overlay behaviour.
% Use the 'onlyslide'-style in all nodes, paths etc. that you want to appear only on one specific slide.
% You can't use more than one onlyslide on one node or path.
onlyslide1/.style = {none},
slide1/.style = { onlyslide1/.style = {} },
% Copy the code for every slide
onlyslide2/.style = {none},
onlyslide3/.style = {none},
% This is what you could do if you wanted something to appear on more than one slides, but not on all
onlyslides23/.style = {none},
slide2/.style = {
onlyslide2/.style = {},
onlyslide23/.style = {}
},
slide3/.style = {
onlyslide3/.style = {},
onlyslide23/.style = {}
},
% --------------------------
% This is the actual image you want to draw. I'm drawing it as a pic for convenience.
% You would need TikZ 3.0 for that to work. But you can use the styles above also in a normal tikzpicture.
yourimage/.pic = {
\node[draw,onlyslide1] {Only visible on slide 1};
\node[draw,onlyslide2] at (2,0) {Only visible on slide 2};
\node[draw] at (6,0) {Always visible};
}
}
% --------------------------
% Finally, let's use all that in your actual document:
This is how it looks on the first slide:
\begin{tikzpicture}[slide1]
\pic {yourimage};
\end{tikzpicture}
This is how it looks on the second slide:
\begin{tikzpicture}[slide2]
\pic {yourimage};
\end{tikzpicture}
\end{document}
El resultado debería verse así: