- Questo topic ha 16 risposte, 3 partecipanti ed è stato aggiornato l'ultima volta 6 anni, 6 mesi fa da
ivan.
-
CreatoreTopic
-
12 Marzo 2020 alle 17:30 #117493::
Questo EMC produce un errore. Il comando \@Alph{thecontentslabel} produce una lettera, mentre il file .aux si aspetta un numero.
`
\documentclass{book}
\usepackage{titletoc}\makeatletter
\def\mylabel{\@Alph{\thecontentslabel}}
\titlecontents{chapter}
[1em]
{\addvspace{2ex}}
{\mylabel}
{}
{\contentspage}\makeatother
\begin{document}
\tableofcontents
\chapter{Titolo}
\appendix
\chapter{Titolo prima appendice}
\chapter{Titolo seconda appendice}\end{document}
`La soluzione che ho trovato è questa:
`\def\mylabel{\noexpand\@Alph{\thecontentslabel}}`Chi mi sa spiegare cosa succede?
Mi aspettavo che \noexpand eliminasse l’errore, ma anche che non producesse il risultato desiderato.
Invece il risultato è, apparentemente, corretto.Ciao
Ivan
-
CreatoreTopic
-
AutoreRisposte
-
-
12 Marzo 2020 alle 17:58 #117494::
Non so perché tu voglia specificare che \@Alph non sia sviluppato, ma se togli \@Alph tout-court (magari aggiungendo uno spazio} l’indice viene fuori perfettamente come ci si aspetta`\documentclass{book}
\usepackage{titletoc}\makeatletter
\def\mylabel{\thecontentslabel\space}
\titlecontents{chapter}
[1em]
{\addvspace{2ex}}
{\mylabel}
{}
{\contentspage}\makeatother
\begin{document}
\tableofcontents
\chapter{Titolo}
\appendix
\chapter{Titolo prima appendice}
\chapter{Titolo seconda appendice}\end{document}`
-
12 Marzo 2020 alle 18:48 #117495::
Il mio EMC compila la prima volta, e produce un errore la seconda volta.Se si aggiunge \noexpand qui:
`\def\mylabel{\noexpand\@Alph{\thecontentslabel}}`
l’errore scopare alla seconda compilazione.Il tuo EMC compila a prescindere da \space, perché manca il comando che crea il guasto, ovvero \@Alph.
Questo fa sì che nel file .aux vena scritta una lettera (nella fattispecie A e B, che sono le etichette delle due appendici),
mentre ci dovrebbe essere un numero. Non capisco perché con \noexpand scompaia l’errore e le appendici
vengano corrrettamente numerate con A e B anche nell’indice.Ciao
Ivan
-
12 Marzo 2020 alle 21:19 #117496::
Continuo il messaggio precedente.Nel frattempo ho cercato di indagare la questione e mi sono accorto che il mio EMC è fuorviante… Deriva da un tentativo di semplificare il problema, ma l’ho semplificato troppo.
Evidentemente quel \noexpand non risolve il problema.
Riformulo il caso concreto. Poniamo di volere nell’indice i numeri di capitolo in caratteri romani maiuscoli
e le appendici numerate con A, B, ecc. Il tutto usando titlesec/titletocEcco un EMC che riproduce l’errore. Se si commenta \appendix ovviamente tutto fila liscio.
`
\documentclass{book}
\usepackage{titletoc}\makeatletter
\def\mylabel{\@Roman{\thecontentslabel}}
\titlecontents{chapter}
[1em]
{\addvspace{2ex}}
{\mylabel}
{}
{\contentspage}\makeatother
\begin{document}
\tableofcontents
\chapter{Titolo}
\appendix
\chapter{Titolo prima appendice}
\chapter{Titolo seconda appendice}\end{document}`
Dal poco che ho capito ha a che fare con una definizione presente in \appendix, e precisamente:
`\gdef\thechapter{\@Alph\c@chapter}`Ciao
Ivan
-
12 Marzo 2020 alle 22:12 #117497::
Conrolla il file .aux sia quando l’errore si presenta, sia quando non si prsenta; i due .aux sono identici.Dove è l’errore? Nel fatto che \@Alph, \@Roman e gli altri comandi per “stampare” i contatori hanno bisogno del nome di un contatore TeX; il contaotree chapter, che serve per numerare i capitoli e le appendici, ha il nome TeX \c@chapter. Per esemplo, viene definito il comando \thecapter come \@arbic\c@chapte; per le appendici esso viene rinominato da \appendix come \@Alph\c@chpater.
Ora il tuo codice che definisce \mylabel come \@Alph\thecontentslabel è sbagliato due volte, ma \mettendo \noexpand davanti si rende localmente \@Alph equivalente a \relax e il comando \thecontentslabel fa il suo mestiere.
Casomai dovresti definirlo come \@Alph\c@contentslabel, dove contentslabel è il nome di un contatore LaTeX definito da titletoc in maniera ritardata al momento dell’esecuzione del comando \begin{document}. Infatti se metti \show\thecontentslabel subito prima di \begin{document} il compilatore di dice (nella console) che quel comando è undefined.Tra laltro, Ivan, non so che SO e quale shell editor tu usi, ma configura il tuo shell editor in modo che qualunque sia il compilatore che esegui, lo faccia in -errorstopmode; di sotilto vengono prefigurati per funzionare in -scrollmode o comeunque in uno degli altri modi che non lo fanno fermare, ma lo fanno semplicemente o proseguire alla cieca fin ché ci riesce, o fermarsi di brutto. Con -errorstopmode sei sicuro di leggere tutti i messaggio che ti vengono inviati dal compilatore (tranne i Warning) in modo che addirittura puoi correggere localmente gli errori di ortografia nei comandi (però poi li devi correggere anche nel sorgente) ma ti consentono di proseguire senza l’errore corretto almeno fino all’errore successivo (quando ci riesce).
-
12 Marzo 2020 alle 22:34 #117498::
Prova a compilare il secondo codice che ho inviato, e che riporto qui:
`\documentclass{book}
\usepackage{titletoc}\makeatletter
\def\mylabel{\@Roman{\thecontentslabel}}
\titlecontents{chapter}
[1em]
{\addvspace{2ex}}
{\mylabel}
{}
{\contentspage}\makeatother
\begin{document}
\tableofcontents
\chapter{Titolo}
\appendix
\chapter{Titolo prima appendice}
\chapter{Titolo seconda appendice}\end{document}`
Come avevo scritto nel mio ultimo messaggio, il primo codice era sbagliato. Ora \@Alph non compare più.
Ciao
Ivan
-
13 Marzo 2020 alle 8:32 #117499::
Sì, ma rimane [tt]\@Roman{\thecontentslabel}[/tt] che se hai lettoal spiegazione del mio ultimo messaggio contiene un errore logico: \@Roman deve essere seguito dal nome di un contatore TeX e \thecontentslable non è un contatore tex ma una stringa di cifre; Per tua fortuna \@Roma e \@roman si appoggiano al comando nativo \romannumeral e quindi riescono ancora a svolgere il loro lavoro, mentre \@alph e \Àlph devono costruire il codice ASCII della lettera da usare.
Nello stesso tempo se ci si riferisce alle appendici delle quali il comando \chapter ha inviato al file .aux la lettera e non il numero corrispondente all’appendice, nemmeno \@roman e \@Roman riescono a farci niente.E infatti anche questo tuo secondo esempio non funziona con le appendici e se guardi il file .log, oppure quanto ti scrive sulla console, vedi che spiega che l’argomento A per la prima appendice, o l’argomento B per la seconda appendice, sono errati.
In realtà non riesco a capire perché tu voglia ridefinire il modo di scrivere il numero del capitolo ( capitolo o appendice che sia) con una impostazione globale nello stile del capitolo, come fai quando imposti lo stile della pagina dell’indice co in comandi di titletoc. Se stai solo sperimentando allora, non guardare solo in superficie, ma leggi anche il file .log ed eventualmente fai un tracciamento delle operazioni eseguite dal programma, caricando il pacchetto trace e mettendo n \traceon subito prima di \tableofcontents, e un \traceoff subito dopo; avrai alcune miglia di righe da leggere nel file .log, ma se lo apri con lo stesso editor con cui componi fil file sorgente ne puoi sfruttare le proprietà per ricercare stringhe di vario genere e saltare interi brani di codice nel file .log.
Se invece vuoi ottenere un risultato particolare, descrivi il tuo obbiettivo in modo che, magari, assieme si possa trovare una soluzione.
-
13 Marzo 2020 alle 10:46 #117500::
L’avevo scritto in un precedente messaggio. Lo riporto di seguito.ivan” post=117920
Riformulo il caso concreto. Poniamo di volere nell’indice i numeri di capitolo in caratteri romani maiuscoli
e le appendici numerate con A, B, ecc. Il tutto usando titlesec/titletocEcco un EMC che riproduce l’errore. Se si commenta \appendix ovviamente tutto fila liscio.
`
\documentclass{book}
\usepackage{titletoc}\makeatletter
\def\mylabel{\@Roman{\thecontentslabel}}
\titlecontents{chapter}
[1em]
{\addvspace{2ex}}
{\mylabel}
{}
{\contentspage}\makeatother
\begin{document}
\tableofcontents
\chapter{Titolo}
\appendix
\chapter{Titolo prima appendice}
\chapter{Titolo seconda appendice}\end{document}`
Ciao
Ivan
-
13 Marzo 2020 alle 17:53 #117501::
OK, credo di avere capito.Premetto che numerare i capitoli romani è un suicidio, perché sono stringhe di lettere di lunghezza variabile, e per avere un indice decente con i titoli incolonnati bisogna modificare pesantemente gli schemi (template) di scrittura delle righe dell’indice (sono righe che hanno il seguente aspetto: \l@chapter, \l@section, eccetera), quello che hai fatto tu generalizza la scrittura romana sia per i capitoli numerati romanescamente, sia i numeri letterali delle appendici; ovviamente produce errori; I capitoli sono numerati con cifre arabe, ma nell’indice questi numeri arabi sono tradotti in numeri romani; prova a scrivere il tuo esempio mettendoci una ventina di comandi \chapter e vedrai nell’indice il disastro che succede, a prescindere dalle appendici.
Quindi, anche se ti sconsiglio di suicidarti TeXianamente parlando, non devi agire sulla forma dell’indice analitico, ma devi reimpostare solo il comando \thecapter e dopo, quando cominci le appendici, probabilmente il comando \appendix fa il suo mestiere. Fammici provare un po’, ma siccome non uso mai titletoc, devo studiarlo un poco; come sai io preferisco ridefinire, o eventualmente mettere toppe nel codice originale, piuttosto che caricare interi pacchetti onnicomprensivi che fanno anche cose che non mi interessano e talvolta provocano delle incompatibilità.
-
13 Marzo 2020 alle 18:36 #117502::
Titletoc è proprio il pacchetto sbagliato; potrebbe servire per allargare il campo destinato il numero dei capitoli, ma per cambiare la numerazione in numerazione romana basta pochissimo`\documentclass{book}
%\usepackage{titletoc}\makeatletter
\def\mylabel{\@Roman{\thecontentslabel}\space}
%\titlecontents{chapter}
%[1em]
%{\addvspace{2ex}}
%{\mylabel}
%{}
%{\contentspage}\makeatother
\begin{document}
\tableofcontents
\renewcommand\thechapter{\Roman{chapter}}
\chapter{Uno}
\chapter{Due}
\chapter{Tre}
\chapter{Quattro}
\chapter{Cinque}
\chapter{Sei}
\chapter{Sette}
\chapter{Otto}
\chapter{Nove}
\chapter{Dieci}
\chapter{Undici}
\chapter{Dodici}
\chapter{Tredici}
\chapter{Quattordici}
\chapter{Quindici}
\chapter{Sedici}
\chapter{Diciassette}
\chapter{Diciotto}
\chapter{Diciannove}
\chapter{Venti}
\chapter{Ventuno}
\chapter{Ventidue}
\chapter{Ventitre}
\chapter{Ventiquattro}
\chapter{Venticinque}
\chapter{Ventisei}
\chapter{Ventisette}
\chapter{Ventotto}
\chapter{Ventinove}
\chapter{Trenta}\appendix
\chapter{Prima appendice}
\chapter{Seconda appendice}\end{document}`Come vedi ti ho messo trenta capitoli;e se compili questo EMC non ottieni nessun errore, ma i numeri dei capitoli si sovrappongono ai loro titoli; Il numero più lungo è 28 _> XXVIII, quindi caso mai devi usare questo per allargare la colonna dei numeri; tini presente che per l’allineamento verticale le righe \l@chapter & company, anno un argomento che che determina la larghezza della scatola che contiene il numero; con una scatola di larghezza costante, la colonna dei numeri li ha appoggiati a sinistra, ma i titoli cominciano tutti alla stessa distanza dal margine sinistro; però questa scatola, definita con i comandi nativi ti TeX, equivale a una \makebox, per esempio [tt]\makebox[l][2em]{
}[/tt]; quindi se è più largo di 2em, quello che eccede sfora fuori dalla scatola a destra e si sovrappone al titolo. Leggi bene titletoc specialmente nella pagina 15, dove si spiega che cosa siano le varie parti che formano la stringa modello per l’indice; devi specificare correttamente il valore di
-
13 Marzo 2020 alle 21:53 #117503::
Ok, però non è questo il problema.
Io devo trovare una soluzione usando titletoc, perché il problema si presenta in suftesi con l’opzione chapnumstyle=Roman,
che per l’appunto imposta i numeri di capitolo in cifre romane. Questa opzione non funziona nelle appendici.
Quindi attualmente se si usa quell’opzione non si può usare \appendix.
Il fatto che il mio EMC non carica suftesi è semplicemente perché ho ridotto il problema all’osso.Ciao
Ivan
-
13 Marzo 2020 alle 22:06 #117504
-
14 Marzo 2020 alle 10:19 #117505::
Ho esaminato con cura sia il sorgente di suftesi per quel che rigurda l’indice e in particolare l’uso di \thecontentslabel.Purtroppo, come dicono gli autori di titletoc, quel pacchetto non funziona bene con le classi che ridefiniscono i comandi di sezionamento, e, purtroppo, suftesi è uno di quelli.
Il file .aux contiene i dati corretti per l’indice: i numeri dei capitoli sono in cifre arabe e i numeri delle appendici sono in cifre maiuscole. Definendo \thecontentslabel viene ridefinita \numberline in modo che usi la nuova definizione di \thecontentslabel. Cioè le cifre arabe del file .aux sono trasformate in numeri romani solo quando si compone l’indice, in quanto vengono elaborate solo a quel momento da \thecontentslabel. Dunque non c’è nulla da fare a livello di documento, perché l’indice viene composto asincrono dal documento che viene composto.
Per correggere questo comportamento, bisognerebbe che \appendix, o \appendices, o l’ambiente appendices aggiungesse ai comandi interni di titletoc uno switch tale da testare se l’indice sta elaborando le voci relative al capitoli o quelle relative alle appendici e ridefinisse \numberline in modo conforme; oppure, se comunque con suftesi, le appendici restano sempre numerate con lettere maiuscole, bisognerebbe che lo switch modificasse \numberline togliendo semplicemente il comando \thecontentsline dalla sua definizione. L’interazione fra titletoc e suftesi è delicatissima e quindi il lavoro lo devi fare tu, perché conosci ogni dettaglio di suftesi; io potrei forse riuscire a combinare qualcosa con un EMC, ma non è affatto escluso che dando un colpo al cerchio non sfasci la botte 🙁
Come vedi si tratta di cose delicatissime da fare con giudizio e sperimentando molto per verificare che tutto funzioni come voluto.
PS: Incidentalmente nel preambolo, per gestire i numeri romani correttamente nell’indice bisogna mettere `\toclabelwidth{chap}{3em}`. Forse andrebbe bene anche 2.5em, ma mi sembra più arioso con 3em.
-
15 Marzo 2020 alle 10:18 #117506::
Questa sembra essere la strada giusta. Il problema è che non si può ridefinire semplicemente \numberline, o meglio io ci ho provato ma non riesco a ottenere alcun risultato.
Credo che ciò dipenda dal fatto che in mezzo sta titletoc, che sovrascrive la definizione. Ho individuato il comando sul quale, credo, si debba agire: \ttl@tocentry definito in titletoc.sty. Incollo qui sotto un EM(C) e segno con <<<<<< la riga responsabile della stampa dell'etichetta: `\def\numberline##1{\global\ttl@labeltrue\gdef\thecontentslabel{##1}}% <<<<<<<<<<<<<<` ##1 deve essere un numero. Con l'opzione chapnumstyle=Roman questo diventa, nelle appendici, una lettera. E si produce l'errore. Bisognerebbe fare in modo che funzionasse anche nel caso sia una lettera. Ma è una bella grana, credo. ` \documentclass[chapnumstyle=Roman]{suftesi} \makeatletter \def\ttl@tocentry#1#2#3#4#5#6#7#8{% \ttl@fixhyperref \ttl@providettll{}{#2}% \xdef\ttl@b{\csname ttll@#2\endcsname}% \ifnum\ttl@b>\c@tocdepth\else
\ifnum\ttl@b<\ttl@toctop\else \edef\ttl@a{\ttl@lasttoc}% \gdef\thecontentspage{#8}% \global\let\thecontentslabel\@empty \global\ttl@labelfalse \sbox\z@{% Unused box. It just catch the numberline \def\numberline##1{\global\ttl@labeltrue\gdef\thecontentslabel{##1}}% <<<<<<<<<<<<<< #7}% \ttl@b = current \ttl@a = previous \ifttl@fromblock \ttl@outblock{#1}{#2}{#4}% \else \ttl@outnoblock{#1}{#3}{#4}% \fi \def\numberline##1{\ignorespaces}% \ifttl@label {\leavevmode\strut\@firstoftwo#5{#7}\strut\kern\z@}% \else {\leavevmode\strut\@secondoftwo#5{#7}\strut\kern\z@}% \fi {#6}% \ifcase#1\relax \ifttl@fromblock\else \protected@edef\ttl@preend{\@nameuse{ttle@#2}}% \fi \global\ttl@fromblocktrue \else \@@par \nobreak \csname ttle@#2\endcsname \endgroup \global\ttl@fromblockfalse \fi \xdef\ttl@lasttoc{\csname ttll@#2\endcsname}% \fi \fi \ignorespaces} \makeatother \begin{document} \tableofcontents \chapter{Titolo} \appendix \chapter{Titolo prima appendice} \chapter{Titolo seconda appendice} \end{document}` Ciao Ivan -
15 Marzo 2020 alle 13:36 #117507::
Ivan, ti ho mandato una mail personale, perché il messaggio era troppo lungo.
Nel messaggio che ti ho inviato ti ho mostrato come sono riuscito ad ottenere il risultato giusto, ma si tratta di una toppa e non è completa; se ci lavori sopra, seguendo la stessa linea di pensiero, e aggiusti le cose con tutti gli stili di numerazione dei \chapter e dei sezionamenti subalterni, sei a cavallo.
-
15 Marzo 2020 alle 16:30 #117508::
ivan” post=117920Continuo il messaggio precedente.
Nel frattempo ho cercato di indagare la questione e mi sono accorto che il mio EMC è fuorviante… Deriva da un tentativo di semplificare il problema, ma l’ho semplificato troppo.
Evidentemente quel \noexpand non risolve il problema.
Riformulo il caso concreto. Poniamo di volere nell’indice i numeri di capitolo in caratteri romani maiuscoli
e le appendici numerate con A, B, ecc. Il tutto usando titlesec/titletocEcco un EMC che riproduce l’errore. Se si commenta \appendix ovviamente tutto fila liscio.
`
\documentclass{book}
\usepackage{titletoc}\makeatletter
\def\mylabel{\@Roman{\thecontentslabel}}
\titlecontents{chapter}
[1em]
{\addvspace{2ex}}
{\mylabel}
{}
{\contentspage}\makeatother
\begin{document}
\tableofcontents
\chapter{Titolo}
\appendix
\chapter{Titolo prima appendice}
\chapter{Titolo seconda appendice}\end{document}`
Dal poco che ho capito ha a che fare con una definizione presente in \appendix, e precisamente:
`\gdef\thechapter{\@Alph\c@chapter}`Ciao
IvanMi pare evidente che non possa funzionare. Il primo [tt]\chapter[/tt] nell’appendice produce [tt]\numberline{A}Titolo prima appendice[/math] nell’argomento di [tt]\contentsline[/tt].
Perché [tt]\noexpand\@Alph[/tt] sembra funzionare? Perché semplicemente [tt]\@Alph[/tt] diventa temporaneamente [tt]\relax[/tt], quindi sparisce e rimane [tt]{A}[/tt]. Ovviamente questo stampa “A”.
Senza [tt]\noexpand[/tt] (che non serve affatto a risolvere il problema), a un certo punto [tt]\numberline{A}[/tt] esegue [tt]\mylabel{A}[/tt], e il tutto sbrocca perché ovviamente [tt]\@Alph[/tt] vuole vedere un numero, non una lettera.
Non riesco a capire quale sia lo scopo finale.
Ciao
Enrico
-
15 Marzo 2020 alle 16:47 #117509::
Ciao Enrico, ignora quel messaggio. Poi mi sono accorto che non era affatto una soluzione.
Lo scopo finale è far funzionare un’opzione di suftesi che permette di avere i numeri di capitolo in cifre romane nell’indice, tramite titletoc.
Ecco un EMC.`\documentclass[chapnumstyle=Roman]{suftesi}
\begin{document}
\tableofcontents
\chapter{Titolo}
\appendix
\chapter{Titolo prima appendice}
\chapter{Titolo seconda appendice}\end{document}`
Nel primo messaggio avevo creato un EMC, estrapolato da suftesi, ma indipendente, che riproduce lo stesso problema,
che brevemente si riassume in questo: come è possibile avere il numero di capitolo in cifre romane nell’indice anche in presenza di appendici?`\documentclass{book}
\usepackage{titletoc}\makeatletter
\def\mylabel{\@Alph{\thecontentslabel}}
\titlecontents{chapter}
[1em]
{\addvspace{2ex}}
{\mylabel}
{}
{\contentspage}\makeatother
\begin{document}
\tableofcontents
\chapter{Titolo}
\appendix
\chapter{Titolo prima appendice}
\chapter{Titolo seconda appendice}\end{document}
`
Nell’ultimo mio messaggio ho provato a individuare dove potrebbe essere il problema in titletoc:
https://www.guitex.org/home/forum/5-tex-e-latex/117913-errore-titletoc-alph-appendix?lang=it#117942Ciao
Ivan
-
-
AutoreRisposte
- Devi essere connesso per rispondere a questo topic.