problemi contatori e loro inizializzazione

  • Creatore
    Topic
  • #101768
    Up
    0
    Down
    ::


    Carissimi,
    ho un problema con i contatori.
    E’ possibile passare dall’elaborato principale un contatore non definito che viene poi usato ed elaborato in una macro?
    Quale valore iniziale assume?
    Esempio

    \macronelmain{10}{\count0}{count1}

    Ovviamente il valore “10” è puramente inventato.

    Tracciando il flusso di macro con \traceon mi sono accorto che fino ad un certo livello il \count1 viene passato senza che il suo interno sia inizializzato o elaborato.(solo con la classica “#n<--count1". Solo verso la fine del processo,(che risulta ricorsivo in alcune sue parti) viene acquisito da una macro che lo prende come argomento. Quest'ultima contiene una definizione relativa parametro in questione \newcount\contatorenelqualecifiniscecount1. Mi chiedo due cose: - se count1 non risulta definito da nessuna parte,se non come parametro (e poi diviene argomento) di una sottomacro che interviene quasi alla fine del processamento,è naturale che non ho errori? - dal tracciamento con \traceon vedo che il suo interno contiene (solo ed esclusivamente quando interviene la macro che lo prende come argomento e lo modifica) inizialmente il valore 0 senza che esso sia stato posto così da alcuna precedente assegnazione. E' il \newcount della sottomacro (che lo usa come argomento) ad inizializzarlo a zero per poi processarlo e manipolarlo? Scusatemi se la domanda risulta poco chiara in caso provo a postare il codice.Risulta comunque molto arizigogolato. Un grazie a tutti Alessandro

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


        I nomi dei contatori TeX (a differenza dei conatatori LaTeX) sono costituiti da control sequence a cui, con \newcount viene associato il numero di un contatore.
        I comandi nativi come \count si riferiscono con il numero che lo segue, per esempio \count213, il contento del registro numerico 213; quindi se si accede al registro tramite \count, il suo contenuto è quello di inizializzazione della memoria del programma di composizione, generalmente zero, o l’ultimo valore che quel registro conteneva per usi precedenti, fatti esplicitamente o implicitamente nell’elaborazione precedente.

        Quindi, anche se non è mai stato assegnato un valore a un contatore, esso comunque non è indefinito, ma di solito contiene il valore zero.

        Quando si definisce il nome di un contatore con \newcount (per TeX} o \newcounter (per LaTeX) alla c.s. viene associato un contatore inizializzato al valore 0; se si facesse riferimento a un nome di contatore senza prima aver assegnato a quella c.s. il numero di un registro numerico, la compilazione darebbe il messaggio “Undefinded control sequence”.

        Regole generali:
        1) In teoria si possono mescolare contatori TeX e contatori LaTeX, ma sarebbe troppo facile fare confusione e commettere errori di cui non si capisce la natura, perciò non si mescolino i contatori TeX con i contatori LaTeX.
        2) I registri numerici da 0 a circa 30 sono riservati per TeX e LaTeX; non li si usi per nessun motivo al mondo; si usu sempre l’associazione di un registro numerico con una c.s. perché il comando \newcounter (e anche \newcount) controllano che quel nome sia associato ad un registro che non è stato ancora assegnato.
        3) il registro 0 è usato dal sistema; i registri da 1 a 10 dovrebbero contenere i numeri di pagina per usare delle numerazioni strutturate; i registri dall’11 al 29 o 30 (non ricordo bene) dovrebbero servire per l’allocazione dei registri numerici, dimensionali, delle scatole, delle inserzioni e via di questo passo, fino all’assegnazione di un nome di lingua al numero che identifica i suoi pattern di sillabazione; come si vede una cosa piuttosto complessa sulla quale non è opportuno mettere le mani.
        4) TeX normale (quello che oggi usa solo Knuth) permette di associare a d altrettante control sequence fino a 256 contatori, 256 lunghezze, 256 lunghezze elastiche, eccetera. Per poterne associare di più bisogna usare etex, pdftex, xetex, eccetera nelle rispettive versioni estese, e bisogna caricare il pacchetto e tex per modificare la procedure con cui vengono allocati i registri e collegati con una c.s. assolutamente unica fino ad un massimo di oltre 32000 registri o altre cose. Senza usare il pacchetto etex i registri e gli altri oggetti che corrispondono a numeri superiori a 255 solo usando l’indirizzo/numero esplicito, senza poter usare nomi o c.s. Per i contatori LaTeX è sempre necessario disporre del nome perché al contatorie pippo, viene associata la c.s. \c@pippo, al quale è associato un registro numerico.
        5) Sui contatori TeX o LaTeX sui registri lunghezza (fissa o elastica, testuale o matematica) è possibile eseguire operazioni di calcolo senza usare il pacchetto calc. Vedi la documentazione di etex con texdoc etex.
        6) Di solito prima di usare un contatore bisogna incrementarlo di una unità, tranne che con il numero della pagina che viene internamente incrementato quando si spedisce fuori ogni pagina composta in modo definitivo. Ma di fatto finché la routine di output non ha spedito fuori la pagina, il numero di pagina non è esattamente conosciuto dal compositore.

        Detto questo visto che nel tuo esempio usi \count0 e \count1, direi che quella è programmazione con comandi nativi e senza usare contatori identificati con c.s. Se uno sa che cosa sta facendo la cosa è possibile, ma in ogni caso è molto imprudente; per esperienza diretto sconsigli vivamente di fare quei giochetti con i quali ci si può ficcare in guai inenarrabili. Bisogna salvarsi nel “rifugio atomico” di proteggersi dentro un gruppo e di usare solo comandi di assegnazione locale; all’occorrenza bisogna conoscere i trucchi necessari per portare i contenuti dei contatori fuori dal gruppo, ristabilendo i contatori ai valori che avevano prima di entrare nel gruppo.

        @Mago_Gandalf, non ti impegolare in queste cose; è una raccomandazione, non una minaccia 🙂 😉 😀

      • #101770
        Up
        0
        Down
        ::


        Grazie mille per la illuminante e preziosissima risposta.
        Non mi faccio “impegolare” è solo che andando a fondo nelle c.s. riesco ad apprendere il dettaglio della programmazione e la logica dell’interprete vero e proprio.
        Ho programmato in C ed in Pascal ma qui il “meccanismo” è un po diverso 🙂
        Ecco il motivo per il quale ho iniziato a “spazzolare” dal “TeX in Practice” ed il TeXbook altrimenti non riesco ad affilarci nulla in quanto mi chiedo sempre il perchè delle cose sino ad arrivare all’osso.Deformazione mentale 🙂
        Un saluto
        Alessandro

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

    Go to top