Ambiente con comandi interni

  • Creatore
    Topic
  • #64025
    Up
    0
    Down
    ::


    Supponiamodi dover creare un ambiente che funzioni in questo modo (è un esempio semplificato di quello che devo fare):

    \begin{scheda}{Luogo}{Anno}
    \descrizione
    \end{scheda}

    Ci sono due argomenti, e fin qui niente di difficile. Ma come si fa a definire dei comandi in modo che nella definizione dell’ambiente venga richiamato l’argomento del comando dato nel corpo del documento? L’idea è: dentro all’ambiente “schede” uso il comando \descrizione e quello che segue deve essere stampato al posto di \d@escrizione nel punto dove voglio io nella definizione dell’ambiente. Naturalmente se \descrizione lo metto fuori dall’ambiente funziona, ma vorrei che fosse locale all’ambiente e che si “azzerasse” alla fine di ogni ambiente.
    Così non funziona 🙁 :

    `\newcommand{\descrizione}{\def\d@scrizione{#1}}
    \newenvironment{scheda}[2]{%
    #1, #2\\[3ex]
    \d@scrizione
    }`

    Spero di essermi spiegato.

    Credo che sia una situazione molto simile all’ambiente “frontespizio”, ma non riesco a venirne a capo.

    Ciao
    Ivan

Visualizzazione 1 filone di risposte
  • Autore
    Risposte
    • #64026
      OldClaudio
      Partecipante
        Up
        0
        Down
        ::


        `
        \makeatletter
        \newcommand{\descrizione}[1]{\def\d@scrizione{#1}}
        \newenvironment{scheda}[2]{% apertura
        #1, #2\\[3ex]
        \d@scrizione
        }
        {% chiusura

        }
        `

        Però onestamente, se usi descrizione così com’è e non ci fai niente, salvo stamparlo dop dopo il Luogo e l’Anno, definire un ambiente (dove bisogna psecificare anche i comandi di chiusura) non serve a granché; proviamo a renderlo così:
        `
        \newenvironment{scheda}[2]{% apertura
        \par\bigskip
        #1, #2, \\[\bigskipamount]
        }
        {% chiusura
        \par\bigskip\ignorespacesafterend
        }
        `

        Da usarsi così:
        `
        \begin{scheda}{Urbino}{1544}
        Urbino in quel tempo era una città ricca, ma senza più la guida dei duchi di Montefeltro.
        Il Duca Federico era morto nel 1482 e suo figlio Guidubaldo era morto di tifo a 22 anni,
        poco dopo la morte del padre.

        Eccetera
        \end{scheda}
        `

        La scheda ti viene composta a piena pagina con una riga di spazio bianco sopra e una sotto.

        È perfettamente inutile mettere i vari capoversi della descrizione in una variabile \d@scrizione, quando comunque usando il comando \def non consente di dare al suo oggetto definito un argomento che consti di più di un paragrafo. Nello stesso tempo che cosa metteresti come contenuto dell’ambiente? Quando chiudi l’ambiente, tutto quello che è stato usato o definito o assegnato a i contatori o ai registri, viene dimenticato perché queste cose sono strettamente locali.

        Se vuoi cimentarti in simili piccole acrobazie devi studiarti per bene il testo di Enrico “Appunti di programmazione in TeX e LaTeX”.

        Per curiosità: se definisci una macro con argomenti all’interno di un’altra definizione devi raddoppiare il segno #; devi cioè scrivere ##1, ##2, eccetera.

      • #64027
        Up
        0
        Down
        ::

        ivan” post=63056Supponiamodi dover creare un ambiente che funzioni in questo modo (è un esempio semplificato di quello che devo fare):

        \begin{scheda}{Luogo}{Anno}
        \descrizione
        \end{scheda}

        Ci sono due argomenti, e fin qui niente di difficile. Ma come si fa a definire dei comandi in modo che nella definizione dell’ambiente venga richiamato l’argomento del comando dato nel corpo del documento? L’idea è: dentro all’ambiente “schede” uso il comando \descrizione e quello che segue deve essere stampato al posto di \d@escrizione nel punto dove voglio io nella definizione dell’ambiente. Naturalmente se \descrizione lo metto fuori dall’ambiente funziona, ma vorrei che fosse locale all’ambiente e che si “azzerasse” alla fine di ogni ambiente.
        Così non funziona 🙁 :

        `\newcommand{\descrizione}{\def\d@scrizione{#1}}
        \newenvironment{scheda}[2]{%
        #1, #2\\[3ex]
        \d@scrizione
        }`

        Spero di essermi spiegato.

        Credo che sia una situazione molto simile all’ambiente “frontespizio”, ma non riesco a venirne a capo.

        La situazione di “frontespizio” è piuttosto diversa. Là \begin{frontespizio} serve principalmente per attivare la scrittura sul file “frn” oltre che per tenere i vari comandi al posto giusto, visto che altrove non servirebbero a nulla. I vari comandi hanno in effetti tre definizioni diverse: una per quando è attiva la scrittura; una per quando non è attiva la scrittura e siamo nel file principale; la terza quando siamo nel file “frn” (e, in particolare, la scrittura non è attiva).

        Esempio delle definizioni nei tre casi descritti:

        1. \newcommand{\Titolo}[1]{\front@write{\Titolo{#1}}} (scriviamo nel file “frn” la stessa cosa)
        2. \newcommand{\Titolo}[1]{} (non facciamo niente, perché non ci interessa produrre il “frn” né stamparlo)
        3. \newcommand{\Titolo}[1]{\def\front@title{#1}} (vogliamo produrre il frontespizio)

        Naturalmente le tre definizioni non coesistono: in ciascuna delle tre situazioni la definizione è una sola, quella che serve al momento.

        Con \end{frontespizio} si chiude la scrittura (se attiva) e nel file “frn” viene scritto anche \begin{document}\preparefrontpage\end{document}.

        Il tuo caso di una scheda non richiede questo, così a occhio.

        Ciao
        Enrico

    Visualizzazione 1 filone di risposte
    • Devi essere connesso per rispondere a questo topic.

    Go to top