0

Have been reading the expl3 document interfaces3.pdf to understand how to declare and use functions. Although I have understood that there are three main methods (new, set, gset) where each method has specific use cases and restrictions upon parameter arguments.

Have also covered quite well the protected from expansion variants in certain contexts.

I would like some explanation about the difference between defining new functions using parameter text and defining new functions using the signature as covered in sections 4.3.2 and 4.3.3.

5
  • 4
    you are presumably refering to \cs_new:Nn verses \cs_new:Npn which is covered in interface3.pdf but you haven't given any example or mentioned expl3, so that's just a guess. Commented Sep 29, 2023 at 22:40
  • set/gset are not exactly different ways of defining from new. They're intended for redefining functions already declared with new. So you shouldn't do set or gset unless you did new or you're explicitly wanting to redefine a function declared with new elsewhere.
    – cfr
    Commented Sep 30, 2023 at 1:29
  • @cfr That is ok. The biggest wonder is parameter text versus signature.
    – Veak
    Commented Sep 30, 2023 at 1:34
  • It's not versus signature. All expl3 functions have to have a signature. It's whether that signature is used to determine the expected parameters or whether the parameters are specified separately.
    – cfr
    Commented Sep 30, 2023 at 1:55
  • I don't know if my answer answers your question. The idea of parameters here is a TeX one. But I thought an example of why you might want the parametised form might help, since otherwise it might seem superfluous. Some people seem to use it as their default choice, whereas I'm lazy and let LaTeX figure it out from the signature when I can.
    – cfr
    Commented Sep 30, 2023 at 1:59

1 Answer 1

1

The code examples below are either from Joseph Wright or derived from code from Joseph Wright in answer to my (much) earlier question.

In standard cases, the difference is just one of how you prefer to specify the function. In the parametised case you specify the function's parameters explicitly:

\cs_new_protected_nopar:Npn \__chronos_set_minoryearformat:n #1
{
  \tl_set:Nn \l__chronos_minoryearformat_tl { #1 }
  \tl_replace_all:Nnn \l__chronos_minoryearformat_tl { ~ } { \c_space_token }
}

That is, the #1 tells LateX the function takes a single argument, just as \def\formatyear#1{ ... } does.

In the non-parametised case, LaTeX infers the parameters from the new function's signature:

\cs_new_protected_nopar:Nn \__chronos_set_minoryearformat:n 
{
  \tl_set:Nn \l__chronos_minoryearformat_tl { #1 }
  \tl_replace_all:Nnn \l__chronos_minoryearformat_tl { ~ } { \c_space_token }
}

That is the n tells LaTeX the function takes a single argument, just as the 1 does in \newcommand*\formatyear[1]{ ... } or m does in \NewDocumentCommand\formatyear{m}{ ... }.

But in some cases, you want the parametised version because you want to handle the arguments passed to the function specially.

\cs_new_protected_nopar:Npn \__chronos_set_date_aux_ce:w #1 - #2 - #3 - #4 @#5 \q_stop
{
    \__chronos_set_date:nnnn {#1} {#2} {#3} {#5}
}

So this function doesn't expect some mixture of tokens and braced lists of tokens. It expects something with a non-standard syntactical form.

This makes it possible to parse user input of dates which differ in how much information they provide. Basically, the user can say

date={1066-08-09}

or

date=1066

or

date={1066-03}

The package then adds to the user-specified input

<user-specified date>-01-01-0@start \q_stop

and the code will pass the appropriate information on. If the user only specified a year, a month and day will be added. If the user specified only a year and month, a day will be added. If the user specified a full date, nothing will be added except start which is used to create variable names.

This is why w. w is for 'weird'.

This is basically like similar definitions at the TeX level.

\def\mydateparser@aux#1-#2-#3-#4@#5\@nil{ ... }

would work similarly (except this isn't protected and there is no check to ensure the definition isn't obliterating some crucial thing).

7
  • Right, I have only had experience with non-parametised version, where I do not specify #1 at the end.
    – Veak
    Commented Sep 30, 2023 at 2:45
  • How would you describe the non-parametised and parametised versions briefly. Haw would you describe them ?
    – Veak
    Commented Sep 30, 2023 at 3:02
  • This does not say much in terms of understanding p and w These are special cases.
    – Veak
    Commented Sep 30, 2023 at 3:03
  • 2
    @Fluffy the p argument is a special case and means parameter text.
    – Skillmon
    Commented Sep 30, 2023 at 9:34
  • 1
    @User23456234 tex.stackexchange.com/q/327619 is the question. tex.stackexchange.com/a/327642 is Joseph's answer, referenced above. I've edited the links into the answer.
    – cfr
    Commented Oct 1, 2023 at 4:50

Not the answer you're looking for? Browse other questions tagged .