METAPOST: XeLaTeX로 자른 Feynman 다이어그램

METAPOST: XeLaTeX로 자른 Feynman 다이어그램

다음 코드는 PDFLaTex로 올바른 결과를 제공하지만 XeLaTeX(전체 문서에 대해 수행해야 함)를 실행하면 글루온 선의 일부가 잘립니다.

\documentclass{article}
\usepackage{feynmp-auto}

\begin{document}
  \begin{fmffile}{fgraph_qxq_z_gz_s}
    \setlength{\unitlength}{0.5cm}
    \begin{fmfgraph*}(8,5)
    \fmfleft{i0,i1}
    \fmfright{o0,o1}
      \fmf{fermion   , label=$\overline{q}$}{w0,i0}
      \fmf{fermion   , label=$q         $}{i1,w0}
      \fmf{boson     , label=$Z^0       $}{w0,w1}
      \fmf{gluon     , label=$g         $}{w1,o0}
      \fmf{boson     , label=$Z^0       $}{w1,o1}
    \end{fmfgraph*}
  \end{fmffile}
\end{document}

이것을 어떻게 피합니까?

편집하다: 출력 차이에 대한 아래 이미지 \documentclass{minimal}로 변경 및 추가되었습니다(사용자 Dr. Manuel Kuehner):\documentclass{article}

pdf라텍스

여기에 이미지 설명을 입력하세요

젤라텍스

여기에 이미지 설명을 입력하세요

답변1

이 문제를 해결하는 가장 좋은 방법이 무엇인지 확신할 수 없기 때문에 이것은 아마도 답변의 시작일 뿐입니다.

문제는 글루온의 바닥이 Metapost에 의해 생성된 그래픽의 경계 상자 외부에 떨어지고 xetex이에 대해 매우 열성적이어서 그림을 경계 상자에 맞춰 자른다는 것입니다. pdftex더 편안하고 모든 것을 포함합니다. 심지어 잘라야 할 글루온의 일부까지 포함합니다. 따라서 xetex에 결함이 있다고 말하기는 어렵습니다. 만약 pdftex가 "수정"되어야 한다고 말하고 싶습니다.

하지만 글루온은 어떻게 경계 상자 외부로 그려지나요?

일반적으로 Metapost는 도면의 모든 요소를 ​​포함하도록 경계 상자를 자동으로 계산하고 설정합니다. 그러나 언어는 setbounds그리는 동안 언제든지 경계 상자를 임의로 설정할 수 있는 명령도 제공합니다. 예를 들어, 이 기능의 한 가지 용도는 그림 주위에 공백 여백을 만드는 것입니다.

소스 코드의 줄 \end{fmfgraph*}을 사용하면 도면이 마무리되고 모든 관련 명령이 Metapost 파일에 기록되고 마지막으로 Metapost 매크로가 작성됩니다 endchar;. 실제로 완성된 MP 파일은 다음과 같습니다.

