J'ai écrit une boucle \foreach que je voudrais pouvoir réutiliser en modifiant uniquement la variable de dimension, que j'ai appelée \longueur.

Sans cette variable en utilisant en lieu et place la valeur 4, cela fonctionne bien :

Ouvrir dans l'éditeur Overleaf
[evaluate=\x as \xx using
{\x\*(4\*.347296355)}]

et il apparaît bien l'image ci-dessous :

... mais lorsque je remplace la valeur 4 par la variable \longueur, qui mesure 4 cm, avec ce code :

Ouvrir dans l'éditeur Overleaf
[evaluate=\x as \xx using
{\x\*(\longueur\*.347296355)}]

... cela ne fonctionne plus et j'obtiens cette image :

alt text

L'ECM qui fonctionne est celui-ci :

Ouvrir dans l'éditeur Overleaf
\documentclass[a4paper, 11pt,landscape]{article}

\usepackage{tikz}               
\usepackage[frenchb]{babel}

\begin{document}

\newlength{\longueur}
\setlength{\longueur}{4cm}

\begin{tikzpicture}
\clip (0,0) rectangle({\longueur*3.125667198},{\longueur*.984807753});
\foreach \x  [evaluate=\x as \xx using {\x*(4*.347296355)}] in {0,1,...,9}{
\draw (\xx,0)--++(80:\longueur);
\draw(\xx,0)--++(100:\longueur);
}
\draw (0,0) rectangle({\longueur*3.125667198},{\longueur*.984807753});
\end{tikzpicture}
\end{document}

L'ECM qui ne fonctionne pas est celui-là :

Ouvrir dans l'éditeur Overleaf
\documentclass[a4paper, 11pt,landscape]{article}

\usepackage{tikz}               
\usepackage[frenchb]{babel}

\begin{document}

\newlength{\longueur}
\setlength{\longueur}{4cm}

\begin{tikzpicture}
\clip (0,0) rectangle({\longueur*3.125667198},{\longueur*.984807753});
\foreach \x  [evaluate=\x as \xx using {\x*(\longueur*.347296355)}] in {0,1,...,9}{
\draw (\xx,0)--++(80:\longueur);
\draw(\xx,0)--++(100:\longueur);
}
\draw (0,0) rectangle({\longueur*3.125667198},{\longueur*.984807753});
\end{tikzpicture}
\end{document}

Comment faire pour utiliser une variable de dimension dans l'evaluate de la boucle foreach ?

Posée 20 Mai '17, 20:59

Andr%C3%A9C's gravatar image

AndréC
6111124
Taux d'acceptation : 25%

Modifiée 10 Aoû '17, 17:13

Pathe's gravatar image

Pathe ♦♦
7.4k28196245

1

Il suffit de remplacer \newlength{\longueur} \setlength{\longueur}{4cm} par \newcommand*\longueur{4}

(20 Mai '17, 23:35) touhami touhami's gravatar image

Parfait ! merci beaucoup !

(21 Mai '17, 10:56) AndréC Andr%C3%A9C's gravatar image

@touhami Une question : j'avais tenté de remplacer les longueurs avec \def\longueur{4} sans succès, pourquoi cela ne fonctionne t-il pas avec \def mais fonctionne avec \newcommand ?

(22 Mai '17, 23:24) AndréC Andr%C3%A9C's gravatar image

@AndréC Pour moi ça marche.

(23 Mai '17, 00:12) touhami touhami's gravatar image

Vous avez raison ça marche, en fait j'avais remplacé par \def\longueur{4cm} et non pas par \def\longueur{4} et c'est ce problème de conversion de longueur qui s'est posé.

(23 Mai '17, 00:15) AndréC Andr%C3%A9C's gravatar image

TeX convertit les longueurs en pt donc 4 cm = \longueur = 113.81102 pt.

Lors de l'évaluation, c'est cette valeur qui est utilisée, i.e. 113.81102.

Une solution est d'utiliser \longueur/1cm* qui est 113.81102 pt / 28.45274 pt = (4).

Ouvrir dans l'éditeur Overleaf
\documentclass[a4paper, 11pt,landscape]{article}

\usepackage{tikz}               
\usepackage[frenchb]{babel}

\begin{document}

\newlength{\longueur}
\setlength{\longueur}{4cm}

\begin{tikzpicture}
\clip (0,0) rectangle({\longueur*3.125667198},{\longueur*.984807753});
\foreach \x  [evaluate=\x as \xx using {\x*(\longueur/1cm*.347296355)}] in {0,1,...,9}{
\draw (\xx,0)--++(80:\longueur);
\draw(\xx,0)--++(100:\longueur);
}
\draw (0,0) rectangle({\longueur*3.125667198},{\longueur*.984807753});
\end{tikzpicture}

\end{document}
Lien permanent

Publiée 21 Mai '17, 00:42

touhami's gravatar image

touhami
9.7k410
Taux d'acceptation : 51%

Modifiée 10 Aoû '17, 17:17

Pathe's gravatar image

Pathe ♦♦
7.4k28196245

@touhami Merci beaucoup, vos deux solutions fonctionnent parfaitement.

(21 Mai '17, 11:00) AndréC Andr%C3%A9C's gravatar image

@AndréC n'oubliez pas d'accepter la réponse si elle convient.

(26 Mai '17, 00:22) pluton pluton'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.