Je cherche à utiliser le système de clés/valeurs d'Expl3 et je veux avoir une valeur par défaut. Je veux aussi affecter une variable globale qui stocke la valeur de ma clé. Ma tentative ne fonctionne pas.

Ouvrir dans l'éditeur Overleaf
\documentclass{article}
\usepackage{expl3}
\usepackage{xparse}
\begin{document}

\ExplSyntaxOn

\tl_new:N \g__matl_tl

\keys_define:nn{keylib}{%
    macle .tl_gset:N = \g__matl_tl,
    macle .default:n = defaut
}

\NewDocumentCommand\macommande { o m } {
   \IfNoValueF {#1}
   {
       \keys_set:nn { keylib } { #1 }
   }
  Ma~commande~{#2}~et~la~valeur~de~macle~\tl_use:N \g__matl_tl.
  \tl_clear:N \g__matl_tl
}
\ExplSyntaxOff

\macommande{Test}
\end{document}

Posée 07 Déc '20, 13:17

Maxime's gravatar image

Maxime ♦
1.3k32439
Taux d'acceptation : 55%

1

Je ne comprends pas le #1 dans l'argument de la commande \keys_set:nn.

(07 Déc '20, 18:49) Le TeXnicien de surface Le%20TeXnicien%20de%20surface's gravatar image

C'est dans l'idée d'avoir plusieurs clés, et donc toutes les traiter.

(07 Déc '20, 22:53) Maxime ♦ Maxime's gravatar image

Tu peux faire ce qui suit qui remet la clé macle à sa valeur par défaut au début de l'exécution de la commande (pas bien dit mais je n'ai pas le temps d'être précis :)

Ouvrir dans l'éditeur Overleaf
\NewDocumentCommand\macommande { o m } 
 {
   \keys_set:nn { keylib } {macle}
   \IfNoValueF {#1}
   {
     \keys_set:nn { keylib } { #1 }
   }
   Ma~commande~{#2}~et~la~valeur~de~macle~\tl_use:N \g__matl_tl.
   \tl_clear:N \g__matl_tl
 }

Dans ce cas, ma solution précédente n'est plus utile.

À chaque appel de \macommande la clé macle prendra la valeur par défaut. Et si tu la redéfinis dans l'argument optionnel, comme ça vient après c'est cette définition qui prendra le dessus.

Essayer \macommande[macle = turlututu]{Autre test} dans le document pour voir.

Lien permanent

Publiée 09 Déc '20, 16:43

Le%20TeXnicien%20de%20surface's gravatar image

Le TeXnicien de surface
2.0k814
Taux d'acceptation : 27%

Plutôt qu'ajouter une réponse supplémentaire pour répondre au commentaire d'une réponse précédente, il est préférable de modifier cette dernière.

(10 Déc '20, 08:22) denis ♦♦ denis's gravatar image

Il faut initialiser la clé quelque part.

Avec

Ouvrir dans l'éditeur Overleaf
\keys_set:nn { keylib } {macle}

placé après la définition, on obtient bien ce que l'on cherche.

Lien permanent

Publiée 07 Déc '20, 18:53

Le%20TeXnicien%20de%20surface's gravatar image

Le TeXnicien de surface
2.0k814
Taux d'acceptation : 27%

Super merci, mais du coup, il faut que je remette la valeur defaut à la fin de ma nouvelle commande par le \keys_set:nn { keylib } {macle} ou il y a mieux ?

(07 Déc '20, 22:52) Maxime ♦ Maxime's gravatar image

Peut-être confondez-vous valeur par défaut et valeur initiale.

La valeur par défaut est la valeur qui est utilisée si la clé est utilisée sans valeur, c'est-à-dire sans mettre de signe d'égalité, c'est-à-dire si on utilise macle de manière absolue (par opposition à, par exemple, macle = qqch).

La valeur initiale est la valeur qui est fournie à la variable si la clé n'est pas utilisée par l'utilisateur. Plus précisément, si la clé macle n'est pas utilisée, expl3 rajoutera une entrée macle = 'valeur initiale' à la liste clé-valeur passée à keys_set:nn.

Je pense qu'ici il faut utiliser la valeur initiale et non la valeur par défaut.

Ouvrir dans l'éditeur Overleaf
\documentclass{article}
\usepackage{expl3}
\usepackage{xparse}
\begin{document}

\ExplSyntaxOn

\tl_new:N \g__matl_tl

\keys_define:nn{keylib}{%
    macle .tl_gset:N = \g__matl_tl,
    macle .initial:n = defaut
}

\NewDocumentCommand\macommande { o m } {
   \IfNoValueF {#1}
   {
       \keys_set:nn { keylib } { #1 }
   }
  Ma~commande~{#2}~et~la~valeur~de~macle~\tl_use:N \g__matl_tl.
  \tl_clear:N \g__matl_tl
}
\ExplSyntaxOff

\macommande{Test}
\end{document}
Lien permanent

Publiée 13 Déc '20, 13:20

fpantigny's gravatar image

fpantigny
1.3k44
Taux d'acceptation : 36%

C'est tout à fait ça !! Merci

(14 Déc '20, 17:03) Maxime ♦ Maxime's gravatar image
Votre réponse
(dés)activer l'aperçu

Suivre cette question

Par courriel :

Une fois que vous serez enregistré, vous pourrez souscrire à n'importe quelle mise à jour ici

Par flux RSS :

Réponses

Réponses et commentaires

Bases de Markdown

  • *italique* ou _italique_
  • **gras** ou __gras__
  • Lien ::[texte](http://url.com/ "Titre ")
  • Image : ?![alt texte](/path/img.jpg "Titre ")
  • Liste numérotée : 1. Foo 2. Bar
  • Pour ajouter un passage à la ligne, ajoutez deux espaces à l'endroit où vous souhaitez que la ligne commence.
  • Les balises HTML de base sont également prises en charge.