Wie kann ich eine tl-Variable in TikZ-Optionen verwenden?

Wie kann ich eine tl-Variable in TikZ-Optionen verwenden?

Ich richte einen Befehl mit einigen Optionen über ein l3keys. Eine der Optionen ist tikz-optionsund sollte eine Liste von TikZ-Optionen annehmen und sie an ein übergeben {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}

Das obige Beispiel gibt diesen Fehler aus

! 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.

Ich vermute, dass es ein Problem mit der Erweiterung gibt, da TikZ den gesamten Inhalt der Tokenliste alseinsOption. Wie kann ich sie manuell erweitern?

Antwort1

Sie übergeben keinen Satz von Optionen, sondern etwas, das einen Satz von Optionen enthält. Die Fehlermeldung ist etwas irreführend, da die Erweiterung beim Ausgeben des Fehlers erfolgt und es daher so aussieht, als hätten Sie die richtigen Optionen übergeben.

Kein schlüsselwertbasiertes Paket führt eine Erweiterung durch, wenn Schlüsselwertpaare absorbiert werden, da dies katastrophal sein könnte. Die Lösung besteht also darin, die Tokenliste zu erweitern, bevor sie im optionalen Argument an übergeben wird \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}

Bildbeschreibung hier eingeben

verwandte Informationen