Могу ли я `.search also` путь, который `.search also` другой путь?

Могу ли я `.search also` путь, который `.search also` другой путь?

(Это вдохновленоПроблема между ключами, путями с двумя макросами и pgfkeys)

Следующий код

\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}

выдает ошибку

Ошибка пакета pgfkeys: Я не знаю ключ ' /foo/fill', которому вы передали 'red', и я собираюсь его проигнорировать. Возможно, вы неправильно его написали.

Это неудивительно, ведь под . ничего нет /foo.



Следующий код

\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}

успешно создает изображение

Это тоже неудивительно, потому что /fooпытается выполнить поиск fillпо /barи /tikzи находит, что /tikz/fillопределено.



Следующий код

\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}

как ни странно, не выдает никаких ошибок, а лишь наивную картину.

Кажется, /fooпросит /barнайти fillпод /tikz, и они успешно (следовательно, без ошибки). Но по какой-то причине стиль не применился.



Почему это происходит? Могу ли я как-то сделать так, чтобы произошло одно из этого:

  • выдать ошибку; или
  • успешно применить стиль; или даже лучше
  • успешно применить стиль и выдать предупреждение?

решение1

Если я правильно понимаю, проверка \ifpgfkeysaddeddefaultpath, которая выполняется в начале .unknownкода, установленного с помощью, .search alsoпереключается на false при /foo/.unknownпопытках

\pgfqkeys{/bar}{fill=red}

что заставляет /bar/.unknownне пробовать ничего другого.

(По сути, это разница между /bar/.cd, fill=redи /bar/fill=red, где последний предполагается правильным и намеренно выдает ошибку, несмотря на .search alsoальтернативу.)

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

Все зависит от того, как вы хотите справляться с некоторыми вещами.


Поскольку /tikz/.unknownне выполняет \ifpgfkeysaddeddefaultpathпроверку, то не делает различий между /tikz/.cd, <key>=<value>и /tikz/<key>=<value>. (Внутренне вместо часто используется .cdболее быстрый , но по сути это то же самое.)\pgfqkeys{/tikz}{<key>=<value>}

Однако иногда <key>это стиль, и тогда все зависит от того, в каком направлении мы их реализуем.

\pgfkeys{/abc/.cd, /tikz/thick}

приведет к ошибке о неизвестном ключе, /abc/line widthпоскольку мы все еще находимся на /abcпути (ну, если он не /abc/line widthопределен, конечно, тогда он будет использован).

Это приводит меня к .unknownобработчику, который очень близок кпример руководства.

К сожалению, /tikz/.unknownне устанавливается \pgfkeyssuccesstrueпри обнаружении цвета, спецификации стрелки или имени формы, что затрудняет определение того, /tikz/<key>был ли a действительно успешным, а это означает, что сопровождающий /fooне может выдать правильное сообщение об ошибке без переопределения /tikz/.unknownили выполнения того же самого трюка.

Код

\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}

Выход

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

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

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