Programmazione comando

  • Creatore
    Topic
  • #88792
    Up
    0
    Down
    ::


    Ho scritto questo nuovo comando nel preambolo (con pacchetti)

    \usepackage{amsmath}
    \usepackage{amsthm}
    \usepackage{amssymb}
    \newcommand{\curl}[1]{\gv{\nabla} \times #1}

    ma il compilatore mi da errore: “missing $” “missing }”

    In cosa ho sbagliato?

Visualizzazione 15 filoni di risposte
  • Autore
    Risposte
    • #88793
      Up
      0
      Down
      ::


      Senza un codice minimo che riproduca l’errore non ne sono sicuro, ma credo che tu abbia dato il comando [tt]\curl[/tt] fuori dall’ambiente matematico. Questo è necessario perché [tt]\nabla[/tt] e [tt]\times[/tt] sono comandi validi solo in ambiente matematico. Prova a controllare e se ti dà ancora errore, posta un codice minimo compilabile che lo riproduca.

      Solo una piccola precisazione: per postare dei listati di codice sul forum è consigliato metterli nell’ambiente [tt]code[/tt], scrivendo nel messaggio
      `
      [code] testo da inserire [/ code]
      `
      (la slash / non ha uno spazio dopo, lo aggiunto altrimenti il forum me lo riconosce come un’ambiente) :D. In questo modo isoli il codice dal resto e, se il codice è troppo esteso, compare automaticamente una barra di scorrimento. Mi rendo conto che è una sottigliezza, ma aiuta a leggere meglio il post ;).

    • #88794
      Up
      0
      Down
      ::

      atom heart mother” post=88254Ho scritto questo nuovo comando nel preambolo (con pacchetti)

      \usepackage{amsmath}
      \usepackage{amsthm}
      \usepackage{amssymb}
      \newcommand{\curl}[1]{\gv{\nabla} \times #1}

      ma il compilatore mi da errore: “missing $” “missing }”

      In cosa ho sbagliato?

      Senza vedere un esempio minimo ti consiglierei di cambiare [tt]\curl[/tt] in: `
      \newcommand{\curl}[1]{\ensuremath{\gv{\nabla} \times #1}}
      ` Ma è meglio se posti un esempio.

      Ciao
      Claudio

    • #88795
      Up
      0
      Down
      ::

      Solo una piccola precisazione: per postare dei listati di codice sul forum è consigliato metterli nell’ambiente code

      Hai ragione, perdonami la poca attenzione nello scrivere il messaggio.

      comando \curl fuori dall’ambiente matematico

      In realtà l’ho scritto sia in ambiente math sia in eqnarray. In entrambi mi dava lo stesso errore.

      Questo è l’esempio del mio caso
      `
      \renewcommand{\v}[1]{\ensuremath{\mathbf{#1}}}
      \newcommand{\curl}[1]{\gv{\nabla} \times #1}

      \newenvironment{eq}
      {\begin{eqnarray}}
      {\end{eqnarray}}

      \begin{document}

      blabla $\v B = \curl{\v A}$ e vale
      \begin{eq}
      \int \curl{\v A} d\v s
      \end{eq}

      \end{document}
      `

      Scrivo l’uscita del compilatore

      VerificaAharonovBohm_triennale.tex(99): Errore: Extra }, or forgotten $.
      VerificaAharonovBohm_triennale.tex(100): Errore: Missing \endgroup inserted.
      VerificaAharonovBohm_triennale.tex(100): Errore: Missing \endgroup inserted.
      VerificaAharonovBohm_triennale.tex(100): Errore: Missing } inserted.
      VerificaAharonovBohm_triennale.tex(100): Errore: You can’t use `\halign’ in math mode.
      VerificaAharonovBohm_triennale.tex(100): Errore: Missing number, treated as zero.
      VerificaAharonovBohm_triennale.tex(100): Errore: Illegal unit of measure (pt inserted).
      VerificaAharonovBohm_triennale.tex(100): Errore: Missing } inserted.
      VerificaAharonovBohm_triennale.tex(100): Errore: Missing $ inserted.
      VerificaAharonovBohm_triennale.tex(100): Errore: You can’t use `macro parameter character #’ in math mode.
      VerificaAharonovBohm_triennale.tex(100): Errore: Misplaced alignment tab character &.
      VerificaAharonovBohm_triennale.tex(100): Errore: You can’t use `macro parameter character #’ in math mode.
      VerificaAharonovBohm_triennale.tex(100): Errore: Misplaced alignment tab character &.
      VerificaAharonovBohm_triennale.tex(100): Errore: You can’t use `macro parameter character #’ in math mode.
      VerificaAharonovBohm_triennale.tex(100): Errore: Misplaced alignment tab character &.
      VerificaAharonovBohm_triennale.tex(100): Errore: You can’t use `macro parameter character #’ in restricted horizontal mode.
      VerificaAharonovBohm_triennale.tex(100): Errore: Misplaced \cr.
      VerificaAharonovBohm_triennale.tex(101): Errore: Missing $ inserted.
      VerificaAharonovBohm_triennale.tex(102): Errore: LaTeX Error: Too many columns in eqnarray environment.
      VerificaAharonovBohm_triennale.tex(102): Errore: Misplaced \cr.
      VerificaAharonovBohm_triennale.tex(102): Errore: Extra }, or forgotten $.
      VerificaAharonovBohm_triennale.tex(102): Errore: LaTeX Error: \begin{document} ended by \end{eqnarray}.
      VerificaAharonovBohm_triennale.tex(102): Errore: Missing $ inserted.
      VerificaAharonovBohm_triennale.tex(102): Errore: Extra \endgroup.
      VerificaAharonovBohm_triennale.tex(102): Errore: LaTeX Error: \begin{document} ended by \end{eq}.
      VerificaAharonovBohm_triennale.tex(102): Errore: Extra \endgroup.

      Infine ho provato come suggerito da Claudio

      \newcommand{\curl}[1]{\ensuremath{\gv{\nabla} \times #1}}

      ma il problema rimane.

    • #88796
      Up
      0
      Down
      ::

      atom heart mother” post=88266

      Solo una piccola precisazione: per postare dei listati di codice sul forum è consigliato metterli nell’ambiente code

      Hai ragione, perdonami la poca attenzione nello scrivere il messaggio.

      comando \curl fuori dall’ambiente matematico

      In realtà l’ho scritto sia in ambiente math sia in eqnarray. In entrambi mi dava lo stesso errore.

      Questo è l’esempio del mio caso
      `
      \renewcommand{\v}[1]{\ensuremath{\mathbf{#1}}}
      \newcommand{\curl}[1]{\gv{\nabla} \times #1}

      \newenvironment{eq}
      {\begin{eqnarray}}
      {\end{eqnarray}}

      \begin{document}

      blabla $\v B = \curl{\v A}$ e vale
      \begin{eq}
      \int \curl{\v A} d\v s
      \end{eq}

      \end{document}
      `

      Scrivo l’uscita del compilatore

      VerificaAharonovBohm_triennale.tex(99): Errore: Extra }, or forgotten $.
      VerificaAharonovBohm_triennale.tex(100): Errore: Missing \endgroup inserted.
      VerificaAharonovBohm_triennale.tex(100): Errore: Missing \endgroup inserted.
      VerificaAharonovBohm_triennale.tex(100): Errore: Missing } inserted.
      VerificaAharonovBohm_triennale.tex(100): Errore: You can’t use `\halign’ in math mode.
      VerificaAharonovBohm_triennale.tex(100): Errore: Missing number, treated as zero.
      VerificaAharonovBohm_triennale.tex(100): Errore: Illegal unit of measure (pt inserted).
      VerificaAharonovBohm_triennale.tex(100): Errore: Missing } inserted.
      VerificaAharonovBohm_triennale.tex(100): Errore: Missing $ inserted.
      VerificaAharonovBohm_triennale.tex(100): Errore: You can’t use `macro parameter character #’ in math mode.
      VerificaAharonovBohm_triennale.tex(100): Errore: Misplaced alignment tab character &.
      VerificaAharonovBohm_triennale.tex(100): Errore: You can’t use `macro parameter character #’ in math mode.
      VerificaAharonovBohm_triennale.tex(100): Errore: Misplaced alignment tab character &.
      VerificaAharonovBohm_triennale.tex(100): Errore: You can’t use `macro parameter character #’ in math mode.
      VerificaAharonovBohm_triennale.tex(100): Errore: Misplaced alignment tab character &.
      VerificaAharonovBohm_triennale.tex(100): Errore: You can’t use `macro parameter character #’ in restricted horizontal mode.
      VerificaAharonovBohm_triennale.tex(100): Errore: Misplaced \cr.
      VerificaAharonovBohm_triennale.tex(101): Errore: Missing $ inserted.
      VerificaAharonovBohm_triennale.tex(102): Errore: LaTeX Error: Too many columns in eqnarray environment.
      VerificaAharonovBohm_triennale.tex(102): Errore: Misplaced \cr.
      VerificaAharonovBohm_triennale.tex(102): Errore: Extra }, or forgotten $.
      VerificaAharonovBohm_triennale.tex(102): Errore: LaTeX Error: \begin{document} ended by \end{eqnarray}.
      VerificaAharonovBohm_triennale.tex(102): Errore: Missing $ inserted.
      VerificaAharonovBohm_triennale.tex(102): Errore: Extra \endgroup.
      VerificaAharonovBohm_triennale.tex(102): Errore: LaTeX Error: \begin{document} ended by \end{eq}.
      VerificaAharonovBohm_triennale.tex(102): Errore: Extra \endgroup.

      Infine ho provato come suggerito da Claudio

      \newcommand{\curl}[1]{\ensuremath{\gv{\nabla} \times #1}}

      ma il problema rimane.

      Io ottengo: `
      ! Undefined control sequence.
      \curl #1->\gv
      {\nabla } \times #1
      l.14 blabla $\v B = \curl{\v A}
      ` Quindi, o dentro [tt]\curl[/tt] tu vuoi mettere [tt]\v[/tt] e non [tt]\gv[/tt] oppure non ho capito nulla del problema.

      Ciao
      Claudio

    • #88797
      Up
      0
      Down
      ::


      Dentro voglio mettere \v A con la definizione di \v scritta nel codice.
      Quale potrebbe essere il problema se nella definizione di \curl c’è \gv “applicato” a \nabla?

    • #88798
      Up
      0
      Down
      ::

      atom heart mother” post=88268Dentro voglio mettere \v A con la definizione di \v scritta nel codice.
      Quale potrebbe essere il problema se nella definizione di \curl c’è \gv “applicato” a \nabla?

      C’è il problema che con il codice che ci hai mostrato non sappiamo da dove esce fuori il comando [tt]\gv[/tt]

    • #88799
      Up
      0
      Down
      ::

      Elrond” post=88269

      Dentro voglio mettere \v A con la definizione di \v scritta nel codice.
      Quale potrebbe essere il problema se nella definizione di \curl c’è \gv “applicato” a \nabla?

      C’è il problema che con il codice che ci hai mostrato non sappiamo da dove esce fuori il comando [tt]\gv[/tt]

      Hai perfettamente ragione! Il problema è che parte del preambolo l’ho preso da un header in giro per internet che a mia volta ho modificato. Scusate, posto il codice spero completo

      `
      \renewcommand{\v}[1]{\ensuremath{\mathbf{#1}}}
      \newcommand{\gv}[1]{\ensuremath{\mbox{\boldmath$ #1 }}}
      \newcommand{\curl}[1]{\gv{\nabla} \times #1}

      \newenvironment{eq}
      {\begin{eqnarray}}
      {\end{eqnarray}}

      \begin{document}

      blabla $\v B = \curl{\v A}$ e vale
      \begin{eq}
      \int \curl{\v A} d\v s
      \end{eq}

      \end{document}
      `

    • #88800
      Up
      0
      Down
      ::


      Manca un [tt]$[/tt] proprio al comando [tt]\gv[/tt]
      `\newcommand{\gv}[1]{\ensuremath{\mbox{\boldmath$ #1 $}}}`
      ma ho come l’impressione che tutto questo codice sia una porcheria

    • #88801
      Up
      0
      Down
      ::


      I comandi che sono definiti li utilizzi anche fuori dagli ambienti matematici? Perché mi sembra che utilizzi troppi [tt]\ensuremath[/tt] nelle tue definizioni. Ma qual’è lo scopo delle tue macro? Se è cambiare il font matematico in grassetto, non ti è sufficiente [tt]\mathbf[/tt] o, per le lettere greche e alcuni simboli, caricando l’ononimo pacchetto, [tt]\bm[/tt].

      Comunque l’errore è dovuto al fatto che nella definizione di [tt]\gv[/tt] il simbolo [tt]$[/tt] non è bilanciato.

      [tt]\curl[/tt] potresti riscriverlo come
      `
      \newcommand{\curl}[1]{\bm{\nabla}\times #1}
      `
      e al posto di [tt]\v[/tt] usare [tt]\mathbf[/tt] direttamente o [tt]\bm[/tt]

    • #88802
      OldClaudio
      Partecipante
        Up
        0
        Down
        ::


        Il codice che hai copiato è una prcheria, come qualcuno ha supposto correttamente. Tanto per commentare la porcheria, il codice`\newenvironment{eq}
        {\begin{eqnarray}}
        {\end{eqnarray}}`è una porcheria per due motivi:
        1) è ridicolo cambiare nome ad un ambiente soltanto per scrivere qualche lettera in meno: [tt]\begin{eq}[/tt] invece di [tt]\begin{eqnarray}[/tt]; non lo si deve mai fare, anche se funziona, perché diminuisce la leggibilità del codice (non perché [tt]eq[/tt] non ricordi le equazioni, ma perché si perde il concetto di «sistema di» equazioni dato da nome [tt]eqnarray[/tt].
        2) qualunque guida ricorda che LaTeX2e contiene ancora l’ambiente eqnarray per compatibilità con i vecchi documenti, ma che non lo si deve usare con i nuovi documenti perché contiene un errore tipografico visibile a occhio nudo da chiunque abbia un minimo di attenzione: lo spazio attorno all’operatore di relazione rispetto al quale è eseguito l’incolonnamento è troppo grande rispetto a quello che appare se la stesa equazione è scritta fuori di quell’ambiente. Qualunque guida raccomanda di usare l’ambiente align del pacchetto amsmath, anzi consigia di caricare sempre questo pacchetto anche se non si usa matematica avanzata. Esso diventa assolutamente indispensabile per scrivere sistemi di equazioni, per identificare le singole equazioni di un sistema con il loro \label e l’intero sistema con il suo \label, per comporre matrici, per comporre liste di casi (nell’ambiente cases) e per tante altre cose che puoi leggere da solo aprendo il terminale e scrivendoci dentro il comando texdoc amsmath e premendo poi il tasto INVIO. La guida tematica liberamente tradotta in italiano e commentata con il LaTeX Reference Manual commentato, scaricabile dalla sezione Documentazione di questo sito, descrive l’ambiente eqnarray come comando del mark up di LaTeX e commentandolo negativamente spiega bene anche il perché.

        Conclusione di questa “reprimenda”: non prendere mai codice scritto da altri se non sai esattamente che cosa fa, cioè se non sei in grado di decifrare ogni definizione di comando in ogni suo minimo dettaglio; al posto di quelle cose c’è sempre un apposito pacchetto che le fa meglio. Sei tu solo autorizzato a scriverti i comandi che ti fanno comodo, perché tu solo sai che cosa vuoi veramente fare; ma se non riesci a scrivere da solo questi comandi personali, lascia stare e cerca qualche pacchetto di estensione che lo faccia per te.

      • #88803
        Up
        0
        Down
        ::

        Elrond” post=88271Manca un [tt]$[/tt] proprio al comando [tt]\gv[/tt]
        `\newcommand{\gv}[1]{\ensuremath{\mbox{\boldmath$ #1 $}}}`
        ma ho come l’impressione che tutto questo codice sia una porcheria

        Sì, lo è. Se si vuole un simbolo in nero, la soluzione è usare il pacchetto bm:
        `\usepackage{bm}
        \newcommand{\gv}[1]{\bm{#1}}`
        È giusto definirsi una propria macro per questi casi, naturalmente, preferendo un comando “significativo” a uno “generico”.

        Ciao
        Enrico

      • #88804
        OldClaudio
        Partecipante
          Up
          0
          Down
          ::


          Hai ragione , Enrico; ma proprio l’esempio di [tt]\gv[/tt] mi sembra uno spreco; che vantaggio c’è a scrivere [tt]\gv{a}[/tt] piuttosto che [tt]\bm{a}[/tt]?
          Almeno [tt]\bm[/tt] ha le iniziali di “bold math”, mentre [tt]\gv[/tt] a me non ricorda niente, per quanto mi sforzi. Sebbene la macro che proponi sia corretta, è evidentemente uno spreco.
          Volendo evitare di correggere altre cose già scritte, preferirei usare [tt]\let\gv=\bm[/tt] facendo sì che [tt]\gv[/tt] sia un sinonimo di [tt]\bm[/tt].

        • #88805
          Up
          0
          Down
          ::

          OldClaudio” post=88281Hai ragione , Enrico; ma proprio l’esempio di [tt]\gv[/tt] mi sembra uno spreco; che vantaggio c’è a scrivere [tt]\gv{a}[/tt] piuttosto che [tt]\bm{a}[/tt]?
          Almeno [tt]\bm[/tt] ha le iniziali di “bold math”, mentre [tt]\gv[/tt] a me non ricorda niente, per quanto mi sforzi. Sebbene la macro che proponi sia corretta, è evidentemente uno spreco.
          Volendo evitare di correggere altre cose già scritte, preferirei usare [tt]\let\gv=\bm[/tt] facendo sì che [tt]\gv[/tt] sia un sinonimo di [tt]\bm[/tt].

          Be’, evidentemente ricorda qualcosa a atom heart mother. E non è affatto uno spreco.

          Supponiamo che in un documento mi trovi a che fare con due tipi di oggetti; uno si può chiamare “generic variable” e un altro “funny variable”. Per ciascuno di essi definirò
          `\newcommand{\gv}[1]{\bm{#1}}
          \newcommand{\fv}[1]{\bm{#1}}`
          anche se la realizzazione in stampa è la stessa. Se dal’alto dovesse venire l’obiezione che le “funny” devono essere indicate in lettere Fraktur a testa in giù, sarebbe facile cambiare la definizione di [tt]\fv[/tt] senza guardare in tutto il documento quale uso di [tt]\bm[/tt] corrisponde a “funny” e quale a “generic”.

          Quanto a [tt]\let\gv\bm[/tt], io e te sappiamo bene che è molto più efficiente. Ma [tt]\let[/tt] non è documentato nel manuale di LaTeX.

          Ciao
          Enrico

        • #88806
          OldClaudio
          Partecipante
            Up
            0
            Down
            ::

            Quanto a \let\gv\bm, io e te sappiamo bene che è molto più efficiente. Ma \let non è documentato nel manuale di LaTeX.

            È vero.

          • #88807
            Up
            0
            Down
            ::


            Anzitutto vi ringrazio per le copiose, alcune appassionate, risposte.

            Il codice che hai copiato è una prcheria, come qualcuno ha supposto correttamente. Tanto per commentare la porcheria, il codice`\newenvironment{eq}
            {\begin{eqnarray}}
            {\end{eqnarray}}`è una porcheria per due motivi:
            1) è ridicolo cambiare nome ad un ambiente soltanto per scrivere qualche lettera in meno: [tt]\begin{eq}[/tt] invece di [tt]\begin{eqnarray}[/tt]; non lo si deve mai fare, anche se funziona, perché diminuisce la leggibilità del codice (non perché [tt]eq[/tt] non ricordi le equazioni, ma perché si perde il concetto di «sistema di» equazioni dato da nome [tt]eqnarray[/tt].
            2) qualunque guida ricorda che LaTeX2e contiene ancora l’ambiente eqnarray per compatibilità con i vecchi documenti, ma che non lo si deve usare con i nuovi documenti

            Questa porzione di codice è l’unica che ho scritto autonomamente cercando su internet la sintassi per definire un nuovo ambiente. Non avevo alcuna intenzione di modificare la filosofia di LaTeX piuttosto ho trovato più comodo scrivere solo “eq” invece che “eqnarray” (oppure “align”) in un documento che prevede usare questo ambiente decine di volte. Ho comunque tutto il diritto di farlo dato che ciò che devo mostrare è il .pdf non il .tex al contrario di ciò che vale per l’HTML (ad es.)

            Conclusione di questa “reprimenda”: non prendere mai codice scritto da altri se non sai esattamente che cosa fa, cioè se non sei in grado di decifrare ogni definizione di comando in ogni suo minimo dettaglio; al posto di quelle cose c’è sempre un apposito pacchetto che le fa meglio. Sei tu solo autorizzato a scriverti i comandi che ti fanno comodo, perché tu solo sai che cosa vuoi veramente fare; ma se non riesci a scrivere da solo questi comandi personali, lascia stare e cerca qualche pacchetto di estensione che lo faccia per te.

            Da qualche parte si deve pur cominciare no? Se non si sbaglia non s’impara.
            A volte conviene, a volte no, usare direttamente un esempio scritto da altri piuttosto che leggersi guide su guide. Per dirne una ho visto che linkate spesso quella di Pantieri: è scritta con i piedi. Sarà pure bravo in LaTeX ma non sa spiegare.

            Proverò a correggere con i vostri preziosi consigli.

          • #88808
            Up
            0
            Down
            ::

            atom heart mother” post=88332Non avevo alcuna intenzione di modificare la filosofia di LaTeX piuttosto ho trovato più comodo scrivere solo “eq” invece che “eqnarray” (oppure “align”) in un documento che prevede usare questo ambiente decine di volte. Ho comunque tutto il diritto di farlo dato che ciò che devo mostrare è il .pdf non il .tex al contrario di ciò che vale per l’HTML (ad es.)

            Se vuoi risparmiare battute sulla tastiera usa un buon editor di testo con buone scorciatoie, non pasticciare il tuo codice. Fra qualche mese potrebbe diventare illeggibile anche per te.

            In alcuni ambienti andava molto di moda (ma ci sono ancora sacche di resistenza) definire i comandi [tt]\beq[/tt] ed [tt]\eeq[/tt] per aprire e chiudere l’ambiente [tt]equation[/tt]. A parte il belato che ti viene spontaneo leggendo questi comandi, il codice è davvero illeggibile per chi se lo trova davanti le prime volte, diventa difficile da gestire, e se c’è qualche editor di testo che ha la colorazione della sintassi per gli ambienti matematici non riuscirà a capire che quello è un [tt]equation[/tt]. La cosa divertente è che usando le funzioni di autocompletamento di uno qualsiasi degli editor più diffusi ci vogliono davvero meno battute per inserire un
            `\begin{equation}
            \end{equation}`
            che un
            `\beq
            \eeq`
            senza alcun autocompletamento. Contare per credere.

            Definire nuovi comandi o nuovi ambienti va bene se quei comandi o ambienti hanno un senso ben preciso, come negli esempi di egreg9. Questo ti aiutare a mantenere una notazione coerente perché poi ti basterà ridefinire un comando/ambiente se vorrai cambiare la notazione, invece di fare un cerca e sostituisci su tutto il documento, ma non usare la definizione di comandi e ambienti solo per risparmiarti battute sulla tastiera, per questo c’è l’autocompletamento

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

        Go to top