我想用 tikz 绘制一些线性系统。问题是系统的方向。有些系统有
- 左边是输入,右边是输出
- 右侧输入 - 左侧输出
- 输入在上方 - 输出在下方
- 输入在下方 - 输出在上方
因此,为了使用单个 \command 处理所有变化,我想使用参数
- ud (上 下)
- du (下 上)
- lr (左 右)
- rl(右左)
所以我需要在 Latex 中有一个开关来定义 Orientationparameter。
伪代码:
\drawSYS{Text}{lr}
Command: drawSYS
\switch #2
\case 'lr'
\def\ORIENTA left
\def\ORIENTB right
\case 'rl'
\def\ORIENTA right
\def\ORIENTB left
....
\endswitch
\node[anchor=\ORIENTA,\ORIENTB=1cm] () {foobar};
在 Tex 中这可能吗?
感谢您的帮助。
答案1
这是一个通用的“案例”类型命令,在社区之外也很有用tikz
;-)。它返回\ifcase <pos>
列表中的
\documentclass{article}
\makeatletter
\newcommand*\@testlist{}
\newcommand*\@invalue{}
\newcommand*\@choiceval{}
\newcounter{itemcount}
\newcommand*\ifchoice[2]{%
\edef\@testlist{\zap@space#1 \@empty}%
\edef\@invalue{\zap@space#2 \@empty}%
\def\@choiceval{99}%
\setcounter{itemcount}{-1}%
\@for\@testitem:=\@testlist\do{%
\stepcounter{itemcount}%
\ifx\@invalue\@testitem\relax
\edef\@choiceval{\the\c@itemcount}%
\fi}%
\ifcase\@choiceval}
\newcommand*\drawSYS[2]{%
\ifchoice{ud, du, lr, rl}{#2}%
%-------------------- 0 = ud
\def\ORIENTA{Up}%
\def\ORIENTB{Down}%
\or%-------------------- 1 = du
\def\ORIENTA{Down}%
\def\ORIENTB{Up}%
\or%-------------------- 2 = lr
\def\ORIENTA{Left}%
\def\ORIENTB{Right}%
\or%-------------------- 3 = rl
\def\ORIENTA{Right}%
\def\ORIENTB{Left}%
\else%------------------ 99 = default
\def\ORIENTA{Left}%
\def\ORIENTB{Right}%
\fi
(#1)(#2)[\ORIENTA][\ORIENTB]}%--- Test output
\makeatother
\begin{document}
\drawSYS{xxx}{ rl }
\end{document}
答案2
您可以使用pgfkeys
.is choice
选项。看起来您实际上并不想根据选择执行代码片段,而只是设置样式,这使得这种方法成为显而易见的选择。请注意,您也可以使用以下方法执行代码片段\pgfkeys{/tikz/orientation/lr/.code=<code>}
:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{positioning}
\begin{document}
\tikzset{orientation/.is choice,
orientation/lr/.style={anchor=left,right=1cm},
orientation/rl/.style={anchor=right,left=1cm}
}
\newcommand{\drawSYS}[2]{
\node [orientation=#1] {#2};
}
\begin{tikzpicture}[every node/.style=draw]
\draw [fill=red] (0,0) circle [radius=3pt];
\drawSYS{lr}{X}
\drawSYS{rl}{Y}
\end{tikzpicture}
\end{document}
答案3
这xparse
包有很多依赖于参数的宏定义功能。但我不知道它是否支持字符串比较。