带有条件 tikzset 的 Tikzpicture

带有条件 tikzset 的 Tikzpicture

我想要一个 tikz 图片,它根据变量 \PA 改变其行为。我有两个文件。一个文件仅包含 tikz 图片 (Tikz.tex),另一个主文件通过 \input 加载图片,如下所示。为了更改描述,我在加载 Tikz-Picture 之前定义了一个名为 \PA 的变量。在 Tikz-Picture 中,我使用 ifthenelse 语句根据变量定义样式,该语句是我在另一个定义中放入的。

我喜欢让节点颜色取决于变量 \PA,如下表所示:

\PA 力学节点 传感器节点
全部 黑色的 黑色的
机械 黑色的 灰色的
传感器 灰色的 黑色的

我收到很多错误,所有框都是黑色的!但 iftheelse-block 似乎工作正常,如通过 \PAIF-Command 的测试打印所示。

主文件:

\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}
\usepackage{ifthen}

\newcommand{\PAIF}[1]{%
    \ifthenelse{\equal{\PA}{#1}\or\equal{\PA}{All}}{black}{gray}%
}


\begin{document}
    \newcommand{\PA}{All}
    \noindent\\PA='\PA': Mechanic: \PAIF{Mechanic}; Sensor: \PAIF{Sensor}\\
    \input{Tikz}
    \renewcommand{\PA}{Mechanic}
    \\PA='\PA': Mechanic: \PAIF{Mechanic}; Sensor: \PAIF{Sensor}\\
    \input{Tikz}
    \renewcommand{\PA}{Sensor}
    \\PA='\PA': Mechanic: \PAIF{Mechanic}; Sensor: \PAIF{Sensor}\\
    \input{Tikz}
\end{document}

Tikz 图片:(Tikz.tex)

\begin{figure}[h]
    \begin{tikzpicture}
        \tikzset{
            mechanic/.style={\PAIF{Mechanic}},
            sensor/.style={\PAIF{Sensor}},
        }

        \node [draw, rectangle, mechanic] (mech) {Mechanics};
        \node [draw, rectangle, right=of mech, sensor] {Sensors};
    
    \end{tikzpicture}
\end{figure}

目前结果:

当前错误的结果

错误(仅限 Tikz.tex 中的第一个节点行):

  1. 未定义控制序列
  2. 额外 \或
  3. @tempc 的参数有一个额外的 }
  4. 段落在 @tempc 完成之前结束
  5. 段落在 \pgfkeys@addpath 完成之前结束
  6. 缺少 \endcsname 插入
  7. ...

期望结果:

期望结果

答案1

非常感谢@HenriMenke!

我从 \newcommand 切换到 \newcount,这样我就可以使用 \ifnum 而不是 \ifthenelse 和 \equal。我不确定这是否是一个“好的”解决方案,但它确实有效!

更佳解决方案,可轻松组合多个参数

我对我的第一个解决方案做了一些改进。这样,如果两个类别中有一个匹配,我就可以将节点设为黑色。因此,我在第一个解决方案中添加了类似 OR-Case 的东西。原则上,这可以轻松扩展到两个以上的类别。只是 if 语句变得越来越庞大。

主文件

\documentclass[]{article}

\usepackage{tikz}
\usetikzlibrary{positioning}
\usepackage{ifthen}

\newcount\all           \all=0
\newcount\mechanics     \mechanics=1
\newcount\sensors       \sensors=2
\newcount\sthelse       \sthelse=3
\newcount\PA            \PA=\all

\newcommand{\PAIF}[1]{%
    \ifnum\PA=\all%
        black%
    \else%
        \ifnum\PA=#1%
            black%
        \else%
            gray%
        \fi%
    \fi%
}

\newcommand{\PAIFB}[2]{%
    \ifnum\PA=\all%
        black%
    \else%
        \ifnum\PA=#1%
            black%
        \else%
            \ifnum\PA=#2%
                black%
            \else%
                gray%
            \fi%
        \fi%
    \fi%
}


\begin{document}
    \PA = \all
    \\PA=All: Mechanic: \PAIF{\mechanics}; Sensor: \PAIF{\sensors}; Both: \PAIFB{\sensors}{\mechanics}\\
    \input{Tikz}
    
    \PA = \mechanics
    \\PA=Mechanic: Mechanic: \PAIF{\mechanics}; Sensor: \PAIF{\sensors}; Both: \PAIFB{\sensors}{\mechanics}\\
    \input{Tikz}
    
    \PA = \sensors
    \\PA=Sensor: Mechanic: \PAIF{\mechanics}; Sensor: \PAIF{\sensors}; Both: \PAIFB{\sensors}{\mechanics}\\
    \input{Tikz}
    
    \PA = \sthelse
    \\PA=Sthelse: Mechanic: \PAIF{\mechanics}; Sensor: \PAIF{\sensors}; Both: \PAIFB{\sensors}{\mechanics}\\
    \input{Tikz}
\end{document}

Tikz 文件

\begin{figure}[h]
    \begin{tikzpicture}
        \tikzset{
            arga/.style n args={1}{\PAIF{#1}},
            argb/.style n args={2}{\PAIFB{#1}{#2}}
        }

        \node [draw, rectangle, arga={\mechanics}] (A) {Mechanics};
        \node [draw, rectangle, right=of A, arga={\sensors}] (B) {Sensors};
        \node [draw, rectangle, right=of B, argb={\mechanics}{\sensors}] (C) {Mechanics or Sensors};
        
    \end{tikzpicture}
\end{figure}

第一个可行的解决方案

主文件

\documentclass[]{article}

\usepackage{tikz}
\usetikzlibrary{positioning}
\usepackage{ifthen}

\newcount\all \all=0
\newcount\mechanics \mechanics=1
\newcount\sensors \sensors=2
\newcount\PA \PA=\all

\newcommand{\PAIF}[1]{%
    \ifnum\PA=\all%
        black%
    \else%
        \ifnum\PA=#1%
            black%
        \else%
            gray%
        \fi%
    \fi%
}


\begin{document}
    \PA = \all
    \\\noindent All: Mechanic: \PAIF{\mechanics}; Sensor: \PAIF{\sensors}\\
    \input{Tikz}
    \PA = \mechanics
    \\Mechanic: Mechanic: \PAIF{\mechanics}; Sensor: \PAIF{\sensors}\\
\input{Tikz}
    \PA = \sensors
    \\Sensor: Mechanic: \PAIF{\mechanics}; Sensor: \PAIF{\sensors}\\
    \input{Tikz}
\end{document}

Tikz 文件

\begin{figure}[h]
    \begin{tikzpicture}
        \tikzset{
            mechanic/.style={\PAIF{\mechanics}},
            sensor/.style={\PAIF{\sensors}},
        }

        \node [draw, rectangle, mechanic] (mech) {Mechanics};
        \node [draw, rectangle, right=of mech, sensor] {Sensors};
        
    \end{tikzpicture}
\end{figure}

相关内容