Copertine con dati variabili

  • Creatore
    Topic
  • #19726
    robitex
    Amministratore del forum
      Up
      0
      Down
      ::


      Salve,
      vorrei abbreviarmi il lavoro di redazione di una cinquantina di “copertine”.

      In ciascuna di esse vi sono informazioni grafiche e testuali fisse, ed informazioni testuali che cambiano, relative a tre campi testuali indipendenti.

      E’ un po come voler fare un mail merge per inviare la stessa lettera a molti destinatari.

      Cosa mi suggerireste?

      Grazie.

    Visualizzazione 8 filoni di risposte
    • Autore
      Risposte
      • #19727
        Up
        0
        Down
        ::

        Salve,
        vorrei abbreviarmi il lavoro di redazione di una cinquantina di “copertine”.

        In ciascuna di esse vi sono informazioni grafiche e testuali fisse, ed informazioni testuali che cambiano, relative a tre campi testuali indipendenti.

        E’ un po come voler fare un mail merge per inviare la stessa lettera a molti destinatari.

        Cosa mi suggerireste?

        Una volta che hai costruito nel modo che ti aggrada la copertina, prendi il codice relativo, al posto degli elementi variabili ci piazzi #1, #2 e #3 e metti tutto nella definizione del comando \copertina:
        `\newcommand{\copertina}[3]{%
        }`
        Dunque i parametri #1, #2 e #3 stanno al posto degli elementi variabili. Comporrai le copertine con il seguente input:
        `\copertina{aaa}{bbb}{ccc}
        \copertina{ddd}{eee}{fff}
        …`
        Ciao
        Enrico

      • #19728
        robitex
        Amministratore del forum
          Up
          0
          Down
          ::


          Grazie mille.

          Funziona molto bene.

          Ho solo fatto un passo in più mettendo in un file separato i dati sorgenti riportati in esempio quì sotto.

          Rimangono così nettamente separati i dati dalla loro vista (le copertine).
          Qualora volessi cambiarne l’aspetto dovrei intervenire su questo secondo file tex.

          `…
          \copertina{aaa}{bbb}{ccc}
          \copertina{ddd}{eee}{fff}
          …`

          Faccio un’altra domanda:
          il numero dei campi utilizzabili nella definizione del comando \copertina è illimitato?

          Grazie ancora.

        • #19729
          Up
          0
          Down
          ::


          No, Tex e quindi Latex accettano massimo 9 campi. Se necessiti qualcosa di più, bisogna creare qualcosa di più complicato.

        • #19730
          Up
          0
          Down
          ::

          Faccio un’altra domanda:
          il numero dei campi utilizzabili nella definizione del comando \copertina è illimitato?

          Il modo per definire una macro che abbia più di nove parametri, per esempio 16, è il seguente:
          `\newcommand{\miocomando}[9]{%
          \def\miouno{#1}%
          \def\miodue{#2}%
          \def\miotre{#3}%
          \def\mioquattro{#4}%
          \def\miocinque{#5}%
          \def\miosei{#6}%
          \def\miosette{#7}%
          \def\miootto{#8}%
          \def\mionove{#1}%
          \miocomandobis}
          \newcommand{\miocomandobis}[7]{%
          }`
          Nel codice userai \mio per indicare uno dei primi nove argomenti, #1, #2 e così via per uno dei successivi sette argomenti. Puoi richiamare proprio dando i sedici argomenti:
          `\miocomando{1}{2}{3}{4}{5}{6}{7}{8}{9}{10}{11}{12}{13}{14}{15}{16}`
          In apparenza sono sedici argomenti a \miocomando, in realtà sono nove argomenti a \miocomando e sette a \miocomandobis. Però è un modo pesante di lavorare, ci si perde a contare gli argomenti e le graffe: più di tre o quattro è sconsigliabile.

          Un altro modo, allora, è di usare “macro chiave”: scrivi la tua definizione di \copertina senza argomenti; dove prima usavi #1 eccetera, sostituisci con un comando il cui nome richiami la funzione:
          `\newcommand{\copertina}{%

          \xtitolo
          }`
          Poi definisci il comando
          `\newcommand{\titolo}[1]{\def\xtitolo{#1}}`
          e fai in modo analogo per gli altri campi che ti servono, diciamo \autore e \anno. Adesso puoi comporre la copertina scrivendo
          `\titolo{Un titolo}
          \autore{A. U. Tore}
          \anno{2035}
          \copertina`
          È il modo usato da LaTeX per le intestazioni dei documenti con \maketitle. In questo modo hai il vantaggio che puoi “vedere” meglio i vari campi e anche scriverli in ordine sparso, se preferisci. Potrebbe essere indicato anche un metodo “misto”: \copertina con un certo numero di argomenti (per esempio numerici) e comandi per i campi testuali.

          Ciao
          Enrico

        • #19731
          robitex
          Amministratore del forum
            Up
            0
            Down
            ::


            Sto creando la lista dei documenti corrispondenti alle singole copertine emesse.

            Ho pensato di utilizzare il file dati.tex in cui vi sono unicamente i comandi \copertina{a}{b}{c} dove a, b, c sono i campi variabili, utilizzando un secondo file (parallelo a quello che genera le copertine), dove ho inserito il comando \input{dati} all’interno di un ambiente supertabular:

            Ecco la ridefinizione del comando copertina:

            `\newcommand{\copertina}[3]{%
            \texttt{#3} & #2 & \textbf{#1}\\
            \midrule}`

            ed ecco il suo utilizzo:
            `\begin{supertabular}{cp{8cm}|c}
            \input{dati}
            \end{supertabular}`

            nel file dati.tex vi sono le linee:

            `…
            \copertina{uno}{relazione uno}{originale uno}
            \copertina{due}{relazione due}{originale due}
            \copertina{tre}{relazione tre}{originale tre}

            `

            il problema è che la tabella va oltre il margine inferiore, mentre nella pagina successiva ricompare ma da un numero di riga successivo.

            Penso che ciò sia dovuto a difficoltà di calcolo dei punti in cui spezzare la tabella.

            Ma l’idea è molto buona perchè con un unico file di dati in cui una riga corrisponde ad un documento, ottengo sia le copertine che un elenco complessivo perfettamente corrispondente.

            Grazie.

            PS. Colgo l’occasione per ringraziare delle meravigliose risposte.

          • #19732
            Up
            0
            Down
            ::

            Sto creando la lista dei documenti corrispondenti alle singole copertine emesse.

            Ho pensato di utilizzare il file dati.tex in cui vi sono unicamente i comandi \copertina{a}{b}{c} dove a, b, c sono i campi variabili, utilizzando un secondo file (parallelo a quello che genera le copertine), dove ho inserito il comando \input{dati} all’interno di un ambiente supertabular:

            Ecco la ridefinizione del comando copertina:

            `\newcommand{\copertina}[3]{%
            \texttt{#3} & #2 & \textbf{#1}\\
            \midrule}`

            ed ecco il suo utilizzo:
            `\begin{supertabular}{cp{8cm}|c}
            \input{dati}
            \end{supertabular}`

            nel file dati.tex vi sono le linee:

            `…
            \copertina{uno}{relazione uno}{originale uno}
            \copertina{due}{relazione due}{originale due}
            \copertina{tre}{relazione tre}{originale tre}

            `

            il problema è che la tabella va oltre il margine inferiore, mentre nella pagina successiva ricompare ma da un numero di riga successivo.

            Penso che ciò sia dovuto a difficoltà di calcolo dei punti in cui spezzare la tabella.

            Ma l’idea è molto buona perchè con un unico file di dati in cui una riga corrisponde ad un documento, ottengo sia le copertine che un elenco complessivo perfettamente corrispondente.

            Usa longtable.

            Ciao
            Enrico

          • #19733
            robitex
            Amministratore del forum
              Up
              0
              Down
              ::


              Perfetto, grazie.

              <>

            • #19734
              robitex
              Amministratore del forum
                Up
                0
                Down
                ::

                … Un altro modo, allora, è di usare “macro chiave”: scrivi la tua definizione di \copertina senza argomenti; dove prima usavi #1 eccetera, sostituisci con un comando il cui nome richiami la funzione:
                `\newcommand{\copertina}{%

                \xtitolo
                }`
                Poi definisci il comando
                `\newcommand{\titolo}[1]{\def\xtitolo{#1}}`
                e fai in modo analogo per gli altri campi che ti servono, diciamo \autore e \anno. Adesso puoi comporre la copertina scrivendo
                `\titolo{Un titolo}
                \autore{A. U. Tore}
                \anno{2035}
                \copertina`
                È il modo usato da LaTeX per le intestazioni dei documenti con \maketitle. In questo modo hai il vantaggio che puoi “vedere” meglio i vari campi e anche scriverli in ordine sparso, se preferisci. Potrebbe essere indicato anche un metodo “misto”: \copertina con un certo numero di argomenti (per esempio numerici) e comandi per i campi testuali.

                Ciao
                Enrico

                Buonasera a tutti.
                Ho ripreso questa soluzione per produrre un documento composto da schede con dati testuali variabili.
                Bene.

                Tuttavia i campi che fanno parte della scheda sono molti, veramente molti (… circa una dozzina quindi certamente troppi tasti da digitare), quindi non potevo non pensare a qualcosa che mi abbreviasse il compito: un comando che generi la macro chiave che a sua volta generi il comando interno.

                Chiaro. Una volta che la sfida è stata lanciata non ci si può ritirare.
                Dunque mi sono messo all’opera, e quando ormai stavo rinunciando sono riuscito nell’intento.

                Ho consultato la guida del Prof. Gregorio sulla programmazione in LaTeX a pag. 117 (Definizioni dentro definizioni), dove si spiega come TeX legge un doppio #, la pagina 81 sulla modalità con cui vengono determinati gli argomenti di un comando, e la pagina 93 dove si spiega come definire un comando dato il testo del nome.

                Ok. Con il codice che segue, un campo può essere costruito con un unico comando (il nome delle macro interne è il nome del campo preceduto dalla lettera x):
                `\makecmd{nomecampo}

                \newcommand{\esempio}{Ecco l'esempio: \xnomecampo}

                % da usare così:
                \nomecampo{valore primo}
                \esempio

                \nomecampo{valore secondo}
                \esempio
                %ecc
                `

                ecco il codice:`\documentclass[a4paper]{article}
                \usepackage[utf8]{inputenc}
                \usepackage[T1]{fontenc}
                \usepackage{lmodern}

                % ditemi se questa non è literate programming… modestamente
                \newcommand{\makexcmd}[1]{%
                \expandafter\def\csname #1\endcsname##1{%
                \expandafter\def\csname x#1\endcsname{##1}}
                }

                \makexcmd{indirizzo}
                \makexcmd{citta}
                % comodo non è vero?

                % ecco il comando per generare l'oggetto contenente campi variabili
                \newcommand{\esempio}{%
                Questo è un esempio di indirizzo: \xindirizzo.

                E questa è la città corrispondente: \xcitta.
                }

                \begin{document}

                \indirizzo{Via Genova, 222}
                \citta{Milano}
                \esempio

                \bigskip
                \indirizzo{Via Milano, 222}
                \citta{Genova}
                \esempio

                \end{document}
                `

                … buon proseguimento.
                Ciao.

                Nota: approfitto dell’ora tarda per permettere al post di sfuggire al prof. eh eh eh

              • #19735
                Up
                0
                Down
                ::

                Buonasera a tutti.
                Ho ripreso questa soluzione per produrre un documento composto da schede con dati testuali variabili.
                Bene.

                Tuttavia i campi che fanno parte della scheda sono molti, veramente molti (… circa una dozzina quindi certamente troppi tasti da digitare), quindi non potevo non pensare a qualcosa che mi abbreviasse il compito: un comando che generi la macro chiave che a sua volta generi il comando interno.

                Chiaro. Una volta che la sfida è stata lanciata non ci si può ritirare.
                Dunque mi sono messo all’opera, e quando ormai stavo rinunciando sono riuscito nell’intento.

                Ho consultato la guida del Prof. Gregorio sulla programmazione in LaTeX a pag. 117 (Definizioni dentro definizioni), dove si spiega come TeX legge un doppio #, la pagina 81 sulla modalità con cui vengono determinati gli argomenti di un comando, e la pagina 93 dove si spiega come definire un comando dato il testo del nome.

                Ok. Con il codice che segue, un campo può essere costruito con un unico comando (il nome delle macro interne è il nome del campo preceduto dalla lettera x):
                `\makecmd{nomecampo}

                \newcommand{\esempio}{Ecco l'esempio: \xnomecampo}

                % da usare così:
                \nomecampo{valore primo}
                \esempio

                \nomecampo{valore secondo}
                \esempio
                %ecc
                `

                ecco il codice:`\documentclass[a4paper]{article}
                \usepackage[utf8]{inputenc}
                \usepackage[T1]{fontenc}
                \usepackage{lmodern}

                % ditemi se questa non è literate programming… modestamente
                \newcommand{\makexcmd}[1]{%
                \expandafter\def\csname #1\endcsname##1{%
                \expandafter\def\csname x#1\endcsname{##1}}
                }

                \makexcmd{indirizzo}
                \makexcmd{citta}
                % comodo non è vero?

                % ecco il comando per generare l'oggetto contenente campi variabili
                \newcommand{\esempio}{%
                Questo è un esempio di indirizzo: \xindirizzo.

                E questa è la città corrispondente: \xcitta.
                }

                \begin{document}

                \indirizzo{Via Genova, 222}
                \citta{Milano}
                \esempio

                \bigskip
                \indirizzo{Via Milano, 222}
                \citta{Genova}
                \esempio

                \end{document}
                `

                … buon proseguimento.
                Ciao.

                Nota: approfitto dell’ora tarda per permettere al post di sfuggire al prof. eh eh eh

                Ora tarda? 😆

                Il codice è interessante. Ma
                `\makeatletter
                \newcommand{\makexcmd}[1]{\@namedef{#1}##1{\@namedef{x#1}{##1}}}
                \makeatother`
                è più breve! In effetti \@namedef{#1} si espande in
                `\expandafter\def\csname#1\endcsname`
                Ciao
                Enrico

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

            Go to top