考虑以下示例,其中包含%
中间的 - 符号\only<2>{ .... my macro .... }
和后续的minipage
。如果我将其省略,整个框架的间距就会被搞乱。我了解它的%
作用以及它为什么需要在那里。但我真的想把它省略,因为它需要考虑它,并且会使我的文档的结构和组织变得复杂。因此我想保留空白行。
在 beamer 上下文中的示例:我正在使用我的自定义环境将 tikz 对象放置在我的框架上的某个位置,并且我想将这些代码片段放置在框架环境内的任何位置,而不考虑之前或之后的内容,因为实际上 tikzpicture 不应该影响框架上的任何其他内容,因为它用作覆盖。但是命令的简单书写却可以。
我怎样才能使这些代码片段的插入与%
- 符号无关?或者有没有办法将其包含在宏或环境中?
\documentclass{beamer}
\usepackage{tikz}
\usepackage{siunitx}
\usepackage{kantlipsum}
\usepackage{environ}
\NewEnviron{tikzannotation}{%
\begin{tikzpicture}[overlay, remember picture, shift={(current page.south west)}]
\BODY
\end{tikzpicture}%
}
\begin{document}
\begin{frame}
\only<2>{%
\begin{tikzannotation}
\node[circle,fill = cyan, minimum width = 1.4cm, align=center,opacity=0.8,
text opacity = 1, font={\scriptsize},inner sep = 1pt
] at (11.2,7.2) {\SI{100}{\percent}\\real!};
\end{tikzannotation}%
}
% <----- this is important - but I want to leave it out!
\begin{minipage}[t]{\textwidth}
\kant[10]
\end{minipage}
\end{frame}
\end{document}
我希望这个问题看起来不会太愚蠢。如果我知道原因是什么,我可以修复它。但我担心我没有意识到的情况。
评论
我知道我可以省略空行,但我正是想这样做才能使代码更具可读性。如果空行是为了开始一个新段落,我明白这一点。但在我的例子中,它开始了一个新段落没有什么。
我基本上想知道是否有类似的命令\pleaseIgnoreAllFollowingBlankLinesUntilTheNextGroup
可以包含在我的宏/环境中。例如,毕竟是否\begin{...}
有空行并不重要。有没有办法适应这种行为?
进一步的想法
正如 David Carlisle 所说,问题是由创建新段落引起的。因此,\let\par\relax
只要它发生在组内,就可以解决问题。这可行吗?有没有办法里面环境定义?
\only<2>{%
\let\par\relax%
\begin{tikzannotation}%
\node[circle,fill = cyan, minimum width = 1.4cm, align=center,opacity=0.8,
text opacity = 1, font={\scriptsize},inner sep = 1pt
] at (11.2,7.2) {\SI{100}{\percent}\\real!};
\end{tikzannotation}%
}
答案1
示例中所示的任何内容都不%
是必需的,只有当您在源中引入空格并将其隐藏时才需要它们,通常最好不要添加您不想要的空格:
\documentclass{beamer}
\usepackage{tikz}
\usepackage{siunitx}
\usepackage{kantlipsum}
\usepackage{environ}
\NewEnviron{tikzannotation}
{\begin{tikzpicture}[overlay, remember picture, shift={(current page.south west)}]
\BODY
\end{tikzpicture}}
\begin{document}
\begin{frame}
\only<2>{\begin{tikzannotation}
\node[circle,fill = cyan, minimum width = 1.4cm, align=center,opacity=0.8,
text opacity = 1, font={\scriptsize},inner sep = 1pt
] at (11.2,7.2) {\SI{100}{\percent}\\real!};
\end{tikzannotation}}
\begin{minipage}[t]{\textwidth}
\kant[10]
\end{minipage}
\end{frame}
\end{document}
特别是,空白行总是意味着段落中断,如图所示,意味着垂直间距。直接不设置空白行比设置空白行但将其注释掉要清楚得多。
与往常一样,在 TeX 中,您可以更改行尾的解释以避免发生这种情况,但很多代码都假定空行是段落末尾,因此这样做弊大于利。
答案2
你确实不是想要\let\par\relax
按照您的编辑建议的那样。考虑
\begin{frame}
\only<2>{%
\let\par\relax
\begin{tikzannotation}
\node[circle,fill = cyan, minimum width = 1.4cm, align=center,opacity=0.8,
text opacity = 1, font={\scriptsize},inner sep = 1pt
] at (11.2,7.2) {\SI{100}{\percent}\\real!};
\end{tikzannotation}%
}
\begin{minipage}[t]{\textwidth}
\kant[10]
\end{minipage}
\onslide<2>
A new paragraph.
Another.
\end{frame}
这\only<2>{...}
不会限制受影响幻灯片上的更改范围。因此,在该点之后的第二张幻灯片上添加的任何内容都将缺少段落。这在上图中很明显,其中 2 个预期段落变成了一个段落。
是的,如果您愿意,您可以将其放在\let\par\relax
环境中。这样可以将更改范围限制在该环境中。
\NewEnviron{tikzannotation}{%
\let\par\relax
\begin{tikzpicture}[overlay, remember picture, shift={(current page.south west)}]
\BODY
\end{tikzpicture}%
}
但是这显然不会对tikzannotation
环境之外产生影响,所以您仍然需要删除或注释掉空白行,以防止它影响第二张幻灯片的间距。
对于所讨论的特定情况,如果需要,您可以通过几种方式包含未注释的空白行。
对于问题中的例子,最简单的方法就是使用\onslide
而不是\only
。这并不能阻止空行影响间距。但它确实确保了对框架中所有幻灯片的间距的影响都是相同的。当然,这是否足够取决于案件的细节。但如果问题只是跳过幻灯片内容,这种方法就足够了。
\begin{frame}
\onslide<2>{%
\begin{tikzannotation}
\node[circle,fill = cyan, minimum width = 1.4cm, align=center,opacity=0.8,
text opacity = 1, font={\scriptsize},inner sep = 1pt
] at (11.2,7.2) {\SI{100}{\percent}\\real!};
\end{tikzannotation}%
}
\begin{minipage}[t]{\textwidth}
\kant[10]
\end{minipage}
\end{frame}
更复杂的解决方案是将幻灯片的内容包装在overlayarea
环境中。
\begin{frame}
\only<2>{%
\begin{tikzannotation}
\node[circle,fill = cyan, minimum width = 1.4cm, align=center,opacity=0.8,
text opacity = 1, font={\scriptsize},inner sep = 1pt
] at (11.2,7.2) {\SI{100}{\percent}\\real!};
\end{tikzannotation}%
}
\begin{overlayarea}{\textwidth}{.8\textheight}
\begin{minipage}[t]{\textwidth}
\kant[10]
\end{minipage}
\end{overlayarea}
\end{frame}
我认为没有空行更易读,但您的偏好显然与我的不同,因为我觉得您的代码间隔太大,让人不舒服。(不仅仅是您的偏好 - 我习惯性地从 MWE 中删除空白行和注释行,因为我想一次在屏幕上看到尽可能多的代码。)
完整代码:
\documentclass{beamer}
\usepackage{tikz}
\usepackage{siunitx}
\usepackage{kantlipsum}
\usepackage{environ}
\NewEnviron{tikzannotation}{%
\begin{tikzpicture}[overlay, remember picture, shift={(current page.south west)}]
\BODY
\end{tikzpicture}%
}
\begin{document}
\begin{frame}
\onslide<2>{%
\begin{tikzannotation}
\node[circle,fill = cyan, minimum width = 1.4cm, align=center,opacity=0.8,
text opacity = 1, font={\scriptsize},inner sep = 1pt
] at (11.2,7.2) {\SI{100}{\percent}\\real!};
\end{tikzannotation}%
}
\begin{minipage}[t]{\textwidth}
\kant[10]
\end{minipage}
\end{frame}
\begin{frame}
\only<2>{%
\begin{tikzannotation}
\node[circle,fill = cyan, minimum width = 1.4cm, align=center,opacity=0.8,
text opacity = 1, font={\scriptsize},inner sep = 1pt
] at (11.2,7.2) {\SI{100}{\percent}\\real!};
\end{tikzannotation}%
}
\begin{overlayarea}{\textwidth}{.8\textheight}
\begin{minipage}[t]{\textwidth}
\kant[10]
\end{minipage}
\end{overlayarea}
\end{frame}
\end{document}