Hello,
Before I start I'd like to thank Joseph for his fantastic effort
putting template-alt together. It really is a "re-imagining" of
template itself and raises many questions. It is much more useful to
be able to compare two working implementations than to discuss
template on its own in abstract terms.
* * *
I've been comparing in more detail template to Joseph's template-alt.
The only differences I'm interested in are the different ways to
define keys. I'm assuming that the collection/type/template/instance
groundwork in template is pretty much the approach that we're happy
with.
Here's a modified example from the template documentation:
\DeclareTemplate{caption}{lesssimple}{4}
{
above-skip =L [0pt] \caption_above_skip ,
below-skip =L [0pt] \caption_below_skip ,
number-format =f2 [#1~#2:~]
\caption_number_format:nn ,
nonumber-format =f1 [#1:~]
\caption_nonumber_format:n ,
single-line-format =f1 [\hfil#1\hfil]
\caption_single_line_format:n ,
caption-font =f0 [\normalfont] \caption_set_font: ,
caption-hj-setup =i {hj} [default] \caption_hj_instance ,
}
And here's how something equivalent might look in template-alt:
\DeclareTemplate{caption}{lesssimple}{4}
{
above-skip .set:N = \l_caption_above_skip ,
below-skip .set:N = \l_caption_below_skip ,
number-format .function:N = \caption_number_format:nn ,
nonumber-format .function:N =
\caption_nonumber_format:nn ,
single-line-format .function:N =
\caption_single_line_format:n ,
caption-font .function:N = \caption_set_font: ,
caption-hj-setup .instance:nN = {hj} \caption_hj_instance ,
above-skip .initial:n = 0pt ,
below-skip .initial:n = 0pt ,
number-format .initial:n = {#1~#2:~} ,
nonumber-format .initial:n = {#1:~} ,
single-line-format .initial:n = {\hfil #1\hfil} ,
caption-font .initial:N = \normalfont ,
caption-hj-setup .initial:n = default ,
}
Discussion:
1. Despite the large increase in verbosity (doubling the line count),
I think I like splitting the defaults into separate keyvals. In fact,
after splitting defaults from the definition of the keys, it's no
longer clear to me whether defaults should be included within the
template definition at all. For example, perhaps it would be more
readable to write something like this:
\DeclareTemplate{caption}{lesssimple}{4}
{
above-skip .set:N = \l_caption_above_skip ,
below-skip .set:N = \l_caption_below_skip ,
number-format .function:N = \caption_number_format:nn ,
nonumber-format .function:N =
\caption_nonumber_format:nn ,
single-line-format .function:N =
\caption_single_line_format:n ,
caption-font .function:N = \caption_set_font: ,
caption-hj-setup .instance:nN = {hj} \caption_hj_instance ,
}
\DeclareTemplateDefaults{caption}{lesssimple}
{
above-skip = 0pt ,
below-skip = 0pt ,
number-format = {#1~#2:~} ,
nonumber-format = {#1:~} ,
single-line-format = {\hfil #1\hfil} ,
caption-font = \normalfont ,
caption-hj-setup = default ,
}
This transfers much more cleanly when people are generating instances
(e.g., they can just copy/paste some of the default list).
\DelayEvaluation of template could still be used instead of .initial:V
of template-alt.
But considering templates are designed to be instantiated, what's the
point of default values? Well, it's nice to be able to generate
instances without setting every key; furthermore, the instance
parameters will cascade from these default values. If the template
defaults can be altered, classes of instances can be generated much
more easier, I think.
For example, if we create instances 'chapter', 'section',
'subsection', and so on, it's much easier to change the "section font"
by calling
\DeclareTemplateDefaults{divisions}{plain}{font=italic}
than editing each instance or the definition of each instance.
(Assuming that there's a processing stage where we can edit template
defaults and instances *before* the document elements become
instantiated and frozen.)
2. If template-alt is going to auto-detect variables and set them
appropriately, perhaps it could do the same for functions.
number-format .set:N = \caption_number_format:nn
could look at the signature of \caption_number_format:nn and use
\cs_set:Nn automagically, I think.
3. The big difference between template and template-alt is the number
of keyval types and how they're referred to.
template provides 11 different key types with nine different letters
(two are uppercase variants).
template-alt provides seven key types (assuming we can
drop .function), of which four are equivalent to template, one relates
to initial/default values (which may be able to be dropped as well as
discussed above), and two more deal with choices selection. Actually,
I'm lying here, as there are actually 15 key types in template-alt
with many variations such as
.code:n
.code:x
.code:Nn
.code:Nx
But where template has six letters for setting different variables,
template-alt uses the catch-all ".set:N" with an _x variant.
Furthermore, template-alt also deals with global variables properly.
(As a possible downside, to do all of this it ties the package writer
down to use the expl3 syntax, which template.sty is more lenient about.)
I believe that template-alt, as it currently stands, provides more
useful tools for the template designer. Many 2e packages use keyval
forms like
size=a4paper
style=SI
font=bf (not that I like this one!)
and template should cater for these uses. \MultiSelection doesn't
really go far enough, I think.
This isn't to say that template-alt necessarily does things 100%
correctly; I am saying that, in my opinion, template needs further
improvement before it's ready, and it's not clear to me that we'll be
able to add more functionality without overly complicating its current
naming system.
* * *
I hope this comparison helps the discussion here, rather than bogging
it down with too many details. From the sounds of things, we're much
closer to finalising something with xparse than with template.
Will
|