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
xelatex
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 setbounds
comando 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.mp
e que a última macro chamada, antes do comando primitivo end
, é endchar;
. Se você olhar em feynmp.mp
seu sistema, verá que endchar
está 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 w
e h
(que são, obviamente, definidos para a largura e altura que você definiu com \begin{fmfgraph*}(8,5)
). Na verdade, esse setbounds
comando 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 xetex
processa seu arquivo corretamente, assim:
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 setbounds
comando é necessário.
Minha solução de hack é consertar beginchar
também, de forma que desenhe uma caixa invisível antes de começarmos. Minha cópia de feynmp.mp
agora 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 xetex
assim:
(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.