2
2

Avec \pgfgetlastxy, on peut récupérer les coordonnées du point courant mais ces coordonnées sont en points (pt). Comment faire pour avoir ces coordonnées en centimètres (et plus généralement dans toute autre unité) ?

L'exemple ci-dessous dessine un arc et récupère les coordonnées de l'extrémité de l'arc qui est le point courant une fois l'arc dessiné, puis les affiche. Elle sont en points (pt). Un cercle rouge est dessiné sur ce point en utilisant ces coordonnées récupérées. Il est bien positionné alors que les unités utilisées ne sont pas des centimètres.

Je pensais que par défaut l'unité pour les coordonnées était le centimètre, alors je suis un peu surpris. Comment se fait-il que le point soit bien positionné malgré tout ? Les valeurs sont stockées et utilisées avec leur unité (le point, je suppose) et la commande \fill utilise alors le point comme unité pour positionner le centre du cercle ?

Ouvrir dans l'éditeur Overleaf
\documentclass[french,a4paper]{article}
\usepackage[]{tikz}

\begin{document}
\begin{tikzpicture}
\draw (1,0) arc (0:90:1);
\pgfgetlastxy{\ax}{\ay}     (pas de point virgule pour commande pgf)
\draw (3,0) node[draw]{$\ax ,\ay$};
\fill[red] (\ax,\ay) circle (5pt);
\end{tikzpicture}
\end{document}

Posée 07 Jul '20, 16:43

idefix's gravatar image

idefix
95594051
Taux d'acceptation : 14%

Modifiée 09 Jul '20, 01:38

Pathe's gravatar image

Pathe ♦♦
7.4k28196245


Avec l'extension printlen :

Ouvrir dans l'éditeur Overleaf
\documentclass[french,a4paper]{article}
\usepackage[]{tikz}

\usepackage{printlen}
\uselengthunit{cm}

\begin{document}
\begin{tikzpicture}
\draw (1,0) arc (0:90:1);
\pgfgetlastxy{\ax}{\ay}   %  (pas de point virgule pour commande pgf)
\draw (3,0) node[draw]{\rndprintlength{\dimexpr\ax}, \rndprintlength{\dimexpr\ay}};
\fill[red] (\ax,\ay) circle (5pt);
\end{tikzpicture}
\end{document}

alt text

Ou plus généralement :

Ouvrir dans l'éditeur Overleaf
\documentclass[french,a4paper]{article}
\usepackage[]{tikz}

\usepackage{printlen}
\uselengthunit{cm}

\begin{document}
\begin{tikzpicture}
\draw (1,0) arc (0:90:1);
\pgfgetlastxy{\ax}{\ay}   %  (pas de point virgule pour commande pgf)
\fill[red] (\ax,\ay) circle (5pt);

\foreach \n [count=\xi] in {cm,mm,pt,pc,in,bp,dd,cc}{
  \draw (3,-\xi) node[draw]{\uselengthunit{\n}\rndprintlength{\dimexpr\ax}, \rndprintlength{\dimexpr\ay}};
}

\end{tikzpicture}
\end{document}

alt text

Lien permanent

Publiée 07 Jul '20, 20:55

samcarter's gravatar image

samcarter
8.2k2817
Taux d'acceptation : 57%

Modifiée 07 Jul '20, 21:27

Dans les coordonnées présentes dans une instruction de TikZ, on peut mettre une valeur numérique (qui est alors interprétée avec l'unité par défaut) mais on peut aussi mettre une expression avec une unité, ce qui spécifie une longueur.

En l'occurrence, \ay contient 28.45274pt (et non seulement 28.45274). En utilisant \ay plus loin, l'unité est présente et est correctement utilisée.

\ay n'est un registre de dimension de TeX mais une macro de TeX.

Pour faire la conversion en cm, il existe une macro \dim_to_decimal_in_unit:nn dans expl3.

Comme c'est une macro interne, on doit écrire écrire une sur-macro pour l'utiliser dans le document courant. Je l'ai nommée PtToCm.

Ouvrir dans l'éditeur Overleaf
\documentclass[french,a4paper]{article}
\usepackage{tikz}
\usepackage{xparse}
\ExplSyntaxOn
\NewDocumentCommand \PtToCm { m } { \dim_to_decimal_in_unit:nn { #1 } { 1 cm } }
\ExplSyntaxOff
\begin{document}
\begin{tikzpicture}
\draw (1,0) arc (0:90:1);
\pgfgetlastxy{\ax}{\ay} %    (pas de point virgule pour commande pgf)
\draw (3,0) node[draw]{$\PtToCm{\ax} ,\PtToCm{\ay}$};
\fill[red] (\ax,\ay) circle (5pt);
\end{tikzpicture}
\end{document}
Lien permanent

Publiée 07 Jul '20, 17:09

fpantigny's gravatar image

fpantigny
1.2k44
Taux d'acceptation : 34%

Modifiée 08 Jul '20, 00:21

Pathe's gravatar image

Pathe ♦♦
7.4k28196245

Merci. Et pour afficher la valeur récupérée de la coordonnée en centimètres ?

(07 Jul '20, 17:47) idefix idefix's gravatar image

@idefix : J'ai modifié ma réponse.

(07 Jul '20, 19:40) fpantigny fpantigny'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.