我想要一个 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 中的第一个节点行):
- 未定义控制序列
- 额外 \或
- @tempc 的参数有一个额外的 }
- 段落在 @tempc 完成之前结束
- 段落在 \pgfkeys@addpath 完成之前结束
- 缺少 \endcsname 插入
- ...
期望结果:
答案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}