根据参数定义宏

根据参数定义宏

我想用 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}

tikz .是选择

答案3

xparse包有很多依赖于参数的宏定义功能。但我不知道它是否支持字符串比较。

相关内容