quisiera hacer el siguiente diagrama
usando TikZ
(El diagrama anterior se realizó usando feynmf
el paquete). Hasta ahora he escrito esto:
\documentclass[12pt]{article}
\usepackage[compat=1.1.0]{tikz-feynman}
\begin{document}
\begin{tikzpicture}
\feynmandiagram [ horizontal=i to v1] {
i -- [double] v1 -- [double] v2 -- [double] v3 -- [double] v1,
v2 -- [double] o1,
v3 -- [double] o2,
};
\end{tikzpicture}
\end{document}
y obtuve esto
Sin embargo, no puedo entender cómo disminuir la longitud de las líneas externas. Además, no sé cómo hacer que las líneas se crucen como en la primera figura. ¿Alguna sugerencia?
Respuesta1
Si va a utilizar los algoritmos de colocación automática enTikZ-Feynman(CTAN), desafortunadamente no existe una forma sencilla de acortar las líneas externas ya que el algoritmo subyacente no tiene idea de qué líneas son externas.
Es posible modificar la distancia con la que se dibujan los bordes shorten <=(distance)
yshorten >=(distance)
(la diferencia es si corta el principio del final); pero esto sólo afecta adibujodel borde y no la forma en que el algoritmo trata la longitud del borde y, como resultado, realmente no recomendaría usar esto. En particular, esto se verá extraño si se usa junto con el particle
estilo, ya que el texto estará muy lejos del final de la línea.
En su caso, una buena forma de lograr el resultado deseado es aprovechar la geometría simple:
\RequirePackage{luatex85}
\documentclass[tikz,border=10pt]{standalone}
\usepackage[compat=1.1.0]{tikz-feynman}
\begin{document}
\begin{tikzpicture}
\begin{feynman}
\vertex (i);
\vertex [right=2cm of i] (center);
\pgfmathsetmacro\vert{2 * sin(2 * pi / 6 r)};
\pgfmathsetmacro\horz{2 * cos(2 * pi / 6 r)}
\vertex [above right=\vert cm and \horz cm of center] (o1);
\vertex [below right=\vert cm and \horz cm of center] (o2);
\vertex (v1) at ($(center)!0.7!(i)$);
\vertex (v2) at ($(center)!0.7!(o1)$);
\vertex (v3) at ($(center)!0.7!(o2)$);
\diagram* [edges=double] {
(i) -- (v1) -- (v2) -- (v3) -- (v1),
(v2) -- (o1),
(v3) -- (o2),
};
\end{feynman}
\end{tikzpicture}
\end{document}
Inicialmente, esto coloca todos los vértices externos 2cm
del center
vértice. Luego coloca cada vértice y v1
a la distancia entre el centro y el vértice exterior deseado.v2
v3
0.7
Me doy cuenta de que esta solución es muy específica del diseño anterior y no es general en absoluto. Sin embargo, en términos más generales, puedes modificar las distancias en elabove right=(distance) and (distance) of (vertex)
. Hay muchos otros ejemplos que hacen uso de esto en este sitio web, y hay ejemplos de esto en la documentación de Ti.kEl propio Z-Feynman.
En cuanto a la segunda parte de su pregunta sobre las líneas perpendiculares que cruzan los distintos propagadores, esto se logra mejor utilizando un estilo personalizado que a su vez define una nueva decoración personalizada:
\RequirePackage{luatex85}
\documentclass[tikz,border=10pt]{standalone}
\usepackage[compat=1.1.0]{tikz-feynman}
\tikzfeynmanset{
crossed/.style={
/tikz/postaction={
/tikz/decoration={
show path construction,
lineto code={
\coordinate (tmp1) at ($(\tikzinputsegmentfirst)!5pt!(\tikzinputsegmentlast)$);
\draw
($(tmp1)!4pt!90:(\tikzinputsegmentlast)$)
-- ($(tmp1)!4pt!-90:(\tikzinputsegmentlast)$);
},
},
/tikz/decorate=true,
},
},
crossed'/.style={
/tikz/postaction={
/tikz/decoration={
show path construction,
lineto code={
\coordinate (tmp1) at ($(\tikzinputsegmentlast)!5pt!(\tikzinputsegmentfirst)$);
\draw
($(tmp1)!4pt!90:(\tikzinputsegmentlast)$)
-- ($(tmp1)!4pt!-90:(\tikzinputsegmentlast)$);
},
},
/tikz/decorate=true,
},
},
}
\begin{document}
\begin{tikzpicture}
\begin{feynman}
\vertex (i);
\vertex [right=2cm of i] (center);
\pgfmathsetmacro\vert{2 * sin(2 * pi / 6 r)};
\pgfmathsetmacro\horz{2 * cos(2 * pi / 6 r)}
\vertex [above right=\vert cm and \horz cm of center] (o1);
\vertex [below right=\vert cm and \horz cm of center] (o2);
\vertex (v1) at ($(center)!0.7!(i)$);
\vertex (v2) at ($(center)!0.7!(o1)$);
\vertex (v3) at ($(center)!0.7!(o2)$);
\diagram* [edges=double] {
(i) -- (v1) -- [crossed] (v2) -- [crossed] (v3) -- [crossed'] (v1),
(v2) -- [crossed] (o1),
(v3) -- [crossed] (o2),
};
\end{feynman}
\end{tikzpicture}
\end{document}
El postaction
asegura que lo que sigue (en este caso la decoración) quede dibujado encima. Luego le decimos que dibuje una decoración en postaction
, y el tipo de decoración es show path construction
.
Esta decoración es un tipo especializado de decoración que da acceso a \tikzinputsegmentfirst
y \tikzinputsegmentlast
y permite ejecutar código arbitrario. En este caso, creamos una coordenada temporal 5pt
lejos del inicio y la llamamos tmp1
, y luego dibujamos una línea recta que es 8pt
larga en un ángulo de 90 grados con respecto a la ruta original que pasa por tmp1
. Por conveniencia, también he definido un estilo complementario crossed'
que coloca la tmp1
coordenada 5pt
lejos del final.