关于 pgfplotsset 解释的问题

关于 pgfplotsset 解释的问题

我试图理解以下代码:

\pgfplotsset{
    discard if not/.style 2 args={
        x filter/.code={
            \edef\tempa{\thisrow{#1}}
            \edef\tempb{#2}
            \ifx\tempa\tempb
            \else
                \def\pgfmathresult{inf}
            \fi
        }
    }
}

这是我读完手册后的理解:

  1. \pgfplotsset用于设置文档样式。

  2. discard if not/.style 2 argsdiscard if not定义一个在命名空间中命名的样式/pgfplots并接受两个参数:#1#2

  3. x filter/.code用于更改 PGFPLOTS 关于坐标过滤的行为。这里,我们说的是使用x filter基于单个坐标的坐标过滤。.code类似于 TeX 命令:\newcommandx filter获取输入坐标作为#1并应用过滤,最后将结果写入宏\pgfmathresult。如果我们设置\pgfmathresult为,则可以inf通过\pgfmathresults{inf}这种方式丢弃坐标(如果unbounded coords=discard设置了)。

  4. \thisrow{#1}返回列中的活动行#1。换句话说,\thisrow{#1}= table(active row,column= #1)。

  5. \tempa{\thisrow{#1}}定义一个名为的宏tempa,其值是指定列中当前活动表行的值,\tempa= table(active row,column= #1)。

  6. \edef指扩展定义。它扩展宏来评估其值。

  7. \edef\tempa{\thisrow{#1}}评估宏并将指定列中活动行的值分配给tempa

  8. \edef\tempb{#2}将第二个参数的值分配给宏tempb

  9. \ifx:我在手册中找不到这个,但我假设它\ifx\tempa\tempb相当于逻辑条件:\tempa == \tempb。也许我们有\ify

  10. \pgfmathresult{inf}:到目前为止\pgfmathresult具有 x 坐标的值,如果已设置则将其设置为inf丢弃该坐标。unbounded coords=discard

  11. \def\pgfmathresult{inf}我无法找到它的具体作用,但我认为它设置了可以引用丢弃的\def值。\pgfmathresultinf

因此,discard if not是一种样式的名称,当调用时,它会根据两个输入参数应用坐标丢弃。

如果我理解不正确或者有人能纠正我或者给我更好的解释,我将不胜感激。

答案1

这确实是正确的,但需要澄清一些细微差别;

  1. \pgfplotsset用于设置key=value特定于pgfplots键系列的对。可以在 TikZ 手册的 pgfkeys 部分中看到。使用它的主要目的是避免每次都输入/pgfplots/要设置的每个键的前缀。TikZ 有\tikzset,pgfplotstable 有\pgfplotstableset等等。因此它会自动将命名空间设置为pgfplots

  2. discard if not/.style 2 argsdiscard if not定义一个在命名空间中命名的样式/pgfplots/并接受两个参数:#1#2是的,这些输入仍然可用,#1并且在此样式中#2

  3. x filter/.code用于改变 PGFPLOTS 关于坐标过滤的行为。这里我们说的是用于x filter基于单个坐标的坐标过滤。.code是一个处理程序,它执行一段代码而不是设置值或其他样式的样式。类似于 TeX 命令:\newcommand

    x filter保存代码以评估当前值,我们可以改变的值\pgfmathresult。我们使用先前定义的#1#2来评估值。如果我们通过这种方式设置\pgfmathresult为,则可以丢弃坐标(设置)。inf\pgfmathresults{inf}unbounded coords=discard

  4. \thisrow{#1}返回列中的活动行#1。换句话说,\thisrow{#1}= table(active row,column= #1)。是的

  5. \edef\tempa{\thisrow{#1}}定义一个名为的宏tempa,其具有扩展指定列中当前活动表行的值,\tempa= table(active row,column= #1)。

  6. \edef指扩展定义。它扩展宏以评估其值。不同之处在于,的值\thisrow{#1}在定义后立即使用。如果\def使用,它将等待未扩展,直到使用时才使用最后一个值。

  7. \edef\tempa{\thisrow{#1}}评估宏并将指定列中活动行的值分配给tempa相同

  8. \edef\tempb{#2}将第二个参数的值分配给宏tempb

  9. \ifx:我在手册中找不到这个,但我假设它\ifx\tempa\tempb相当于逻辑条件。很难在这里解释所有细微差别,但为了简单起见,它是一个扩展条件。它扩展输入流中的宏,直到找到两个事物无法进一步扩展并进行比较。

  10. \pgfmathresult{inf}:到目前为止\pgfmathresult具有 x 坐标的值,如果已设置则将其设置为inf丢弃该坐标。unbounded coords=discard

  11. \def\pgfmathresult{inf}我无法找到它的具体作用,但我认为它设置了可以引用丢弃的\def值。\pgfmathresultinf\edef往上看这些是 TeX 原语并在其他地方进行了解释。

那么,discard if not是一种样式的名称,当调用时会应用X基于两个输入参数的坐标过滤器。

答案2

是的,您几乎正确理解了所有的代码。

如果我没记错的话,这个代码最早是在回答当条形图基于符号值时,是否可以更改单个条形的颜色?。它用于过滤符号坐标(而不是数字坐标)。这解释了 的用法\ifx:该宏比较两个 eXpanded 参数(“x”不是指 x 轴,而是指 eXpansion)。如果它们扩展为相同的字符串,则执行某些代码。

\def\pgfmathresult{inf}重新定义宏\pgfmathresult来计算结果inf

相关内容