Come fa una macro a sapere che è ad inizio pagina?

  • Creatore
    Topic
  • #100246
    Up
    0
    Down
    ::


    Salve,

    È da giorni che mi sto rompendo il capo su questo problema. Ho letto decine di casi apparentemente simili, ma non ho ancora trovato il modo.

    Come fa una macro a sapere che si è ad inizio pagina?

    Un esempio pratico:

    I documenti che devo preparare (XeLaTeX) usano titlesec per definire le sezioni.

    A volte una sezione termina immediatamente prima il fine pagina (page break), per cui la sezione successiva inizierà proprio in cima alla nuova pagina che segue.

    In generale, lo spazio verticale immediatemente seguente la sezione deve essere di un certo valore (per esempio \vspace{9.6pt}).

    Ma, se la sezione è a inizio pagina, quel valore deve essere diverso, ad esempio \vspace{14.4pt}.

    C’è per caso una variabile da usare in \ifthenelse, in modo da poter determinare i due spazi verticali diversamente, a seconda dei casi?

    `
    \documentclass{article}

    \usepackage{titlesec}

    \begin{document}

    \chapter*{Capitolo 1}
    \section*{Sezione non ad inizio pagina}

    % spazio verticale equivalente a \vspace{9.6pt}

    Testo di sezione non ad inizio di pagina.

    \clearpage

    %% Come fare?

    \section*{Sezione ad inizio pagina}

    %% questo spazio verticale deve essere diverso dalla sezione sopra
    % spazio verticale equivalente a \vspace{14.4pt}

    Testo di sezione ad inizio pagina

    \end{document}

    `

    Grazie per un qualsiasi chiarimento o indicazione.

