METAPOST: Diagrama de Feynman recortado com XeLaTeX

METAPOST: Diagrama de Feynman recortado com XeLaTeX

O código a seguir fornece resultados corretos com PDFLaTex, mas se eu executar o XeLaTeX (o que preciso fazer para o documento completo), parte da linha gluon será cortada.

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

Como posso evitar isso?

Editar: Alteradas \documentclass{minimal}e \documentclass{article}adicionadas imagens abaixo da diferença na saída (do usuário Dr. Manuel Kuehner):

pdflatex

insira a descrição da imagem aqui

xelatex

insira a descrição da imagem aqui

Responder1

Este é provavelmente apenas o começo de uma resposta, porque não tenho certeza de qual é a melhor maneira de resolver esse problema.

O problema é que a parte inferior do glúon fica fora da caixa delimitadora do gráfico gerado pelo Metapost e xetexé extremamente zeloso com isso e recorta a figura na caixa delimitadora; pdftexé mais descontraído e inclui tudo, até o pedaço do glúon que deveria ser cortado. Portanto, é difícil dizer que o xetex é o culpado - se alguma coisa eu diria que o pdftex deveria ser "corrigido".

Mas como o glúon é desenhado para fora da caixa delimitadora?

Normalmente o Metapost irá calcular e definir a caixa delimitadora automaticamente para incluir todos os elementos de um desenho. Mas a linguagem também fornece um setboundscomando que permite definir arbitrariamente a caixa delimitadora em qualquer ponto durante um desenho. Uma utilização disso é criar uma margem de espaço em branco ao redor do desenho, por exemplo.

A \end{fmfgraph*}linha em seu código-fonte faz com que o desenho seja finalizado e todos os comandos relevantes escritos no arquivo Metapost, seguido finalmente pela macro Metapost endchar;. Na verdade, o arquivo MP completo fica assim:

% 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;

Observe que na parte superior você está incluindo feynmp.mpe que a última macro chamada, antes do comando primitivo end, é endchar;. Se você olhar em feynmp.mpseu sistema, verá que endcharestá definido da seguinte forma:

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;

Numa questão de organização, o autor do pacote decidiu cortar a imagem para que ela caiba em uma caixa definida pelos parâmetros we h(que são, obviamente, definidos para a largura e altura que você definiu com \begin{fmfgraph*}(8,5)). Na verdade, esse setboundscomando não altera nenhum dos comandos de desenho, apenas faz com que o MP grave a caixa delimitadora especificada no PostScript que ele produz. Portanto, quando o xetex obedece "corretamente" às ​​dimensões da caixa delimitadora, o glúon é cortado, mas quando o pdftex ignora "utilmente" a caixa delimitadora, o pé do glúon ainda é desenhado.

A solução óbvia (na minha humilde opinião) é remover toda a linha:

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

Se você editar sua cópia local, descobrirá que xetexprocessa seu arquivo corretamente, assim:

insira a descrição da imagem aqui

exceto que, como você verá imediatamente, por algum motivo os rótulos agora estão todos deslocados para a direita!

Olhando um pouco mais de perto o que está acontecendo, parece que as macros de desenho de rótulos fazem suposições sobre o tamanho da figura, e é por isso que o setboundscomando é necessário.

Minha solução de hack é consertar beginchartambém, de forma que desenhe uma caixa invisível antes de começarmos. Minha cópia de feynmp.mpagora está assim:

...
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;
...

e sua foto sai xetexassim:

insira a descrição da imagem aqui

(A linha cinza visível na parte inferior desta imagem mostra onde está a parte inferior da caixa "invisível". Este é um artefato produzido pelo ImageMagick quando converto o pdf em png. Não vejo esse artefato no PDF versão).

A razão pela qual estou hesitante sobre esta solução é que parece errado dizer para você corrigir sua cópia do feynmp.mp, pois você terá que refazer quaisquer alterações ao atualizar. Mas pode ser a maneira mais simples de consertar as coisas no curto prazo.

No meu sistema macos com MacTeX 2016 o arquivo está em

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

mas pode estar em algum outro lugar do seu sistema. Existem vários mecanismos para corrigir pacotes LaTeX, mas não sei como aplicá-los aos arquivos fonte do Metapost. Você também pode considerar criar uma árvore texmf local com uma cópia "fixa" do arquivo feynmp.mp. Você também pode considerar levantar um bug com o autor do pacote.

informação relacionada