0 votos
502 visualizações

Estou tentando usar ganchos (hooks) para definir múltiplas bordas em um documento. Consigo definir a primeira e também desativar as bordas, mas, se tento definir uma segunda, ela simplesmente volta para a primeira.

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

O que estou fazendo de errado? Isso é possível?

Tradução automática de English
PTXprint por (1,9k pontos) | 502 visualizações

5 Respostas

0 votos

Os especialistas em XeTeX provavelmente podem dar uma resposta melhor, mas fizemos um projeto há alguns anos em que queríamos uma borda específica para a primeira página de um livro, mas uma borda diferente para a segunda e as páginas subsequentes. Conseguíamos isso redefinindo a macro pl@ceborder (uma daquelas macros que normalmente você não redefiniria…), e usando a definição de PageBorder{}, e uma nova macro chamada PageBorderTwo{}. Há alguns comentários no código abaixo, que podem ajudar você a entender como funciona. Você também pode simplesmente tentar em um projeto de teste…

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
Tradução automática de English
por (1,4k pontos)

Obrigado. Seu código me deu algo que funciona, embora eu ache meu hack bastante feio.

Minha intenção era ter algumas páginas sem borda. Para fazer seu código funcionar, mudei minha terceira linha para:

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

Tive que fazer isso porque, quando eu ativava a 2ª borda, ela imprimia uma página da primeira borda antes de fazer a troca. O que é no código que diz “imprimir uma página da borda 1, depois trocar para a borda 2”?

De qualquer forma, neste ponto estou passando de “funciona” para “quero entender melhor o xetex/pdf2ptx”.

Tradução automática de English
0 votos

O código define a caixa da borda e, na parte que começa com:

\ifx\PageBorderTwo\empty\else

Ele verifica se PageBorderTwo está definido e, se estiver, altera PageBorder. Como está dado, o código do Jeff parece recarregar o PDF da borda a cada página, então a alteração de PageBorder entra em vigor na próxima vez que precisar escrever uma borda. Se PageBorderTwo estiver vazio, PageBorder permanecerá como estava.

Se você não usar a versão do código do Jeff, mas se ater à original, que só recarrega o PDF quando a caixa está vazia (por exemplo, no início do documento), podemos aproveitar isso com gatilhos (triggers) e definir a caixa como vazia (void) sempre que quisermos mudar a borda.
Se você quiser mudar a borda em vários lugares no código, poderia fazer algo assim:

\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 o código é totalmente não testado!
(\voidb@x é apenas uma caixa normal, mas ninguém deveria colocar nada nela, portanto, ela está sempre vazia)

Tradução automática de English
por (1,1k pontos)

Para expandir a resposta do DavidG, a razão para \setbox\b@rder\box\voidb@x é que as macros fazem cache do pdf da borda em box\b@rder. Portanto, alterar o nome do arquivo não tem efeito, a menos que você também limpe a caixa da borda em cache, forçando as macros a recarregar o arquivo na próxima vez que uma página for emitida.

Tradução automática de English
0 votos

Obrigado pelas respostas. Isso me ajuda a entender muito melhor.

Estou quase chegando aonde quero. Neste ponto, acho que meu problema não está no código para ligar, desligar ou alternar as bordas. Em vez disso, parece que meus ganchos funcionam no meu texto principal, mas não no material preliminar que escrevi dentro do PTXprint. Isso faz sentido?

Enviei um arquivo compactado (archive) caso isso ajude vocês a ver o que estou fazendo de errado.

Tradução automática de English
por (1,9k pontos)
0 votos

O problema é que as alterações estão sendo feitas em algum tipo de ambiente local, então elas não têm efeito global

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

(Você também poderia usar \sethook{page}{2}, caso o sfm mude, mas você sempre precisa usar \global nas configurações de ganchos de página se quiser que elas durem. Aliás, foi assim que cheguei à solução - mudei o gancho para a página 2, percebi que não havia \global, funcionou e tentei \global para o ponto de gancho original de você)

