Warning di LaTeX: riferimenti incrociati non definiti

  • Creatore
    Topic
  • #110598
    Up
    0
    Down
    ::


    Ciao a tutti 🙂

    Scusate la domanda probabilmente stupida, sono nuova all’utilizzo di LaTeX, spero abbiate un pochino di pietà.
    Sto facendo delle prove per utilizzare dei riferimenti incrociati e ho scritto questo banalissimo codice:

    `\documentclass[a4paper,11pt]{article}

    \usepackage[T1]{fontenc}
    \usepackage[utf8]{inputenc}
    \usepackage[italian]{babel}
    \usepackage{amsmath}

    \title{L'uso delle tabelle}
    \author{Silvia Gloria Tamburini}
    \date{}

    \begin{document}
    \maketitle

    Oggi voglio provare a esercitarmi con le tabelle. Prima, però, un riferimento incrociato.
    \begin{equation}
    \label{funzintegrale}
    F(x) = \int_0^x f(t) \,dt
    \end{equation}
    Come si vede dall'equazione~\eqref{funzintegrale}, so fare i riferimenti incrociati.

    \end{document}
    `

    L’ho compilato e i riferimenti incrociati ci sono come voglio; sembrerebbe tutto perfetto, ma c’è questo warning:

    “LaTeX Warning: Reference `funzintegrale’ on page 1 undefined on input line 20.
    LaTeX Warning: There were undefined references.
    LaTeX Warning: Label(s) may have changed. Rerun to get cross-references right”

    E mi turba profondamente :’) Che cosa vuol dire che i riferimenti incrociati sono “non definiti”? Come potrei definirli meglio di così? Ho pensato che, visto che su tutte le guide viene suggerito di chiamare le etichette in un modo tipo questo:

    `eqn:funz-integrale`

    Era così che lo avevo fatto all’inizio. Ma il warning c’era comunque… ho fatto un po’ di prove, tipo togliere eqn, togliere il trattino… ma come vedete l’ultima versione ha un unico nome senza spazi, però il warning c’era lo stesso. C’è un modo per evitarlo?

    Grazie mille!

    PS: le guide le ho lette, ma non se ne parla.

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


      Gli avvertimenti dovrebbero sparire alla seconda compilazione. Tu, ovviamente, sai che, affinché i riferimenti incrociati funzionino, bisogna compilare almeno due volte, no? Del resto, se tu non lo sapessi, non otterresti i riferimenti incrociati come li vuoi, e non diresti che «sembrerebbe tutto perfetto», giusto?

      Ciao.


      Gustavo

    • #110600
      Up
      0
      Down
      ::


      Sì, ho letto di questa cosa, ma:

      1. L’avrò compilato tipo quattro o cinque volte ma gli avvertimenti ci sono sempre stati;
      2. I riferimenti sono apparsi correttamente già alla prima compilazione.

    • #110601
      OldClaudio
      Partecipante
        Up
        0
        Down
        ::


        No, ti sembra, ma non è così come credi.
        Infatti comincia con un file del tutto nuovo, contenente, per esempio il tuo Esempio Minimo Compilabile (EMC), ma dandogli un nome diverso da quelli che hai usato finora. Compila una sola volta ed esamina i messaggi che compaiono nel file .log verso al fine; troverai Undefined references e un consiglio … run again…

        Senza modificare niente nel file sorgente (come invece hai fatto nei tuoi numerosi tentativi, dove hhai aggiunt equ-, il trattino, tolto il trattino, eccetera), ricompila subito e il riefiment che dopo al prima compilazione era sostituida un punto interrogativo diventa il valore corretto 1.

        Che cosa è successo? semplicemente pdflatex ha fatto il suo dovere. con ogni compilazione, compresa la prima, il programma scrive in un file .aux che il label equ:funzintegrale, corrisponde al numero 1; con la seconda compilazione il programma legge il file .aux della compilazione precedente e sa quindi che cosa deve sostituire al label equ:funzintegrale.

        Cosa succede invece se cambi la stringa che costituisce il label? La prima volta scrive nel file .aux che equ:funzintegrale corrisponde a 1, ma prima di eseguire la seocnda compilazione tu cambi tutte le occorrenze delal stringa equ:funzintegrale con la stringa equ:funz-integrale, poi compili; il programma legge il file .aux della compilazione precedente e sa che a equ:funzintegrale deve sostituire 1, ma il nuovo sorgente non contiene nessuna istanza di quel labe, ma contiene il nuovo label che gli è del tutto ignoto, e ti ridà l’errore undefinded reference. E via di questo passo; perché i \label funzionino fra due compilazioni successive nessun \label deve venire modificato; se però nelle compilazioni successive compaiono nuovi vlabel, questi vengono dichiarati sconosciuti.

        Conclusione: non ti preoccupare se metre lavori un tuo documento ricevi quell’errore; alla compilazione successiva non ci sarà più. Preoccupatene solo quando devi licenziare il tuo documento; se dopo due compilazioni successive senza che intervengano modifiche ti appare ancora qualche undefined reference, allora, sempre che tu per sbaglio non abbia cambiato qualche label fra le due compilazioni, i casi sono due:
        1) hai definito \label{string} ma vi hai fatto riferimento con \ref{Stringa} (cioè con una stringa che non è identica a quella del corrispondente \abel — si tratta di uns semplice errore di battitura. Vedi sotto
        2) uai usato un \ref{stringa} senza avere mai usato \label{stiring}. In un carte senso questo è un caso che rientra nel precedente, anche se si tratta di una eventualità estrema; semplicemente la stringa usata dal comando \ref non coincide con quella del comando \label, perché non è stato usato nessun \label per definirla.

        Scusami se con tutte queste ripetizioni la spiegazione è diventata contorta.

        Tuttavia il problema è: come fare a scoprire se sei nel caso 1 o nel caso 2? basta per prima cosa aprire il file .log e cercare la stringa undefined partendo dall’inizio del file; il messaggio segue l’indicazione presente nella riga precedente del file .log dove è indicata la stringa di riferimento non definita.

        Ecco quindi che conoscendo la stringa non definita la inserisci nella casella del dialoco di ricerca delle stringhe del tuo editor, e vedi dove si trova questa stringa; a quel punto diventa facile capire dal contesto se hai fatto un errore di battitura, perché il \label corrispondente è da quelle parti nel file sorgente e vedi subito come correggere la stringa del \label )oppure la stringa del \ref). Altrimenti sei nel caso 2 e vai a cercare dove mettere il \label con la stringa giusta dove ti erir dimenticata di metterla.

        I programmi di composizione del sistema TeX funzionano come degli orologi svizzeri; gli errori sono quasi sempre nostri. Tutti ne commettiamo, anche chi come me usa LaTeX da oltre trenta anni; l’importante è sapere come individuarli per correggerli; e un minimo di conoscenza del funzionamento dei programmi di compilazione asincroni (come pdflatex, per esempio) aiuta molto ad andare quasi a colpo sicuro almeno in nove casi su dieci. il decimo caso indica che abbiamo commesso un errore veramente grave e dve il programma non riesce a darti nessuna indicazione possibile sul punto dove cercare l’errore commesso.

      • #110602
        Up
        0
        Down
        ::


        Grazie mille Claudio per l’esauriente risposta e scusami per l’ignoranza :’)

        PS: segnate pure la discussione come [risolto], io non so se posso modificare i titoli delle discussioni dopo averli inviati 🙂

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

    Go to top