Как использовать переменную tl в параметрах TikZ

Как использовать переменную tl в параметрах TikZ

Я настраиваю команду с некоторыми опциями через l3keys. Одна из опций — это tikz-options, и она должна брать список опций TikZ и передавать их в {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}

В приведенном выше примере возникает эта ошибка

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

Я думаю, что есть проблема с расширением, так как TikZ рассматривает все содержимое списка токенов какодинoption. Как мне вручную его расширить?

решение1

Вы не передаете набор опций, а что-то, что содержит набор опций. Сообщение об ошибке немного вводит в заблуждение, поскольку расширение происходит при выдаче ошибки, поэтому кажется, что вы передали правильные опции.

Ни один пакет на основе ключ-значение не выполняет расширение при поглощении пар ключ-значение, поскольку это может быть катастрофическим. Поэтому решение заключается в расширении списка токенов перед передачей его в необязательном аргументе в \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}

введите описание изображения здесь

Связанный контент