nuovo environment con condizionale

  • Questo topic ha 3 risposte, 1 partecipante ed è stato aggiornato l'ultima volta 16 anni fa da cincinnato.
  • Creatore
    Topic
  • #48052
    Up
    0
    Down
    ::


    Buondì. Vorrei un aiuto/commento su quanto sto facendo.

    Sto cercando di scrivere un environment per un librettino con dei salmi preceduti da antifona.
    Lo stile che vorrei è questo: se il salmo è più lungo di una pagina vorrei vedere ripetuta l’intera antifona nella nuova pagina alla fine del salmo. Se invece il salmo è corto vorrei scritto soltanto il richiamo all’antifona scritta più sopra. L’idea è poi di fare due passi:
    1) generalizzare l’ambiente per un documento twosided (in cui il condizionale si occuperà di un salmo che parte dalla pagina pari e finisce in pagina dispari, dicendo: antifona, vedi accanto) e verrà ripetuto il testo solo quando si gira fisicamente la pagina.
    2) Fatto questo invece che scrivere l’antifona inserisco un brano di canto gregoriano, che metterò dentro con gregoriotex (http://home.gna.org/gregorio/gregoriotex/), con il risultato che: se l’antifona “è visibile” alla fine del salmo allora non verrà riscritta, se invece l’antifona è in una pagina ormai passata allora l’antifona viene ristampata.

    Ho scritto, scopiazzando e ispirandomi al LaTeX Companion, il seguente codice, che però non mi funziona come vorrei. Infatti se togliete il commento dal `\vspace{5cm}` vedrete che l’antifona finisce a pagina due ma non viene riscritta, mentre questo succede correttamente con quello spazio aggiuntivo che trasla il tutto più in basso.

    Sapreste dirmi perché succede? E come scrivere correttamente il mio environment?

    Uso TexLive2009 su windows XP, edito con TexWorks.

    Grazie mille,
    Lorenzo

    `
    \documentclass[12pt,italian]{article}
    \usepackage[T1]{fontenc}
    \usepackage[utf8]{inputenc}
    \usepackage{babel}
    \usepackage{ifthen}

    \newcounter{numerosalmo}
    \newsavebox{\Antifona}
    \newenvironment{salmo}[1]{%
    \stepcounter{numerosalmo}%
    \noindent%
    \label{pin-\thenumerosalmo}%
    \sbox\Antifona{#1}%
    \textbf{Ant.~\thenumerosalmo}: %
    \usebox\Antifona\par%
    \begin{quotation}
    }
    {%
    \end{quotation}
    \label{pfin-\thenumerosalmo}%
    \ifthenelse{\pageref{pfin-\thenumerosalmo}>
    \pageref{pin-\thenumerosalmo}}
    {\noindent\textbf{Ant.~\thenumerosalmo}: \usebox\Antifona\newline}
    {\noindent\textbf{Ant.~\thenumerosalmo}: v.~sopra\newline}
    Con pageref: pag iniziale = \pageref{pin-\thenumerosalmo}
    \newline Con pageref: pag finale = \pageref{pfin-\thenumerosalmo}
    }

    \begin{document}

    \begin{salmo}{Testo dell'antifona}
    Beato l' uomo che non camminò nel consiglio degli empi e nella via dei peccatori non si fermò e nel consesso dei beffardi non s' assise;

    ma nella legge del Signore è la sua gioia e in essa medita giorno e notte.

    Perciò sarà come un albero che su rivi di acqua è piantato, che dà i suoi frutti ad ogni stagione, le cui foglie mai appassiscono: in ogni cosa che fa ha sempre successo.

    Non così gli empi: essi al contrario saranno come pula che il vento sospinge.

    Per questo non entreranno gli empi nel giudizio, né i peccatori nell' assemblea dei giusti,

    Il Signore conosce la via dei giusti. mentre la via degli empi andrà in rovina.

    \end{salmo}

    \vspace{5cm}

    \begin{salmo}{Testo dell'antifona}
    Beato l' uomo che non camminò nel consiglio degli empi e nella via dei peccatori non si fermò e nel consesso dei beffardi non s' assise;

    ma nella legge del Signore è la sua gioia e in essa medita giorno e notte.

    Perciò sarà come un albero che su rivi di acqua è piantato, che dà i suoi frutti ad ogni stagione, le cui foglie mai appassiscono: in ogni cosa che fa ha sempre successo.

    Non così gli empi: essi al contrario saranno come pula che il vento sospinge.

    Per questo non entreranno gli empi nel giudizio, né i peccatori nell' assemblea dei giusti,

    Il Signore conosce la via dei giusti. mentre la via degli empi andrà in rovina.

    \end{salmo}

    \vspace{3cm}
    Altro testo dopo

    \end{document}
    `

Visualizzazione 2 filoni di risposte
  • Autore
    Risposte
    • #48053
      Up
      0
      Down
      ::


      Forse era meglio se commentavo un po’ di più quel che ho scritto. Provvedo:

      l’idea è di inserire una \label e consecutivamente un \pageref in modo da sapere a che pagina mi trovo. Su Latex companion (LC) c’è scritto di fare così e di non usare \thepage, che è valutato in maniera asincrona.
      Mi servono due labels: pin (pagina iniziale) e pfin (pagina finale), che, sempre scopiazzando dal LC, vedo che devo definire con un’aggiunta variabile (-\thenumerosalmo) per evitare di avere labels definite in maniera multipla.

      Confrontando le due \pageref ci si può rendere conto se si è cambiato pagina (in questa prima versione dell’environment in cui si suppone di essere “oneside”.

      \savebox, \usebox e \Antifona servono perché nei comandi di chiusura del \newenvironment il testo dell’antifona non è più disponibile (ancora dal LC).

      Le due righe che cominciano “Con pageref” sono lì per aiutarmi a vedere cosa stanno tirando fuori le \pageref e andrebbero tolte dalla versione finale dell’environment.

      Ecco, ora mi sembra di aver spiegato quel che c’è da spiegare.

      Saluti,
      L.

    • #48054
      Up
      0
      Down
      ::


      Mi sto aiutando da solo 😉
      Per one side ho risolto: basta mettere la label dopo che latex inizia a scrivere l’antifona. Allora non c’è più quell’effetto di non coordinazione tra la pagina corrente e la pagina a cui fa riferimento la label. Penso (correggetemi se sbaglio) che il problema fosse di “vertical mode” vs “horizontal mode”. Spostando la label dopo la parola “Ant” sono sicuro di essere in horizontal mode.

      I problemi continuo ad averli per la versione twoside. Ho cercato anche di leggere la documentazione di varioref ma devo ammettere di capirci poco. Intuisco qualcosa ma non vado oltre.
      La difficoltà per il twoside è che vorrei fare delle operazioni matematiche sul numero di pagina (ho ben chiaro come usare ifthen per fare le scelte opportune), ma se provo a mettere un contatore non riesco a comunicargli nulla con \pageref.

      Mettiamo che il contatore si chiami “diff”. Provando `\setcounter{diff}{\pageref{pin-\thenumerosalmo}}` latex brontola. Anche usare `\setcounter{diff}{\value{\pageref{pin-\thenumerosalmo}}}}` non funziona.
      Non posso usare \thepage al posto di \pageref perché non è sincrono. In varioref mi sembra che vengano usati contatori, ma forse sono comandi TeX e non LateX.
      Se qualcuno ha una dritta… Grazie comunque,

      Lorenzo

    • #48055
      Up
      0
      Down
      ::


      Ho risolto il mio problema 🙂 (è il primo caso di un topic monoutente?).
      Ho trovato un modo per aggirare il problema di non saper aggiungere uno al risultato di \pageref. Credo, al di là dell’ineleganza, che funzioni. Allego il risultato commentato, a futura memoria e ringrazio il prof. Gregorio per i suoi “appunti di programmazione” che mi sono stati utili.

      Lorenzo

      `
      \newcounter{numsalmo}% contatore numero del salmo
      \newcounter{diff}% contatore per lo “sporco trucco con \thepage”
      \newenvironment{salmo}[1]
      {\stepcounter{numsalmo}% ogni chiamata dell'environment fa scattare il numero per avere
      % numerazione delle antifone e per non definire in maniera multipla le labels
      \def\antifona{#1}% memorizza l'antifona per usarla nella seconda parte di \newenvironment
      \leavevmode\label{pi-\thenumsalmo}\setcounter{diff}{-\thepage}% mette la label della pagina
      % iniziale (pi) e memorizza nel contatore il valore negativo della pagina (anche se non è sicuro)
      \textbf{Ant.~\thenumsalmo}: #1
      \begin{quotation}
      }
      {\end{quotation}%
      \leavevmode\label{pf-\thenumsalmo}% forzata l'uscita dal modo verticale
      % mette la label della pagina finale (pf)
      \noindent\textbf{Ant.~\thenumsalmo}: %
      \addtocounter{diff}{\thepage}% dopo questa operazione in \thediff c'è la differenza tra pagina
      % iniziale e pagina finale AL NETTO DELL'ATTENDIBILITA' del metodo con l'uso di
      % \thepage. Questa differenza viene usata nel terzo \ifthenelse
      \ifthenelse{\equal{\pageref{pi-\thenumsalmo}}{\pageref{pf-\thenumsalmo}}}
      {v.~sopra}% se c'è uguaglianza di pagine, sia per oneside che per twoside scrive v. sopra
      {\ifthenelse{\NOT\boolean{@twoside}\OR\isodd{\pageref{pi-\thenumsalmo}}}% qui siamo
      % sicuri che p. finale > p. iniziale. Se non siamo twosided O la pagina iniziale è dispari allora
      % si riscrive l'antifona.
      {\antifona}
      {\ifthenelse{\isodd{\pageref{pf-\thenumsalmo}}\AND\thediff<2}% se siamo qui vuol
      % dire che siamo twosided e la pagina iniziale è pari. Visto che non funziona la scrittura
      % \pageref{}+1 usiamo lo sporco trucco: mettiamo come condizione l'essere dispari la
      % pagina finale. Questo funziona ma introduce dei “falsi positivi”: ad esempio con p. iniz =2
      % e p. fin=5 verrebbe scritto “v. accanto” invece di riscrivere \antifona. Allora aggiungiamo
      % la condizione che \thediff sia < 2. Questo, pur nella non sincronicità del contatore \thepage % assicura che larghe differenze di pagina non ricadano in questo ramo dell'\ifthenelse, ma % nel successivo dove si riscrive esplicitamente l'antifona. {v.~accanto} {\antifona} } } }`

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

Go to top