在 tikzset 中使用条件

在 tikzset 中使用条件

编辑由于粗心大意,我错误地表达了我所得到的错误。我已经修正了示例代码和我的评论。

我希望能够设置 1 TiZ 节点.style由条件改变。优点是只有一个.style而不是多个。简单条件有效,但任何要求\ifsometest something=something else \fi都会失败。

平均能量损失

\documentclass{article}

\usepackage{xcolor}
\usepackage{tikz}
\usepackage{lipsum}

\newif\ifdash
\newif\ifdouble

\def\doublecolor{yellow}
\def\mydots{dash dot dot}

\tikzset{%
    boxes/.style={%
        thick,
        draw,
        % This works:
        \ifdash \mydots\fi,
        % This works:
        % double=\doublecolor,
        % But this causes error: Use of \pgfkeys@sp@b doesn't match its definition.
        \ifdouble double=\doublecolor \fi,
        % As does this: 
        % \ifdouble double/.expand once=\doublecolor\fi,
    }%
}

\begin{document}

    \tikz\node[boxes] {\begin{minipage}{4in}\lipsum[1]\end{minipage}};

    \dashtrue

    \tikz\node[boxes] {\begin{minipage}{4in}\lipsum[1]\end{minipage}};

\end{document}

此操作失败并显示以下错误消息:

./if-in-node-options.tex:30: Use of \pgfkeys@sp@b doesn't match its definition.

\pgfkeys@spdef ...e \pgfkeys@sp@a #2\pgfkeys@stop 
                                              \pgfkeys@stop        \pgfkeys@st...
l.30    \tikz\node[boxes]
                    {\begin{minipage}{4in}\lipsum[1]\end{minipage}};

问题是这样的:有没有办法做类似的事情:

\ifdouble double=\doublecolor\fi

还是不?再说一遍,尽管根据要求可以有多种风格——我已经这样做了——但如果可能的话,我正在寻找更简单的东西。

答案1

我建议如下:

\tikzset{%
    boxes/.code={
        \pgfkeysalso{
           thick,
           draw
        }
        \ifdouble
          \pgfkeysalso{double=\doublecolor}
        \fi
    }%
}

some key/.style={some other keys,...}是 的简写some key/.code={\pgfkeysalso{some other keys,...}}。如果您的样式代码中需要任何逻辑,一种解决方案是回退到使用/.code处理程序并\pgfkeysalso围绕实际键。

\documentclass{article}

\usepackage{xcolor}
\usepackage{tikz}
\usepackage{lipsum}

\newif\ifdash
\newif\ifdouble

\def\doublecolor{yellow}
\def\mydots{dash dot dot}

\tikzset{%
    boxes/.code={
        \pgfkeysalso{
           thick,
           draw
        }
        \ifdouble
          \pgfkeysalso{double=\doublecolor}
        \fi
    }%
}

\begin{document}

    \tikz\node[boxes] {\begin{minipage}{4in}\lipsum[1]\end{minipage}};

    \dashtrue

    \tikz\node[boxes] {\begin{minipage}{4in}\lipsum[1]\end{minipage}};

\end{document}

答案2

该问题的方法存在两个问题:

  • 语法字符=,不应该位于\if构造内。

  • 中的选项设置\tikzset将立即执行。\if稍后设置的开关无效。

下面的示例使用样式向 style 添加附加属性boxes

\documentclass{article}

\usepackage{xcolor}
\usepackage{tikz}
\usepackage{lipsum}

\def\doublecolor{yellow}
\def\mydots{dash dot dot}

\tikzset{%
  boxes/.style={%
    thick,
    draw,
  },
  set dash/.style={%
    boxes/.append style={\mydots},%
  },%
  set double/.style={%
    boxes/.append style={double=\doublecolor},%
  },%
}

\begin{document}

    \tikz\node[boxes] {\begin{minipage}{4in}\lipsum[2]\end{minipage}};

    \medskip
    \tikz[set dash, set double]
      \node[boxes] {\begin{minipage}{4in}\lipsum[2]\end{minipage}};

\end{document}

结果

相关内容