Nuovi ambienti: prevenire l’andata a capo

  • Creatore
    Topic
  • #13743
    Up
    0
    Down
    ::


    Ciao a tutti,
    mi riallaccio in parte a un discorso fatto un po’ di tempo fa (Copiare un comando di sezionamento, <http://guit.sssup.it/phpbb/viewtopic.php?t=1584>):

    `\newenvironment{esercizio}[1]{% L'ambiente prende un parametro: il titolo
    % dell'esercizio.
    \noindent% L'ambiente non e` preceduto da alcuna
    % indentazione.
    \normalfont% I caratteri sono scritti normalmente, in
    % romano.
    \normalsize% I caratteri hanno un corpo normale.
    {\bfseries#1}% *Solo* il primo argomento (il titolo) e` in
    % grassetto.
    \hspace{.575em}% Vi e` una distanza orizzontale che separa il
    % titolo dal resto della consegna.
    }
    {%
    \clearpage% Alla fine dell'esercizio vi e` un salto pagina.
    }`

    […] Una cosa di sicuro manca nella tua definizione: dopo \hspace{…} devi mettere \ignorespaces, altrimenti LaTeX vede lo spazio che viene dopo \begin{esercizio}{titolo} (è di solito un fine riga, ma non cambia la faccenda).[…]

    In questo momento sto realizzando qualcosa di simile:
    `\newenvironment{esercizio}%
    {%
    \par\medskip\noindent\textbf{Esercizio.}\ \ignorespaces%
    }%
    {%
    \par\smallskip%
    }`
    In merito a quel commento su «\ignorespaces»: tutto fila liscio se richiamo l’ambiente in questo modo
    `\begin{esercizio}
    Bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla
    Bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla
    Bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla
    \end{esercizio}`
    ma se volessi scrivere il sorgente così, invece
    `\begin{esercizio}

    Bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla
    Bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla
    Bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla

    \end{esercizio}`
    salta fuori un salto di una riga che non mi piace (in poche parole: vorrei dire a LaTeX che la semantica di quella riga bianca non rappresenta l’inizio di un nuovo periodo, come «\par», ma una semplice separazione «visiva» al livello del sorgente, che non si deve ripercuotere sul risultato).

    Come potrei fare?

    Grazie a tutti per la preziosa collaborazione e a presto! 🙂

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


        Ciao,

        un semplice
        `\begin{esercizio}%
        %
        Bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla
        Bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla
        Bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla
        %
        \end{esercizio}
        `

        dovrebbe funzionare egregiamente. Vedi pag 7 della not so short.

        Ciao,
        Peppe

      • #13745
        Up
        0
        Down
        ::

        Ciao a tutti,
        mi riallaccio in parte a un discorso fatto un po’ di tempo fa (Copiare un comando di sezionamento, <http://guit.sssup.it/phpbb/viewtopic.php?t=1584>):

        [quote]`\newenvironment{esercizio}[1]{% L'ambiente prende un parametro: il titolo
        % dell'esercizio.
        \noindent% L'ambiente non e` preceduto da alcuna
        % indentazione.
        \normalfont% I caratteri sono scritti normalmente, in
        % romano.
        \normalsize% I caratteri hanno un corpo normale.
        {\bfseries#1}% *Solo* il primo argomento (il titolo) e` in
        % grassetto.
        \hspace{.575em}% Vi e` una distanza orizzontale che separa il
        % titolo dal resto della consegna.
        }
        {%
        \clearpage% Alla fine dell'esercizio vi e` un salto pagina.
        }`

        […] Una cosa di sicuro manca nella tua definizione: dopo \hspace{…} devi mettere \ignorespaces, altrimenti LaTeX vede lo spazio che viene dopo \begin{esercizio}{titolo} (è di solito un fine riga, ma non cambia la faccenda).[…]

        In questo momento sto realizzando qualcosa di simile:
        `\newenvironment{esercizio}%
        {%
        \par\medskip\noindent\textbf{Esercizio.}\ \ignorespaces%
        }%
        {%
        \par\smallskip%
        }`
        In merito a quel commento su «\ignorespaces»: tutto fila liscio se richiamo l’ambiente in questo modo
        `\begin{esercizio}
        Bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla
        Bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla
        Bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla
        \end{esercizio}`
        ma se volessi scrivere il sorgente così, invece
        `\begin{esercizio}

        Bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla
        Bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla
        Bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla, bla

        \end{esercizio}`
        salta fuori un salto di una riga che non mi piace (in poche parole: vorrei dire a LaTeX che la semantica di quella riga bianca non rappresenta l’inizio di un nuovo periodo, come «\par», ma una semplice separazione «visiva» al livello del sorgente, che non si deve ripercuotere sul risultato).

        Come potrei fare?[/quote]
        La riga vuota ha una funzione sintattica nei file .tex: significa “finisci il paragrafo” (o capoverso). In quasi nessun ambiente puoi fare così senza avere effetti indesiderati. La separazione visiva è già data da \begin{esercizio}, magari preceduto da una riga vuota.

        Ciao
        Enrico

      • #13746
        Up
        0
        Down
        ::


        Ciao gmc, grazie per la risposta, ma non era questo quello che volevo. Stavo pensando ad una riga bianca pura e semplice, per leggibilità.

        Grazie comunque, e a presto.

      • #13747
        Up
        0
        Down
        ::

        La riga vuota ha una funzione sintattica nei file .tex: significa “finisci il paragrafo” (o capoverso).

        Certamente, avevo in mente proprio questa cosa quando ho scritto

        vorrei dire a LaTeX che la semantica di quella riga bianca non rappresenta l’inizio di un nuovo periodo, come «\par» [cioè come LaTeX la interpreta di solito], ma una semplice separazione «visiva» al livello del sorgente, che non si deve ripercuotere sul risultato.

        In pratica, stavo cercando di capire se si poteva definire una sorta di «\ignorespaces» non per la comune andata a capo tra «\begin{nomeAmbiente}» e il corpo dell’ambiente stesso, ma per l’andata a capo immediatamente successiva.

        La separazione visiva è già data da \begin{esercizio}, magari preceduto da una riga vuota.

        Su questo sono d’accordo, ma forse anche una riga vuota che segue non sta male…

        In quasi nessun ambiente puoi fare così senza avere effetti indesiderati.

        Stavo pensando: si potrebbe dare un’occhiata a uno di quegli ambienti «sicuri» di cui parli tu, cercare di capire come sono fatti a vedere se quella porzione di codice è riadattabile (se non è TeXnicamente troppo difficile). A naso, mi pare che l’ambiente «document» di article.cls si comporti come voglio io.

        Grazie e a presto.

      • #13748
        Up
        0
        Down
        ::

        Stavo pensando: si potrebbe dare un’occhiata a uno di quegli ambienti «sicuri» di cui parli tu, cercare di capire come sono fatti a vedere se quella porzione di codice è riadattabile (se non è TeXnicamente troppo difficile). A naso, mi pare che l’ambiente «document» di article.cls si comporti come voglio io.

        Per essere pedanti, “document” non è un vero e proprio ambiente (per motivi TeXnici). Quelli che permettono di lasciare una riga vuota sono quelli che mantengono TeX in “modo verticale”, dove i comandi \par sono ignorati. Il problema con il tuo è che l’inizio dell’ambiente forza il modo orizzontale.

        Si può fare, naturalmente, ma secondo me è una perdita di tempo.

        Ciao
        Enrico

      • #13749
        Up
        0
        Down
        ::

        [Gli ambienti] che permettono di lasciare una riga vuota sono quelli che mantengono TeX in “modo verticale”, dove i comandi \par sono ignorati. Il problema con il tuo è che l’inizio dell’ambiente forza il modo orizzontale.

        Se ho capito bene, quello che dovrei fare io è studiare prima di tutto che cosa voglia dire «modo verticale» e poi realizzare un ambiente di questo tipo.

        Si può fare, naturalmente, ma secondo me è una perdita di tempo.

        🙂 Be’, vorrà dire che proverò a farlo da solo, magari a tempo perso.

        Grazie e a presto!

      • #13750
        Up
        0
        Down
        ::

        [Gli ambienti] che permettono di lasciare una riga vuota sono quelli che mantengono TeX in “modo verticale”, dove i comandi \par sono ignorati. Il problema con il tuo è che l’inizio dell’ambiente forza il modo orizzontale.

        Se ho capito bene, quello che dovrei fare io è studiare prima di tutto che cosa voglia dire «modo verticale» e poi realizzare un ambiente di questo tipo.

        Si può fare, naturalmente, ma secondo me è una perdita di tempo.

        🙂 Be’, vorrà dire che proverò a farlo da solo, magari a tempo perso.

        8) Prometti di usarlo solo se capisci ciò che fanno questii comandi 8)
        `\makeatletter
        \newenvironment{esercizio}
        {\par\addvspace{\medskipamount}\noindent\textbf{Esercizio.}\ %
        \@ifnextchar\par{\@gobble}{}}
        {\par\addvspace{\medskipamount}}
        \makeatother`
        Non garantisco nulla; il computer potrebbe sciogliersi o lo schermo diventare viola. A parte gli scherzi, quella roba strana non è sicura in tutte le situazioni, quindi usala con cautela.

        Ti spiego solo \addvspace: se hai due esercizi consecutivi, verrà emesso solo un comando di spaziatura. Quando LaTeX vede due \addvspace consecutivi, esegue solo quello che ordina la spaziatura maggiore (uno solo se viene ordinata la stessa spaziatura da ambedue).

        Ciao
        Enrico

      • #13751
        Up
        0
        Down
        ::

        8) Prometti di usarlo solo se capisci ciò che fanno questii comandi 8)

        Ti do la mia parola d’onore. Anzi, il minimo che posso fare per ringraziarti è spiegare cio che sono riuscito a capire della tua definizione agli altri lettori interessati:

        • `\makeatletter
          […]
          \makeatother`
          Tutto l’ambiente è compreso tra le istruzioni «\makeatletter» e «\makeatother», che fanno sì che gli eventuali caratteri chiocciola («@») in esse contenuti vengano trattati come dei caratteri qualsiasi, senza effetti collaterali;

        • `\newenvironment{esercizio}
          { […] } <--- apertura { [...] } <--- chiusura` Viene dichiarato l'ambiente «esercizio»; [li]`\par\addvspace{\medskipamount}\noindent\textbf{Esercizio.}\ % \@ifnextchar\par{\@gobble}{}` Questo è il codice di apertura:[ul][li]`\par` Si inizia un nuovo paragrafo (o capoverso); [li]`\addvspace{\medskipamount}` Il comando «\addvspace» ci hai già gentilmente spiegato tu che cosa fa:

          Quando LaTeX vede due \addvspace consecutivi, esegue solo quello che ordina la spaziatura maggiore (uno solo se viene ordinata la stessa spaziatura da ambedue).

          «\medskipamount» in questo caso è la dimensione di questa spaziatura. Si può mettere una grandezza a piacere;

        • `\noindent`
          Il paragrafo immediatamente seguente non è interessato dall’indentazione;

        • `\textbf{Esercizio.}`
          Viene stampata la stringa «Esercizio.» (sul perché si usa «\textbf» al posto di «\bfseries», si legga il topic sottolineato, in particolare i messaggi <http://www.guit.sssup.it/phpBB2/viewtopic.php?p=10943#10943> e <http://www.guit.sssup.it/phpBB2/viewtopic.php?p=10952#10952>), in neretto (non «grassetto», come credevo fino a non molto tempo fa, altra perla, Parole chiave in grassetto con listings [Risolto], <http://guit.sssup.it/phpbb/viewtopic.php?highlight=neretto&p=11978#11978>);

        • `\ <--- c'è uno spazio` Questa stringa viene separata da un carattere di spaziatura dal testo immediatamente seguente; [li]`\@ifnextchar\par` Questo è il punto chiave (almeno per me, visto che è la prima volta che mi capita sotto il naso): evidentemente, esiste un comando di nome «\@ifnextchar» che effettua un test sul carattere immediatamente successivo: a seconda dell’esito di questo test, può fare (o non fare) qualcosa. In questo caso, se il carattere immediatamente successivo è «\par» (o, immagino, un’equivalente andata a capo)…

        • `{\@gobble}{}`
          … viene chiamato il comando «\@gobble», che, come abbiamo già letto nella discussione Occultare un comando con parametri, <http://guit.sssup.it/phpbb/viewtopic.php?t=1578&highlight=gobble>, oppure all’indirizzo <http://www.tug.org/pipermail/macostex-archives/2005-April/014764.html>, “cancella” il primo carattere che trova (che non sia uno spazio bianco) oppure la prima stringa che trova raggruppata tra parentesi; se, al contrario, il carattere immediatamente successivo non è «\par», non si fa nulla («{}»).

      • `\par\addvspace{\medskipamount}`
        Questo è il codice di chiusura:

        • `\par`
          Come sopra, si inizia un nuovo paragrafo o capoverso;

        • `\addvspace{\medskipamount}`
          Come sopra, si tiene conto della spaziatura.

        [/ul]L’ultima cosa che mi viene da dire, che non c’entra tantissimo con questo argomento, è che dovrò riuscire a capire il significato del carattere chiocciola per TeX/LaTeX quando non è reso come un carattere come tutti gli altri. Visto che è già un bel po’ che mi scontro con questo argomento, mi sa che questa è la volta buona per comprare il TeXbook

        Grazie ancora e a presto!!! 🙂

  • #13752
    Up
    0
    Down
    ::

    8) Prometti di usarlo solo se capisci ciò che fanno questii comandi 8)

    Ti do la mia parola d’onore. Anzi, il minimo che posso fare per ringraziarti è spiegare cio che sono riuscito a capire della tua definizione agli altri lettori interessati:

    Solo alcune imprecisioni. Il comando \par termina un paragrafo, ma non ne comincia uno nuovo. TeX comincia un nuovo paragrafo quando incontra, dopo un \par, un carattere, il comando \indent o il comando \noindent (o ancora altre cose, per la verità).

    Il comando \@ifnextchar prende quattro argomenti:
    `\@ifnextchar`
    il primo è un token, il secondo contiene ciò che si deve fare se il primo argomento coincide con il quarto, il terzo cioè che si deve fare altrimenti. Lo si usa al termine della definizione di un comando specificando solo i primi tre argomenti, in modo che ii quarto sia il token che segue. Esempio:
    `\def\@pippo[#1]#2{…}
    \def\pippo{\@ifnextchar[\@pippo{\@pippo[xxx]}}`
    è equivalente a
    `\newcommand{\pippo}[2][xxx]{…}`
    Infatti, quando TeX espande \pippo, \@ifnextchar raccoglie i suoi quattro argomenti e il quarto sarà esattamente il token che segue \pippo. La cosa importante è che questo quarto argomento viene poi rimesso al suo posto nella lista di token. Esaminiamo i due casi: se scriviamo \pippo[aaa]{ciao}, \@ifnextchar si accorge che il quarto argomento è la quadra, quindi sostituisce il tutto con \@pippo; se scriviamo \pippo{ciao}, sarà emesso \@pippo[xxx]. Perciò:
    `\pippo[aaa]{ciao} \@pippo[aaa]{ciao}
    \pippo{ciao} \@pippo[xxx]{ciao}`
    Va osservato che il token con cui fare il paragone non può essere uno spazio, per motivi TeXnici. Normalmente si fa il paragone con un carattere (può essere [ oppure * per definire comandi con la variante), ma un token qualunque va bene. Per capire la definizione di \@pippo, occorre conoscere nei dettagli il comando \def e il modo di specificare i parametri delimitati e non delimitati.

    Nel nostro caso invece di [ si usa \par per fare il confronto. Il fine riga dopo \begin{example} viene ignorato (\@ifnextchar si “mangia” gli spazi che seguono il terzo argomento e il quarto è il primo token “non spazio” che segue). L’eventuale riga vuota è trasformata in \par e rende vero il test; una riga non vuota invece rende falso il test. Il token che segue è rimesso al suo posto e tutto procede: nel caso “vero” diventa argomento di \@gobble e sparisce, nel caso “falso” è il punto da cui ricomincia la lettura dei token.

    Certo, per definire un comando con un argomento opzionale non c’è da fare tutta quella fatica, visto che c’è \newcommand che può occuparsene. Ma se vogliamo due argomenti opzionali, \@ifnextchar dà il modo di risolvere. Si può usare anche per vedere se il token che segue è una graffa aperta, ma in questo caso il primo argomento deve essere specificato come \bgroup.

    Il significato usuale di @ (cioè non fra \makeatletter e \makeatother) è “il carattere @”, semplicemente. Nei file richiamati con \usepackage o caricati da questi, il carattere @ è considerato una lettera (quindi con \makeatletter … \makeatother impliciti).

    Ciao
    Enrico

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

    Go to top