Visualizzazione 6 filoni di risposte
  • Autore
    Risposte
    • #100247
      OldClaudio
      Partecipante
        Up
        0
        Down
        ::


        Perché se un titolo di sezione cade a inizio pagina, deve essere distanziato di più dal testo della sezione, rispetto a quando il titolo cade a metà pagina e il testo comincia (ovviamente) nella stessa pagina?

        Tipograficamente parlando non si fa così. Quindi se lo vuoi fare deve esserci un motivo molto valido per violare una regola.

      • #100248
        Up
        0
        Down
        ::

        OldClaudio” post=99965Perché se un titolo di sezione cade a inizio pagina, deve essere distanziato di più dal testo della sezione, rispetto a quando il titolo cade a metà pagina e il testo comincia (ovviamente) nella stessa pagina?

        Tipograficamente parlando non si fa così. Quindi se lo vuoi fare deve esserci un motivo molto valido per violare una regola.

        Purtroppo (o per fortuna, per i lettori) non sono io il designer. I documenti che devo preparare seguono una griglia di base dettata dalla casa editrice francese, (molto piccola, di edizioni nel campo umanistico). Usano una loro concezione della “Sezione” che non è forse quella tradizionale, ma che si avvicina di più al concentto di “sezione” che a quello di “capitolo”. Per questo sto cercando di capire come fa una macro a sapere che è ad inizio pagina, nel contesto della sezione piuttosto che altro comando.

        Ma la mia domanda (Come fa una macro a sapere che è ad inizio pagina?), a questo punto è indipendente dal lato pratico.

        Potrei anche continuare a fare la distinzione “a mano”. La dovrei fare comunque anche in InDesign o in XPress, nessuno dei due ha strumenti che mi permetterebbero dai fare (facilmente) tale distinzione, ma comunque mi sono troppo esposto con l’editore, difendendo LaTeX e XeLaTex a spada tratta, per dargli un file InDesign.

        Ma per completezza: nel caso specifico dell’impostazione tipografica delle sezioni: il titolo della sezione deve distare una distanza doppia dall’ultimo rigo tipografico (prima della sezione) rispetto al primo rigo dopo la sezione. Questa distanza varia, a seconda dei titoli e dei designer (che comunque hanno un minimo di libertà). Inoltre, il titolo della sezione non necessariamente deve essere “tangente” (cioè che tocca) alla griglia (anzi, di solito non lo è mai), mentre il corpo del testo principale lo deve sempre essere.

        Nel caso sottomano ci sono i seguenti valori (possono variare di titolo in titolo):

        `
        \titleformat{\chapter}[block]%
        {\centering}{}{0pt}{\smallcaps{#1}}

        \titlespacing*{\chapter}{0pt}{-14.4pt}{18.4pt}[72pt]

        titleformat{\section}[block]%
        {}{}{0pt}{\emph{#1}}[]

        %% onelineskip=14.4 in 3: 2/3=9.6 inf., 1/3=4.8 sup. in più
        \titlespacing*{\section}{0pt}{19.2pt}{9.6pt}[0pt]
        `

        Ma, se la sezione è a capo pagina, dovrebbe essere:

        `
        \titlespacing*{\section}{0pt}{19.2pt}{14.4pt}[0pt]
        `

        Siccome non voglio cambiare il codice a seconda dei casi, attualmente mantengo il primo, e aggiungo il necessario \vspace a seconda della posizione. Ma spero che ci sia un mezzo per automatizzare il processo.

        PS: Chiedo scusa per il mio codice da principiante, molto naïf!

      • #100249
        OldClaudio
        Partecipante
          Up
          0
          Down
          ::


          OK, ho capito il problema, e la soluzione forse è più complessa se usi i comandi \titlepacing, specialmente se vuoi variare la seocnda spaziatura dopo il titolo della sezione.

          Si sa di essere a inizio pagina, prima di comporre il titolo se \pagegoal e \pagetotal sono due lunghezze uguali; Questo ti permette di definire una variabile booleana. Questo ti permetterebbe, se non usassi quei comandi ma ridefinissi direttamente il comando \section, di saper al momento in cui \section comincia ad essere eseguito se le due lunghezze sono uguali; se lo sono poi impostare la varibaile booleana al valore true, e quindi dopo aver composto il titolopoi scegliere un avanzamento piuttosto che un altro sulla base dello stato di quella variabile booleana.

          Direi che la cosa non sarebbe impossibile, ma certamante difficile epr fare le infinite prove necessarie.

          Un altro metodo potrebbe ssere quello di definire due comandi \section e \Section, quello con la lettera maiuscola con uno spazio maggiore, per cui, anche facendo a mano, avresti in fase di correzione delle bozze la possibilità si camiare solo una s in una S, molto più semplice che non mettere il comando per disteso per aggiungere lo spazio mancante, che non è semplice spazio mancante, ma uno spazio insecabile verticale.

          Altra possibilità di efficacia dubbia, ma spesso efficace; definisci un comando che ti controlla la quatità di spazio in fondo pagina, in modo da emettere un \newpage se mancano meno di , diciamo, quattro righe dal fondo; Questa macro può anche impostare con lo stesso di controllo delle dimensioni può anche impostare anche la variabile booleana del primo metodo e sulla base di quello eseguire \section oppure \Section.

          Vedi che comunque la gire è possobile automatizzare la cosa, ma non è banale realizzarla.

          Tuttavia ti ho dato la risposta: in modo verticale si può sapere se la macro viene eseguita a inizio pagina se \pagegoal e \pagetotal sono uguali.

        • #100250
          Up
          0
          Down
          ::


          Grazie sentite per la risposta elaborata e molto istruttiva.

          Senz’altro partirò usando il consiglio della `\Section` ma vorrei poter arrivare ad una macro più automatica. Proverò i vari metodi, e riferirò in seguito.

          Mi chiedevo se, usando in un futuro piuttosto lontano LuaLaTeX invece che XeLaTeX, oppure addirittura passando a ConTeX, si potessero avere strumenti più flessibili? Oppure la difficiltà è intrinseca al modello computazionale di TeX, che ne è la piattaforma comune?

          Grazie di nuovo Sig. Claudio, sono molto obbligato.

          Guido Sette

        • #100251
          OldClaudio
          Partecipante
            Up
            0
            Down
            ::

            GuidoSette” post=99977

            Mi chiedevo se, usando in un futuro piuttosto lontano LuaLaTeX invece che XeLaTeX, oppure addirittura passando a ConTeX, si potessero avere strumenti più flessibili? Oppure la difficiltà è intrinseca al modello computazionale di TeX, che ne è la piattaforma comune?

            Credo che LuaLaTeX per quel che riguarda la routine di divisione in pagine della galley proof (la bozza non impaginata) usi la stessa routine di pdflatex e xelatex. Context, invece, non usa il markup di latex e ha una routine di output molto diversa.
            Non ho sufficiente esperienza con CnTeXt per darti notizie rassicuranti; semplicemente non lo so se questo programma di compl=ilazione abbia routine,macro o altro per cambiare comportamento a inizio pagina.

          • #100252
            Up
            0
            Down
            ::


            Grazie al suo consiglio riguardo a \pagetotal. Non pensa che il codice seguente faccia quello che cercavo?
            `
            % Occorre \usepackage{etoolbox}

            \titleformat{\section}[block]%
            {}{}{0pt}{\emph{#1}\ifdimless{\pagetotal}{1pt}{\vspace{4.8pt}}{\vspace{0pt}}}[]
            `

            Lo devo provare più a fondo, ma mi parebbe che funzioni. Le faccio sapere fra alcuni giorni, dopo averlo provato bene.

          • #100253
            OldClaudio
            Partecipante
              Up
              0
              Down
              ::


              Siccome il test su \pagetotal viene fatto dopo aver composto il titolo con \emph{#1} ho impressione che la cosa non funzioni, almeno con il confronto con 2pt; però l’idea non è male, però bisogna vedere come interferisce con lo spazio insecabile che il comando \section inserisce dopo il titolo.

          Visualizzazione 6 filoni di risposte
          • Devi essere connesso per rispondere a questo topic.

          Go to top