平均能量损失

平均能量损失

在下面的 MWE 中,我定义了一个宏\markxy,该宏从一个点到 x 和 y 轴绘制虚线以指示 x/y 坐标。由于我不希望虚线覆盖其他“更重要”的线,因此我将内容收集\markxy在一个范围内并将其设置为背景层。

我使用visible on键来创建叠加效果。为了节省输入,我将第 2 帧上显示的所有内容(包括路径\markxy)分组到范围内,然后传递visible on=<2->给该范围。但是,该\markxy命令似乎没有从范围继承选项。

我想了解为什么会出现这种情况,以及如何纠正它。(我现在的解决方案是复制范围选项并将它们添加到\markxy。但这不是很有效。)

平均能量损失

\documentclass{beamer}
\usepackage{tikz}
\usetikzlibrary{intersections,backgrounds,scopes}
\tikzset{
  % use option [visible on=<+->] to uncover parts of a tikzpicture
  invisible/.style={opacity=0},
  visible on/.style={alt=#1{}{invisible}},
  alt/.code args={<#1>#2#3}{%
    \alt<#1>{\pgfkeysalso{#2}}{\pgfkeysalso{#3}} % \pgfkeysalso doesn't change the path
  },
}
\newcommand\axes[3][]{
  \draw[<->,#1](0,10)node[left]{$#3$}--(0,0)--(10,0)node[below]{$#2$};
}
\newcommand\markxy[4][]{
  \scoped[on background layer]
  \draw[dashed,#1](#2-|0,0)node[left]{$#3$}--(#2)--(#2|-0,0)node[below,anchor=base,yshift=-9pt]{$#4$};
}

\begin{document}
\begin{frame}
Frame \insertpagenumber\centering

\begin{tikzpicture}[font=\scriptsize,scale=.5]
  \draw[thick,name path=nd1](1,8)to[bend right=8](8,3)node[right]{$N^d$};
  \draw[thick,name path=ns1](5,1)to[bend right=8](9,6)node[above]{$N^s_1(r_1)$};
  \filldraw[name intersections={of=nd1 and ns1,by=ne1}](ne1)circle[radius=4pt];
  \markxy{ne1}{w_1}{N_1}
  \begin{scope}[visible on=<2->,orange]
    \draw[thick,name path=ns2,](1,3)to[bend right=8](5,8)node[above]{$N^s_2(r_1)$};
    \filldraw[name intersections={of=nd1 and ns2,by=ne2},](ne2)circle[radius=4pt];
    \markxy[]{ne2}{\widetilde w_2}{\widetilde N_2}
  \end{scope}
  \axes{N}{w}
\end{tikzpicture}
\end{frame}
\end{document}

MWE 的输出(错误)

在此处输入图片描述

期望输出

在此处输入图片描述

答案1

问题不仅仅存在于子作用域中;简单作用域也会出现不良行为。问题在于您错误地使用了选项visible onorange也是错误使用的),与on background layer规范无关;只要将visible on(以及 orange)作为选项传递给选项,问题就会得到解决on background layer

以下简化版本的代码展示了我刚才提到的内容;当使用on background layer范围时,必须将附加选项作为选项传递给选项on background layer,而不是独立地传递给范围:

\documentclass{beamer}
\usepackage{tikz}
\usetikzlibrary{scopes,backgrounds}

\tikzset{
  % use option [visible on=<+->] to uncover parts of a tikzpicture
  invisible/.style={opacity=0},
  visible on/.style={alt=#1{}{invisible}},
  alt/.code args={<#1>#2#3}{%
    \alt<#1>{\pgfkeysalso{#2}}{\pgfkeysalso{#3}} % \pgfkeysalso doesn't change the path
  },
}

\makeatletter
\def\c@slideinframe{\beamer@slideinframe}
\def\beamerslideinframe{\beamer@slideinframe}
\makeatother

\begin{document}

\begin{frame}
\frametitle{Test slide \arabic{slideinframe}}

\begin{tikzpicture}[every node/.style={draw,circle}]
  \node at (0,0) {A};

  % wrong result
  \scoped[visible on=<2->,red,on background layer]
  \node at (1,0) {B};

  % right result
  \scoped[on background layer={red,visible on=<2->}]
  \node at (2,0) {C};
\end{tikzpicture}

\end{frame}
\end{document}

在此处输入图片描述

请注意,第一张幻灯片上有一个错误的节点“B”,它是可见的,并且是黑色的(只有标签是红色);这是因为visible on=<2->red被(错误地)作为选项提供给了\scoped。当作为选项传递on background layer给节点“C”时,一切都按预期工作。

事实上,PGF 手册中提到了这一点(第43 背景库,第 527 页):

/tikz/on background layer= options(无默认值)

此键只能与{scope}或一起使用\scoped。它将导致范围内的所有内容在背景层上排版。选项将在背景范围内执行。这很有用,因为传递给环境的其他选项{scope}将在实际背景材料开始之前执行,因此不会对其产生任何影响。

因此,为了使visible onorange选项能够被继承,您需要将它们作为选项传递给键on background layer。根据 参数的实际管理\markxy,您可以将其定义为

\newcommand\markxy[4][]{
  \scoped[on background layer={#1}]
  \draw[dashed](#2-|0,0)node[left]{$#3$}--(#2)--(#2|-0,0)node[below,anchor=base,yshift=-9pt]{$#4$};
}

然后使用它作为

\markxy[visible on=<2->,orange]{ne2}{\widetilde w_2}{\widetilde N_2}

您的完整示例与这个想法:

\documentclass{beamer}
\usepackage{tikz}
\usetikzlibrary{intersections,backgrounds,scopes}
\tikzset{
  % use option [visible on=<+->] to uncover parts of a tikzpicture
  invisible/.style={opacity=0},
  visible on/.style={alt=#1{}{invisible}},
  alt/.code args={<#1>#2#3}{%
    \alt<#1>{\pgfkeysalso{#2}}{\pgfkeysalso{#3}} % \pgfkeysalso doesn't change the path
  },
}
\newcommand\axes[3][]{
  \draw[<->,#1](0,10)node[left]{$#3$}--(0,0)--(10,0)node[below]{$#2$};
}
\newcommand\markxy[4][]{
  \scoped[on background layer={#1}]
  \draw[dashed](#2-|0,0)node[left]{$#3$}--(#2)--(#2|-0,0)node[below,anchor=base,yshift=-9pt]{$#4$};
}

\begin{document}
\begin{frame}
Frame \insertpagenumber\centering

\begin{tikzpicture}[font=\scriptsize,scale=.5]
  \draw[thick,name path=nd1](1,8)to[bend right=8](8,3)node[right]{$N^d$};
  \draw[thick,name path=ns1](5,1)to[bend right=8](9,6)node[above]{$N^s_1(r_1)$};
  \filldraw[name intersections={of=nd1 and ns1,by=ne1}](ne1)circle[radius=4pt];
  \markxy{ne1}{w_1}{N_1}
  \begin{scope}[visible on=<2->,orange]
    \draw[thick,name path=ns2,](1,3)to[bend right=8](5,8)node[above]{$N^s_2(r_1)$};
    \filldraw[name intersections={of=nd1 and ns2,by=ne2},](ne2)circle[radius=4pt];
    \markxy[visible on=<2->,orange]{ne2}{\widetilde w_2}{\widetilde N_2}
  \end{scope}
  \axes{N}{w}
\end{tikzpicture}
\end{frame}
\end{document}

结果:

在此处输入图片描述

相关内容