Eu gostaria de fazer o seguinte diagrama
usando TikZ
(O diagrama acima foi feito usando feynmf
pacote). Até agora escrevi isto:
\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}
e obtive isso
No entanto, não consigo descobrir como diminuir o comprimento das linhas externas. Além disso, não consigo descobrir como fazer linhas cruzadas como na primeira figura. Alguma sugestão?
Responder1
Se você for usar os algoritmos de posicionamento automático emTikZ-Feynman(CTAN), infelizmente não há uma maneira direta de encurtar as linhas externas, pois o algoritmo subjacente não tem ideia de quais linhas são externas.
É possível ajustar até que ponto as bordas são desenhadas com shorten <=(distance)
e shorten >=(distance)
(a diferença é se corta o início do fim); mas isso afeta apenas odesenhoda borda e não a maneira como o algoritmo trata o comprimento da borda e, como resultado, eu realmente não recomendaria usar isso. Em particular, isso parecerá estranho se usado em conjunto com o particle
estilo, pois o texto estará muito distante do final da linha.
No seu caso, uma maneira bacana de alcançar o resultado desejado é aproveitar as vantagens da geometria simples:
\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}
Isto inicialmente coloca todos os vértices externos 2cm
do center
vértice. Em seguida v1
, ele coloca cada vértice v2
e na distância entre o centro e o vértice externo desejado.v3
0.7
Sei que esta solução é muito específica para o layout acima e não é nada geral. Porém, de maneira mais geral, você pode ajustar as distâncias no arquivo above right=(distance) and (distance) of (vertex)
. Existem muitos outros exemplos que fazem uso disso neste site, e há exemplos disso na documentação do TikO próprio Z-Feynman.
Quanto à segunda parte da sua pergunta sobre as linhas perpendiculares que cruzam os vários propagadores, isso é melhor conseguido usando um estilo personalizado que define uma nova decoração 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}
O postaction
garante que o que se segue (neste caso a decoração) seja desenhado por cima. Em seguida, dizemos para ele desenhar uma decoração em postaction
, e o tipo de decoração é show path construction
.
Esta decoração é um tipo especializado de decoração que dá acesso a \tikzinputsegmentfirst
e \tikzinputsegmentlast
e permite a execução de código arbitrário. Nesse caso, criamos uma coordenada temporária 5pt
distante do início e a chamamos de tmp1
, e então desenhamos uma linha reta que 8pt
forma um ângulo de 90 graus em relação ao caminho original que passa por tmp1
. Por conveniência, também defini um estilo complementar crossed'
que afasta a tmp1
coordenada 5pt
do final.