Take the 2-minute tour ×
TeX - LaTeX Stack Exchange is a question and answer site for users of TeX, LaTeX, ConTeXt, and related typesetting systems. It's 100% free, no registration required.

I am not too sure just by reading the manual as to the subtle differences between the .initial and .default PGF key types. Can someone explain and demonstrate the differences with a minimal example?

share|improve this question

2 Answers 2

up vote 9 down vote accepted

They're for two different things: A key defined using /.initial=<value or string> is a value-storing key, with the initial value set to <value or string>.

The /.default keyword defines what value will be used as the argument for a key defined with /.code=<code> if no argument is provided.

The two things are similar, but not equivalent. A key can at the same time have a value, which can be queried with \pgfkeysvalueof{/key}, and a code, which will be run when you just call the key using \pgfkeys{/key}. If no code is defined, the two are the same, but if you have defined both a .initial

\documentclass{article}
\usepackage{pgfkeys}

\begin{document}
%% Case 1: We want a key to store a value

% Just passing a value to an undefined key fails:
%\pgfkeys{firstkey=red}

% It first needs to be initialised
\pgfkeys{firstkey/.initial=red}

% Then we can get the value
\pgfkeys{firstkey}

% After the key has been initialised, we can change the stored value using simple assignments
\pgfkeys{firstkey=blue}
\pgfkeys{firstkey}

%% Case 2: We want a key to execute code using the argument
\pgfkeys{secondkey/.code=Your argument: \textbf{#1}}
\pgfkeys{secondkey=Some words}

% If we don't use an argument, it's assumed to be empty
\pgfkeys{secondkey}

% We can provide a default value to be used if no argument is provided:
\pgfkeys{secondkey/.default=Nothing}
\pgfkeys{secondkey}

% Let's define a .code key that just returns the argument...
\pgfkeys{/thirdkey/.code=#1}
% ...and give it an initial value...
\pgfkeys{/thirdkey/.initial=green}
% ...and a default argument
\pgfkeys{/thirdkey/.default=red}

% If we query the value, we get "green"
\pgfkeysvalueof{/thirdkey}
% If we run the code, we get "red"
\pgfkeys{/thirdkey}

\end{document}
share|improve this answer
1  
Does tikz have a reason for this semantics, ie, for separating .initial from .default? They seem to serve the same purpose: if there is no user-supplied value, use initial or default value. –  Ahmed Musa Apr 5 '12 at 16:26
    
@AhmedMusa: The value stored in a key and the code it runs are two different things. I've edited the example. Also, they don't really serve the same purpose: .initial initialises a key with a value, once you've assigned a different value to the key, the initial value is lost. The .default value stays around, even if you call the key with a different argument. –  Jake Apr 5 '12 at 16:48
    
I think there is an existence issue as well. Non-existing keys originated by /.initial would be assumed as empty. However, if you want to use /.value required it seems that the /.default is the way to go. I am just guessing by the way I have to check once again. –  percusse Apr 5 '12 at 16:54
    
@Jake the /.default also applies for the /.style keys (you only mention /.code). I know that there is no implementation difference (from a user perspective), however for future readers might I suggest to add that as well to disclose any ambiguities. –  zeroth Apr 5 '12 at 17:22

Although this does not specifically add anything to the answer already provided, the following example helped me understand the difference more intuitively:

\documentclass{article}

\usepackage{pgfkeys}

\setlength{\parindent}{0mm}

\begin{document}

%% Create the keys, default values, etc.
\pgfkeys{%
  /mythingy/.is family, /mythingy,
  usecolor/.default = green,
  usecolor/.code = {You have chosen to use the color #1.},
  usecolor/.initial = purple,
}

%% Create a command that will use the keys
\newcommand{\mythingy}[1][]{%
  \pgfkeys{/mythingy, #1}   %% The usecolor/.code is executed
  \pgfkeysvalueof{/mythingy/usecolor}   %% Retrieves only the VALUE of the usecolor key
}

%% Use the command along with the keys in various different manners

\textbf{Attempt 1}:\\
%% Here, the usecolor/.code is executed using "blue" as the argument
\mythingy[usecolor=blue]

\vspace{\baselineskip}

\textbf{Attempt 2}:\\
%% Here, the usecolor/.code is execute using the /.default argument value "green"
\mythingy[usecolor]

\vspace{\baselineskip}

\textbf{Attempt 3}:\\
%% Here, the usecolor key is initialized to the /.initial value "purple"
%% However, the usecolor/.code is not executed !!!
\mythingy

\end{document}

which outputs to:

enter image description here

In understanding this behavior, it is very important to understand the conceptual difference between the VALUE of a key and an ARGUMENT for the code associated to that key.

I could imagine this distinction being used in the following manner (see code below), although this example is grotesque (in my opinion) in the sense that it should use a distinct second key radius to actually control the radius:

\documentclass{article}

\usepackage{tikz}
\usepackage{etoolbox}

\setlength{\parindent}{0mm}

\begin{document}

\pgfkeys{%
  /mypainter/.is family, /mypainter,
  drawcircle/.default = true,
  drawcircle/.code = {%
    \ifstrequal{#1}{true}{
      \begin{tikzpicture}
        \draw (0,0) circle[radius=\pgfkeysvalueof{/mypainter/drawcircle}];
      \end{tikzpicture}
    }{}
  },
  drawcircle/.initial = 1cm,
}

\newcommand{\mypainter}[1][]{%
  Executing {\ttfamily drawcircle/.code}: \pgfkeys{/mypainter, #1}
  \par
  Value of key {\ttfamily drawcircle}: \pgfkeysvalueof{/mypainter/drawcircle}
}

\textbf{Attempt 1}:\\
\mypainter[drawcircle=true]

\vspace{3\baselineskip}

\textbf{Attempt 2}:\\
\mypainter[drawcircle]

\vspace{3\baselineskip}

\textbf{Attempt 3}:\\
%% The order of the "keys" is important here (try switching the two)
\mypainter[drawcircle/.initial=2cm, drawcircle]

\vspace{3\baselineskip}

\textbf{Attempt 4}:\\
%% Notice the drawcircle/.initial now remains set to 2cm !!!
\mypainter

\vspace{3\baselineskip}

\textbf{Attempt 5}:\\
\mypainter[drawcircle=false]

\end{document}

The output to that last bit of code is:

Output for the drawcircle example

share|improve this answer

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.