我正在处理以下 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
应该会返回。您可以通过注释失败的行并取消注释下面的行来确认这一点,其中坐标内的宏被替换为预期结果。该示例按预期工作并绘制一个带有文本(由宏产生)的圆圈。如果我将宏嵌入坐标向量中,为什么它不起作用?1
a
1
\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}