0 votos
356 visualizações

Existe alguma maneira de voltar ao alinhamento da grade depois que você se desloca dela? Ou de ter algum texto fora da grade enquanto você secretamente mantém o controle da grade em segundo plano?

As primeiras páginas dos meus livros são dispostas assim:

MAIN TITLE
introductory outline (with \io markers)
\s
\p

O problema é causado pela seção \io. Quero que o texto e o espaçamento entre linhas dessa seção sejam menores que o normal, mas se eu fizer isso, o \s e o \p não ficam alinhados à grade. Posso corrigir usando um \vskip, mas como cada introdução tem um número diferente de linhas, o \vskip precisaria ser diferente para cada livro. (Agora que escrevi isso, se não houver uma maneira de voltar ao alinhamento da grade, talvez eu possa corrigir o problema escrevendo uma alteração ou um sethook para cada livro.)

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

2 Respostas

0 votos

Bem… existe o \parlines, que o TeX usa para informar quantas linhas houve em um parágrafo.
Acho que o código de fim de parágrafo poderia fazer algumas contagens e alguns cálculos…

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

Argh. Desculpe, dois erros bastante graves na minha resposta anterior.

  1. \@parlines faz parte do cálculo que usamos para calcular capítulos deslocados, etc.; eu deveria ter escrito \prevgraf
  2. \prevgraph te dá quase exatamente o que você quer - multiplique o desalinhamento por isso e, desde que não haja outros saltos, espaços antes/depois, etc., você terá um 'deslocado de X pt' que pode ser usado para restaurar o alinhamento à grade, depois de garantir que seja positivo e menor que 1 linha da grade. Isso funcionaria na primeira execução do TeX. MAS há uma ressalva enorme aqui:
    Isso está tudo bem, desde que o seu texto anterior fora da grade nunca seja dividido entre páginas. Nesse ponto, todos os cálculos cuidadosos precisam ser descartados, porque todo o texto na página começa na 1ª linha de base. E sem o processamento do tipo @parlines, você não sabe quantas linhas daquele parágrafo, em algum lugar no meio do texto, estão na nova página.

Então… depois de pensar um pouco mais, não consigo pensar em uma maneira de fazer isso quando inclui quebras de página sem que o arquivo .parlocs esteja diretamente envolvido, e nesse ponto será mais fácil dizer 'quero que este parágrafo (cursor atualmente em X,Y) esteja na grade' e não se preocupar em contar nenhum parágrafo. Pelo menos para a primeira transição.
Isso exigiria uma nova execução do TeX, se estiver fora da grade. A desvantagem é que isso pode mudar os pontos de quebra de página e a colocação de figuras/notas de rodapé, potencialmente em >= uma nova execução por transição! (uau, se você estiver falando de uma Bíblia inteira!)

Tradução automática de English
0 votos

Acho que este é um problema comum o suficiente para MUITAS pessoas, então provavelmente devemos forçar automaticamente o texto de volta à grade depois que a introdução termina e quando o 1º capítulo começa. (Podemos fazer isso programaticamente para que os usuários não precisem se preocupar com isso?)

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

Minha grande ressalva se aplica, se quisermos que isso funcione em todas as situações. Dado que as pessoas podem ter introduções de várias páginas, acho que precisaríamos efetivamente (a) numerar cada parágrafo com espaçamento não regular, e também qualquer um depois disso para outra página cheia, (b) calcular qual parágrafo é quebrado e quantas linhas dentro do parágrafo a quebra foi calculada. (c) lembrar disso para a próxima execução, quando chegarmos a 'restaurar a grade'.

A alternativa é o que fazemos no momento em uma transição de coluna única para duas colunas: a página parcialmente cheia é tipografada, tornando-se fixa, e outro material é adicionado abaixo. Isso causa problemas diferentes no modo de 2 colunas, por exemplo… com o balanceamento.

Tradução automática de English

Em qualquer momento, o TeX não sabe onde está na página? Ele só sabe que é positivo em relação à linha acima? Não entendo por que não há uma maneira de dizer "o número do capítulo ocorre no valor y de a, a próxima linha da grade está no valor y de b, e então precisamos deslocar a linha de base do capítulo para baixo por b-a.

A alternativa é o que fazemos no momento em uma transição de coluna única para duas colunas: a página parcialmente cheia é tipografada, tornando-se fixa, e outro material é adicionado abaixo.

