Comment puis-je personnaliser la forme de la pointe de flèche pour quelle corresponde aux styles LaTeX courants?

Comment contrôler la forme de mes flèches? Le paquetage TikZ de LaTeX a une grande variété de styles de pointes de flèches prédéfinis, dont certains que jaimerais essayer de faire correspondre pour les figures Mathematica que jimporte dans un document LaTeX:

Exemples de flèches LaTeX

Mais le style de pointe de flèche par défaut de Mathematica ne se rapproche daucun de ces éléments. Par exemple,

Graphics[{Thick, Arrow[{{0, 0}, {-50, 0}}]}] 

donne

Flèche Mathematica par défaut

Les versions précédentes de Mathematica avaient des options pour contrôler la forme de la pointe de flèche, mais celles-ci semblent avoir disparu dans la version 8.0.

Comment puis-je faire correspondre la forme de mes pointes de flèche Mathematica aux styles de pointes de flèche LaTeX TikZ?

Commentaires

  • De plus, les flèches de Mathematica ' sont mises à léchelle différemment des pointes de flèche LaTeX, en utilisant une logique que je peux ' t discerner. Idéalement, je ' aimerais également massurer que mes flèches Mathematica sont mises à léchelle de la même manière que les flèches LaTeX; mais cest peut-être une question distincte.
  • Avez-vous regardé la documentation de Arrowheads?
  • Oui, naturellement. Rien là-bas ne ma rapproché.
  • @Heike: cela ne donne quun exemple de pointe de flèche personnalisée, mais rien sur les types prédéfinis (bien que StreamPlot ait une miriade de différents styles de flèches intégrés).
  • Voir cette question – elle montrera comment définir des formes personnalisées, et définir des tailles de pointes de flèche absolues.

Réponse

Voici une Manipulate pour concevoir vous-même un Arrow:

DynamicModule[{top, baseMid, rightBase, outerMidRight, innerMidRight}, Manipulate[ top = {0, 0}; baseMid = {1, 0} baseMid; rightBase = {1, -1} leftBase; outerMidRight = {1, -1} outerMidLeft; innerMidRight = {1, -1} innerMidLeft; h = Graphics[ { Opacity[0.5], FilledCurve[ { BSplineCurve[{baseMid, innerMidLeft, leftBase}], BSplineCurve[{leftBase, outerMidLeft, top}], BSplineCurve[{top, outerMidRight, rightBase}], BSplineCurve[{rightBase, innerMidRight, baseMid}] } ] } ], {{baseMid, {-2, 0}}, Locator}, {{innerMidLeft, {-2, 0.5}}, Locator}, {{leftBase, {-2, 1}}, Locator}, {{outerMidLeft, {-1, 1}}, Locator} ] ] 

Graphiques Mathematica

Il est facile dajouter plus de points de contrôle si le besoin sen fait sentir.

Le graphique en pointe de flèche est placé dans la variable h. Notez quil contient une fonction Opacity pour une meilleure visibilité des points de contrôle. Vous devez le supprimer si vous voulez avoir une tête de flèche complètement saturée.

Quelques exemples générés avec ce Manipulate en utilisant:

Graphics[ { Arrowheads[{{Automatic, 1, h /. Opacity[_] :> Sequence[]}}], Arrow /@ Table[{{0, 0}, {Sin[t], Cos[t]}}, {t, 0, 2 \[Pi] - 2 \[Pi]/20, 2 \[Pi]/20}] }, PlotRangePadding -> 0.2 ] 

Graphiques Mathematica

Le code des flèches se trouve dans h. Copiez simplement les graphiques ou le FullForm pour les stocker pour une utilisation ultérieure.

h /. Opacity[_] :> Sequence[] // FullForm (* ==> Graphics[{FilledCurve[{BSplineCurve[{{-0.496, 0.}, {-1., 0.48}, {-2,1}}], BSplineCurve[{{-2, 1}, {-0.548, 0.44999999999999996}, {0, 0}}], BSplineCurve[{{0, 0}, {-0.548, -0.44999999999999996}, {-2, -1}}], BSplineCurve[{{-2, -1}, {-1., -0.48}, {-0.496, 0.}}]}]} ] *) 

EDIT
Un autre point de contrôle couvrira les formes les plus courantes:

DynamicModule[{top, baseMid, outerMidRight, innerMidRight, innerBaseRight, outerBaseRight}, Manipulate[ top = {0, 0}; baseMid = {1, 0} baseMid; innerBaseRight = {1, -1} innerBaseLeft; outerBaseRight = {1, -1} outerBaseLeft; outerMidRight = {1, -1} outerMidLeft; innerMidRight = {1, -1} innerMidLeft; h = Graphics[ { Opacity[0.5], FilledCurve[ { BSplineCurve[{baseMid, innerMidLeft, innerBaseLeft}], Line[{innerBaseLeft, outerBaseLeft}], BSplineCurve[{outerBaseLeft, outerMidLeft, top}], BSplineCurve[{top, outerMidRight, outerBaseRight}], Line[{outerBaseRight, innerBaseRight}], BSplineCurve[{innerBaseRight, innerMidRight, baseMid}] } ] } ], {{baseMid, {-2, 0}}, Locator}, {{innerMidLeft, {-2, 0.5}}, Locator}, {{innerBaseLeft, {-2, 1}}, Locator}, {{outerBaseLeft, {-2, 1.1}}, Locator}, {{outerMidLeft, {-1, 1}}, Locator} ] ] 

Graphiques Mathematica

Graphiques Mathematica

Commentaires

  • Incroyable! Merci!

Réponse

Une source de formes de pointes de flèche est Graph qui est livré avec une liste de formes de pointes de flèches prédéfinies que vous pouvez définir à laide de loption EdgeShapeFunction. Vous pouvez obtenir les noms de ces formes en faisant quelque chose comme

arrowheadNames = GraphElementData["Edge"]; 

Malheureusement, ces noms en eux-mêmes sont inutiles dans Arrowheads. Heureusement, il existe un moyen dextraire les Graphics spécifications de ces pointes de flèches en convertissant un Graph en Graphics en utilisant Show et en extrayant les Arrowheads directives:

headlist = Flatten[Cases[ Show[Graph[{1 <-> 2}, EdgeShapeFunction -> #]], Arrowheads[a_] :> Cases[a, b_GraphicsBox :> ToExpression[b], Infinity, 1], Infinity, 1] & /@ arrowheadNames]; GraphicsGrid[Partition[headlist, 5, 5, {1, 1}, ""], Frame -> All] 

Graphiques Mathematica

Vous pouvez les utiliser dans Arrowheads comme suit:

grlist = Graphics[{Arrowheads[{{.3, 1, #}}], Arrow[{{0, 0}, {1, 1}}]}] & /@ headlist; GraphicsGrid[Partition[grlist, 5, 5, {1, 1}, ""], Frame -> All] 

Graphiques Mathematica

Commentaires

  • Je peux ' pour que ce code fonctionne plus.
  • Pareil ici, sur Mathematica 10.1, ce code ne fonctionne plus.
  • Pour cela pour travailler dans Mathematica 10, remplacez GraphicsBox par Graphics: headlist = Flatten[Cases[ Show[Graph[{1 \[DirectedEdge] 2}, EdgeShapeFunction -> #]], Arrowheads[a_] :> Cases[a, _Graphics, Infinity, 1], Infinity, 1] & /@ arrowheadNames];
  • Il y a une erreur de frappe, Headlist est écrit au début avec un petit l « Headlist » à la fin avec un L majuscule « HeadList » …
  • I lai corrigé, @Phil.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *