¿Puedo `.buscar también` una ruta que `.buscar también` otra ruta?

¿Puedo `.buscar también` una ruta que `.buscar también` otra ruta?

(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 /foointenta buscar filldebajo /barde /tikzy encuentra que /tikz/fillestá 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 /foopide /barbuscar filldebajo /tikzy 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 \ifpgfkeysaddeddefaultpathque se ejecuta al inicio del .unknowncódigo configurado por .search alsose activa como falso cuando /foo/.unknownse intenta

\pgfqkeys{/bar}{fill=red}

lo que hace que /bar/.unknownno intente nada más.

(Básicamente, esa es la diferencia entre /bar/.cd, fill=redy /bar/fill=reddonde se supone que este último es correcto y genera un error intencionalmente a pesar de una .search alsoalternativa).

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 .unknowncontrolador personalizado...

Simplemente depende de cómo quieras manejar algunas cosas.


Como /tikz/.unknownno realiza la \ifpgfkeysaddeddefaultpathverificació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 widthya que todavía estamos en la /abcruta (bueno, a menos que /abc/line widthesté definido, por supuesto, qué se usará).

Esto me lleva a un .unknowncontrolador que está muy cerca delejemplo del manual.

Desafortunadamente, /tikz/.unknownno se establece \pgfkeyssuccesstruecuando 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 /foono puede generar un mensaje de error adecuado sin redefinir /tikz/.unknowno 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}

Producción

ingrese la descripción de la imagen aquí

ingrese la descripción de la imagen aquí

información relacionada