\StrBetween
我正在使用一个使用来自的宏xstring
看起来效果很好。
但是,当我尝试使用它作为 tikz 图片中的坐标返回的值时,我收到一个令人困惑的错误。
考虑这个片段:
\documentclass[letterpaper,12pt]{article}
\usepackage{xstring}
\usepackage{tikz}
% http://tex.stackexchange.com/a/21566/3068
\newcommand*\GetListMember[2]{\StrBetween[#2,\number\numexpr#2+1]{,#1,},,\par}%
\begin{document}
\pagestyle{empty}
\begin{tikzpicture}
\def\A{\GetListMember{1,2,3}{1}}
% This makes me think the value of \A is 1
\node [draw] at (1,0) {\A};
% Uncommenting the following gives an error that is very confusing to me
% \node [draw] at (\A,1) {\A};
\end{tikzpicture}
\end{document}
它可以工作,但如果我取消注释最后一行注释,就会出现此错误:
! Undefined control sequence.
<argument> \@@cls
l.18 \node [draw] at (\A,1)
{\A};
我想我需要将的值转换\A
为数字或者其他东西,但我不知道如何操作。
ps 这种情况经常发生,错误消息中包含输入文件中没有的文本。(在这种情况下\@@cls
)有没有办法让我看到中间形式?我觉得我在调试没有的 Lisp 代码macroexpand-1
。
一如既往地感谢你。(:
答案1
您尚未将其定义\A
为 ,而是1
已将其定义为(当 展开时\GetListMember{1,2,3}{1}
会得到)。TikZ在坐标中遇到它时不知道该怎么做。在这种情况下,您可以使用。要查看差异,请考虑以下内容(为清楚起见,我使用了和):1
\A
\GetListMember
\pgfmathtruncatemacro
\A
\B
\documentclass{article}
\usepackage{xstring}
\usepackage{tikz}
\begin{document}
\def\A{\GetListMember{1,2,3}{1}}
\show\A
\pgfmathtruncatemacro\B{{1,2,3}[0]}
\show\B
\end{document}
当您查看日志文件时,您应该看到:
> \A=macro:
->\GetListMember {1,2,3}{1}.
l.7 \show\A
> \B=macro:
->1.
l.9 \show\B
答案2
你的问题在于扩展。
\def\A{\GetListMember{1,2,3}{1}}
定义\A
为\GetListMember{1,2,3}{1}
,这显然不是一个数字。TeX 尝试将其作为 内部的一部分进行扩展\node
,但\StrBetween
不可“扩展”。您可以看到,如果您尝试使用 强制扩展\edef
:
\edef\A{\GetListMember{1,2,3}{1}}
这也会产生同样的错误。
您需要的是可扩展的逗号列表项选择器。该xstring
包不提供此类选择器,但expl3
提供:
\documentclass[letterpaper,12pt]{article}
\usepackage{expl3}
\usepackage{tikz}
\begin{document}
\pagestyle{empty}
\begin{tikzpicture}
\ExplSyntaxOn
\edef\A{\clist_item:nn{1,2,3}{1}}
\ExplSyntaxOff
\node [draw] at (1,0) {\A};
\node [draw] at (\A,1) {\A};
\end{tikzpicture}
\end{document}
可能您会想要将其包含\clist_item:nn
在用户级宏中。