为 negative/not/except 设置样式参数语法,使代码更简洁

为 negative/not/except 设置样式参数语法,使代码更简洁

我问另一个问题percusse 不仅解释了代码,还进一步为我编写了代码。这真是太棒了。我所需要做的就是切换每个第 n 个点代码所作用的图的部分。我能够以一种迂回的方式做到这一点:

\documentclass{standalone}
    \usepackage{pgfplots}

    \makeatletter

    \pgfplotsset{
        my filter/.style args={every#1between#2and#3}{%
            /pgfplots/x filter/.append code={%
                \ifnum\coordindex<#2%
                    \pgfmathsetmacro\temp{int(mod(\coordindex,#1))}%
                    \ifnum0=\temp\relax
                        %pass
                    \else
                        \let\pgfmathresult\pgfutil@empty
                    \fi%
                \else
                    \ifnum\coordindex>#3%
                        \pgfmathsetmacro\temp{int(mod(\coordindex,#1))}%
                        \ifnum0=\temp\relax
                            %pass
                        \else
                            \let\pgfmathresult\pgfutil@empty
                        \fi%
                    \else
                        %pass
                    \fi%
                \fi%
            }
        }
    }
    \makeatother

\begin{document}

\begin{tikzpicture}
    \begin{axis}[my filter=every 50 between 600 and 1050]
        \addplot[samples=1501] {sin(deg(5*x))};
    \end{axis}
\end{tikzpicture}

\end{document}

这达到了我想要的效果:

平滑中

不幸的是,我破解的代码非常肮脏。不仅代码重复,而且样式参数读起来好像代码执行了相反的操作。有人知道我可以使用什么语法将其更改为every#1between#2and#3相反的语法吗?我尝试了every#1except between#2and#3、、、、、以及every#1!between#2and#3诸如此类every#1not between#2and#3的事情。它们都没有用every#1outside#2and#3,而且就我而言,除了之外,我在 TikZ 手册中找不到否定样式参数关键字。every#1out of#2and#3every#1below#2or above#3without

答案1

样式名称是你自己想出来的。因此,当你尝试反转这些单词时,TikZ 将无法识别它们。实际名称在定义中,因此我将其更改为你在问题中给出的其他名称。

对于反转,由于我们试图进入两个嵌套的 if,并且结果什么都不做,因此 if 之外的默认操作无论如何都应该为真。然后,您可以按如下方式分离测试和操作

\documentclass{standalone}
\usepackage{pgfplots}
\makeatletter
\pgfplotsset{
    my filter/.style args={every#1except#2and#3}{%
        /pgfplots/x filter/.append code={%
            \def\myswitch{1}% Switch is by default on, you can do this with a TeX \if too
            \ifnum\coordindex>#2%Ready to turn off the filter?
            % Yes but are we still in the desired interval?
                \ifnum\coordindex<#3
                \def\myswitch{0}% Turn it off
                \fi%
            \fi%No else
            % Now if the switch is on
            \ifnum1=\myswitch%
                \pgfmathsetmacro\temp{int(mod(\coordindex,#1))}%
                    \ifnum0<\temp
                        \let\pgfmathresult\pgfutil@empty
                    \fi%
            \fi%
        }
    }
}
\makeatother

\begin{document}
\begin{tikzpicture}
\begin{axis}[my filter=every 50 except 600 and 1050]% Note this name matches the definiton
\addplot[samples=1501] {sin(deg(5*x))};
\end{axis}
\end{tikzpicture}
\end{document}

在此处输入图片描述

我最近也在这个回答中回答了多个论点风格的问题

\tikzset 具有多个参数的键

如果你需要更多详细信息。但 TikZ 手册始终是最有用的。

相关内容