
経由でいくつかのオプションを持つコマンドを設定していますl3keys
。オプションの 1 つは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はトークンリストのコンテンツ全体を次のように扱うので、拡張に問題があると思います。1つオプション。手動で拡張するにはどうすればいいですか?
答え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}