
Estoy configurando un comando con algunas opciones a través de l3keys
. Una de las opciones es tikz-options
y debería tomar una lista de opciones de TikZ y pasarlas a un archivo {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}
El ejemplo anterior da este error.
! 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.
Supongo que hay un problema con la expansión, ya que TikZ considera todo el contenido de la lista de tokens comounoopción. ¿Cómo puedo expandirlo manualmente?
Respuesta1
No estás pasando un conjunto de opciones sino algo que contiene un conjunto de opciones. El mensaje de error es un poco engañoso, porque la expansión se produce al emitir el error, por lo que parece que has pasado las opciones correctas.
Ningún paquete basado en clave-valor realiza expansión al absorber pares clave-valor, porque podría ser desastroso. Entonces, la solución es expandir la lista de tokens antes de pasarla en el argumento opcional a \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}