0 votes
499 vues

J’essaie d’utiliser des hooks pour définir plusieurs bordures dans un document. Je peux définir la première et je peux désactiver les bordures, mais si j’essaie d’en définir une deuxième, elle revient simplement à la première.

\sethook{before}{mt1}{\def\PageBorder{path_to_border_1}}
\sethook{before}{imt1}{\def\PageBorder{}}
\sethook{before}{c}{\def\PageBorder{path_to_border_2}}

Que fais-je de mal ? Est-ce possible ?

Traduit automatiquement depuis English
PTXprint par (1,9k points) | 499 vues

5 Réponses

0 votes

Les experts en XeTeX peuvent probablement vous donner une meilleure réponse, mais nous avons réalisé un projet il y a quelques années où nous voulions une bordure spécifique pour la première page d’un livre, mais une bordure différente pour la deuxième page et les suivantes. Nous avons réussi cela en redéfinissant la macro pl@ceborder (l’une de ces macros que vous ne redéfinissez normalement pas…), et en utilisant la définition de PageBorder{}, ainsi qu’une nouvelle macro appelée PageBorderTwo{}. Il y a quelques commentaires dans le code ci-dessous, qui peuvent vous aider à comprendre comment cela fonctionne. Vous pouvez aussi simplement essayer sur un projet de test…

Jeff

% Define this to add a border to all pages, from a PDF file containing the graphic
%   "scaled <factor>" adjusts the size (1000 would keep the border at its original size)
% Can also use "xscaled 850 yscaled 950" to scale separately in each direction,
%   or "width 5.5in height 8in" to scale to a known size
%\def\PageBorder{"A5 page border.pdf" width 148.5mm height 210mm}
\def\PageBorder{}
% If \PageBorderTwo is defined, then shift to a different page border after
% the first page. This needs to be redefined after each \ptxfile, as it gets cleared out
\def\PageBorderTwo{}

%% Redefine the ptx2pdf macro which places the border, so that we can
%% shift to a different border after the first page, if \PageBorderTwo is defined
\catcode`\@=11   % allow @ to be used in the name of ptx2pdf macro we have to override
\def\pl@ceborder{\ifx\PageBorder\empty\else
  \setbox\b@rder=\hbox{\XeTeXpdffile \PageBorder \relax}%
  \setbox\b@rder=\vbox to \pdfpageheight{\vss
    \hbox to \pdfpagewidth{\hss\box\b@rder\hss}\vss}%
  \vbox to 0pt{% respect binding gutter, just like main page content
    \hbox to \pdfpagewidth{\hss\hbox{%
      \if\g@tterside L\kern\BindingGutter\fi
      \box\b@rder
      \if\g@tterside R\kern\BindingGutter\fi
    }\hss}
  \vss}% output \box\b@rder
  \ifx\PageBorderTwo\empty\else % we have a diff page 2 border, so shift to it
    \global\let\PageBorder=\PageBorderTwo
    \global\def\PageBorderTwo{} % clear page 2 border, so we don't have to set border box each time
  \fi
\fi}
\catcode`\@=12   % return to normal function
Traduit automatiquement depuis English
par (1,4k points)

Merci. Votre code m’a permis d’obtenir quelque chose qui fonctionne, bien que je trouve mon hack assez laid.

Mon intention était d’avoir quelques pages sans bordure. Pour faire fonctionner votre code, j’ai modifié ma troisième ligne comme suit :

\sethook{before}{c}{\def\PageBorder{path_to_border_2}\def\PageBorderTwo{path_to_border_2}}

J’ai dû faire cela parce que lorsque j’activais la 2e bordure, elle imprimait une page de la première bordure avant de basculer. Qu’est-ce qui, dans le code, indique « imprimer une page de la bordure 1, puis basculer à la bordure 2 » ?

En tout cas, à ce stade, je passe de « ça marche » à « je veux mieux comprendre xetex/pdf2ptx ».

Traduit automatiquement depuis English
0 votes

Le code définit la boîte de bordure, puis dans la partie commençant par :

\ifx\PageBorderTwo\empty\else

Il vérifie si PageBorderTwo est défini et, si c’est le cas, modifie PageBorder. Tel quel, le code de Jeff semble recharger le PDF de la bordure à chaque page, donc la modification de PageBorder prend effet la prochaine fois qu’il doit écrire une bordure. Si PageBorderTwo est vide, alors PageBorder restera tel qu’il était.

Si vous n’utilisez pas la version du code de Jeff, mais vous en tenez à l’original, qui ne recharge le PDF que lorsque la boîte est vide (par exemple, au début du document), nous pouvons en tirer parti avec des déclencheurs (triggers) et définir la boîte comme vide (void) chaque fois que nous voulons changer la bordure.
Si vous voulez changer la bordure à divers endroits du code, vous pourriez faire quelque chose comme ceci :

\makeatletter
\setcvhook{GEN1.1}{\def\PageBorder{path_to_border2}\setbox\b@rder\box\voidb@x}
\sethook{bookstart}{MAT}{\let\PageBorder\empty\setbox\b@rder\box\voidb@x} % No border for NT intro
\setcvhook{MAT1.1}{\def\PageBorder{path_to_border3}\setbox\b@rder\box\voidb@x}
\makeatother

Tout le code est totalement non testé !
(\voidb@x est simplement une boîte normale, mais personne ne devrait jamais y mettre quoi que ce soit, donc elle est toujours vide)

Traduit automatiquement depuis English
par (1,1k points)

Pour compléter la réponse de DavidG, la raison pour laquelle on utilise \setbox\b@rder\box\voidb@x est que les macros mettent en cache le pdf de la bordure dans box\b@rder. Par conséquent, changer le nom du fichier n’a aucun effet à moins que vous ne vidiez également la boîte de bordure mise en cache, forçant les macros à recharger le fichier la prochaine fois qu’une page est sortie.

