提供给 TikZ 范围的令牌列表失败

提供给 TikZ 范围的令牌列表失败

我想动态构建一个链表,然后在中使用它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]失败tikzpicturePackage 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\grrxstring(额外的,不会有害)或\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}

相关内容