我正在展示幻灯片,通过快照展示时间的演变。每个快照对应一个特定的时间。
我想显示一个时间箭头(侧面垂直),其中的项目符号对应于每个时间点(间距不等)。在每个叠加层上,其中一个项目符号是实心填充的,并指定当前时间,而其他项目符号是开放的(空心圆圈)。
我认为我可以很容易地用 来完成未命名的版本tikz
,但我不确定如何根据覆盖号调整元素的样式和节点文本的存在。
以下是静态时间箭头的 MWE:
\documentclass[tikz,border=3mm]{standalone}
\usetikzlibrary{arrows.meta}
\begin{document}
\begin{tikzpicture}
\def\axscale{-0.02}
\def\thex{0}
\def\they{0}
\def\prevy{0}
\def\times{{-5,2, 12, 22, 32, 44, 76, 116, 182, 300,307}}
\def\maxt{9}
\foreach \it in {1,...,\maxt} {
\pgfmathparse{\axscale*\times[\it-1]}
\pgfmathsetmacro{\prevy}{\pgfmathresult}
\pgfmathparse{\axscale*\times[\it]}
\pgfmathsetmacro{\they}{\pgfmathresult}
\draw[-{Circle[open]}] (\thex,\prevy) -- (\thex,\they);
\node[right,anchor=west] at (\thex,\they) {
$t=\pgfmathparse{\times[\it]}
\pgfmathprintnumber[ % Print the result
fixed,
fixed zerofill,
precision=0,
assume math mode=true
]{\pgfmathresult}
$};
}
\pgfmathparse{\axscale*\times[\maxt]}
\pgfmathsetmacro{\prevy}{\pgfmathresult}
\pgfmathparse{\axscale*\times[\maxt+1]}
\pgfmathsetmacro{\they}{\pgfmathresult}
\draw[->] (\thex,\prevy) -- (\thex,\they);
%\draw(\thex,\prevy) -- (\thex+5,\they);
\end{tikzpicture}
\end{document}
因此要动画的元素是Circle[open]
以及是否显示t=...
标签。
答案1
我相信你已经得到了答案,即使用图层和TikZ,两个答案都展示了如何做到这一点。
我想展示一种不同的方法来绘制这个时间轴,使用 TikZ 提供的一些好东西,主要是钥匙/tikz/y
你可以改变长度和方向是轴线坐标坐标系(没有单位)。
除了使用,\axscale
您还可以设置y
为-0.02cm
(默认值为 1cm),然后 TikZ 会将您的值乘以它以将其转换为帆布坐标系(单位为是仍然指向上方)。
然后,还有chains
图书馆 我实际上只用它来连接节点,而不是去任何地方1mm
。为此,我设置了一个高于的起点吨= 0,并添加最后一个点,该点始终位于最后一个点下方 1.4 毫米处吨。(如果您需要线的上部起点位于第一个线的上方固定距离处吨这里需要进行调整。)最后一个也连接起来,->
这样我们就得到了实际的箭头。
说到箭头,Circle
提示看起来不错,它们只接触指定的坐标,而不是位于其中心。这可以固定的,尽管我在这里只使用圆形节点。
为了让图表投影仪能够感知,我窃取<.>
了Sam Carter 的回答拥有label
与节点填充同时出现。由于我使用圆形节点作为参考,而不是箭头尖端,因此我认为节点的排列会更好。
我们还可以将添加label
到fill
,即
alt=<+>{fill, label={$t = \t$}}{}
不过,除非标签不再对边界框起作用,否则这会使图片跳动。
由于visible on
解决方案overlay-beamer-styles
会在框架上留下隐藏文本(可以选择和复制),所以我使用 beamer 自己的\uncover
来隐藏文本。
代码
\documentclass{beamer}
\usepackage{tikz}
\usetikzlibrary{arrows.meta, chains, overlay-beamer-styles}
\begin{document}
\begin{frame}
\begin{itemize}[<+->]
\item First.
\item Second.
\end{itemize}
\begin{tikzpicture}[
y=-.02cm, thick, label position=right, start chain = going {},
dot/.style={circle, draw, inner sep=+0pt, minimum size=+1.3mm}]
\coordinate[on chain]() at (0, 1mm); % a start (for the line)
\foreach \t in {2, 12, 22, 32, 44, 76, 116, 182, 300}
\node[dot, on chain, join, alt=<+>{fill},
label/.expanded={$\uncover<.>{t = \t}$}, % no hidden text in output
% label={[visible on=<.>]$t = \t$}, % hidden text in output
] at (0, \t) {};
% and an end that is below the last dot
\coordinate[on chain, join=by ->]() at ([yshift=-1.4mm] chain-end.south);
\end{tikzpicture}
\end{frame}
\end{document}
输出(点击查看完整版本)
答案2
你可以利用 tikz 命令(例如\draw
)具有叠加感知功能的事实:
\documentclass{beamer}
\usepackage{tikz}
\usetikzlibrary{arrows.meta}
\begin{document}
\begin{frame}
\begin{tikzpicture}
\def\axscale{-0.02}
\def\thex{0}
\def\they{0}
\def\prevy{0}
\def\times{{-5,2, 12, 22, 32, 44, 76, 116, 182, 300,307}}
\def\maxt{9}
\foreach \it in {1,...,\maxt} {
\pgfmathparse{\axscale*\times[\it-1]}
\pgfmathsetmacro{\prevy}{\pgfmathresult}
\pgfmathparse{\axscale*\times[\it]}
\pgfmathsetmacro{\they}{\pgfmathresult}
\draw[-{Circle[open]}] (\thex,\prevy) -- (\thex,\they);
\draw<+(2)>[-{Circle}] (\thex,\prevy) -- (\thex,\they);
\node<.(2)>[right,anchor=west] at (\thex,\they) {
$t=\pgfmathparse{\times[\it]}
\pgfmathprintnumber[ % Print the result
fixed,
fixed zerofill,
precision=0,
assume math mode=true
]{\pgfmathresult}
$};
}
\pgfmathparse{\axscale*\times[\maxt]}
\pgfmathsetmacro{\prevy}{\pgfmathresult}
\pgfmathparse{\axscale*\times[\maxt+1]}
\pgfmathsetmacro{\they}{\pgfmathresult}
\draw[->] (\thex,\prevy) -- (\thex,\they);
%\draw(\thex,\prevy) -- (\thex+5,\they);
\end{tikzpicture}
\end{frame}
\end{document}
答案3
使用这个出色的overlay-beamer-styles
库,您可以执行以下操作:
\documentclass{beamer}
\usepackage{tikz}
\usetikzlibrary{arrows.meta}
\usetikzlibrary{overlay-beamer-styles}
\begin{document}
\begin{frame}
\begin{tikzpicture}
\def\axscale{-0.02}
\def\thex{0}
\def\they{0}
\def\prevy{0}
\def\times{{-5, 2, 12, 22, 32, 44, 76, 116, 182, 300, 307}}
\def\maxt{9}
\foreach \it in {1,...,\maxt} {
\pgfmathparse{\axscale*\times[\it-1]}
\pgfmathsetmacro{\prevy}{\pgfmathresult}
\pgfmathparse{\axscale*\times[\it]}
\pgfmathsetmacro{\they}{\pgfmathresult}
\draw[alt={<\it>{-{Circle[]}}{-{Circle[open]}}}] (\thex,\prevy) -- (\thex,\they);
\node[right,anchor=west] at (\thex,\they) {
$t=\pgfmathparse{\times[\it]}
\pgfmathprintnumber[ % Print the result
fixed,
fixed zerofill,
precision=0,
assume math mode=true
]{\pgfmathresult}
$};
\pgfmathparse{\axscale*\times[\maxt]}
\pgfmathsetmacro{\prevy}{\pgfmathresult}
\pgfmathparse{\axscale*\times[\maxt+1]}
\pgfmathsetmacro{\they}{\pgfmathresult}
\draw[->] (\thex,\prevy) -- (\thex,\they);
}
%\draw(\thex,\prevy) -- (\thex+5,\they);
\end{tikzpicture}
\end{frame}
\end{document}
或者,如果您想保留前面的点,您可以用alt={<\it>{-{Circle[]}}{-{Circle[open]}}}
替换alt={<\it->{-{Circle[]}}{-{Circle[open]}}}
(即在-
后面添加 )。\it