J'ai créé une commande qui permet de dessiner, dans un environnement tikzpicture, un critérium intitulé \Criterium avec de nombreuses options modifiables en paramètre à l'aide du package xkeyval.

Je souhaite pouvoir afficher la dureté de la mine grâce à l'option \cmdDES@Criterium@Durete qui par défaut vaut HB alors que l'utilisateur aurait le choix entre diverses valeurs prédéfinies selon la ligne de code source ci-dessous :

\define@choicekey[DES]{Criterium}{Durete}[]{HB,F,H,2H,3H,4H,2B,B}[HB]{}.

Mais cela ne fonctionne pas : plus précisément, si je renseigne une valeur qui n'appartient pas à la liste, celle-ci est quand même affichée alors que je voudrais que cela ne soit pas possible, seules les valeurs prédéfinies devraient pouvoir être utilisées.

Quel est le problème dans la ligne du code source ?

Posée 25 Jan '22, 13:58

pdesmons's gravatar image

pdesmons
294817
Taux d'acceptation : 40%

Modifiée 25 Jan '22, 21:55

Pathe's gravatar image

Pathe ♦♦
7.5k42203251

@pdesmons — expliquer aux lecteurs qu'un critérium est un crayon serait utile, à mon avis : tout le monde ne sait pas ce que c'est.

(25 Jan '22, 21:57) Pathe ♦♦ Pathe's gravatar image
2

Juste une remarque: utiliser xkeyval dans le cadre de TikZ me semble une hérésie. Le mécanisme de clé/valeur de TikZ (pgfkeys) est bien plus puissant, simple et adapté.

(28 Jan '22, 00:13) Paul Gaborit Paul%20Gaborit's gravatar image

Voici une solution dans un exemple minimal mais, comme signalé par @Paul Gaborit en commentaire, l'utilisation de pgfkeys devrait être préférée à celle de xkeyval ici (et pour tout ce qui touche à tikz).

\documentclass{article}

\usepackage{xkeyval}

\makeatletter

\define@choicekey[DES]{Criterium}{Durete}{HB,F,H,2H,3H,4H,2B,B}[HB]{\def\cmdDES@Criterium@Durete{#1}}

\presetkeys[DES]{Criterium}{Durete}{}

\newcommand{\Criterium}[1][]{%
    \setkeys[DES]{Criterium}{#1}%
    critérium de dureté \cmdDES@Criterium@Durete
}

\makeatother

\begin{document}
    Sans option : \Criterium

    Avec option mais sans clé : \Criterium[Durete]

    Avec option dans la liste : \Criterium[Durete=2B]

    % Avec option mais qui n'est pas dans la liste : \Criterium[Durete=P]
\end{document}

Premièrement avec ta ligne d'exemple \cmdDES@Criterium@Durete n'est jamais définie (pire, donner une valeur à ta clé ne fera rien) : il manque \def\cmdDES@Criterium@Durete{#1} en dernier argument de \define@choicekey.

Deuxièmement, \setkeys[DES]{Criterium}{#1} ne va pas chercher toutes les clés de préfixe DES et de famille Criterium mais seulement celles passées en paramètre (dans le #1). Il faut donc initialiser les clés, par exemple en utilisant \presetkeys.

Finalement je ne vois comment une mauvaise valeur ne lèverait pas d'erreur, un exemple semble nécessaire.

Lien permanent

Publiée 30 Avr '22, 00:36

YannD's gravatar image

YannD
465310
Taux d'acceptation : 25%

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.