Na verdade, no projeto que motivou esta pergunta, tanto a introdução quanto o texto principal são de coluna única. Isso é algo que posso fazer manualmente – fechar a página e começar uma nova abaixo?

Tradução automática de English

O TeX tem a 'galley' (coluna ininterrupta de parágrafos e espaçamentos) toda preparada antes de decidir como vai cortá-la em páginas. Ele sempre termina um parágrafo antes de testar se tudo na galley soma para formar uma página, e enquanto ele tenta fazer um palpite razoável sobre quando acionar o corte de página, esses palpites não são totalmente precisos: para obter balanceamento de colunas, notas de rodapé, referências cruzadas, figuras e barras laterais e fins de página consistentes, muitas vezes temos que tentar comprimentos de corte mais curtos da galley. Assim, uma nova página pode ter uma pilha considerável de texto, figuras e notas de rodapé esperando em sua galley quando começa.

Quando um parágrafo é iniciado (o ponto em que você teria que adicionar espaço extra), o \pagegoal e o \pagetotal são conhecidos, mas, na verdade, eles são apenas palpites, e o programa não sabe, por exemplo, que imagens podem ser adicionadas no topo da página, ou se haverá alguma chamada para esticar algo que é flexível.

Sim, deveria ser possível fazer com que ele feche a página parcial, mas provavelmente não manualmente. Há também alguns efeitos colaterais que podem ser uma dor de cabeça completa.
Acabei de me ocorrer que outra opção seria usar espaçamento esticável, um pouco assim:

Stretch to page height{
  {figures}
  Stretch to 35 normal lines{
    {Intro paragraph (13.4 normal lines)}
    {stretchy bit}
    {main text (21 lines)}
  }
  {stretchy bit}
  {footnotes}
}

(A nova parte seria o 'Stretch to 35 lines' para a seção do meio, e, claro, o '35 lines' precisaria ser calculado com base no comprimento não esticado da sequência de texto.)
@Martin_Hosken pode querer comentar sobre por que esta é uma ideia tola, no entanto.

Tradução automática de English

Offline, David sugeriu \par\layoutstylebreak. Isso não funcionou, mas, olhando como era usado em outros documentos, acabei testando \singlecolumn, e funciona!!! Mesmo que eu esteja alternando de coluna única para coluna única, isso parece ser suficiente para redefinir a grade.


Essa solução levantou outra pergunta:

Meu documento .sfm agora parece assim

\io a bunch of introductory outline rows
\\p ~
\zgetbackongrid\*
\s The first section title

e meu arquivo *mods.text tem isso:

\sethook{end}{zgetbackongrid}{\singlecolumn}

Mas, não consigo fazer funcionar sem aquela linha \\p ~, que então adiciona uma linha em branco extra que não quero. Estou assumindo que o problema é que meu marco zgetbackongrid ainda está dentro do parágrafo \io, mas não consigo descobrir como sair desse parágrafo sem adicionar a linha extra. O \par que David originalmente sugeriu em conjunto com layoutstylebreak parece não ser permitido dentro de um sethook.

Tradução automática de English

Se \zgetbackongrid\* for um marco vazio de outra forma, você pode ir até o fim e tentar fazê-lo se expandir para fazer coisas dentro (sem garantias, não testei isso):

\expandafter\def\csname MS:zgetbackongrid\endcsname{\par\singlecolumn}

Pode não funcionar. O código do marco espera estar (no máximo) gerando algum texto em nível de caractere e tem várias partes complicadas para garantir que configurações de estilo etc. não escapem.

Tradução automática de English

Usar seu código não causou um erro do \par, mas também não pareceu redefinir a grade como usar um \p no arquivo .sfm fez.

No entanto, o seguinte acabou funcionando e, portanto, acho que posso redefinir a grade sem ter um espaço extra:
Coloque \p ~ no arquivo sfm.
No arquivo *mods.tex, use isso:
\sethook{end}{zgetbackongrid}{\vskip-1\baselineskip\singlecolumn}

Obrigado por toda a ajuda.

Tradução automática de English

Nenhuma pergunta relacionada encontrada

Welcome to Support Bible, where you can ask questions and receive answers from other members of the community.
Make every effort to keep the unity of the Spirit through the bond of peace.
Ephesians 4:3
3,046 perguntas
6,006 respostas
5,671 comentários
2,027 usuários