我想动态构建一个链表,然后在中使用它tikzpicture
,如下所示:
\documentclass{article}
\usepackage{tikz}
\usepackage{xstring}
\usetikzlibrary{chains}
\newtoks\stch
\ExplSyntaxOn
\NewDocumentCommand \ForEach { O{1} m O{1} +m }
{ \int_step_inline:nnnn {#1} {#3} {#2} {#4} }
\ExplSyntaxOff
\parindent0pt
\begin{document}
\thispagestyle{empty}
\ForEach{4}{\edef\foo{\global\stch={\the\stch start chain=#1 going below,}}\foo}
\edef\grr{\the\stch}%% <<!!! expand token list into \grr>>
\StrGobbleRight{\grr}{1}[\grr]%% <<!!! remove last comma and put back into \grr>>
Bla bla bla: \grr
\bigskip
\begin{tikzpicture}
[\grr]% This fails
%[start chain=1 going below,start chain=2 going below,start chain=3 going below,start chain=4 going below]% this does not fail, even with spurious last comma
\foreach \x in {1,2,3,4}{%
\node[on chain=\x,xshift=\x*1in] {XX\x XX};
}
\end{tikzpicture}
\end{document}
(示例图形是使用显式选项生成的。)第一个选项[\grr]
失败tikzpicture
:Package pgfkeys Error: I do not know the key '/tikz/start chain=1 going below,start chain=2 going below,start chain=3 going below,start chain=4 going below' and I am going to ignore it. Perhaps you misspelled it.
一个谜题,因为链表的文本似乎是按预期构建的。
答案1
一个快速的解决方法是使用
\begin{tikzpicture}[style/.expand once=\grr]
或者
\begin{tikzpicture}[style/.expanded=\grr]
在这种情况下是安全的,因为 PGFKeys 仅“看到”\grr
而不是“看到” ,
,所以它尝试将整个事物作为一个密钥,这解释了您的错误消息。
但是您不需要\foo
或\grr
或xstring
(额外的,
不会有害)或\global
因为 L3 循环没有限定其内容的范围。
\documentclass[varwidth]{standalone}
\usepackage{tikz}
\usetikzlibrary{chains}
\newtoks\stch
\ExplSyntaxOn
\NewDocumentCommand \ForEach { O{1} m O{1} +m }
{ \int_step_inline:nnnn {#1} {#3} {#2} {#4} }
\ExplSyntaxOff
\begin{document}
\ForEach{4}{\stch\expandafter{\the\stch start chain=#1 going below,}}
Bla bla bla: \the\stch
\bigskip
\begin{tikzpicture}[style/.expand once=\the\stch]
\foreach \x in {1, 2, 3, 4}
\node[on chain=\x, xshift=\x*1in] {XX\x XX};
\end{tikzpicture}
\end{document}
但您实际上并不需要 toks,您只需使用.list
处理程序(基本上是无范围的\foreach
)即可使用 PGFFor:
\documentclass[varwidth]{standalone}
\usepackage{tikz}
\usetikzlibrary{chains}
\begin{document}
\begin{tikzpicture}[
stch/.style={start chain = #1 going below},
stch/.list={1, ..., 4},
]
\foreach \x in {1, 2, 3, 4}
\node[on chain=\x, xshift=\x*1in] {XX\x XX};
\end{tikzpicture}
\end{document}
也许你想用一条向右的链四分支如下:
\documentclass[tikz]{standalone}
\usetikzlibrary{chains}
\begin{document}
\tikz[
start chain=main going right,
node distance=1em and 1cm,
]
\foreach \x/\y in {1/3, 2/5, 3/7, 4/2}
\node[on chain] {branch \x}
[start branch={\x} going below]
node foreach \i in {1, ..., \y}
[on chain] {\x: \i\ of \y};
\end{document}
答案2
我不确定你想达到什么目的,但你为什么不直接使用 Ti钾直接使用 Z 样式:
\documentclass{article}
\usepackage{tikz}
\usetikzlibrary{chains}
\ExplSyntaxOn
\NewDocumentCommand \ForEach { O{1} m O{1} +m }
{ \int_step_inline:nnnn {#1} {#3} {#2} {#4} }
\ExplSyntaxOff
\begin{document}
\ForEach{4}{
\tikzset{temp/.append style={start chain=#1 going below}}
}
\begin{tikzpicture}[temp]
\foreach \x in {1,2,3,4} {%
\node[on chain=\x, xshift=\x*1in] {XX\x XX};
}
\end{tikzpicture}
\end{document}