Tradução automática de English
por (1,1k pontos)

Brilhante! Funcionou perfeitamente.

E saber sobre {page}{2} é muito útil. Na verdade, eu tinha pensado que um gancho assim seria útil, mas olhei na apresentação do workshop e não vi nada que referenciasse números de página. Seria bom documentar essa funcionalidade em algum lugar (ou me dizer onde já está documentada). Procurei no manual de Referência Técnica, mas não consegui encontrar.

Edição: Quando olhei o resto do meu documento, percebi que o gancho da página 2 foi acionado uma 2ª vez, pois reiniciei a numeração das páginas quando cheguei ao texto principal – então, esse é um possível inconveniente de usar a numeração de páginas.

Tradução automática de English
0 votos

Está no lado direito da metade inferior da página 3 da apresentação de ganchos, ‘Book and Page hooks’, canto inferior direito. Óbvio, né?
Vou adicioná-lo à referência técnica!

Tradução automática de English
por (1,1k pontos)

Com certeza, está lá. Não é óbvio quando estou apenas lendo pelo lado esquerdo da página e não olhando para nenhum outro lugar :frowning:

Tradução automática de English
Você pode fornecer um link para a apresentação de ganchos? Houve uma série de alterações na documentação desde esta publicação e não consegui encontrar essas informações nos Master Slides, nem em nenhuma das outras apresentações avançadas encontradas aqui: https://software.sil.org/ptxprint/documentation/
Tradução automática de English
A apresentação de ganchos fazia parte do workshop avançado de uso de novembro/dezembro de 2022 (Karimu). Algumas outras apresentações daquela vez também não entraram na MASTER, provavelmente porque são muito específicas do TeX. Estou perguntando ao MP se ele quer que eu as incorpore à MASTER, as coloque em algo como o arquivo MASTER, as adapte para um uso mais geral ou apenas compartilhe um link para aqui como está.
AFAIK, a pasta de apresentações não foi tornada pública e estava disponível apenas para os participantes. Não tenho certeza do que motivou essa decisão.
Tradução automática de English

Perguntas relacionadas

0 votos
1 resposta 18 visualizações
Olá, Estou tentando aplicar uma borda de página no PTXprint, mas sem incluir as páginas da introdução. Quando ativo a ... vez de \setcvhook para isso? Muito obrigado pela ajuda!
Roger Beramgoto Nado 125 perguntada Mar 25
0 votos
1 resposta 89 visualizações
Olá Estou trabalhando em um layout e queria limitar as bordas da minha página até o capítulo 24, versículo 10, conforme ... tela da regra que usei. Obrigado desde já pela ajuda.
Roger Beramgoto Nado 125 perguntada Dez 13, 2024
0 votos
4 respostas 336 visualizações
Gostaria de ter bordas de página ao redor do texto bíblico, mas não ao redor das introduções. No passado, usei ... ao redor do texto produzido por humanos (como as Introduções).
jeffh 1,4k perguntada Abr 8, 2024
0 votos
1 resposta 155 visualizações
(Parece que me lembro de uma discussão sobre isso, mas não consigo encontrá-la agora ) Em um PDF que estou produzindo ... a não colocar borda ao redor das páginas do livro GLO?
jeffh 1,4k perguntada Mai 10, 2021
0 votos
2 respostas 201 visualizações
Gostaria de imprimir vários livros (os 5 Ts além de Filemom). 1Ts termina com 5 linhas no topo da página 5, ... É possível fazer isso com o PTXPrint? Obrigado por qualquer ajuda.
Paul 642 perguntada Jun 2, 2021
Welcome to Support Bible, where you can ask questions and receive answers from other members of the community.
Just as a body, though one, has many parts, but all its many parts form one body, so it is with Christ.
1 Corinthians 12:12
3,045 perguntas
6,005 respostas
5,671 comentários
2,026 usuários