
(Это вдохновленоПроблема между ключами, путями с двумя макросами и 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}