\def e \newcommand

  • Creatore
    Topic
  • #40295
    ernded
    Partecipante
      Up
      0
      Down
      ::


      Che differenza c’è tra il comando TeX \def ed il comando LaTeX \newcommand, a parte quella banale che \def non controlla se il comando è già definito ed a parte la sintassi più amichevole di \newcommand?

      Mi sono accorto che anche in alcuni comandi LaTeX viene usato \def invece di \newcommand, in particolare curiosando nel sorgente dell’ “introtex” di Enrico ho trovato queste definizioni
      `
      \def\ttchar#1{\begingroup\ttfamily\char`#1\endgroup}
      \protected\def\cs#1{{\ttfamily\ttchar\\#1}}
      `
      Ho fatto delle prove, sostituendo \def con \newcommand e, almeno in apparenza, non cambia nulla.
      Certamente ci sono degli ottimi motivi per la scelta fatta. Quali sono?
      Grazie
      Ernesto

    Visualizzazione 3 filoni di risposte
    • Autore
      Risposte
      • #40296
        Up
        0
        Down
        ::

        Che differenza c’è tra il comando TeX \def ed il comando LaTeX \newcommand, a parte quella banale che \def non controlla se il comando è già definito ed a parte la sintassi più amichevole di \newcommand?

        Mi sono accorto che anche in alcuni comandi LaTeX viene usato \def invece di \newcommand, in particolare curiosando nel sorgente dell’ “introtex” di Enrico ho trovato queste definizioni
        `
        \def\ttchar#1{\begingroup\ttfamily\char`#1\endgroup}
        \protected\def\cs#1{{\ttfamily\ttchar\\#1}}
        `
        Ho fatto delle prove, sostituendo \def con \newcommand e, almeno in apparenza, non cambia nulla.
        Certamente ci sono degli ottimi motivi per la scelta fatta. Quali sono?
        Grazie
        Ernesto

        Brevità nel primo caso. 8) E abitudine inveterata dai primi tempi; infine, una definizione in cui compare la primitiva \char va con \def. 🙂

        Nel secondo caso invece è una faccenda diversa: è un modo di sfruttare e-TeX per avere un comando robusto senza scomodare il pesante \DeclareRobustCommand. Caricando il pacchetto etoolbox si ha a disposizione \newrobustcmd che ha la stessa sintassi di \newcommand (e che forse dovrei usare).

        Una differenza però c’è: la prima definizione è equivalente a
        `\newcommand*{\ttchar}{\begingroup\ttfamily\char`#1\endgroup}`
        Notare l’asterisco che caratterizza quei comandi in cui non vogliamo ammettere il token \par negli argomenti. Analogamente la seconda si può dare con \newrobustcmd*.

        Occhio: chi non è abbastanza esperto usi \newcommand.

        Ciao
        Enrico

      • #40297
        ernded
        Partecipante
          Up
          0
          Down
          ::


          Grazie della risposta; ma non ho capito il discorso su \newcommand* che ci azzecca \par in questo caso?
          Ernesto

        • #40298
          Up
          0
          Down
          ::

          Grazie della risposta; ma non ho capito il discorso su \newcommand* che ci azzecca \par in questo caso?
          Ernesto

          cambiando leggerissimamente

          L’asterisco caratterizza quei comandi in cui non vogliamo ammettere il token \par negli argomenti.

        • #40299
          Up
          0
          Down
          ::

          Grazie della risposta; ma non ho capito il discorso su \newcommand* che ci azzecca \par in questo caso?

          \par è del tutto equivalente a una riga vuota nel documento TeX. Con \newcommand{\pippo}[1]{—#1—} una chiamata come
          `\pippo{abc

          def}`
          che è equivalente a \pippo{abc\par def} è ammissibile. Se l’utente della macro commette l’errore di non chiudere la graffa dell’argomento, TeX probabilmente andrà avanti fino alla fine del documento cercando quella graffa di chiusura.

          Se invece si definisce \pippo con \newcommand*, TeX segnalerà un errore appena troverà una riga vuota che sia costretto a considerare come parte dell’argomento di \pippo.

          Morale della favola: si usi pure \newcommand, ma ricordando che per comandi in cui non ha senso che l’argomento contenga interi capoversi, forse è più conveniente \newcommand* per isolare eventuali errori di delimitazione degli argomenti.

          Ciao
          Enrico

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

      Go to top