Problema TeXnico: parsing di righe

  • Creatore
    Topic
  • #55773
    Up
    0
    Down
    ::


    Salve a tutti,
    vorrei scrivere una macro che effettua il parsing di un testo fatto così:
    `Questa è una prima riga\\
    Seconda riga\\
    Terza riga\\
    \\
    Quinta riga (quella precedente era vuota)\\
    Sesta riga\\
    Settima riga\\
    \\
    Nona riga (quella precedente era vuota)\\
    Decima riga\\
    Undicesima riga
    `
    La macro dovrebbe semplicemente mettere in neretto la prima riga di ciascun gruppo di tre (riga 1, 5, 9, eccetera). Dovrebbe mettere in corsivo la seconda riga di ciascun gruppo. Infine dovrebbe lasciare inalterata la terza di ciascun gruppo di tre righe.

    Come posso procedere?
    Grazie,
    Agostino

Visualizzazione 20 filoni di risposte
  • Autore
    Risposte
    • #55774
      Up
      0
      Down
      ::


      La soluzione più ovvia è usare argomenti delimitati, cosa che però richiede il linguaggio TeX di base:
      `
      \makeatletter
      \def\threelines#1\\#2\\#3\\{%
      \ifx\@empty#1\@empty % if #1 is empty
      \else
      {\bfseries #1}\\%
      {\itshape #2}\\%
      #3\\%
      \expandafter\threelines
      \fi
      }
      \makeatother
      `
      Usando una macro del genere, però, è facile andare “fuori sincrono”: sarebbe meglio marcare la fine di ogni gruppo di tre linee con una sequenza di controllo differente. Per esempio:
      `
      \makeatletter
      \def\threelines#1\\#2\\#3\/{%
      \ifx\@empty#1\@empty % if #1 is empty
      \else
      {\bfseries #1}\\%
      {\itshape #2}\\%
      #3\\%
      \expandafter\threelines
      \fi
      }
      \makeatother
      `
      da usarsi così:
      `
      \threelines
      Linea 1\\
      Linea 2\\
      Linea 3\/
      Linea 4\\
      Linea 5\\
      Linea 6\/
      `
      eccetera. Naturalmente questa è solo l’idea generale, poi i dettagli andrebbero raffinati. Per esempio, cosa fare se lo schema con cui si devono susseguire le linee non è rispettato, e cose del genere.

      Ciao.


      Gustavo

    • #55775
      Up
      0
      Down
      ::

      Salve a tutti,
      vorrei scrivere una macro che effettua il parsing di un testo fatto così:
      `Questa è una prima riga\\
      Seconda riga\\
      Terza riga\\
      \\
      Quinta riga (quella precedente era vuota)\\
      Sesta riga\\
      Settima riga\\
      \\
      Nona riga (quella precedente era vuota)\\
      Decima riga\\
      Undicesima riga
      `
      La macro dovrebbe semplicemente mettere in neretto la prima riga di ciascun gruppo di tre (riga 1, 5, 9, eccetera). Dovrebbe mettere in corsivo la seconda riga di ciascun gruppo. Infine dovrebbe lasciare inalterata la terza di ciascun gruppo di tre righe.

      Come posso procedere?
      Grazie,
      Agostino

      Questa potrebbe essere un’idea:
      `\documentclass[a4paper]{article}
      \usepackage[latin1]{inputenc}
      \usepackage[T1]{fontenc}

      \makeatletter
      \newcount\r@wcount
      \def\pp@sentinel{\@empty}
      \def\pprows{\begingroup\parindent=\z@\endlinechar=\m@ne\ppr@ws}
      \def\ppr@ws#1{%
      \r@wcount=\z@\ppr@w#1\\\@empty\\}
      \def\ppr@w#1\\{%
      % controlliamo se siamo alla fine
      \def\temp{#1}%
      \ifx\temp\pp@sentinel
      \expandafter\endgroup
      \else
      \processr@w{#1}\expandafter\ppr@w
      \fi}

      \def\processr@w#1{\advance\r@wcount\@ne
      \ifcase\r@wcount\or
      \textbf{#1}\par\or
      \textit{#1}\par\or
      #1\par\or
      \r@wcount=\z@ \mbox{#1}\par\fi}
      \makeatother

      \begin{document}

      \pprows{%
      Questa è una prima riga\\
      Seconda riga\\
      Terza riga\\
      \\
      Quinta riga (quella precedente era vuota)\\
      Sesta riga\\
      Settima riga\\
      \\
      Nona riga (quella precedente era vuota)\\
      Decima riga\\
      Undicesima riga}

      \end{document}`
      \pprows fa solo un’inizializzazione, per evitare i fine riga dopo i \\. Poi chiama \ppr@ws che comincia il lavoro trovando l’argomento e aggiungendo alla fine una sentinella e partendo con la ricorsione tramite la macro \ppr@w.

      La ricorsione termina quando si incontra la sentinella, altrimenti consiste nell’incrementare il contatore, trovare l’argomento che è delimitato da \\ e trattarlo con \processr@w. Questa macro guarda il valore del contatore e prende la decisione a seconda se valga 1, 2, 3 oppure 4. Nell’ultimo caso azzera il contatore.

      Ciao
      Enrico

    • #55776
      Up
      0
      Down
      ::


      Risposte a tempo di record! 😀
      Grazie!

      Adesso mi chiedo: nel caso in cui si avesse una sequenza non regolare di gruppi di righe, come in questo esempio
      `Questa è una prima riga\\
      Seconda riga\\
      Terza riga\\
      \\
      Quinta riga (quella precedente era vuota)\\
      Sesta riga\\
      \\
      Ottava riga (quella precedente era vuota)\\
      \\
      Decima riga (quella precedente era vuota)\\
      Undicesima riga\\
      Dodicesima riga
      `
      Come si modificherebbe l’algoritmo di Enrico per poter applicare lo stesso schema di formattazione desiderato?
      Chiarisco: la prima riga del gruppo in neretto, la seconda riga (se esiste) in corsivo, la terza riga (se esiste) inalterata.

      Grazie,
      Agostino

    • #55777
      Up
      0
      Down
      ::

      Risposte a tempo di record! 😀
      Grazie!

      Adesso mi chiedo: nel caso in cui si avesse una sequenza non regolare di gruppi di righe, come in questo esempio
      `Questa è una prima riga\\
      Seconda riga\\
      Terza riga\\
      \\
      Quinta riga (quella precedente era vuota)\\
      Sesta riga\\
      \\
      Ottava riga (quella precedente era vuota)\\
      \\
      Decima riga (quella precedente era vuota)\\
      Undicesima riga\\
      Dodicesima riga
      `
      Come si modificherebbe l’algoritmo di Enrico per poter applicare lo stesso schema di formattazione desiderato?
      Chiarisco: la prima riga del gruppo in neretto, la seconda riga (se esiste) in corsivo, la terza riga (se esiste) inalterata.

      Grazie,
      Agostino

      `\makeatletter
      \newcount\r@wcount
      \def\pp@sentinel{\hfuzz}
      \def\pprows{\begingroup\parindent=\z@\endlinechar=\m@ne\ppr@ws}
      \def\ppr@ws#1{%
      \r@wcount=\z@\ppr@w#1\\\hfuzz\\}
      \def\ppr@w#1\\{%
      % controlliamo se siamo alla fine
      \def\pp@temp{#1}%
      \ifx\pp@temp\pp@sentinel
      \expandafter\endgroup
      \else
      \processr@w{#1}\expandafter\ppr@w
      \fi}

      \def\processr@w#1{\advance\r@wcount\@ne
      \ifx\pp@temp\@empty
      \r@wcount=\z@ \strut\par
      \else
      \ifcase\r@wcount\or
      \textbf{#1}\par\or
      \textit{#1}\par\else
      #1\par
      \fi
      \fi}
      \makeatother`
      Controllo se la riga è vuota, in questo caso riazzero il contatore. Per righe non vuote oltre la seconda in ogni gruppo non applico alcun formato. Ho definito in maniera diversa \pp@sentinel, ma è solo per scrupolo. Siccome mi serve la macro prima chiamata \temp anche in un altro contesto, ne ho cambiato il nome in \pp@temp.

      Ciao
      Enrico

    • #55778
      Up
      0
      Down
      ::


      Enrico, sei il solito fenomeno 🙂

      Saluti,
      Agostino

    • #55779
      Up
      0
      Down
      ::


      Come si potrebbe inserire un contatore che conti i gruppi di righe?
      Potrei voler effettuare delle manipolazioni solo sul primo e sul secondo gruppo di righe, lasciando gli altri all’algoritmo di cui sopra.
      Mi spiego. Se ho:
      `Riga 1\\
      Riga 2\\
      Riga 3\\
      \\
      Riga 5\\
      Riga 6\\
      \\
      Riga 7\\
      \\
      Riga 9\\
      Riga 10\\
      Riga 11
      `
      vorrei anteporre $\bullet$ alla Riga 1 e $\star$ alla Riga 5.

      Agostino

    • #55780
      Up
      0
      Down
      ::

      Come si potrebbe inserire un contatore che conti i gruppi di righe?
      Potrei voler effettuare delle manipolazioni solo sul primo e sul secondo gruppo di righe, lasciando gli altri all’algoritmo di cui sopra.
      Mi spiego. Se ho:
      `Riga 1\\
      Riga 2\\
      Riga 3\\
      \\
      Riga 5\\
      Riga 6\\
      \\
      Riga 7\\
      \\
      Riga 9\\
      Riga 10\\
      Riga 11
      `
      vorrei anteporre $\bullet$ alla Riga 1 e $\star$ alla Riga 5.

      Agostino

      Aggiungi un nuovo contatore \r@wcounti che azzererai all’inizio di \ppr@ws come l’altro e incrementi a ogni esecuzione di \ppr@w; prima di \ifcase in \processr@w aggiungi la macro \pppr@fix così definita:
      `\def\pppr@fix{%
      \ifcase\r@wcounti\or
      \textbullet\ \or % 1
      \or %2
      \or %3
      \or %4
      $\star$\ \or %5

      \fi}`
      Modifica come più ti aggrada (spero che sia chiaro il significato dei puntini).

      Ciao
      Enrico

    • #55781
      Up
      0
      Down
      ::


      `\documentclass[a4paper]{article}
      \usepackage[latin1]{inputenc}
      \usepackage[T1]{fontenc}

      \makeatletter
      \newcount\r@wcounti
      \newcount\r@wcount
      \def\pp@sentinel{\hfuzz}
      \def\pprows{\begingroup\parindent=\z@\endlinechar=\m@ne\ppr@ws}
      \def\ppr@ws#1{%
      \r@wcounti=\z@\r@wcount=\z@\ppr@w#1\\\hfuzz\\}
      \def\ppr@w#1\\{%
      % incremento contatore esterno
      \advance\r@wcounti\@ne
      % controlliamo se siamo alla fine
      \def\pp@temp{#1}%
      \ifx\pp@temp\pp@sentinel
      \expandafter\endgroup
      \else
      \processr@w{#1}\expandafter\ppr@w
      \fi}

      \def\pppr@fix{%
      \ifcase\r@wcounti\or
      \textbullet\ \or % 1
      \or %2
      \or %3
      \or %4
      $\star$\ \or %5
      % …
      \fi}

      \def\processr@w#1{\advance\r@wcount\@ne
      \ifx\pp@temp\@empty
      \r@wcount=\z@ \strut\par
      \else
      \pppr@fix
      \ifcase\r@wcount\or
      \textbf{#1}\par\or
      \textit{#1}\par\else
      #1\par
      \fi
      \fi}
      \makeatother

      \begin{document}

      Elenco generico di destinatari:

      \pprows{%
      Assessorato alle politiche sociali\\
      Respons. Quart. Vicaria, dott.ssa Rosa Russo\\
      P.zza Vicario, 31bis\\
      \\
      Comando VV. UU.\\
      Com. Luigi Fariello\\
      \\
      Ufficio Stampa\\
      \\
      Comando VV. FF.\\
      Com. ing. Tiberio Sauro\\
      Sede
      }
      \end{document}
      `

      Grazie.
      Ciao,
      Agostino

    • #55782
      Up
      0
      Down
      ::


      Piccola variante.
      Un esempio realistico di come si possa gestire una lista dei destinatari multipli in una comunicazione formale.
      `\documentclass[a4paper]{article}
      \usepackage[latin1]{inputenc}
      \usepackage[T1]{fontenc}

      \newcommand{\myToMark}{%
      \makebox[0pt][r]{A: }%
      }
      \newcommand{\myCcMark}{%
      \makebox[0pt][r]{E, p.c.: }%
      }

      \makeatletter

      \newcount\r@wcounti
      \newcount\r@wcount
      \def\pp@sentinel{\hfuzz}
      \def\pprows{\begingroup\parindent=\z@\endlinechar=\m@ne\ppr@ws}
      \def\ppr@ws#1{%
      \r@wcounti=\z@\r@wcount=\z@\ppr@w#1\\\hfuzz\\}
      \def\ppr@w#1\\{%
      % incremento contatore esterno
      \advance\r@wcounti\@ne
      % controlliamo se siamo alla fine
      \def\pp@temp{#1}%
      \ifx\pp@temp\pp@sentinel
      \expandafter\endgroup
      \else
      \processr@w{#1}\expandafter\ppr@w
      \fi}

      \def\pppr@fix{%
      \ifcase\r@wcounti\or
      \myToMark{}\or % 1
      \or %2
      \or %3
      \or %4
      \myCcMark{}\or %5
      % …
      \fi}

      \def\processr@w#1{\advance\r@wcount\@ne
      \ifx\pp@temp\@empty
      \r@wcount=\z@ \strut\par
      \else
      \pppr@fix
      \ifcase\r@wcount\or
      \textbf{#1}\par\or
      \textit{#1}\par\else
      #1\par
      \fi
      \fi}
      \makeatother

      \begin{document}

      \pprows{%
      Assessorato alle politiche sociali\\
      Respons. Quart. Vicaria, dott.ssa Rosa Russo\\
      P.zza Vicario, 31bis\\
      \\
      Comando VV. UU.\\
      Com. Luigi Fariello\\
      \\
      Ufficio Stampa\\
      \\
      Comando VV. FF.\\
      Com. ing. Tiberio Sauro\\
      Sede
      }

      \end{document}
      `
      Da notare le macro \myToMark e \myCcMark che appongono le diciture “A: ” e “E p. c.: “, rispettivamente, al primo e al secondo destinatario.

      Ciao,
      Agostino

    • #55783
      Up
      0
      Down
      ::

      Piccola variante.
      Un esempio realistico di come si possa gestire una lista dei destinatari multipli in una comunicazione formale.

      Non mi pare che sia il modo migliore: assumi che la quinta riga sia quella che comincia gli indirizzi “per conoscenza”, ma non è detto che sia così: una lettera potrebbe avere due o più destinatari principali.
      `\documentclass[a4paper]{article}
      \usepackage[latin1]{inputenc}
      \usepackage[T1]{fontenc}

      \makeatletter
      \newcount\r@wcount
      \newcount\@ddrcount
      \def\pp@sentinel{\hfuzz}
      \newcommand\pprows[1][1]{\begingroup
      \r@wcount=\z@
      \chardef\@ddrnum=#1\relax
      \parindent=\z@\endlinechar=\m@ne\ppr@ws}
      \def\ppr@ws#1{\ppr@w#1\\\hfuzz\\}
      \def\ppr@w#1\\{%
      % controlliamo se siamo alla fine
      \def\temp{#1}%
      \ifx\temp\pp@sentinel
      \expandafter\endgroup
      \else
      \processr@w{#1}\expandafter\ppr@w
      \fi}

      \def\pppr@fix{%
      \ifnum\@ddrcount<\@ddrnum \tom@rk \else \ifnum\@ddrcount=\@ddrnum \ccm@rk \fi \fi \advance\@ddrcount\@ne} \def\processr@w#1{\advance\r@wcount\@ne \ifx\temp\@empty \r@wcount=\z@ \strut\par \else \ifcase\r@wcount\or \pppr@fix\textbf{#1}\par\or \textit{#1}\par\else #1\par \fi \fi} \def\tom@rk{\makebox[0pt][r]{A: }} \def\ccm@rk{\makebox[0pt][r]{E, p.c.: }} \makeatother \begin{document} \pprows{% Assessorato alle politiche sociali\\ Respons. Quart. Vicaria, dott.ssa Rosa Russo\\ P.zza Vicario, 31bis\\ \\ Comando VV. UU.\\ Com. Luigi Fariello\\ \\ Ufficio Stampa\\ \\ Comando VV. FF.\\ Com. ing. Tiberio Sauro\\ Sede } \bigskip \pprows[2]{% Assessorato alle politiche sociali\\ Respons. Quart. Vicaria, dott.ssa Rosa Russo\\ P.zza Vicario, 31bis\\ \\ Comando VV. UU.\\ Com. Luigi Fariello\\ \\ Ufficio Stampa\\ \\ Comando VV. FF.\\ Com. ing. Tiberio Sauro\\ Sede } \end{document}` Nel secondo caso dico che i destinatari principali sono due e ciascuno avrà "A:" a fianco. Righe multiple negli indirizzi sono possibili, purché le si separi con \newline (per esempio una doppia riga per la via). Ciao Enrico

    • #55784
      Up
      0
      Down
      ::


      Grazie Enrico.
      Traggo spunto dalla tua precedente soluzione e dal post http://guit.sssup.it/phpbb/viewtopic.php?t=9713 in cui si parla di suddivisione del materiale all’interno di una vbox.
      A questo punto, come si modifica la macro \pprows in modo da suddividere la lista degli indirizzi in più scatole di assegnata altezza?
      Nel codice seguente:
      `\documentclass{minimal}
      \usepackage{ifthen}
      \usepackage{lipsum}

      \makeatletter
      \newcount\r@wcount
      \newcount\@ddrcount
      \def\pp@sentinel{\hfuzz}
      \newcommand\pprows[1][1]{\begingroup
      \r@wcount=\z@
      \chardef\@ddrnum=#1\relax
      \parindent=\z@\endlinechar=\m@ne\ppr@ws}
      \def\ppr@ws#1{\ppr@w#1\\\hfuzz\\}
      \def\ppr@w#1\\{%
      % controlliamo se siamo alla fine
      \def\temp{#1}%
      \ifx\temp\pp@sentinel
      \expandafter\endgroup
      \else
      \processr@w{#1}\expandafter\ppr@w
      \fi}

      \def\pppr@fix{%
      \ifnum\@ddrcount<\@ddrnum \tom@rk \else \ifnum\@ddrcount=\@ddrnum \ccm@rk \fi \fi \advance\@ddrcount\@ne} \def\processr@w#1{\advance\r@wcount\@ne \ifx\temp\@empty \r@wcount=\z@ \strut\par \else \ifcase\r@wcount\or \pppr@fix\textbf{#1}\par\or \textit{#1}\par\else #1\par \fi \fi} \def\tom@rk{\makebox[0pt][r]{A: }} \def\ccm@rk{\makebox[0pt][r]{E, p.c.: }} \makeatother \newlength{\larghezza} \setlength{\larghezza}{12cm} \newlength{\altezza} \setlength{\altezza}{7cm} \newbox\mybox \newbox\myboxa \newcommand\Separa[1]{% \par\begingroup\vbadness=10000 \setbox\mybox=\vbox{\hsize=\larghezza #1} \loop\ifdim\ht\mybox > \altezza
      \setbox\myboxa=\vsplit\mybox to \altezza
      \vbox{\unvbox\myboxa}\hrule
      \repeat
      \vbox{\unvbox\mybox}\hrule\endgroup
      }

      \begin{document}

      \Separa{\lipsum[1-5]}
      \bigskip

      \Separa{\pprows{%
      Servizio Politiche di Inclusione Sociale\\
      Centro comunale di accoglienza per senza fissa dimora ex dormitorio pubblico Via Giuseppe De Blasiis, 10\\
      Luigi Pratolin\\
      \\
      Servizio Giovani\\
      Sede di Bagnoli Via Cicerone, 18\\
      Gino Viglio Crippa\\
      \\
      Servizio Politiche per i Minori, l'Infanzia e l'Adolescenza\\
      Ufficio provvedimenti autorità giudiziaria minorile\\
      Giuseppe Pace\\
      \\
      Servizio Dipartimentale Consiglio Comunale\\
      Attività connesse alle funzioni ispettive del Consiglio Comunale\\
      Gino Giorgetto\\
      \\
      Servizio Reti Tecnologiche Interne\\
      Rete fonia dati\\
      Luigi Sicilia\\
      \\
      Servizio Politiche per i Minori, l'Infanzia e l'Adolescenza\\
      Ufficio interventi integrativi\\
      Rosaria Dinevoli\\
      \\
      Municipalità 1 – Organi Politici\\
      Commissioni Consiliari: segreteria e conferenza dei Presidenti\\
      Eugenio Izzo Aiazzone\\
      \\
      Direttore della I Municipalità Chiaia — San Ferdinando — Posillipo\\
      Segreteria della direzione\\
      \\
      Servizio Archivi Storici\\
      Referente visite guidate, Real Casa Santa dell'Annunziata: ramo esposti\\
      Lucia Renzulli\\
      \\
      U.O.A. Elaborazione degli Stipendi\\
      Ufficio cessioni e prestiti\\
      Vittoria Cecatiello\\
      \\
      Direttore della Municipalità 1\\
      \\
      Direttore della Municipalità 2\\
      Segreteria della direzione\\
      Rosalia Cozzolino\\
      \\
      Direttore della Municipalità 3\\
      Segreteria della direzione\\
      Rosalia Cozzolino\\
      \\
      Direttore della Municipalità 4\\
      Segreteria della direzione\\
      Rosalia Cozzolino\\
      \\
      Direttore della Municipalità 5\\
      Segreteria della direzione\\
      Rosalia Cozzolino\\
      \\
      Direttore della Municipalità 6\\
      Segreteria della direzione\\
      Rosalia Cozzolino\\
      \\
      Direttore della Municipalità 7\\
      Segreteria della direzione\\
      Rosalia Cozzolino
      }}
      \end{document}
      `
      ho chiamato \pprows all’interno di \Separa. In questa situazione \pprows non lavora come ci si aspetterebbe.

      Ciao,
      Agostino

    • #55785
      Up
      0
      Down
      ::


      Credo di aver risolto in questo modo:
      `\begin{document}
      \newbox\BigBox
      \setbox\BigBox=\vbox{\hsize=\larghezza
      \pprows{
      Servizio Politiche di Inclusione Sociale\\
      Centro comunale di accoglienza per senza fissa dimora ex dormitorio pubblico Via Giuseppe De Blasiis, 10\\
      Luigi Pratolin\\
      \\
      Servizio Giovani\\
      Sede di Bagnoli Via Cicerone, 18\\
      Gino Viglio Crippa\\
      \\
      Servizio Politiche per i Minori, l'Infanzia e l'Adolescenza\\
      Ufficio provvedimenti autorità giudiziaria minorile\\
      Giuseppe Pace\\
      \\
      Servizio Dipartimentale Consiglio Comunale\\
      Attività connesse alle funzioni ispettive del Consiglio Comunale\\
      Gino Giorgetto\\
      \\
      Servizio Reti Tecnologiche Interne\\
      Rete fonia dati\\
      Luigi Sicilia\\
      \\
      Servizio Politiche per i Minori, l'Infanzia e l'Adolescenza\\
      Ufficio interventi integrativi\\
      Rosaria Dinevoli\\
      \\
      Municipalità 1 – Organi Politici\\
      Commissioni Consiliari: segreteria e conferenza dei Presidenti\\
      Eugenio Izzo Aiazzone\\
      \\
      Direttore della I Municipalità Chiaia — San Ferdinando — Posillipo\\
      Segreteria della direzione\\
      \\
      Servizio Archivi Storici\\
      Referente visite guidate, Real Casa Santa dell'Annunziata: ramo esposti\\
      Lucia Renzulli\\
      \\
      U.O.A. Elaborazione degli Stipendi\\
      Ufficio cessioni e prestiti\\
      Vittoria Cecatiello\\
      \\
      Direttore della Municipalità 1\\
      \\
      Direttore della Municipalità 2\\
      Segreteria della direzione\\
      Rosalia Cozzolino\\
      \\
      Direttore della Municipalità 3\\
      Segreteria della direzione\\
      Rosalia Cozzolino\\
      \\
      Direttore della Municipalità 4\\
      Segreteria della direzione\\
      Rosalia Cozzolino\\
      \\
      Direttore della Municipalità 5\\
      Segreteria della direzione\\
      Rosalia Cozzolino\\
      \\
      Direttore della Municipalità 6\\
      Segreteria della direzione\\
      Rosalia Cozzolino\\
      \\
      Direttore della Municipalità 7\\
      Segreteria della direzione\\
      Rosalia Cozzolino
      }
      }

      \Separa{\unvbox\BigBox}
      \end{document}
      `
      Metto tutto il risultato di \pprows in una \vbox che chiamo \BigBox: questo permette alla macro di processare le righe come vorrei. Successivamente, con il comando \unvbox\BigBox estraggo il contenuto per darlo in pasto alla macro \Separa.

    • #55786
      Up
      0
      Down
      ::


      Come fare per passare alla macro \pprows un parametro da usare nella macro interna \pppr@fix?
      Vorrei poter effettuare la chiamata:
      `\pprows{pippo}{%
      Riga 1\\
      Riga 2\\
      Riga 3\\
      \\
      Riga 5\\
      Riga 6\\
      \\
      Riga 8
      }
      `

      Grazie,
      Agostino

    • #55787
      Up
      0
      Down
      ::

      Come fare per passare alla macro \pprows un parametro da usare nella macro interna \pppr@fix?
      Vorrei poter effettuare la chiamata:
      `\pprows{pippo}{%
      Riga 1\\
      Riga 2\\
      Riga 3\\
      \\
      Riga 5\\
      Riga 6\\
      \\
      Riga 8
      }
      `

      Grazie,
      Agostino

      Il modo più semplice è
      `\newcommand\pprows[2][1]{\begingroup
      \def\pp@token{#2}%
      \r@wcount=\z@

      }`
      e poi usare \pp@token dove vuoi.

      Ciao
      Enrico

    • #55788
      Up
      0
      Down
      ::


      Continuo in questo filone e pongo il problema del dimensionamento di ciò che viene fuori da \pprows.
      Mettiamo che il materiale trattato da questa macro debba essere composto con un’assegnata giustezza, diciamo \mylinewidth, e debba essere spezzato con un \newpage in modo da entrare verticalmente in uno spazio non superiore ad un’assegnata dimensione, diciamola \myheight.
      Immagino che si debba usare un registro dimensionale come \@tempdima, inizializzarlo e aggiornarlo con un \advance\tempdima\baselineskip man mano che si processano nuove righe.
      L’interruzione di pagina dovrebbe essere data quando \@tempdima>\myheight ma solo se si sta processando una riga vuota. Se l’interruzione dovesse capitare dopo l’inizio di un gruppo di 3 (o 2) ma non alla sua fine:
      `\pprows{pippo}{%
      %…
      Riga 21\\
      Riga 22\\
      Riga 23\\
      \\
      Riga 25\\ <--- interruzione qui Riga 26\\ \\ Riga 28\\ %... } ` Come potrebbe essere gestito il problema?

    • #55789
      Up
      0
      Down
      ::

      Continuo in questo filone e pongo il problema del dimensionamento di ciò che viene fuori da \pprows.
      Mettiamo che il materiale trattato da questa macro debba essere composto con un’assegnata giustezza, diciamo \mylinewidth, e debba essere spezzato con un \newpage in modo da entrare verticalmente in uno spazio non superiore ad un’assegnata dimensione, diciamola \myheight.
      Immagino che si debba usare un registro dimensionale come \@tempdima, inizializzarlo e aggiornarlo con un \advance\tempdima\baselineskip man mano che si processano nuove righe.
      L’interruzione di pagina dovrebbe essere data quando \@tempdima>\myheight ma solo se si sta processando una riga vuota. Se l’interruzione dovesse capitare dopo l’inizio di un gruppo di 3 (o 2) ma non alla sua fine:
      `\pprows{pippo}{%
      %…
      Riga 21\\
      Riga 22\\
      Riga 23\\
      \\
      Riga 25\\ <--- interruzione qui Riga 26\\ \\ Riga 28\\ %... } ` Come potrebbe essere gestito il problema?

      Passo. Questo modo di procedere per gestire dati del genere è sbagliato.

      Ciao
      Enrico

    • #55790
      Up
      0
      Down
      ::


      Grazie lo stesso Enrico.
      Sempre preziosissimi i tuoi suggerimenti.
      Il fatto è che mi sono limitato a riportare delle versioni semplificate dei problemi che affronto. In questo caso specifico ho dei vincoli imposti sul formato degli indirizzi, che al momento sono rigidamente fissati come ho descritto nei post precedenti.

      Ciao,
      Agostino

    • #55791
      Up
      0
      Down
      ::

      […]
      Mettiamo che il materiale trattato da questa macro […] debba essere spezzato con un \newpage in modo da entrare verticalmente in uno spazio non superiore ad un’assegnata dimensione, diciamola \myheight.
      Immagino che si debba usare un registro dimensionale come \@tempdima, inizializzarlo e aggiornarlo con un \advance\tempdima\baselineskip man mano che si processano nuove righe.
      L’interruzione di pagina dovrebbe essere data quando \@tempdima>\myheight ma solo se si sta processando una riga vuota. Se l’interruzione dovesse capitare dopo l’inizio di un gruppo di 3 (o 2) ma non alla sua fine:[…]

      Perché vuoi metterti a fare “a mano” i conti che il costruttore di pagine fa già “a livello macchina”?

      Non posso fare a meno di notare che i problemi che ti stai ponendo, relativi alla formattazione di indirizzi, sono gli stessi che dovetti affrontare io, dieci anni fa, quando scrissi la classe letteracdp, per comporre le lettere del Coordinamento Dottorandi di Padova. A questo punto, mi chiedo se non ti andrebbe di guardare come provai a risolverli allora. In particolare, ti suggerirei di guardare la definizione dell’ambiente foldedpresentation, che serve a spezzare gli indirizzi in due parti, delle quali una stia dentro a un’altezza prefissata (in quel caso, quella del lembo della lettera da ripiegare).

      Se hai una TeXlive, puoi dare il comando `texdoc cdpbundl`Oltretutto, la definizione dell’ambiente foldedpresentation è uno dei pochi punti del codice che ho provveduto a commentare! 🙂

      Ciao.


      Gustavo

    • #55792
      Up
      0
      Down
      ::


      Mi sono accorto che ho detto una sciocchezza, perché il comando`texdoc cdpbundl`visualizza la documentazione “breve”, che non include il codice: per questo devi compilare il file cdpbundl.dtx. Ma forse tutto ciò non ti interessa…

    • #55793
      Up
      0
      Down
      ::


      Al contrario, letteracdp è la prima cosa che ho guardato. Infatti la documentazione “breve” non mi sembrava un buon punto da cui iniziare. Ragion per cui, dopo alcune valutazioni di opportunità, ho scelto di usare la classe scrlttr2 che è ben documentata e flessibile.
      A questo punto compilerò il file .dtx e guarderò il codice.
      Per quanto riguarda il problema di cui sopra, sono vicino alla soluzione con qualche modifica al codice di Enrico.

      Ciao,
      Agostino

    • #55794
      Up
      0
      Down
      ::


      Segnalo il pacchetto parselines
      http://www.tex.ac.uk/tex-archive/macros/latex/contrib/parselines/
      che offra la possibilità di definire del codice da applicare alle singole righe.
      Un esempio potrebbe essere:
      `\documentclass{minimal}
      \usepackage{xifthen}
      \usepackage{parselines}
      \begin{document}
      \begin{parse lines}{%
      %
      % codice utente qui (#1 rappresenta la singola riga)
      %
      \ifthenelse{\isempty{#1}}
      {\row: (riga vuota)\par}
      {\row: #1\par}
      }
      Riga 1
      Riga 2
      Riga 3

      Riga 5
      Riga 6

      Riga 8
      \end{parse lines}
      \end{document}
      `
      Il codice da applicare a ciascuna riga potrebbe effettuare i conteggi suggeriti dal codice di Enrico risolvendo lo stesso problema in modo diverso.

      Ciao,
      Agostino

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

Go to top