comportamento diverso lualatex e xelatex utilizzando pacchetti crop e tikzpagenodes

Aug 18 2020

Utilizzando il tikzpagenodespacchetto per posizionare gli elementi nella pagina, ho notato che durante il caricamento del croppacchetto XeLaTeXe LuaLaTeXhanno un comportamento diverso.

XeLaTeXcalcola in modo errato le current page nodecoordinate. Per ottenere le coordinate corrette, il current page nodedovrebbe essere spostato usando hoffsete voffset.

Lo spettacolo MWE sotto, due rettangoli che coprono il current page node. Quello blu è il nodo calcolato da tikzpagenodes; quello rosso è stato spostato per avere il rettangolo corretto con XeLaTeX.

\documentclass{article}
\usepackage{calc}
\usepackage[
%
  paperwidth = 210mm, 
  paperheight = 270mm,
  includefoot,
  includemp,
  nomarginpar,
%  textwidth
%  textheight
% marginparwidth
% marginparsep
  inner = 19.2mm+10mm,
  outer = 19.2mm+10mm,
  top = 14.6mm,
  bottom = 10.8mm,
  bindingoffset = 5.4mm,
%  showcrop
]%
{geometry}

\usepackage%
[
cam,
width = 230mm,
height = 290mm,
center]%
{crop}

\usepackage{tikzpagenodes}
\usetikzlibrary{calc}


\begin{document}
\tikz[remember picture,overlay] {%
\draw [blue,line width=2mm]
(current page.south west)
rectangle
(current page.north east)
;

\draw [red,line width=2mm]
($(current page.south west)+ (-\hoffset, \voffset)$)
rectangle
($(current page.north east)+ (-\hoffset, \voffset)$)
;
}%
\end{document}

Correggi output con LuaLaTeX:

Output errato con XeLaTeX:

Risposte

muzimuzhiZ Aug 18 2020 at 22:47

Immagino che questo sia causato da un errore di battitura nel pgffile del driver di xetex, e il problema è stato segnalato a pgf, vederehttps://github.com/pgf-tikz/pgf/issues/909. Il pacchetto cropimposta un valore diverso da zero \hoffsete \voffset, che scoprono il problema.

Il frammento di codice seguente può essere utilizzato come soluzione alternativa a breve termine.

% after tikz is loaded
\usepackage{iftex}

\makeatletter
\ifXeTeX
  \def\pgf@sys@pdf@mark@pos@pgfpageorigin{\pgfqpoint{\hoffset}{\voffset}}
\fi
\makeatother

Un esempio completo:

\documentclass{article}
\usepackage{calc}
\usepackage[
  paperwidth = 210mm, 
  paperheight = 270mm,
  includefoot,
  includemp,
  nomarginpar,
%  textwidth
%  textheight
% marginparwidth
% marginparsep
  inner = 19.2mm+10mm,
  outer = 19.2mm+10mm,
  top = 14.6mm,
  bottom = 10.8mm,
  bindingoffset = 5.4mm,
%  showcrop
]%
{geometry}

\usepackage[
  cam,
  width = 230mm,
  height = 290mm,
  center
]%
{crop}

\usepackage{tikz}
\usepackage{iftex}

\makeatletter
\ifXeTeX
  \def\pgf@sys@pdf@mark@pos@pgfpageorigin{\pgfqpoint{\hoffset}{\voffset}}
\fi
\makeatother

\begin{document}
\tikz[remember picture,overlay]
  \draw [blue,line width=2mm]
    (current page.south west) rectangle (current page.north east);
\end{document}

PS: Node current pageè fornito direttamente da tikz, quindi non è necessario caricare il tikzpagenodespacchetto.