¿Cómo puedo personalizar la forma de la punta de flecha para que coincida con los estilos comunes de LaTeX?

¿Cómo controlo la forma de las puntas de mis flechas? El paquete TikZ de LaTeX tiene una amplia variedad de estilos de punta de flecha predefinidos, algunos de los cuales me gustaría tratar de hacer coincidir con las cifras de Mathematica que estoy importando en un documento LaTeX:

Ejemplos de flechas LaTeX

Pero el estilo de punta de flecha predeterminado de Mathematica no se acerca a ninguno de estos. Por ejemplo,

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

produce

Flecha predeterminada de Mathematica

Las versiones anteriores de Mathematica tenían opciones para controlar la forma de la punta de flecha, pero esas parecen desaparecer en 8.0.

¿Cómo puedo hacer que la forma de mis puntas de flecha de Mathematica coincida con los estilos de punta de flecha de LaTeX TikZ?

Comentarios

  • Además, las flechas de Mathematica ' tienen una escala diferente a las puntas de flecha LaTeX, usando una lógica que puedo ' t discernir. Idealmente, ' también quisiera asegurarme de que mis flechas de Mathematica escalen de la misma manera que las flechas de LaTeX; pero esa es quizás una pregunta separada.
  • ¿Ha mirado la documentación de Arrowheads?
  • Sí, naturalmente. Nada me acercó.
  • @Heike: eso solo da un ejemplo para una punta de flecha personalizada, pero nada sobre los tipos predefinidos (aunque StreamPlot tiene una miríada de diferentes estilos de flecha incorporados).
  • Consulte esta pregunta : mostrará cómo definir formas personalizadas, y establecer tamaños de punta de flecha absolutos.

Respuesta

Aquí hay un Manipulate para diseñar usted mismo 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} ] ] 

gráficos de Mathematica

Es fácil agregar más puntos de control si surge la necesidad.

Los gráficos de punta de flecha se colocan en la variable h. Tenga en cuenta que contiene una función Opacity para una mejor visibilidad de los puntos de control. Debe eliminar eso si desea tener una punta de flecha completamente saturada.

Algunos ejemplos generados con este Manipulate usando:

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 ] 

Gráficos de Mathematica

El código para las puntas de flecha se puede encontrar en h. Simplemente copie los gráficos o FullForm para almacenarlos para su uso posterior.

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 punto de control más cubrirá las formas más comunes:

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} ] ] 

Gráficos de Mathematica

Gráficos de Mathematica

Comentarios

  • ¡Increíble! ¡Gracias!

Respuesta

Una fuente de formas de punta de flecha es Graph que viene con una lista de formas de punta de flecha predefinidas que puede configurar usando la opción EdgeShapeFunction. Puede obtener los nombres de estas formas haciendo algo como

arrowheadNames = GraphElementData["Edge"]; 

Desafortunadamente, estos nombres por sí mismos son inútiles en Arrowheads. Afortunadamente, hay una manera de extraer las Graphics especificaciones de estas puntas de flecha convirtiendo un Graph en Graphics usando Show y extrayendo las Arrowheads directivas:

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] 

Gráficos de Mathematica

Puede usarlos en Arrowheads de la siguiente manera:

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

Gráficos de Mathematica

Comentarios

  • Puedo ' No haga que este código funcione más.
  • Lo mismo aquí, en Mathematica 10.1, este código ya no funciona.
  • Para esto para trabajar en Mathematica 10, reemplace GraphicsBox con Graphics: headlist = Flatten[Cases[ Show[Graph[{1 \[DirectedEdge] 2}, EdgeShapeFunction -> #]], Arrowheads[a_] :> Cases[a, _Graphics, Infinity, 1], Infinity, 1] & /@ arrowheadNames];
  • Hay un error de escritura, la lista principal está escrita al principio con una pequeña l «Lista principal» al final con una L mayúscula «Lista principal» …
  • I lo he arreglado, @Phil.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *