0 votos
498 vistas

Estoy intentando usar ganchos (hooks) para establecer múltiples bordes en un documento. Puedo establecer el primero y puedo desactivar los bordes, pero si intento establecer un segundo, simplemente vuelve al primero.

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

¿Qué estoy haciendo mal? ¿Es posible?

Traducción automática desde English
PTXprint por (1,9k puntos) | 498 vistas

5 Respuestas

0 votos

Los expertos en XeTeX probablemente puedan darte una mejor respuesta, pero realizamos un proyecto hace unos años en el que queríamos un borde específico para la primera página de un libro, pero un borde diferente para la segunda y las páginas siguientes. Logramos esto redefiniendo la macro pl@ceborder (una de esas macros que normalmente no se redefinen…), y usando la definición de PageBorder{}, y una nueva macro llamada PageBorderTwo{}. Hay algunos comentarios en el código a continuación, que pueden ayudarte a entender cómo funciona. También podrías simplemente probarlo en un proyecto de prueba…

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
Traducción automática desde English
por (1,4k puntos)

Gracias. Tu código me dio algo que funciona, aunque encuentro mi solución bastante fea.

Mi intención era tener algunas páginas sin borde. Para hacer que tu código funcionara, cambié mi tercera línea a:

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

Tuve que hacer esto porque cuando activaba el segundo borde, imprimía una página con el primer borde antes de cambiar. ¿Qué hay en el código que dice “imprimir una página con el borde 1 y luego cambiar al borde 2”?

De todos modos, en este punto estoy pasando de “funciona” a “quiero entender mejor xetex/pdf2ptx”.

Traducción automática desde English
0 votos

El código define la caja del borde y luego en la parte que comienza:

\ifx\PageBorderTwo\empty\else

Comprueba si PageBorderTwo está definido y, de ser así, cambia PageBorder. Tal como está, el código de Jeff parece recargar el PDF del borde en cada página, por lo que cambiar PageBorder surte efecto la próxima vez que tenga que escribir un borde. Si PageBorderTwo está vacío, PageBorder se mantendrá como estaba.

Si no usas la versión del código de Jeff, sino que te ciñes a la original, que solo recarga el PDF cuando la caja está vacía (p. ej., al inicio del documento), podemos aprovechar esto con ganchos (triggers) y establecer la caja como vacía (void) cada vez que queramos cambiar el borde.
Si quieres cambiar el borde en varios lugares del código, podrías hacer algo como esto:

\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

¡Todo el código está totalmente sin probar!
(\voidb@x es simplemente una caja normal, pero nadie debería poner nada en ella, por lo que siempre está vacía)

Traducción automática desde English
por (1,1k puntos)

Para ampliar la respuesta de DavidG, la razón de \setbox\b@rder\box\voidb@x es que las macros almacenan en caché el pdf del borde en box\b@rder. Por lo tanto, cambiar el nombre del archivo no tiene efecto a menos que también se borre la caja del borde en caché, obligando a las macros a recargar el archivo la próxima vez que se imprima una página.

Traducción automática desde English
0 votos

Gracias por las respuestas. Eso me ayuda a entenderlo mucho mejor.

Estoy casi en el punto al que quiero llegar. En este momento creo que mi problema no es con el código para activar, desactivar o cambiar los bordes. Más bien, parece que mis ganchos (hooks) funcionan en mi texto principal, pero no en el material preliminar que escribí dentro de PTXprint. ¿Tiene sentido?

He enviado un archivo comprimido por si eso ayuda a ver qué estoy haciendo mal.

Traducción automática desde English
por (1,9k puntos)
0 votos

El problema es que los cambios se están realizando en algún tipo de entorno local, por lo que no tienen efecto global

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

(También podrías usar \sethook{page}{2}, por si el sfm cambia, pero siempre necesitas usar \global en los ajustes desde ganchos de página si quieres que duren. Por cierto, así es como llegué a la solución: cambié el gancho a page2, me di cuenta de que no había \global, eso funcionó y probé \global para tu punto de gancho original)

Traducción automática desde English
por (1,1k puntos)

¡Genial! Funcionó perfectamente.

Y saber sobre {page}{2} es muy útil. De hecho, pensé que un gancho así sería útil, pero busqué en la presentación del taller y no vi nada que hiciera referencia a números de página. Sería bueno que esa funcionalidad estuviera documentada en algún lugar (o que me dijeran dónde ya está documentada). Busqué en el manual de referencia técnica, pero no pude encontrarlo.

Edición: Cuando revisé el resto de mi documento, me di cuenta de que el gancho de la página 2 se activó una segunda vez porque reinicié la numeración de páginas cuando llegué al texto principal; por lo tanto, ese es un posible inconveniente de usar la numeración de páginas.

Traducción automática desde English
0 votos

Está en el lado derecho de la mitad inferior de la página 3 de la presentación de ganchos, ‘Book and Page hooks’, abajo a la derecha. ¿Obvio, eh?
¡Lo añadiré a la referencia técnica!

Traducción automática desde English
por (1,1k puntos)

Claro que sí, ahí está. No es obvio cuando solo estoy leyendo por el lado izquierdo de la página y no miro en otra parte :frowning:

Traducción automática desde English
¿Puedes proporcionar un enlace a la presentación de ganchos? Ha habido una serie de cambios en la documentación desde esta publicación, y no pude encontrar esta información en las Diapositivas Maestras (Master Slides), ni en ninguna de las otras presentaciones avanzadas que se encuentran aquí: https://software.sil.org/ptxprint/documentation/
Traducción automática desde English
La presentación de ganchos formaba parte del taller avanzado de uso de noviembre/diciembre de 2022 (Karimu). Algunas otras presentaciones de ese taller tampoco terminaron en la versión MASTER, probablemente porque son demasiado específicas de TeX. Le estoy preguntando a MP si quiere que las integre en MASTER, que las ponga en algo como el archivo MASTER, que las adapte para un uso más general o que simplemente comparta un enlace a aquí tal como están.
Por lo que sé, la carpeta de presentaciones no se hizo pública y solo se puso a disposición de los participantes. No estoy seguro de qué motivó esa decisión.
Traducción automática desde English

Preguntas relacionadas

0 votos
1 respuesta 18 vistas
Hola, Estoy intentando aplicar un borde de página en PTXprint, pero sin incluir las páginas de la introducción. Cuando ... de \setcvhook para esto? Muchas gracias por su ayuda!
Roger Beramgoto Nado 125 preguntada mar 25
0 votos
1 respuesta 89 vistas
Hola Estoy trabajando en un diseño y quería limitar los bordes de mis páginas hasta el capítulo 24, versículo 10, como se ... de la regla que usé. Gracias de antemano por su ayuda.
Roger Beramgoto Nado 125 preguntada dic 13, 2024
0 votos
4 respuestas 336 vistas
Me gustaría que hubiera bordes de página alrededor del texto bíblico, pero no alrededor de las introducciones. En el ... del texto producido por humanos (como las Introducciones).
jeffh 1,4k preguntada abr 8, 2024
0 votos
1 respuesta 155 vistas
(Parece que recuerdo una discusión al respecto, pero no la encuentro ahora ) En un PDF que estoy produciendo con ... ponga el borde alrededor de las páginas del libro GLO?
jeffh 1,4k preguntada may 10, 2021
0 votos
2 respuestas 201 vistas
Me gustaría imprimir varios libros (los 5 T más Filemón). 1 Tesalonicenses termina con 5 líneas en la parte ... usar. Es posible con PTXPrint? Gracias por cualquier ayuda.
Paul 642 preguntada jun 2, 2021
Welcome to Support Bible, where you can ask questions and receive answers from other members of the community.
May the God who gives endurance and encouragement give you the same attitude of mind toward each other that Christ Jesus had.
Romans 15:5
3,045 preguntas
6,005 respuestas
5,671 comentarios
2,026 usuarios