关于 tikz 中的字符串和数字的混淆

关于 tikz 中的字符串和数字的混淆

\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在用户级宏中。

相关内容