Aggiungere in coda tante pagine quanto basta

  • Creatore
    Topic
  • #53383
    OldClaudio
    Partecipante
      Up
      0
      Down
      ::


      Vorrei che il numero totale delle pagine del mio documento fosse un multiplo di 4, per comporre in quartine; il problema si presenterebbe anche volendo comporre in ottavo, in sedicesimo, o in qualunque altro numero di facciate per una segnatura completa.

      Normalmente il documento non finisce su un multiplo intero del numero di facciate di una segnatura. Si tratta, quindi di aggiungere in coda tante pagine bianche quanto basta per completare questo numero intero.

      Ho provato con il codice seguente, dopo aver caricato il pacchetto ifthen ed essendo sicuro che il mio motore di tipocomposizione opera in modo esteso:
      `
      \whiledo{\numexpr \value{page} / 4}{\null\clearpage}
      `
      ma eseguendo la compilazione entra in un loop infinito e sputa fuori infinite pagine; tocca intervenire facendo “abortire” l’esecuzione.

      Ho allora cercato di eseguire le operazioni con i comandi primitivi di TeX:
      `
      \count254=\value{page}\divide\count254 by 4 \relax
      \whiledo{\count254 > 0}{\null\clearpage\count254=\value{page}\divide\count254 by 4}
      `
      Ma succede la stessa cosa.

      È evidente dove è l’errore; ma me ne sono accorto nel momento stesso in cui sono arrivato alla riga precedente di questo messaggio. Purtroppo il software del forum non consente di annullare tutto finché si è in questa pagina.

      Visto che ci sono spiego l’arcano (ovvio a posteriori):
      `
      \numexpr \value{page}/ 4
      `
      e l’analoga espressione
      `
      \count254=\value{page}\divide\count254 by 4 \relax
      `
      rappresentano il numero delle quartine, non il numero di pagine necessarie per completare una quartina; quello che bisogna determinare è il resto della divisione intera:
      `
      \numexpr\value{page} – \value{page}/4
      `
      e il risultato dell’espressione è il valore che bisogna controllare per decidere se sputare un’altra pagina o se uscire dal loop.
      Il problema non esiste: è già risolto! 😀

    Visualizzazione 3 filoni di risposte
    • Autore
      Risposte
      • #53384
        Up
        0
        Down
        ::

        Vorrei che il numero totale delle pagine del mio documento fosse un multiplo di 4, per comporre in quartine; il problema si presenterebbe anche volendo comporre in ottavo, in sedicesimo, o in qualunque altro numero di facciate per una segnatura completa.

        Normalmente il documento non finisce su un multiplo intero del numero di facciate di una segnatura. Si tratta, quindi di aggiungere in coda tante pagine bianche quanto basta per completare questo numero intero.

        Ho provato con il codice seguente, dopo aver caricato il pacchetto ifthen ed essendo sicuro che il mio motore di tipocomposizione opera in modo esteso:
        `
        \whiledo{\numexpr \value{page} / 4}{\null\clearpage}
        `
        ma eseguendo la compilazione entra in un loop infinito e sputa fuori infinite pagine; tocca intervenire facendo “abortire” l’esecuzione.

        Ho allora cercato di eseguire le operazioni con i comandi primitivi di TeX:
        `
        \count254=\value{page}\divide\count254 by 4 \relax
        \whiledo{\count254 > 0}{\null\clearpage\count254=\value{page}\divide\count254 by 4}
        `
        Ma succede la stessa cosa.

        È evidente dove è l’errore; ma me ne sono accorto nel momento stesso in cui sono arrivato alla riga precedente di questo messaggio. Purtroppo il software del forum non consente di annullare tutto finché si è in questa pagina.

        Visto che ci sono spiego l’arcano (ovvio a posteriori):
        `
        \numexpr \value{page}/ 4
        `
        e l’analoga espressione
        `
        \count254=\value{page}\divide\count254 by 4 \relax
        `
        rappresentano il numero delle quartine, non il numero di pagine necessarie per completare una quartina; quello che bisogna determinare è il resto della divisione intera:
        `
        \numexpr\value{page} – \value{page}/4
        `
        e il risultato dell’espressione è il valore che bisogna controllare per decidere se sputare un’altra pagina o se uscire dal loop.
        Il problema non esiste: è già risolto! 😀

        Non del tutto. Le divisioni di e-TeX arrotondano. Se \value{page} è 3, ottieni 2 e non 3. Prova a compilare con pdftex
        `\newcount\pippo
        \pippo=3
        \pippo=\numexpr\pippo-\pippo/4\relax
        \showthe\pippo`
        ottenendo appunto il valore 2. Il resto dovrebbe essere comunque calcolato con
        `\pippo-(\pippo/4)*4`
        ma nel caso di \pippo=7 il risultato è -1. 🙁

        Cerca \truncdiv sugli Appunti. 🙂

        Ciao
        Enrico

      • #53385
        OldClaudio
        Partecipante
          Up
          0
          Down
          ::


          Mi hai preceduto di un secondo. Il mio codice mancava di un *4 e poi, hai ragione, mi ero dimenticato del fatto dell’arrotondamento.
          Grazie mille.

        • #53386
          Up
          0
          Down
          ::

          Mi hai preceduto di un secondo. Il mio codice mancava di un *4 e poi, hai ragione, mi ero dimenticato del fatto dell’arrotondamento.
          Grazie mille.

          Volendo fare tutto in un colpo:
          `\makeatletter
          \providecommand*\truncdiv[2]{\number\numexpr(#1-(#2-1)/2)/#2\relax}
          \newcommand{\completesignature}[1]{\AtEndDocument{\clearpage
          \@tempcnta=\numexpr\value{page}-#1*\truncdiv{\value{page}}{#1}-1\relax
          \loop\ifnum\@tempcnta<#1\relax \advance\@tempcnta\@ne \null\clearpage \repeat}} \makeatother \completesignature{8}` Ciao Enrico

        • #53387
          OldClaudio
          Partecipante
            Up
            0
            Down
            ::


            Allora, giusto per coloro che fossero curiosi di sapere come è andata a finire, ho risolto così:
            `
            \documentclass{…}

            \usepackage{ifthen}

            \newcounter{segnatura}\newcounter{paginebianche}\newcounter{paginetotali}

            % Comando da emettere verso la fine del documento
            \newcommand\getmissingpages{\setcounter{paginetotali}{\value{segnatura}}\whiledo{\value{paginetotali}<\value{page}}{\addtocounter{paginetotali}{\value{segnatura}}} \setcounter{paginebianche}{\value{paginetotali}}\addtocounter{paginebianche}{-\value{page}}} ... \begin{document} --- % Chiudere l'ultima pagina del documento e preparare le pagine vuote \clearpage \pagestyle{empty} % Quante facciate ci sono in ciascuna segnatura \setcounter{segnatura}{4} % Determinazione del numero delle pagine mancanti nel contatore "paginebianche" \getmissingpages % Creazione delle pagine mancanti \whiledo{\value{paginebianche} >0}{\null\clearpage\addtocounter{paginebianche}{-1}}
            \null\clearpage

            \end{document}
            `

            Ho creato macro in diversi modi, ma quella più stupida per determinare il numero di pagine multiplo intero di una segnatura (consistente nell’incrementare il contatore “paginetotali” del valore contenuto nel contatore “segnatura” fin quando “paginetotali” è infriore al contenuto del contatore “page”) spesso rappresenta l’algoritmo più veloce. Certo esistono soluzioni più eleganti… 🙂
            Il numero delle pagine bianche da aggiungere in coda viene determinato subito dopo aver finito il documento “grezzo”, ma prima di chiudere il documento con \end{document}.
            Il comando \whiledo esegue ripetutamente quanto contenuto nel suo secondo argomento purché la condizione contenuta nel primo argomento sia vera. È il tipico comando per le operazioni ripetitive presente in ogni linguaggio di programmazione (in questo caso è fornito dal pacchetto ifthen, standard per ogni distribuzione; ma si tratta solo di un sinonimo di un comando già presente nel nucleo di LaTeX..

            A me questo giochetto mi serviva per comporre le segnature in ventesimo (!) al fine di stampare delle quartine con la stampante di casa e formare un fascicoletto di un numero intero di facciate composte in A5 su fogli A4 stampati fronte e retro; le imposizioni sono state eseguite con il pacchetto pdfpages.

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

        Go to top