% fgraph_qxq_z_gz_s.mp -- do not edit, generated automatically by glue.tex
input feynmp
require_RCS_revision "1.30";
beginchar(1, 8*14.22636pt#, 5*14.22636pt#, 0);
"feynmf: 1";
LaTeX_unitlength:=14.22636pt;
subgraph (0, 0, w, h);
vinit;
pickup pencircle scaled thin;
vleft (__i0, __i1);
vright (__o0, __o1);
vconnect ("fermion , label=$\overline {q}$", __w0, __i0);
vconnect ("fermion , label=$q $", __i1, __w0);
vconnect ("boson , label=$Z^0 $", __w0, __w1);
vconnect ("gluon , label=$g $", __w1, __o0);
vconnect ("boson , label=$Z^0 $", __w1, __o1);
vfreeze;
vdraw;
endsubgraph;
endchar;
% the end.
end.
endinput;

맨 위에는 포함되어 feynmp.mp있으며 기본 명령 이전에 호출된 마지막 매크로는 end입니다 endchar;. feynmp.mp시스템을 살펴보면 다음 endchar과 같이 정의되어 있음을 알 수 있습니다.

vardef endchar =
  setbounds currentpicture to (0,0)--(w,0)--(w,h)--(0,h)--cycle;
  if LaTeX_file <> "":
    write EOF to LaTeX_file;
    LaTeX_file := "";
  fi
  endfig
enddef;

깔끔하게 정리하기 위해 패키지 작성자는 wh매개변수(물론 로 정의한 너비와 높이로 설정됨 \begin{fmfgraph*}(8,5))로 정의된 상자에 맞도록 그림을 자르기로 결정했습니다. 이 setbounds명령은 실제로 그리기 명령을 변경하지 않으며 단지 MP가 생성된 PostScript에 지정된 경계 상자를 쓰도록 합니다. 따라서 xetex가 경계 상자 크기를 "올바르게" 준수하면 글루온이 잘리지만 pdftex가 경계 상자를 "유용하게" 무시하면 글루온의 발은 여전히 ​​그려집니다.

내 겸손한 의견으로는 확실한 해결책은 전체 줄을 제거하는 것입니다.

setbounds currentpicture to (0,0)--(w,0)--(w,h)--(0,h)--cycle;

로컬 복사본을 편집하면 xetex다음과 같이 파일이 올바르게 처리되는 것을 볼 수 있습니다.

여기에 이미지 설명을 입력하세요

단, 바로 보시다시피 어떤 이유로 라벨이 모두 오른쪽으로 오프셋되어 있습니다!

무슨 일이 일어나고 있는지 좀 더 자세히 살펴보면 레이블 그리기 매크로가 그림의 크기에 대해 가정하는 것으로 보이며 이것이 명령 setbounds이 필요한 이유입니다.

내 해킹 솔루션도 수정하여 beginchar시작하기 전에 보이지 않는 상자를 그리는 것입니다. 내 사본은 feynmp.mp다음과 같습니다.

...
vardef beginchar (expr c, wd, ht, dp) =
  LaTeX_file := "";
  beginfig(c);
    w:=wd;
    h:=ht;
    % new line added here to draw an "invisible" box
    undraw (0,0)--(w,0)--(w,h)--(0,h)--cycle;
enddef;
string LaTeX_file;
vardef endchar =
  % next line removed
  % setbounds currentpicture to (0,0)--(w,0)--(w,h)--(0,h)--cycle;
  if LaTeX_file <> "":
    write EOF to LaTeX_file;
    LaTeX_file := "";
  fi
  endfig
enddef;
...

그리고 당신의 사진은 다음과 같이 나옵니다 xetex:

여기에 이미지 설명을 입력하세요

(이 그림 하단에 보이는 회색 선은 "보이지 않는" 상자의 하단이 어디에 있는지 보여줍니다. 이것은 PDF를 png로 변환할 때 ImageMagick에서 생성된 가공물입니다. PDF에는 해당 가공물이 표시되지 않습니다. 버전).

feynmp.mp제가 이 솔루션을 주저하는 이유 는 업그레이드할 때 변경 사항을 다시 수행해야 하기 때문에 의 복사본을 패치하라고 말하는 것이 완전히 잘못되었다고 느끼기 때문입니다 . 하지만 단기적으로 문제를 해결하는 가장 간단한 방법일 수 있습니다.

MacTeX 2016이 설치된 Macos 시스템에서 파일은 다음 위치에 있습니다.

/usr/local/texlive/2016/texmf-dist/metapost/feynmf/feynmp.mp

하지만 시스템의 다른 곳에 있을 수도 있습니다. LaTeX 패키지를 패치하는 다양한 메커니즘이 있지만 Metapost 소스 파일에 적용하는 방법을 모르겠습니다. . feynmp.mp​패키지 작성자에게 버그를 제기하는 것도 고려할 수 있습니다.

관련 정보