
(Esto está inspirado enProblema entre claves, rutas con dos macros y pgfkeys)
El siguiente código
\documentclass[tikz]{standalone}
\begin{document}
\pgfkeys{
%/foo/.search also={/bar,/tikz},
%/foo/.search also={/bar},
/bar/.search also={/tikz}
}
\tikz\draw[/foo/.cd,fill=red]circle(1);
\end{document}
produce error
Error del paquete pgfkeys: No conozco la clave '
/foo/fill
', a la que le pasaste 'red', y la voy a ignorar. Quizás lo escribiste mal.
Esto no es sorprendente, porque no hay nada debajo /foo
.
El siguiente código
\documentclass[tikz]{standalone}
\begin{document}
\pgfkeys{
/foo/.search also={/bar,/tikz},
%/foo/.search also={/bar},
/bar/.search also={/tikz}
}
\tikz\draw[/foo/.cd,fill=red]circle(1);
\end{document}
produce una imagen con éxito
Esto tampoco es sorprendente, porque /foo
intenta buscar fill
debajo /bar
de /tikz
y encuentra que /tikz/fill
está definido.
El siguiente código
\documentclass[tikz]{standalone}
\begin{document}
\pgfkeys{
%/foo/.search also={/bar,/tikz},
/foo/.search also={/bar},
/bar/.search also={/tikz}
}
\tikz\draw[/foo/.cd,fill=red]circle(1);
\end{document}
Sorprendentemente, no produce ningún error sino una imagen ingenua.
Parece que /foo
pide /bar
buscar fill
debajo /tikz
y tienen éxito (por lo tanto, no hay error). Pero por alguna razón el estilo no se aplicó.
¿Por qué está pasando esto? ¿Puedo de alguna manera hacer que suceda uno de estos?
- generar un error; o
- aplicar el estilo con éxito; o mejor
- ¿Aplicar el estilo con éxito y generar una advertencia?
Respuesta1
Si veo esto correctamente, la verificación \ifpgfkeysaddeddefaultpath
que se ejecuta al inicio del .unknown
código configurado por .search also
se activa como falso cuando /foo/.unknown
se intenta
\pgfqkeys{/bar}{fill=red}
lo que hace que /bar/.unknown
no intente nada más.
(Básicamente, esa es la diferencia entre /bar/.cd, fill=red
y /bar/fill=red
donde se supone que este último es correcto y genera un error intencionalmente a pesar de una .search also
alternativa).
No tengo la paciencia para ver por qué sucede esto y dónde sucede y si se trata de un error o si es intencionado, pero parece más fácil configurar un .unknown
controlador personalizado...
Simplemente depende de cómo quieras manejar algunas cosas.
Como /tikz/.unknown
no realiza la \ifpgfkeysaddeddefaultpath
verificación, no diferencia entre /tikz/.cd, <key>=<value>
y /tikz/<key>=<value>
. (Internamente, en lugar de .cd
, a menudo \pgfqkeys{/tikz}{<key>=<value>}
se usa el más rápido, pero es básicamente lo mismo).
Sin embargo, a veces a <key>
es un estilo y luego depende de en qué ruta los ejecutemos. Haciendo
\pgfkeys{/abc/.cd, /tikz/thick}
generará un error sobre una clave desconocida /abc/line width
ya que todavía estamos en la /abc
ruta (bueno, a menos que /abc/line width
esté definido, por supuesto, qué se usará).
Esto me lleva a un .unknown
controlador que está muy cerca delejemplo del manual.
Desafortunadamente, /tikz/.unknown
no se establece \pgfkeyssuccesstrue
cuando encuentra un color, una especificación de flecha o el nombre de una forma, lo que dificulta determinar si /tikz/<key>
realmente tuvo éxito, lo que significa que el responsable del mantenimiento /foo
no puede generar un mensaje de error adecuado sin redefinir /tikz/.unknown
o hacer lo mismo. perorata en sí.
Código
\documentclass[tikz]{standalone}
\begin{document}
\pgfkeys{
/bar/.search also=/tikz, % this can stay, I guess
/foo/.unknown/.code=
\ifpgfkeysaddeddefaultpath
\let\unknownname\pgfkeyscurrentname
\pgfkeysalso{
/bar/\unknownname/.try={#1}, % only try /tikz if /bar failed
/tikz/\unknownname/.lastretry={#1}}%
% Ugh! /tikz/.unknown doesn't set \pgfkeyssuccesstrue
% after it handles a color, an arrow specification or a shape's name
% then this will be annoying:
\unless\ifpgfkeyssuccess
\errmessage{Well, I couldn't find /foo/\unknownname={#1},
/bar/\unknownname={#1} and /tikz/\unknownname={#1}.
I don't know what you want from me.}%
\fi
\else % someone tried to do /foo/<unknown key>, let's fail:
\errmessage{myPackage: /foo/\pgfkeyscurrentname\space is an unknown key.}%
\fi
}
\tikz[radius=1]{
\draw[/bar/.cd, fill=red] circle[];
\draw[/bar/fill=red] (right:1) circle[];% will always fail
\draw[/foo/.cd, fill=red] (right:2) circle[];
\draw[/foo/fill=red] (right:3) circle[];% will always fail
}
\tikz{
\draw[/bar/.cd, inner xsep=0+0] node {\pgfkeysvalueof{/pgf/inner xsep}};
\draw[/foo/.cd, ->] (right:1) -- +(right:.5); % Ugh!
\draw[/foo/.cd, red!50] (right:2) -- +(right:.5); % Ugh!
\draw[/foo/.cd, circle] (right:3.5) node[draw]{}; % Ugh!
\draw[/foo/.cd, thick] (right:4) -- +(right:.5);% finds /tikz/thick but then
% has to try /foo/line width
% and then /bar/line width and
% then finally /tikz/line width
}
\pgfkeys{/tikz/.cd, abc}% → unknown /tikz/abc
\pgfkeys{/bar/.cd, abc} % → unknown /tikz/abc
\pgfkeys{/foo/.cd, abc} % → unknown /foo/abc, /bar/abc, /tikz/abc
\end{document}