Comando istanziabile più volte

  • Creatore
    Topic
  • #95507
    Up
    0
    Down
    ::


    Buongiorno a tutti,
    sto modificando un file .sty che ha il compito di creare una pagina usando istruzioni invocate in un file .tex. Avrei bisogno di creare una cosa del genere: vorrei un comando diciamo \affiliazione, che possa essere chiamato un numero di volte arbitrario, tale per cui il risultato finale sia

    bla bla bla affiliazione1, affiliazione2, affiliazione3, …, affiliazione(n-1) ed affiliazioneN

    Io vorrei che nel file .tex basti scrivere
    `\affiliazione{affiliazione1}
    \affiliazione{affiliazione2}

    \affiliazione{affiliazioneN}`
    ma non ho la più pallida idea di che cosa io debba mettere nel file .sty affinché questo avvenga! Qualcuno potrebbe aiutarmi o quantomeno indirizzarmi?
    Grazie a tutti anticipatamente

Visualizzazione 14 filoni di risposte
  • Autore
    Risposte
    • #95508
      OldClaudio
      Partecipante
        Up
        0
        Down
        ::


        Domanda interessante, ma ambigua.
        Non si capisce se vuoi u comando \affiliazione per costruire una lista di affiliazioni concatenate, che poi con un unico comando puoi stampare tutte assieme, oppure se vuoi creare un “vettore” di affiliazioni da indicare e stampare con una espressione simile a quella che usi per recuperare l’n-esimo elemento di un matrice di una sola colonna.

        In ogni caso per creare la lista o per creare gli elementi del vettore, devi usare un comando e per stamprne il contenuto devi usarne un altro; non puoi usare lo stesso comando per scopi diversi.

        Se, quindi, spieghi meglio che cosa vuoi fare, forse si può trovare una soluzione.

      • #95509
        franen
        Partecipante
          Up
          0
          Down
          ::


          Ciao, la sintassi di LaTeX non vuole,solitamente, numeri all’interno dei nomi dei comandi, infatti se provi a compilare l’esempio qui sotto ottieni un errore.
          `
          \documentclass{article}
          \newcommand{\affiliazione1}{ciao}
          \begin{document}
          \affiliazione1
          \end{document}`

          Potresti usare il pacchetto etoolbox:

          `
          \documentclass{article}
          \usepackage{etoolbox}
          \csdef{affiliazione1}{ciao}
          \begin{document}
          \csuse{affiliazione1}
          \end{document}`

          Potrebbero esserci però problemi di fragilità dei comandi.
          Nel tuo .sty vuoi definire tutti i vari \affiliazionenn? Quel numero non potrebbe essere usato come argomento del comando \affiliazione? Più ci dici, più è facile aiutarti.

          Fran

        • #95510
          Up
          0
          Down
          ::


          In effetti la tua domanda è decisamente ambigua e necessita di più dettagli.

          Cosa succede quando hai 2 autori di cui il primo ha 2 affiliazioni e il secondo 3? Come li stampi? Quando si è in fase di progetto devi prima pensare a tutta una serie di casi ed eccezioni per essere il più generale possibili. Poi, quando lo si fatto, in genere si scopre che manca sempre qualcosa 😉

          Non so quale sia il tuo scopo, non avendo quei dettagli, ma io cercherei di tenere le cose il più semplici possibile, per esempio un comando [\tt]\affiliazione[/tt] per autore in cui il parametro sia la lista di affiliazioni. Se ce n’è una bene, se ce ne sono di più si itera sulla lista.

          Ciao
          Claudio

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

            Gero27″ post=95123Buongiorno a tutti,
            sto modificando un file .sty che ha il compito di creare una pagina usando istruzioni invocate in un file .tex. Avrei bisogno di creare una cosa del genere: vorrei un comando diciamo \affiliazione, che possa essere chiamato un numero di volte arbitrario, tale per cui il risultato finale sia

            bla bla bla affiliazione1, affiliazione2, affiliazione3, …, affiliazione(n-1) ed affiliazioneN

            Io vorrei che nel file .tex basti scrivere
            `\affiliazione{affiliazione1}
            \affiliazione{affiliazione2}

            \affiliazione{affiliazioneN}`
            ma non ho la più pallida idea di che cosa io debba mettere nel file .sty affinché questo avvenga! Qualcuno potrebbe aiutarmi o quantomeno indirizzarmi?
            Grazie a tutti anticipatamente

            Ciao,
            si può fare molto meglio di così:
            il comando
            `
            \sequence{affiliazione}
            `
            potrebbe generare il testo:
            `affiliazione1, affiliazione2, affiliazione3, …, affiliazione(n-1) ed affiliazioneN`

            Una bazzecola con LaTeX3…
            R.

          • #95512
            Up
            0
            Down
            ::

            Gero27″ post=95123Buongiorno a tutti,
            sto modificando un file .sty che ha il compito di creare una pagina usando istruzioni invocate in un file .tex. Avrei bisogno di creare una cosa del genere: vorrei un comando diciamo \affiliazione, che possa essere chiamato un numero di volte arbitrario, tale per cui il risultato finale sia

            bla bla bla affiliazione1, affiliazione2, affiliazione3, …, affiliazione(n-1) ed affiliazioneN

            Io vorrei che nel file .tex basti scrivere
            `\affiliazione{affiliazione1}
            \affiliazione{affiliazione2}

            \affiliazione{affiliazioneN}`
            ma non ho la più pallida idea di che cosa io debba mettere nel file .sty affinché questo avvenga! Qualcuno potrebbe aiutarmi o quantomeno indirizzarmi?
            Grazie a tutti anticipatamente

            Be’, non è molto chiaro come vuoi adoperare il comando. Questa però può essere l’idea:
            `
            \usepackage{xparse}
            \ExplSyntaxOn
            \NewDocumentCommand{\affiliazione}{m}
            {
            \seq_gput_right:Nn \g_gero_affiliations_seq { #1 }
            }
            \NewDocumentCommand{\stampaaffiliazioni}{ }
            {
            \seq_use:Nnnn \g_gero_affiliations_seq { ~e~ } { ,~ } { ~e~ }
            }
            \seq_new:N \g_gero_affiliations_seq
            \ExplSyntaxOff
            `

            Ciao
            Enrico

          • #95513
            Up
            0
            Down
            ::


            Grazie a tutti per le numerose risposte; mi scuso per la poca chiarezza e ci riprovo.

            OldClaudio” post=95129Non si capisce se vuoi u comando \affiliazione per costruire una lista di affiliazioni concatenate, che poi con un unico comando puoi stampare tutte assieme, oppure se vuoi creare un “vettore” di affiliazioni da indicare e stampare con una espressione simile a quella che usi per recuperare l’n-esimo elemento di un matrice di una sola colonna.

            Direi che quello che vorrei è esattamente la seconda opzione, come forse sarà più chiaro tra poco!

            franen” post=95133la sintassi di LaTeX non vuole,solitamente, numeri all’interno dei nomi dei comandi

            Lo so bene; il comando nel mio esempio era semplicemente \affiliazione, coi numeri indicavo le varie istanze (quello che viene stampato, un modo per non inventarmene alcune).

            cfiandra” post=95140Cosa succede quando hai 2 autori di cui il primo ha 2 affiliazioni e il secondo 3? Come li stampi? Quando si è in fase di progetto devi prima pensare a tutta una serie di casi ed eccezioni per essere il più generale possibili. Poi, quando lo si fatto, in genere si scopre che manca sempre qualcosa 😉

            Non succede, perché non è fra i miei casi… a dir la verità non ho neanche mai parlato di autore 🙂 l’”autore” è sempre unico, mentre le “affiliazioni” possono essere in numero variabile.

            robitex” post=95141si può fare molto meglio di così:
            il comando
            `
            \sequence{affiliazione}
            `
            potrebbe generare il testo:
            `affiliazione1, affiliazione2, affiliazione3, …, affiliazione(n-1) ed affiliazioneN`

            Una bazzecola con LaTeX3…
            R.

            Grazie perché non conoscevo il comando \sequence, ma a occhio direi che non è quello che fa al caso mio: io non voglio stampare tante volte la parola “affiliazione”, ma tante affiliazioni differenti!

            Dunque, innanzitutto si parla di un frontespizio per le tesi di dottorato di un’università. Tra poco toccherà a me, e siccome quand’ho preso in mano quel modello ho avuto i brividi, sto tentando di riscriverlo; ma, ahimè, le mie conoscenze di TeX son (molto) limitate.
            Il file che costruisce il frontespizio è, diciamo, Title_page.sty. Il suo interno, ridotto al minimo che può rendere l’idea è del tipo:
            `\long\def\specialite#1{\gdef\@specialite{#1}}
            \long\def\auteur#1{\gdef\@auteur{#1}}
            \long\def\directeur#1{\gdef\@directeur{#1}}

            Thèse\\
            Spécialité~: \@specialite\\
            Présentée par \@auteur\\
            Thèse dirigée par \@directeur`
            Poi ci sarà un file, diciamo Tesi.tex, che conterrà
            `\usepackage{Title_page}
            \specialite{Controllo di sistemi in rete}
            \auteur{un povero dottorando}
            \directeur{l'uomo nero}
            `

            Ora, io vorrei aggiungere in Title_page.sty un comando che funzioni come gli altri, ma che possa esser chiamato più volte, diciamo \affiliation; in modo tale che (modificando ovviamente opportunamente anche la seconda parte di tale file, in modo da costruire le righe che voglio aggiungere), aggiungendo in Tesi.tex una serie di comandi tipo
            `\affiliazione{istituto di ricerca}
            \affiliazione{laboratorio}
            \affiliazione{scuola dottorale}`
            mi ritrovi ad avere un frontespizio che recita:

            Thèse
            Spécialité : Controllo di sistemi in rete
            Présentée par un povero dottorando
            Thèse dirigée par l’uomo nero
            préparée au sein de l’istituto di ricerca, du laboratorio et de l’école doctorale scuola dottorale.

            Immagino mi debba costruire un vettore di affiliazioni e tirarle fuori a una a una, ma non ho idea di come possa fare una cosa del genere!

          • #95514
            franen
            Partecipante
              Up
              0
              Down
              ::


              IN questo caso l’idea di Enrico va benissimo: con il comando \affiliazione aggiungi, ogni volta che lo usi, un elemento a una sequence di LaTeX3. Poi metti \stampaaffiliazioni laddove vuoi che le affiliazioni vengano stampate.

              Fran

            • #95515
              Up
              0
              Down
              ::

              franen” post=95166IN questo caso l’idea di Enrico va benissimo: con il comando \affiliazione aggiungi, ogni volta che lo usi, un elemento a una sequence di LaTeX3. Poi metti \stampaaffiliazioni laddove vuoi che le affiliazioni vengano stampate.

              Fran

              Immaginavo che il suo commento fosse la soluzione 😀 ma a dir la verità non son nemmeno sicuro di aver capito come si usa quindi ho preferito non commentarlo… ci provo, per intanto grazie!

            • #95516
              Up
              0
              Down
              ::

              Gero27″ post=95163

              Cosa succede quando hai 2 autori di cui il primo ha 2 affiliazioni e il secondo 3? Come li stampi? Quando si è in fase di progetto devi prima pensare a tutta una serie di casi ed eccezioni per essere il più generale possibili. Poi, quando lo si fatto, in genere si scopre che manca sempre qualcosa 😉

              Non succede, perché non è fra i miei casi… a dir la verità non ho neanche mai parlato di autore 🙂 l’”autore” è sempre unico, mentre le “affiliazioni” possono essere in numero variabile.

              Ok!

              Gero27″ post=95163Dunque, innanzitutto si parla di un frontespizio per le tesi di dottorato di un’università. Tra poco toccherà a me, e siccome quand’ho preso in mano quel modello ho avuto i brividi, sto tentando di riscriverlo; ma, ahimè, le mie conoscenze di TeX son (molto) limitate.
              Il file che costruisce il frontespizio è, diciamo, Title_page.sty. Il suo interno, ridotto al minimo che può rendere l’idea è del tipo:
              `\long\def\specialite#1{\gdef\@specialite{#1}}
              \long\def\auteur#1{\gdef\@auteur{#1}}
              \long\def\directeur#1{\gdef\@directeur{#1}}

              Thèse\\
              Spécialité~: \@specialite\\
              Présentée par \@auteur\\
              Thèse dirigée par \@directeur`
              Poi ci sarà un file, diciamo Tesi.tex, che conterrà
              `\usepackage{Title_page}
              \specialite{Controllo di sistemi in rete}
              \auteur{un povero dottorando}
              \directeur{l'uomo nero}
              `

              Ora, io vorrei aggiungere in Title_page.sty un comando che funzioni come gli altri, ma che possa esser chiamato più volte, diciamo \affiliation; in modo tale che (modificando ovviamente opportunamente anche la seconda parte di tale file, in modo da costruire le righe che voglio aggiungere), aggiungendo in Tesi.tex una serie di comandi tipo
              `\affiliazione{istituto di ricerca}
              \affiliazione{laboratorio}
              \affiliazione{scuola dottorale}`
              mi ritrovi ad avere un frontespizio che recita:

              Thèse
              Spécialité : Controllo di sistemi in rete
              Présentée par un povero dottorando
              Thèse dirigée par l’uomo nero
              préparée au sein de l’istituto di ricerca, du laboratorio et de l’école doctorale scuola dottorale.

              Immagino mi debba costruire un vettore di affiliazioni e tirarle fuori a una a una, ma non ho idea di come possa fare una cosa del genere!

              Ecco perché il mio consiglio precedente era sbagliato: per me “affiliazione” è l’università, non il laboratorio o la scuola di dottorato. La mia personalissima opinione è che per passare un argomento ad un comando sotto forma di lista, quella lista deve contenere un’informazione omogenea. Se per affiliazione intendiamo il nome dell’università, sono d’accordo. Una persona può essere affiliata a un numero variabile di università. Se per affiliazione intendiamo università, istituto di ricerca, dipartimento, gruppo, edificio, piano, numero di ufficio e sedia se condividi l’ufficio, allora non sono d’accordo. Se dovessi fare io questo tipo di lavoro, mi definirei un comando per ciascun elemento.

              Poi fai tu. Chiaramente, però, affinché tu possa stampare:

              préparée au sein de l’istituto di ricerca, du laboratorio et de l’école doctorale scuola dottorale.

              non potrai usare semplicemente la macro [tt]\stampaaffiliazioni[/tt], ma dovrai accedere ai vari campi separatamente.

              Ciao
              Claudio

            • #95517
              Up
              0
              Down
              ::


              Sono tecnicamente d’accordo, infatti il tutto è stato incapsulato in comandi opportuni (non entro nei dettagli dei vincoli del caso specifico, come si sa spesso le soluzioni sono imposte anche da questo).

              In ogni caso, adesso tutto funziona alla perfezione eccetto un piccolo particolare: all’inizio del mio file Title_page.sty ho le righe
              `\RequirePackage{ifxetex, xparse}
              \ifxetex\RequirePackage{fontspec}\else\RequirePackage[utf8]{inputenc}\fi
              \AtBeginDocument{
              \ifx\colorbox\undefined\RequirePackage{color}\fi
              \ifx\includegraphics\undefined\RequirePackage{graphicx}\fi}`
              che funzionavano perfettamente fino all’aggiunta del pacchetto xparse, ma ora mi danno questo errore:
              `! Missing number, treated as zero.

              c
              l.59 \makeTitlePage`
              Questo si verifica solo se chiamo il pacchetto xparse e il pacchetto graphicx all’interno del costrutto condizionale! Senza xparse tutto funziona alla meraviglia, e dicendo semplicemente `\RequirePackage{graphicx}` pure! Non è gravissimo, potrei optare per questa seconda soluzione e sapere che graphicx è già chiamato, ma qualcuno sa dirmi perché ciò succede??

            • #95518
              Up
              0
              Down
              ::

              Gero27″ post=95178Sono tecnicamente d’accordo, infatti il tutto è stato incapsulato in comandi opportuni (non entro nei dettagli dei vincoli del caso specifico, come si sa spesso le soluzioni sono imposte anche da questo).

              In ogni caso, adesso tutto funziona alla perfezione eccetto un piccolo particolare: all’inizio del mio file Title_page.sty ho le righe
              `\RequirePackage{ifxetex, xparse}
              \ifxetex\RequirePackage{fontspec}\else\RequirePackage[utf8]{inputenc}\fi
              \AtBeginDocument{
              \ifx\colorbox\undefined\RequirePackage{color}\fi
              \ifx\includegraphics\undefined\RequirePackage{graphicx}\fi}`
              che funzionavano perfettamente fino all’aggiunta del pacchetto xparse, ma ora mi danno questo errore:
              `! Missing number, treated as zero.

              c
              l.59 \makeTitlePage`
              Questo si verifica solo se chiamo il pacchetto xparse e il pacchetto graphicx all’interno del costrutto condizionale! Senza xparse tutto funziona alla meraviglia, e dicendo semplicemente `\RequirePackage{graphicx}` pure! Non è gravissimo, potrei optare per questa seconda soluzione e sapere che graphicx è già chiamato, ma qualcuno sa dirmi perché ciò succede??

              Un paio di osservazioni.

              1) Non capisco l’utilità del test `\ifxetex\RequirePackage{fontspec}\else\RequirePackage[utf8]{inputenc}\fi` Infatti, il pacchetto inputenc funziona benissimo con il motore di compilazione xelatex. Forse quel test ti serve per utilizzare fontspec o babel.

              2) Suppondendo che etoolbox sia caricato, non sarebbe meglio fare i test `\AtBeginDocument{
              \ifx\colorbox\undefined\RequirePackage{color}\fi
              \ifx\includegraphics\undefined\RequirePackage{graphicx}\fi}` [tt]\AtEndPreamble[/tt]? Così, in caso, i pacchetti vengono caricati nel preambolo e non all’interno del documento.

              Ciao
              Claudio

            • #95519
              Up
              0
              Down
              ::

              cfiandra” post=951791) Non capisco l’utilità del test `\ifxetex\RequirePackage{fontspec}\else\RequirePackage[utf8]{inputenc}\fi` Infatti, il pacchetto inputenc funziona benissimo con il motore di compilazione xelatex. Forse quel test ti serve per utilizzare fontspec o babel.

              2) Suppondendo che etoolbox sia caricato, non sarebbe meglio fare i test `\AtBeginDocument{
              \ifx\colorbox\undefined\RequirePackage{color}\fi
              \ifx\includegraphics\undefined\RequirePackage{graphicx}\fi}` [tt]\AtEndPreamble[/tt]? Così, in caso, i pacchetti vengono caricati nel preambolo e non all’interno del documento.

              Ciao
              Claudio

              Ciao, grazie per entrambe perché in effetti toccano dei dubbi che avevo. Riguardo alla prima hai ragione, inputenc funziona con XeLaTeX, ma non il contrario se non sbaglio, quindi in un caso evito di chiamare anche inputenc inutilmente, e nell’altro il test è inevitabile, no?
              Riguardo alla seconda, hehe, semplicemente non conoscevo \AtEndPreamble! E necessita di questo etoolbox?
              In ogni caso queste osservazioni non son legate all’errore che ottengo, vero?

            • #95520
              Up
              0
              Down
              ::

              Gero27″ post=95183Riguardo alla prima hai ragione, inputenc funziona con XeLaTeX, ma non il contrario se non sbaglio, quindi in un caso evito di chiamare anche inputenc inutilmente, e nell’altro il test è inevitabile, no?

              Niente di più falso: `\documenclass{article}
              \usepackage[T1]{fontenc}
              \usepackage[utf8]{inputenc}
              \usepackage[italian]{babel}

              \begin{document}
              à é ì ò ù
              \end{document}
              ` compila con pdflatex e dimmi se hai errori (ovviamente imposta il tuo editor per lavorare con utf8 se non è la sua impostazione di default).

              Gero27″ post=95183Riguardo alla seconda, hehe, semplicemente non conoscevo \AtEndPreamble! E necessita di questo etoolbox?

              Sì.

              Gero27″ post=95183In ogni caso queste osservazioni non son legate all’errore che ottengo, vero?

              In qualche modo sono legate: il tuo codice non è corretto, perciò se oltre ad aver caricato xparse, hai tolto graphicx dal documento mi sembra normale che tu ottenga degli errori. Senza avere queste informazioni si può solo tirare ad indovinare. Se crei un esempio minimo magari lo possiamo provare.

              Ciao
              Claudio

            • #95521
              OldClaudio
              Partecipante
                Up
                0
                Down
                ::



                @cfiandra
                , pdflatex e fontenc sono incompatibili di nascita, e se ci provi tu a compilare quell’esempio lo vedi. La ragione è semplice: pdflatex e tutti i programmi che si basano sui motori tex, etex, pedftex sono solo 8-bit aware, mentre solo quelli basati su xetex e luatex, e altri meno comuni, sono unicodeaware.

                Invece per quel che riguarda babel e polyglossia, xelatex accetta anche babel oltre a polyglossia, mentre pdflatex accetta solo babel.

                Quelo strano \ifXeTeX usato dal nostro @gero27 ha un senso, ma non mette in opposizione le cose per l’uno o l’altro programma di compilazione in modo corrette; nell rame treu deve mettere fontenc, magari qualche impostazione epr i font opentype, e, volendo, polyglossia con l’impostazione er le lingue che vuole usare; nel ramo false deve mettere inputenc, fontenc con qualche opzione per font a 8 bit, e babel con le opzioni per le lingue che vuole usare.

                Si dice che sia opportuno usare babel preferibile rispetto a polyglossia, quando l’altrnativa esiste; personalmente ritengo che polyglossia offra qualcosa di più con il suo sistema di specificare le lingue, ognuna con le sue opzioni; sempre personalmente mi rammarico che polyglossia non sia usabile con pdflates o che babel non disponga dello stesso odo per specificare le lingue; recentemente babel è stato molto esteso, a se devi usare una lingua con diverse configurazioni e metodi di sillabazione, babel richided artifizi notevoli per creare gli attributi o i modificatori in modo corretto. Ma questo è OT rispetto al problea di @gero27.

              • #95522
                Up
                0
                Down
                ::

                OldClaudio” post=95207 @cfiandra, pdflatex e fontenc sono incompatibili di nascita, e se ci provi tu a compilare quell’esempio lo vedi. La ragione è semplice: pdflatex e tutti i programmi che si basano sui motori tex, etex, pedftex sono solo 8-bit aware, mentre solo quelli basati su xetex e luatex, e altri meno comuni, sono unicodeaware.

                😕

                Io parlo di [tt]fontenc[/tt], non [tt]fontspec[/tt]. Mi è chiaro che [tt]fontspec[/tt] non può essere utilizzato con pdflatex 😉

                Comunque l’assunto, non corretto, di Gero riguardava [tt]inputenc[/tt] che chiaramente funziona con qualsiasi compilatore.

                😳 Ok ho detto un’idiozia!!

                Ciao
                Claudio

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

            Go to top