我通常使用 MS Powerpoint智能表格或其他对象来突出显示图片或表格中的特定点,以吸引观众的注意力。想象一下一张技术图纸,我想要一个指向该图纸特定部分的粗箭头。或者指向表格中某个数字的箭头。
因此在 Powerpoint 中我只需使用拖放并将箭头放在我想要的位置,如果我想移动图片我将图片和箭头放在一个组中并将它们一起移动。
在投影机我用文本位置将我的对象放在框架上的包:
\usepackage[absolute,overlay]{textpos}
网格应该可以帮助我做到这一点:
\setbeamertemplate{background}[grid][step=10mm]
但不幸的是,它从框架的左下角开始, 但textpos 的原点是左上角。这有点烦人,如何才能正确设置网格?即使这样可行,在放置对象时仍然相当麻烦,而且需要多次编译。
现在我编辑我的表格或移动我的图片,繁琐的放置过程又开始了。
以下是 MWE 展示的示例:
\documentclass{beamer}
\usepackage[absolute,overlay]{textpos}
\usepackage{booktabs}
\usepackage{tabularx}
\newcolumntype{Y}{>{\centering\arraybackslash}X}
\usepackage{bbding}
\newcommand{\BigArrow}{\scalebox{5}[1]\ArrowBoldRightShort\!}
\setbeamertemplate{background}[grid][step=10mm]
\begin{document}
\begin{frame}
\begin{table}
\begin{tabularx}{\textwidth}{YYY}
\toprule
\textbf{Treatments} & \textbf{Response 1} & \textbf{Response 2}\\
\midrule
Treatment 1 & 0.0003262 & 0.512 \\
Treatment 2 & 0.0015681 & 0.910 \\
Treatment 3 & 0.0009271 & 0.296 \\
\bottomrule
\end{tabularx}
\end{table}
\begin{textblock*}{0mm}(80mm,37.875mm)
\BigArrow
\end{textblock*}%
\begin{textblock*}{0mm}(106mm,49.5mm)
\HandLeftUp
\end{textblock*}%
\end{frame}
\end{document}
如您所见,我实际上想将箭头精确地放置在最后两列的两个顶行元素之间,并让手指指向最后一个数字。但我不想改变表格本身。
我正在寻找类似的东西:
...
Treatment 1 & 0.0003262 \setanchorpoint{1} & 0.512 \\
Treatment 2 & 0.0015681 & 0.910 \\
Treatment 3 & 0.0009271 & 0.296\setanchorpoint{2} \\
...
...
\begin{textblock*}{0mm}(\getanchorpointX{1}+10mm,\getanchorpointY{1}+0mm)
\BigArrow
\end{textblock*}%
\begin{textblock*}{0mm}(\getanchorpointX{2}+5mm,\getanchorpointY{2}+5mm)
\HandLeftUp
\end{textblock*}%
那可能吗?
如果不是,您会推荐什么样的通用方法来将物体相对于其他物体放置?
例如,对于表格,我不认为插入“无形的”行和列来插入箭头和手指。不过,将多张重叠的图片分组似乎更可行。
我希望这个问题不要太宽泛。但我对这些可能性非常感兴趣投影机提供给我。这个问题是投影机对我来说,Latex 比 Powerpoint 更好,如果有时间压力,需要在一天内准备好演示文稿,我可能更愿意使用 Powerpoint 来完成工作,但实际上我不想这样做。Latex 的优势太大了。正如你所见,我不是在谈论完美排版在演示中,有时这些肮脏的伎俩是必要的。
Latex 总是给我“一切皆有可能!”印象,那么什么是魔术在这种情况下?
为了进一步说明,我的一张 Powerpoint 演示文稿的幻灯片和我想要放置的对象如本问题所述,用红色标记:
答案1
环顾 TX.SX,你会发现很多例子\tikzmark
\documentclass{beamer}
\usepackage{booktabs}
\usepackage{tabularx}
\newcolumntype{Y}{>{\centering\arraybackslash}X}
\usepackage{tikz}
\usepackage{bbding}
\newcommand{\BigArrow}{\scalebox{5}[1]\ArrowBoldRightShort\!}
\setbeamertemplate{background}[grid][step=10mm]
% tikzmark command, for shading over items
\newcommand{\tikzmark}[1]{\tikz[overlay,remember picture] \node (#1) {};}
\begin{document}
\begin{frame}
\begin{table}
\begin{tabularx}{\textwidth}{YYY}
\toprule
\textbf{Treatments} & \textbf{Response 1} & \textbf{Response 2}\\
\midrule
Treatment 1 & 0.0003262\tikzmark{a} & \tikzmark{b}0.512 \\
Treatment 2 & 0.0015681 & 0.910 \\
Treatment 3 & 0.0009271 & 0.296\tikzmark{c} \\
\bottomrule
\end{tabularx}
\end{table}
\begin{tikzpicture}[overlay, remember picture]
\path (a) -- node[midway, anchor=base] {\BigArrow} (b);
\node[rotate=-15, anchor=west] at (c) {\HandLeftUp};
\end{tikzpicture}
\end{frame}
\end{document}
编译两次上面的代码,你会得到
对于你的第二个问题,我建议使用 TikZ 在图像上绘图
答案2
是的,存在一个通用的工作流程来将对象相对于另一个对象放置。这个通用的工作流程就是 TeX 本身。你唯一需要做的就是了解 TeX。
例如,您可以创建一个宏\putto{right}{up}{object}
,将对象相对于当前排版点移动,但排版点不会移动。该宏可以定义为:
\def\putto#1#2#3{\vbox to0pt{\kern-#2\hbox to0pt{\kern#1{#3}\hss}\vss}}
在您的示例中,此类宏的用法如下:
\documentclass{beamer}
\usepackage[absolute,overlay]{textpos}
\usepackage{booktabs}
\usepackage{tabularx}
\newcolumntype{Y}{>{\centering\arraybackslash}X}
\usepackage{bbding}
\newcommand{\BigArrow}{\scalebox{5}[1]\ArrowBoldRightShort\!}
\def\putto#1#2#3{\vbox to0pt{\kern-#2\hbox to0pt{\kern#1{#3}\hss}\vss}}
\setbeamertemplate{background}[grid][step=10mm]
\begin{document}
\begin{frame}
\begin{table}
\begin{tabularx}{\textwidth}{YYY}
\toprule
\textbf{Treatments} & \textbf{Response 1} & \textbf{Response 2}\\
\midrule
Treatment 1 & 0.0003262\putto{8mm}{3mm}\BigArrow & 0.512 \\
Treatment 2 & 0.0015681 & 0.910 \\
Treatment 3 & 0.0009271 & 0.296\putto{2mm}{1.4mm}\HandLeftUp \\
\bottomrule
\end{tabularx}
\end{table}
编辑如果需要将对象的基线保持在当前排版点的位置,当第二个参数是0mm
时,我们的宏会稍微复杂一些:
\def\putto#1#2#3{\vbox to0pt{\kern-#2\hbox to0pt{\kern#1\puttoA{#3}\hss}\vss}}
\def\puttoA#1{\setbox0=\hbox{#1}\ht0=0pt\box0 }