行尾或命令末尾的百分号还有其他替代吗?

行尾或命令末尾的百分号还有其他替代吗?

考虑以下示例,其中包含%中间的 - 符号\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}

相关内容