Traduit automatiquement depuis English
0 votes

Merci pour les réponses. Cela m’aide à comprendre beaucoup mieux.

Je suis presque arrivé là où je veux être. À ce stade, je pense que mon problème ne vient pas du code pour activer, désactiver ou changer les bordures. Plutôt, il semble que mes hooks fonctionnent dans mon texte principal, mais pas dans les éléments préliminaires (front matter) que j’ai écrits dans PTXprint. Est-ce que cela a du sens ?

J’ai envoyé une archive au cas où cela vous aiderait à voir ce que je fais de mal.

Traduit automatiquement depuis English
par (1,9k points)
0 votes

Le problème est que les modifications sont effectuées dans un environnement local, de sorte qu’elles n’ont pas d’effet global

\sethook{before}{is2}{\global\let\PageBorder\empty\global\setbox\b@rder\box\voidb@x}

(Vous pourriez aussi utiliser \sethook{page}{2}, au cas où le sfm changerait, mais vous avez toujours besoin d’utiliser \global sur les paramètres des hooks de page si vous voulez qu’ils persistent. À titre d’information, c’est ainsi que j’ai trouvé la solution : j’ai changé le hook en page2, j’ai réalisé qu’il n’y avait pas de \global, que cela fonctionnait, et j’ai essayé \global pour votre point de hook original)

Traduit automatiquement depuis English
par (1,1k points)

Excellent ! Ça a parfaitement fonctionné.

Et savoir qu’il existe {page}{2} est très utile. J’avais en fait pensé qu’un tel hook serait utile, mais j’ai regardé dans la présentation du séminaire et je n’ai rien vu qui fasse référence aux numéros de page. Il serait bien d’écrire cette fonctionnalité quelque part (ou de me dire où elle est déjà documentée). J’ai regardé dans le manuel de référence technique, mais je ne l’ai pas trouvé.

Édition : Lorsque j’ai parcouru le reste de mon document, j’ai réalisé que le hook de la page 2 a été déclenché une 2e fois, car j’ai redémarré la numérotation des pages lorsque je suis arrivé au texte principal – c’est donc un inconvénient possible de l’utilisation de la numérotation des pages.

Traduit automatiquement depuis English
0 votes

C’est sur le côté droit de la moitié inférieure de la page 3 de la présentation sur les hooks, « Book and Page hooks », en bas à droite. Évident, hein ?
Je vais l’ajouter à la référence technique !

Traduit automatiquement depuis English
par (1,1k points)

En effet, il est là. Ce n’est pas évident quand je lis juste le long du côté gauche de la page et que je ne regarde nulle part ailleurs :frowning:

Traduit automatiquement depuis English
Pouvez-vous fournir un lien vers la présentation sur les hooks ? Il y a eu un certain nombre de modifications dans la documentation depuis ce message, et je n’ai pas été en mesure de trouver ces informations dans les Master Slides, ni dans aucune des autres présentations avancées trouvées ici : https://software.sil.org/ptxprint/documentation/
Traduit automatiquement depuis English
La présentation sur les hooks faisait partie du séminaire avancé d’utilisation de novembre/décembre 2022 (Karimu). Quelques autres présentations de cette période n’ont pas non plus été incluses dans le fichier MASTER, probablement parce qu’elles sont trop axées sur TeX. Je demande à MP s’il veut que je les fusionne dans MASTER, que je les mette dans quelque chose comme le fichier MASTER, que je les adapte pour un usage plus général, ou que je partage simplement un lien ici tel quel.
À ma connaissance, le dossier des présentations n’a pas été rendu public et n’était disponible que pour les participants. Je ne suis pas sûr de ce qui a motivé cette décision.
Traduit automatiquement depuis English

Questions connexes

0 votes
1 réponse 18 vues
Bonjour, J'essaie d'appliquer une bordure de page dans PTXprint, mais sans inclure les pages d'introduction. Lorsque j' ... \setcvhook pour cela ? Merci beaucoup pour votre aide !
Roger Beramgoto Nado 125 posée mars 25
0 votes
1 réponse 89 vues
Bonjour Je travaille sur une mise en page et je voulais limiter mes marges de page au chapitre 24, verset 10, comme ... règle que j'ai utilisée. Merci d'avance pour votre aide.
Roger Beramgoto Nado 125 posée déc. 13, 2024
0 votes
4 réponses 336 vues
Je souhaiterais avoir des bordures de page autour du texte biblique, mais pas autour des introductions. J'ai utilisé des ... du texte produit par l'homme (comme les Introductions).
jeffh 1,4k posée avr. 8, 2024
0 votes
1 réponse 155 vues
(J'ai l'impression de me souvenir d'une discussion à ce sujet, mais je ne la retrouve plus maintenant ) Sur un PDF ... de ne pas mettre de bordure autour des pages du livre GLO ?
jeffh 1,4k posée mai 10, 2021
0 votes
2 réponses 201 vues
Je voudrais imprimer plusieurs livres (les 5 T plus Philémon). 1Th se termine par 5 lignes en haut de la ... utilisée. Est-ce possible avec PTXPrint ? Merci pour toute aide.
Paul 642 posée juin 2, 2021
Welcome to Support Bible, where you can ask questions and receive answers from other members of the community.
I urge you, brothers and sisters, to watch out for those who cause divisions and put obstacles in your way that are contrary to the teaching you have learned. Keep away from them.
Romans 16:17
3,045 questions
6,005 réponses
5,671 commentaires
2,026 utilisateurs