\IfEqCase 在 tikzpicture 中不起作用

\IfEqCase 在 tikzpicture 中不起作用

我正在处理以下 LaTeX 代码:

\documentclass[a4paper,13pt]{scrartcl}
\usepackage{tikz}
\usepackage{xstring}

\newcommand{\swcase}[1]{
    \IfEqCase{#1}{{a}{1}{b}{2}}
}

\begin{document}
    \begin{tikzpicture}[
    single/.style={draw,circle}
    ]
    \draw node[single,fill=white] at (6,\swcase{a}) {\swcase{a}};
    %\draw node[single,fill=white] at (6,1) {\swcase{a}};
    \end{tikzpicture}
\end{document}

该代码无法编译pdflatex,并且我收到以下错误消息:

! Argument of \XC@definec@lor has an extra }.
<inserted text> 
                \par 
l.14 ... node[single,fill=white] at (6,\swcase{a})
                                                   {\swcase{a}};

当输入参数时,宏\swcase应该会返回。您可以通过注释失败的行并取消注释下面的行来确认这一点,其中坐标内的宏被替换为预期结果。该示例按预期工作并绘制一个带有文本(由宏产生)的圆圈。如果我将宏嵌入坐标向量中,为什么它不起作用?1a1\swcase\swcase

\IfEqCase顺便说一句,如果我将语句直接放入坐标括号中而不是使用包装宏,则没有任何区别。

答案1

在坐标参数中,你需要一些可以扩展为数字的东西,但\IfEqCase可以扩展为一系列指令来打印一。

使用可扩展的字符串切换宏,例如\str_case:nn由 提供的expl3(这里由 加载xparse)。

\documentclass[a4paper,13pt]{scrartcl}
\usepackage{tikz}
\usepackage{xparse}

\ExplSyntaxOn
\DeclareExpandableDocumentCommand{\swcase}{m}
 {
  \str_case:nn { #1 }
   {
    {a}{1}
    {b}{2}
   }
 }
\ExplSyntaxOff

\begin{document}
    \begin{tikzpicture}[
    single/.style={draw,circle}
    ]
    \draw node[single,fill=white] at (6,\swcase{a}) {\swcase{a}};
    \draw node[single,fill=white] at (6,\swcase{b}) {\swcase{b}};
    \end{tikzpicture}
\end{document}

\IfEqCase如您所见,其语法与并没有什么不同。

在此处输入图片描述

如果您在循环中需要它\foreach,请使用“扩展”版本:

\documentclass[a4paper,13pt]{scrartcl}
\usepackage{tikz}
\usepackage{xparse}

\ExplSyntaxOn
\DeclareExpandableDocumentCommand{\swcase}{m}
 {
  \str_case_e:nn { #1 }
   {
    {a}{1}
    {b}{2}
   }
 }
\ExplSyntaxOff

\begin{document}

\begin{tikzpicture}[single/.style={draw,circle}]
\foreach \i in {a,b} {
  \draw node[single,fill=white] at (6,\swcase{\i}) {\swcase{\i}};
  \draw node[single,fill=white] at (6,\swcase{\i}) {\swcase{\i}};
}
\end{tikzpicture}

\end{document}

相关内容