Como posso usar uma variável tl nas opções do TikZ

Como posso usar uma variável tl nas opções do TikZ

Estou configurando um comando com algumas opções via l3keys. Uma das opções é tikz-optionspegar uma lista de opções do TikZ e passá-las para um arquivo {tikzpicture}.

\documentclass{article}

\usepackage{tikz,xparse}

\ExplSyntaxOn

\keys_define:nn { mymodule } {
   tikz-options .tl_set:N = \l_mymodule_tikz_options_tl,
   tikz-options .initial:n = {},
}

\tikzset{
   every~my~image/.style = {
      fill = blue,
   }
}

\NewDocumentCommand{ \myimage }{ o }{
   \IfValueT { #1 } {
      \keys_set:nn { mymodule } { #1 }
   }
   \begin{tikzpicture}[every~my~image, \l_mymodule_tikz_options_tl]
      \filldraw (0,0) rectangle (2,2);
   \end{tikzpicture}
}

\ExplSyntaxOff

\begin{document}
\myimage

\myimage[tikz-options={fill=red,draw=black}]
\end{document}

O exemplo acima dá esse erro

! Package pgfkeys Error: I do not know the key '/tikz/fill=red,draw=black' and 
I am going to ignore it. Perhaps you misspelled it.

Acho que há um problema com a expansão, já que o TikZ considera todo o conteúdo da lista de tokens comoumopção. Como posso expandi-lo manualmente?

Responder1

Você não está passando um conjunto de opções, mas algo que contém um conjunto de opções. A mensagem de erro é um pouco enganosa, pois a expansão ocorre ao emitir o erro, então parece que você passou nas opções corretas.

Nenhum pacote baseado em valores-chave realiza expansão ao absorver pares de valores-chave, porque isso pode ser desastroso. Portanto, a solução é expandir a lista de tokens antes de passá-la no argumento opcional para \begin{tikzpicture}:

\documentclass{article}

\usepackage{tikz,xparse}

\tikzset{
   every my image/.style = {
      fill = blue,
   }
}

\ExplSyntaxOn

\keys_define:nn { mymodule }
 {
   tikz-options .tl_set:N = \l_mymodule_tikz_options_tl,
   tikz-options .initial:n = {},
 }

\NewDocumentCommand{ \myimage }{ O{} }
 {
   \group_begin:
   \keys_set:nn { mymodule } { #1 }
   \__tobi_start_tikzpicture:V \l_mymodule_tikz_options_tl
      \filldraw (0,0) rectangle (2,2);
   \end{tikzpicture}
   \group_end:
 }
\cs_new_protected:Nn \__tobi_start_tikzpicture:n
 {
   \begin{tikzpicture}[every~my~image,#1]
 }
\cs_generate_variant:Nn \__tobi_start_tikzpicture:n { V }

\ExplSyntaxOff

\begin{document}

\myimage

\myimage[tikz-options={fill=red,draw=black}]

\end{document}

insira a descrição da imagem aqui

informação relacionada