以下工作符合预期:
\documentclass{minimal}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\makeatletter
\node (01) at (0, 0) {};
\draw (0, 0) -- (0, 01);
\makeatother
\end{tikzpicture}
\end{document}
但是,当我用 替换其中一个01
s时\@ifnextchar1001
(根据我的理解应该是等效的),它就会中断:
\documentclass{minimal}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\makeatletter
\node (\@ifnextchar1001) at (0, 0) {};
\makeatother
\end{tikzpicture}
\end{document}
给出
! Argument of \XC@definec@lor has an extra }. <inserted text> \par l.6 \node (\@ifnextchar1001) at (0, 0) {};
和
\documentclass{minimal}
\usepackage{tikz}
\begin{document}
\begin{tikzpicture}
\makeatletter
\draw (0, 0) -- (0, \@ifnextchar1001);
\makeatother
\end{tikzpicture}
\end{document}
产量
! Argument of \XC@definec@lor has an extra }. <inserted text> \par l.6 \draw (0, 0) -- (0, \@ifnextchar1001) ;
01
在这种情况下,和之间的相关区别是什么\@ifnextchar1001
?我怎样才能使这个或类似的构造按预期工作?
答案1
\@ifnextchar
不可扩展,因为其内部使用了\futurelet
。节点名称必须是可扩展的,它在内部使用\csname
... \endcsname
。
如果您只想比较简单的数字,那么使用常规宏参数解析的测试就足够了:
\documentclass{minimal}
\usepackage{tikz}
% \IfNextChar
% #1: the char for testing
% #2: code for true
% #3: code for false
% #4: next char
\makeatletter
\newcommand{\IfNextChar}[4]{%
\ifx#1#4\@empty\@empty
\expandafter\@firstoftwo
\else
\expandafter\@secondoftwo
\fi
{#2}{#3}%
}
\makeatother
\begin{document}
\begin{tikzpicture}
\node (\IfNextChar1001) at (0, 0) {};
\end{tikzpicture}
\end{document}
作为坐标的使用也同样适用\@ifnextchar
。
答案2
您可以使用 PGF 数学将数字从十进制转换为十进制。也许有点过头了,也许不是。
\documentclass{article}
\usepackage{tikz}
\begin{document}
\pgfmathbasetodec{\myconvresult}{001}{10}
\pgfmathsetmacro\myresult{\myconvresult+1}\myresult
\pgfmathbasetodec{\myconvresult}{0214}{10}
\pgfmathsetmacro\myresult{\myconvresult+1}\myresult
\pgfmathbasetodec{\myconvresult}{000035}{10}
\pgfmathsetmacro\myresult{\myconvresult+1}\myresult
\pgfmathbasetodec{\myconvresult}{301}{10}
\pgfmathsetmacro\myresult{\myconvresult+1}\myresult
\end{document}
如果某处没有这样的设置我会感到很惊讶……