以下 TikZ 代码尝试通过绘制顶点 1 到 6,然后从列表中绘制边来创建图形。边的格式为12
、等,因此使用包中的23
命令来提取第一个和第二个字符。StrChar
xstring
\documentclass{minimal}
\usepackage{tikz}
\usepackage{xstring}
\begin{document}
\begin{tikzpicture}
\foreach \index in {1, ..., 6}{%
\node[draw,thick,circle,fill=blue!20,inner sep=1pt,minimum size=7pt] (\index) at (\index*360/6:1) {} ;
}
\foreach \edgetodraw in {12,13,14,15,16,34}{%
\draw[thick] (\StrChar{\edgetodraw}{1}) -- (\StrChar{\edgetodraw}{2}) ;
}
\end{tikzpicture}
\end{document}
使用 pdflatex 编译时会出现无用的错误
! Undefined control sequence.
\@xs@StrChar@@ ...\@xs@arg@ii {#2}\edef \@xs@call
{\noexpand \@testopt {\noe...
l.13 }
更小的 MWE 如下:
\documentclass{minimal}
\usepackage{tikz}
\usepackage{xstring}
\begin{document}
\begin{tikzpicture}
\draw[thick] (\StrChar{34}{1}) -- (\StrChar{34}{2}) ;
\end{tikzpicture}
\end{document}
给出同样的错误。我怎样才能到StrChar
里面上班tikzpicture
?
更多细节:
StrChar
在 tikzpicture 之外也能正常工作,即使在\foreach
循环内使用也是如此。我正在编写一个宏,以便能够非常快速而系统地绘制许多图形。我非常希望它能够与我用于边缘的格式(
{12, 13, 14, 15, 16, 23}
)一起使用。因此,为了使我的问题尽可能简单和具体,我询问的是如何使用StrChar
内部tikz.
但如果在 vanilla LaTeX 中使用这种大量编程的宏被认为是一个坏主意,那么我也对替代方法感兴趣。
答案1
最小类不适用于最终用户 --> 参见为什么要避免使用最小类?
关于您的用例,问题在于xstring
提供的条件和测试不可扩展,换句话说,条件和测试不会用结果替换流,而是希望将结果保存在流中。对于\pgfmathparse
宏,这也是在解析数学表达式后需要使用结果的情况\pgfmathresult
。在这里,您需要让 TikZ 知道它必须停止路径解析并执行一些 TeX 操作(xstring
部分)并继续解析。
\documentclass[tikz]{standalone}
\usepackage{xstring}
\begin{document}
\begin{tikzpicture}
\foreach \index in {1, ..., 6}{%
\node[draw,thick,circle,fill=blue!20,inner sep=1pt,minimum size=7pt] (\index) at (\index*360/6:1) {} ;
}
\foreach \x in {12,13,14,15,16,34}{%
\draw[thick] \pgfextra{\StrChar{\x}{1}[\tempa]\StrChar{\x}{2}[\tempb]} (\tempa) -- (\tempb) ;
}
\end{tikzpicture}
\end{document}
你也可以在循环内的路径之前进行宏赋值,然后在路径之后使用定义好的数量进行赋值。不过这只是个人喜好问题。