我试图理解以下代码:
\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
}
}
}
这是我读完手册后的理解:
\pgfplotsset
用于设置文档样式。discard if not/.style 2 args
discard if not
定义一个在命名空间中命名的样式/pgfplots
并接受两个参数:#1
和#2
。x filter/.code
用于更改 PGFPLOTS 关于坐标过滤的行为。这里,我们说的是使用x filter
基于单个坐标的坐标过滤。.code
类似于 TeX 命令:\newcommand
。x filter
获取输入坐标作为#1
并应用过滤,最后将结果写入宏\pgfmathresult
。如果我们设置\pgfmathresult
为,则可以inf
通过\pgfmathresults{inf}
这种方式丢弃坐标(如果unbounded coords=discard
设置了)。\thisrow{#1}
返回列中的活动行#1
。换句话说,\thisrow{#1}
= table(active row,column=#1
)。\tempa{\thisrow{#1}}
定义一个名为的宏tempa
,其值是指定列中当前活动表行的值,\tempa
= table(active row,column=#1
)。\edef
指扩展定义。它扩展宏来评估其值。\edef\tempa{\thisrow{#1}}
评估宏并将指定列中活动行的值分配给tempa
。\edef\tempb{#2}
将第二个参数的值分配给宏tempb
。\ifx
:我在手册中找不到这个,但我假设它\ifx\tempa\tempb
相当于逻辑条件:\tempa == \tempb
。也许我们有\ify
?\pgfmathresult{inf}
:到目前为止\pgfmathresult
具有 x 坐标的值,如果已设置则将其设置为inf
丢弃该坐标。unbounded coords=discard
\def\pgfmathresult{inf}
我无法找到它的具体作用,但我认为它设置了可以引用丢弃的\def
值。\pgfmathresult
inf
因此,discard if not
是一种样式的名称,当调用时,它会根据两个输入参数应用坐标丢弃。
如果我理解不正确或者有人能纠正我或者给我更好的解释,我将不胜感激。
答案1
这确实是正确的,但需要澄清一些细微差别;
\pgfplotsset
用于设置key=value
特定于pgfplots
键系列的对。可以在 TikZ 手册的 pgfkeys 部分中看到。使用它的主要目的是避免每次都输入/pgfplots/
要设置的每个键的前缀。TikZ 有\tikzset
,pgfplotstable 有\pgfplotstableset
等等。因此它会自动将命名空间设置为pgfplots
discard if not/.style 2 args
discard if not
定义一个在命名空间中命名的样式/pgfplots/
并接受两个参数:#1
和#2
。是的,这些输入仍然可用,#1
并且在此样式中#2
x filter/.code
用于改变 PGFPLOTS 关于坐标过滤的行为。这里我们说的是用于x filter
基于单个坐标的坐标过滤。.code
是一个处理程序,它执行一段代码而不是设置值或其他样式的样式。类似于 TeX 命令:。\newcommand
x filter
保存代码以评估当前值,我们可以改变的值\pgfmathresult
。我们使用先前定义的#1
和#2
来评估值。如果我们通过这种方式设置\pgfmathresult
为,则可以丢弃坐标(设置)。inf
\pgfmathresults{inf}
unbounded coords=discard
\thisrow{#1}
返回列中的活动行#1
。换句话说,\thisrow{#1}
= table(active row,column=#1
)。是的\edef\tempa{\thisrow{#1}}
定义一个名为的宏tempa
,其具有扩展指定列中当前活动表行的值,\tempa
= table(active row,column=#1
)。\edef
指扩展定义。它扩展宏以评估其值。不同之处在于,的值\thisrow{#1}
在定义后立即使用。如果\def
使用,它将等待未扩展,直到使用时才使用最后一个值。\edef\tempa{\thisrow{#1}}
评估宏并将指定列中活动行的值分配给tempa
。相同\edef\tempb{#2}
将第二个参数的值分配给宏tempb
。\ifx
:我在手册中找不到这个,但我假设它\ifx\tempa\tempb
相当于逻辑条件。很难在这里解释所有细微差别,但为了简单起见,它是一个扩展条件。它扩展输入流中的宏,直到找到两个事物无法进一步扩展并进行比较。\pgfmathresult{inf}
:到目前为止\pgfmathresult
具有 x 坐标的值,如果已设置则将其设置为inf
丢弃该坐标。unbounded coords=discard
\def\pgfmathresult{inf}
我无法找到它的具体作用,但我认为它设置了可以引用丢弃的\def
值。\pgfmathresult
inf
\edef
往上看这些是 TeX 原语并在其他地方进行了解释。
那么,discard if not
是一种样式的名称,当调用时会应用X基于两个输入参数的坐标过滤器。
答案2
是的,您几乎正确理解了所有的代码。
如果我没记错的话,这个代码最早是在回答当条形图基于符号值时,是否可以更改单个条形的颜色?。它用于过滤符号坐标(而不是数字坐标)。这解释了 的用法\ifx
:该宏比较两个 eXpanded 参数(“x”不是指 x 轴,而是指 eXpansion)。如果它们扩展为相同的字符串,则执行某些代码。
\def\pgfmathresult{inf}
重新定义宏\pgfmathresult
来计算结果inf
。