Короче говоря, вопрос таков:Есть ли обработчик, позволяющий реализовать то, что делает низкоуровневый \pgfkeysvalueof
макрос, или мне следует реализовать его самостоятельно?Если да, то является ли следующее разумным вариантом реализации?
\pgfkeysdef{/handlers/.value}{%
\pgfkeysvalueof{\pgfkeyscurrentpath}%
}
Предыстория / Комментарии / Ход мыслей / Пример
Углубляясь в pgfkeys
мир и пытаясь понять, что происходит за кулисами, я начал читать разделКлючевой менеджментпринадлежащийpgf
руководство(раздел 86 на странице 946 в версии 3.1.1). Несмотря на то, что все это содержится на "всего" 25 страницах, плотность информации определенно высока, и поэтому вероятность того, что я что-то упустил, довольно высока. Вот почему я прочитал несколько тем здесь (1,2,3) до/во время практики.
Но все же я немного удивлен одним аспектом упаковки pgfkeys
.этот хороший ответсовершенно ясно, что a key
может хранить как действие, так и значение. И поскольку знак =
не является синонимом присваивания, действовать нужно по-разному в зависимости от того, какое значение <key>=<value>
должен иметь (т. е. является ли он <value>
значением или на самом деле чем-то, что должно быть дано действию?). Предположим, что есть чистое значение key
(т. е. без какого-либо связанного с ним действия), может иметь смысл пометить его значение как требуемое.
\pgfkeys{/my color/.initial = red, /my color/.value required}
На этом этапе больше не верно, что \pgfkeys{<full path of key>}
извлечет значение, поскольку мы не имеем права использовать ключ без значения. Один издругие способыдля извлечения значения необходимо использовать. Пока все хорошо. Теперь, несмотря на \pgfkeysvalueof
кажущийся самый простой ответ в этом случае, руководство как бы неоднократно предупреждает о "общей ненужности" использования такого рода низкоуровневых команд. Например, на странице 948,
Каждый ключ (может) хранить некоторые токены, и существуют команды, описанные ниже, для установки, получения и изменения токенов, хранящихся в ключе. Однако вы будете очень редко использовать эти команды напрямую. Вместо этого стандартным способом использования ключей является команда
\pgfkeys
или какая-то команда, которая использует его внутренне, например,\tikzset
. Поэтому вы можете пропустить следующие команды и перейти к следующему подразделу.
Мне также нравится использование обработчиков, чтобы оставаться на более высоком уровне абстракции. Поэтому, пытаясь получить значение ключа, /my color
я искал обработчик, но в моем случае я не вижу смысла использовать макрос (т. е. /.get
и /store in
не приветствуются). И тут я понял, что обработчика, чтобы просто получить значение, похоже, нет.
Бонусный вопрос:
Хорошая ли философия — пытаться использовать обработчики исключительно по возможности? Мне они кажутся интерфейсом более высокого уровня, и поэтому я бы так сказал.
МВЭ:
\documentclass[border=5mm, varwidth]{standalone}
\usepackage{pgfkeys}
\pgfkeysdef{/handlers/.value}{%
\pgfkeysvalueof{\pgfkeyscurrentpath}%
}
\pgfkeys{/my color/.initial = red, /my color/.value required}
\begin{document}
%My color is \pgfkeys{/my color}. %This clearly does not compile
My color is \pgfkeysvalueof{/my color}.\\
My color is \pgfkeys{/my color/.value}.
\end{document}