Comment créer un booléen (« orientation ») et une variable (« \n » qui vaut 1 si orientation=true et 2 sinon) qui permettent de dessiner selon les valeurs une figure (la partie intitulée « Vis » dans le code ci-dessous) vers la droite ou vers la gauche ?

Ouvrir dans l'éditeur Overleaf
\documentclass[12pt,a4paper]{article}
\usepackage[latin1,utf8]{inputenc}
\usepackage[french]{babel}
\usepackage[T1]{fontenc}
\usepackage{amsmath}
\usepackage{amsfonts}
\usepackage{amssymb}
\usepackage{lmodern}
\usepackage{fourier}
\usepackage[left=2cm,right=2cm,top=2cm,bottom=2cm]{geometry}
\usepackage{tikz}
    \usetikzlibrary{patterns}
\usepackage{tkz-euclide}
    \usetkzobj{all}
\usepackage{xkeyval}
\usepackage{ifthen}

\makeatletter
%----------> \CrayonGris <----------
\definecolor{wood}{cmyk}{0.00,0.12,0.35,0.05}
\define@cmdkey [DES] {CrayonGris} {inclinaison}{}    
\define@cmdkey [DES] {CrayonGris} {mine}{}
\define@cmdkey [DES] {CrayonGris} {corps}{}
\define@cmdkey [DES] {CrayonGris} {couleur}{}
\define@cmdkey [DES] {CrayonGris} {xscale}{}
\define@cmdkey [DES] {CrayonGris} {yscale}{}
\define@boolkey [DES] {CrayonGris} {bague}[true]{}
\define@boolkey+ [DES] [CrayonGris} {orientation}[true]{}
\presetkeys    [DES] {CrayonGris} {inclinaison = 0, mine = red, corps = blue, couleur = wood, xscale=1, yscale=1}{}
%
\newcommand{\CrayonGris}[2][]{%
    \setkeys[DES]{CrayonGris}{#1}
    \begin{scope}[shift={(#2)},rotate=\cmdDES@CrayonGris@inclinaison, xscale=\cmdDES@CrayonGris@xscale, yscale=\cmdDES@CrayonGris@yscale]
% Pointe ouverte
    \draw[fill=\cmdDES@CrayonGris@couleur] (-0.3,0.6) -- (0,0) -- (0.3,0.6) arc(-90:-180:0.1) arc(0:-180:0.1) arc(0:-180:0.1) arc(0:-90:0.1);
% Mine
    \draw[fill=\cmdDES@CrayonGris@mine] (-0.1,0.2) -- (0.1,0.2) -- (0,0) -- cycle;
% Corps du crayon    
    \draw[fill=\cmdDES@CrayonGris@corps] (0.3,0.6) arc(-90:-180:0.1) arc(0:-180:0.1) arc(0:-180:0.1) arc(0:-90:0.1) -- (-0.3,6) -- (0.3,6) -- cycle;
% Traits verticaux
    \draw (-0.2,6) -- (-0.2,0.65) (0,6) -- (0,0.65) (0.2,6) -- (0.2,0.65);
% Bague
\if \cmdDES@CrayonGris@bague
\draw[fill=gray!20,opacity=0.5] (-0.4,1.5)rectangle(0.4,2.5);
% Vis
   \if \cmdDES@CrayonGris@orientation
         let \n = 1
   \else
         let \n = 2
   \fi
\draw[fill=gray!20] (0.4*(-1)^{\n},1.9)--(0.6*(-1)^{\n},1.9)--(0.6*(-1)^{\n},1.8)--(0.8*(-1)^{\n},1.8)--(0.8*(-1)^{\n},2.2)--(0.6*(-1)^{\n},2.2)--(0.6*(-1)^{\n},2.1)--(0.4*(-1)^{\n},2.1)--cycle;
%\draw[fill=gray!20] (0.4*(-1)^{\n},1.9)--(0.6,1.9)--(0.6,1.8)--(0.8,1.8)--(0.8,2.2)--(0.6,2.2)--(0.6,2.1)--(0.4,2.1)--cycle;
\fi
    \end{scope}
}
\makeatother

Posée 10 Oct '19, 12:02

pdesmons's gravatar image

pdesmons
274817
Taux d'acceptation : 40%

Modifiée 12 Oct '19, 06:57

Pathe's gravatar image

Pathe ♦♦
7.4k28196245

2

Merci d'essayer de fournir un ECM (https://texnique.fr/osqa/faq/#custom-id-ecm )

(10 Oct '19, 16:14) samcarter samcarter's gravatar image
2

\define@boolkey+ [DES] [CrayonGris} {orientation}[true]{} est faux -> [ et }

(10 Oct '19, 16:15) samcarter samcarter's gravatar image
2

^{\n} n'est pas possible dans une coordonnée tikz. Mais pourquoi si compliqué? Avec n = -1 et 1: (0.4*\n,1.9) ?

(10 Oct '19, 16:40) samcarter samcarter's gravatar image
1

Pourquoi avez-vous besoin d'un booléen pour l'orientation? N'est-ce que pas le même comme xscale=-1 ?

(10 Oct '19, 16:47) samcarter samcarter's gravatar image

Le booléen utilisé en option dans la macro doit permettre de décider si on dessine l'élément vers la droite (n = 1) ou bien vers la gauche (n = -1).

(10 Oct '19, 18:12) pdesmons pdesmons's gravatar image

@pdesmons Quelle est la différence entre n=+-1 ou xscale=+-1 ?

(10 Oct '19, 18:35) samcarter samcarter's gravatar image

xscale est une échelle d'agrandissement/réduction des valeurs "en abscisse".

(10 Oct '19, 19:06) pdesmons pdesmons's gravatar image

Le problème provient de ma mauvaise utilisation du package xkeyval, du test conditionnel et de l'affectation de la variable n car mon code ne compile plus dès que je rajoute la partie qui correspond à "bague" et "vis" même après la simplification proposée pour n avec +-1.

(10 Oct '19, 19:54) pdesmons pdesmons's gravatar image
1

@pdesmons : si votre problème est résolu, pourriez-vous rédiger une solution ? Le package xkeyval est très utile, et nul doute qu'une réponse intéresserait les usagers du présent site.

(16 Oct '19, 10:40) Pathe ♦♦ Pathe's gravatar image
Affichage de 5 parmi 9 Afficher 4 commentaire(s) en plus

La réponse à cette question a finalement été complétée dans une autre de mes questions avec la création de compteurs (variables).

Dans le préambule, on écrit après les packages :

Ouvrir dans l'éditeur Overleaf
...
\newcount\n
\newcount\c
...

puis dans la création de la macro « CrayonGris » à l'emplacement adéquat :

Ouvrir dans l'éditeur Overleaf
%affectation des valeurs 1 ou -1 selon la valeur du booléen "DES@CrayonGris@orientation" pour pouvoir dans mon cas réaliser un dessin à droite ou bien à gauche :

\ifDES@CrayonGris@orientation % choix de la position de la vis sur la bague (droite=1 ; gauche=-1)
        \n = 1
        \else
        \n = -1
   \fi

J'ai également eu besoin de faire le lien entre deux booléens de la manière suivante dans une seconde macro, intitulée « Compas » :

Ouvrir dans l'éditeur Overleaf
\ifDES@Compas@orientationCompas 
% corrélation entre l'orientation gauche-droite pour la pointe du compas et de la vis sur la bague du crayon du compas 
    \c = 1  
    \setkeys[DES]{CrayonGris}{orientation=true}
    \else
    \c = -1
    \setkeys[DES]{CrayonGris}{orientation=false}
  \fi

Autrement dit, les deux compteurs \n et \c m'ont permis d'utiliser les deux booléens comme « interrupteur », permettant ici un choix d'orientation.

Lien permanent

Publiée 20 Oct '19, 18:26

pdesmons's gravatar image

pdesmons
274817
Taux d'acceptation : 40%

Modifiée 20 Oct '19, 22:38

Pathe's gravatar image

Pathe ♦♦
7.4k28196245

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.