\ pagedir TRT avec pgfpages provoque un résultat incorrect (décalage hors page)

Aug 19 2020

L'utilisation de \pagedir TRTavec \pgfpagesuselayout{2 on 1}[a4paper,border shrink=5mm,landscape]from pgfpagespackage produit des pages logiques à déplacer hors de la page.

Même problème avec mises en page 4 on 1, 8 on 1, 16 on 1.

% lualatex 
\documentclass{article}
\usepackage[showframe]{geometry}
\usepackage{pgfpages}

\pgfpagesuselayout{2 on 1}[a4paper,border shrink=5mm,landscape]

\begin{document}

\pagedir TRT \bodydir TRT \pardir TRT

\Huge 

Page 1
 
\newpage

Page 2

\end{document}

Mise à jour 22/08/2020

Je trouve une méthode pour déplacer les pages logiques en utilisant \pagerightoffset, le problème est que pour chaque mise en page, j'ai besoin d'ajouter manuellement la quantité de décalage.

Exemple avec une page de mise en page paysage 2 sur 1

% lualatex 
\documentclass{article}
\usepackage[showframe]{geometry}
\usepackage{pgfpages}


\pgfpagesuselayout{2 on 1}[a4paper,landscape]

\begin{document}

\pagerightoffset = .55\pgfphysicalwidth % <--
\pagedir TRT \bodydir TRT \pardir TRT 

\Huge 

Page 1
 
\newpage

Page 2

\end{document}

Réponses

3 DavidPurton Aug 19 2020 at 21:00

Je pense qu'il faudrait créer une nouvelle mise en page qui présente les pages RTL.

Je change une ligne dans la 2 on 1mise en page de:

center=\pgfpoint{.75\pgfphysicalwidth}{.5\pgfphysicalheight}%

à:

center=\pgfpoint{-.25\pgfphysicalwidth}{.5\pgfphysicalheight}%

Il est possible de le faire avec xpatch:

\usepackage{xpatch}
\expandafter\xpatchcmd\csname pgfpages@layout@2 on 1\endcsname
  {center=\pgfpoint{.75\pgfphysicalwidth}{.5\pgfphysicalheight}}
  {center=\pgfpoint{-.25\pgfphysicalwidth}{.5\pgfphysicalheight}}
  {}
  {}

Pour les mises en page avec plus de pages par page, vous aurez besoin de plusieurs appels xpatchcmd.

Exemple complet:

\documentclass{article}
\usepackage[showframe]{geometry}
\usepackage{pgfpages}

\pgfpagesdeclarelayout{rtl 2 on 1}
{
  \edef\pgfpageoptionheight{\the\paperwidth} % landscaped by default
  \edef\pgfpageoptionwidth{\the\paperheight}
  \def\pgfpageoptionborder{0pt}
  \def\pgfpageoptionfirstshipout{1}
}
{
  \pgfpagesphysicalpageoptions
  {%
    logical pages=2,%
    physical height=\pgfpageoptionheight,%
    physical width=\pgfpageoptionwidth,%
    current logical shipout=\pgfpageoptionfirstshipout%
  }
  \ifdim\paperheight>\paperwidth\relax
    % put side-by-side
    \pgfpageslogicalpageoptions{1}
    {%
      border shrink=\pgfpageoptionborder,%
      resized width=.5\pgfphysicalwidth,%
      resized height=\pgfphysicalheight,%
      center=\pgfpoint{.25\pgfphysicalwidth}{.5\pgfphysicalheight}%
    }%
    \pgfpageslogicalpageoptions{2}
    {%
      border shrink=\pgfpageoptionborder,%
      resized width=.5\pgfphysicalwidth,%
      resized height=\pgfphysicalheight,%
      center=\pgfpoint{-.25\pgfphysicalwidth}{.5\pgfphysicalheight}% <- Shift second page to left hand side
    }%
  \else
    % stack on top of one another
    \pgfpageslogicalpageoptions{1}
    {%
      border shrink=\pgfpageoptionborder,%
      resized width=\pgfphysicalwidth,%
      resized height=.5\pgfphysicalheight,%
      center=\pgfpoint{.5\pgfphysicalwidth}{.75\pgfphysicalheight}%
    }%
    \pgfpageslogicalpageoptions{2}
    {%
      border shrink=\pgfpageoptionborder,%
      resized width=\pgfphysicalwidth,%
      resized height=.5\pgfphysicalheight,%
      center=\pgfpoint{.5\pgfphysicalwidth}{.25\pgfphysicalheight}%
    }%
  \fi    
}

\pgfpagesuselayout{rtl 2 on 1}[a4paper,border shrink=5mm,landscape]

\usepackage[bidi=basic-r,nil]{babel}
\babelprovide[import,main]{arabic}
\babelfont{rm}{Amiri}
      
\begin{document}

\Huge 
نص من اليمين الى اليسار

 الصفحة الأولى 1

\newpage

\Huge 
نص من اليمين الى اليسار

الصفحة الثانية 2

\end{document}

SalimBou Aug 24 2020 at 22:01

Je trouve une solution qui inverse la coordonnée x à l'intérieur de chaque \pgfpointcommande comme celle-ci

\let\Pgfpoint\pgfpoint
\def\pgfpoint#1#2{\Pgfpoint{-1*#1}{#2}}

Ce patch doit être ajouté aux commandes pour pgfpagescontenir la commande \pgfpointpour limiter l'action du patch à l'intérieur d'autres commandes d'autres packages

% lualatex 
\documentclass{article}
\usepackage[showframe]{geometry}
\usepackage{pgfpages}


\let\Pgfpoint\pgfpoint
\def\pgfpoint#1#2{\Pgfpoint{-1*#1}{#2}}
\pgfpagesuselayout{4 on 1}[a4paper,landscape]

\begin{document}

\pagedir TRT \bodydir TRT \pardir TRT 

\Huge 

Page 1
 
\newpage

Page 2

\newpage

Page 3

\newpage

Page 4

\end{document}