Длина внешних линий в диаграммах Фейнмана (TikZ)

Длина внешних линий в диаграммах Фейнмана (TikZ)

Я хотел бы сделать следующую диаграмму

ЯНеПонимаюПочемуЭтаФигураСтановитсяЧернойПриИзмененииРазмера

с использованием TikZ(Приведенная выше диаграмма была сделана с использованием feynmfпакета). Пока что я написал следующее:

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

и получил это

диаграмма2

Однако я не могу понять, как уменьшить длину внешних линий. Кроме того, я не могу понять, как сделать линии перекрещенными, как на первом рисунке. Есть предложения?

решение1

Если вы собираетесь использовать алгоритмы автоматического размещения вТикZ-Фейнман(КТАН), то, к сожалению, нет простого способа сократить внешние линии, поскольку базовый алгоритм не имеет представления о том, какие линии являются внешними.

Можно настроить, насколько далеко будут отрисованы края, с помощью shorten <=(distance)и shorten >=(distance)(разница в том, обрезает ли он начало конца); но это влияет только нарисунокребра, а не того, как алгоритм обрабатывает длину ребра, и в результате я бы не рекомендовал использовать это. В частности, это будет выглядеть странно, если использовать его вместе со стилем, particleтак как текст будет находиться далеко от конца строки.

В вашем случае, изящный способ достижения желаемого результата — воспользоваться простой геометрией:

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

выход

Это изначально размещает все внешние вершины 2cmиз centerвершины. Затем это размещает каждую вершину v1, v2и на расстоянии между центром и желаемой внешней вершиной.v30.7

Я понимаю, что это решение очень специфично для макета выше и не является общим вообще. Но в более общем плане вы можете настроить расстояния в above right=(distance) and (distance) of (vertex). На этом сайте есть много других примеров, которые используют это, и есть примеры этого в документации для TiкСам Z-Фейнман.

Что касается второй части вашего вопроса относительно перпендикулярных линий, пересекающих различные пропагаторы, то этого лучше всего добиться с помощью пользовательского стиля, который сам по себе определяет новое пользовательское оформление:

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

выход

Гарантирует postaction, что то, что следует за ним (в данном случае украшение), будет нарисовано сверху. Затем мы говорим ему нарисовать украшение в postaction, а тип украшения — show path construction.

Это украшение — специализированный вид украшения, который дает доступ к \tikzinputsegmentfirstи \tikzinputsegmentlast, и позволяет выполнять произвольный код. В этом случае мы создаем временную координату 5ptвдали от начала и называем ее tmp1, а затем рисуем прямую линию, которая 8ptдлинна и расположена под углом 90 градусов к исходному пути, проходящему через tmp1. Для удобства я также определил дополнительный стиль crossed', который размещает tmp1координату 5ptвдали от конца.

Связанный контент