- Questo topic ha 10 risposte, 3 partecipanti ed è stato aggiornato l'ultima volta 14 anni, 10 mesi fa da
ivan.
-
CreatoreTopic
-
4 Novembre 2011 alle 18:00 #65608::
Provate a compilare questo codice:
`
\documentclass[sctitles]{suftesi}
%\usepackage[italian]{babel}
%\usepackage{listings}
\usepackage{lipsum}\begin{document}
\chapter{Lorem ipsum}
\lipsum
\end{document}`
Il risultato sarà corretto: titoli e testatine in maiuscoletto spaziato.
Ora provate a compilare decommentando entrambe le righe commentate. La compilazione si blocca.
Se però si commenta o uno o l’altro dei pacchetti, non ci sono problemi.Il problema è nelle definizioni dei marcatori usati per le testatine, all’interno dei quali si usano diversi condizionali. Ho provato e riprovato, ma niente.
È la parte di codice più “sporca” di tutte. A forza di aggiungere opzioni è diventata una giungla. Ma non saprei che approccio usare.Idee?
Ciao
Ivan
-
CreatoreTopic
-
AutoreRisposte
-
-
5 Novembre 2011 alle 0:01 #65609::
Ho provato a indagare e sembra che abbia trovato una soluzione, anche se non ho compreso pienamente la causa.Da quel che ho capito, tra babel e listings si fanno due cose che in qualche modo cozzano: ridefinire markboth e cambiare il significato del carattere attivo ~. Quando tu fai:
`
\ifsuftesi@elements
\renewcommand{\chaptermark}[1]{\markboth{#1}{#1}}
\else
\renewcommand{\chaptermark}[1]{\markboth{\chaptertitlename~\thechapter}{#1}}
\fi`
il carattere ~ sembra ancora un carattere attivo, ma non definito (così almeno compare se lo precedi con uno \show).Una soluzione banale è sostituirlo con il più semplice “\ “, tanto è praticamente impossibile che lì avvenga una cesura.
Ripeto: non sono ben conscio del problema, ma questa sembra essere una soluzione.
Ciao,
Antonio
-
5 Novembre 2011 alle 0:41 #65610::
antonio.macrì” post=64713Ho provato a indagare e sembra che abbia trovato una soluzione, anche se non ho compreso pienamente la causa.
Da quel che ho capito, tra babel e listings si fanno due cose che in qualche modo cozzano: ridefinire markboth e cambiare il significato del carattere attivo ~. Quando tu fai:
`
\ifsuftesi@elements
\renewcommand{\chaptermark}[1]{\markboth{#1}{#1}}
\else
\renewcommand{\chaptermark}[1]{\markboth{\chaptertitlename~\thechapter}{#1}}
\fi`
il carattere ~ sembra ancora un carattere attivo, ma non definito (così almeno compare se lo precedi con uno \show).Una soluzione banale è sostituirlo con il più semplice “\ “, tanto è praticamente impossibile che lì avvenga una cesura.
Certo, in quel punto non ci possono essere cesure
antonio.macrì” post=64713
Ripeto: non sono ben conscio del problema, ma questa sembra essere una soluzione.Io meno di te 😯
Ciao
Ivan
-
5 Novembre 2011 alle 0:41 #65611::
antonio.macrì” post=64713Ho provato a indagare e sembra che abbia trovato una soluzione, anche se non ho compreso pienamente la causa.
Da quel che ho capito, tra babel e listings si fanno due cose che in qualche modo cozzano: ridefinire markboth e cambiare il significato del carattere attivo ~. Quando tu fai:
`
\ifsuftesi@elements
\renewcommand{\chaptermark}[1]{\markboth{#1}{#1}}
\else
\renewcommand{\chaptermark}[1]{\markboth{\chaptertitlename~\thechapter}{#1}}
\fi`
il carattere ~ sembra ancora un carattere attivo, ma non definito (così almeno compare se lo precedi con uno \show).Una soluzione banale è sostituirlo con il più semplice “\ “, tanto è praticamente impossibile che lì avvenga una cesura.
Certo, in quel punto non ci possono essere cesure
antonio.macrì” post=64713
Ripeto: non sono ben conscio del problema, ma questa sembra essere una soluzione.Io meno di te 😯
Grazie
Ciao
Ivan
-
5 Novembre 2011 alle 8:43 #65612::
Quanto all’approccio da usare, ti suggerirei l’idea di annidare le definizioni nei condizionali \ifsuftesi@<...>, e non viceversa, tanto tutte le condizioni di questo tipo non cambiano nelle diverse invocazioni dei comandi. Così sveltisci la compilazione. Anziché
`
\def\sufthepage{\ifsuftesi@sctitles\sufsc{\thepage}\else\thepage\fi}
`
farei:
`
\ifsuftesi@sctitles
\def\sufthepage{\sufsc{\thepage}}
\else
\let\sufthepage\thepage
\fi`Un po’ più difficile è riscrivere:
`
\def\sufrightmark{\ifsuftesi@sctitles\sufsc{\ifsuftesi@authortitle\@title\else\rightmark\fi}% article mode
\else\ifsuftesi@authortitle\nouppercase\@title\else\nouppercase\rightmark\fi\fi}
\def\sufleftmark{\ifsuftesi@sctitles\sufsc{\ifsuftesi@authortitle\@author\else\ivanleftmark\fi}% book mode
\else\ifsuftesi@authortitle\nouppercase\@author\else\nouppercase\ivanleftmark\fi\fi}
`
Si può provare:
`
\begingroup
\ifsuftesi@sctitles
\def\cmd{\sufsc}
\else
\def\cmd{\nouppercase}
\fi
\ifsuftesi@authortitle
\def\right{\@title}
\def\left{\@author}
\else
\def\right{\rightmark}
\def\left{\ivanleftmark}
\fi
\expandafter\expandafter\expandafter\gdef\expandafter\expandafter\expandafter\sufrightmark
\expandafter\expandafter\expandafter{\expandafter\cmd\right}
\expandafter\expandafter\expandafter\gdef\expandafter\expandafter\expandafter\sufleftmark
\expandafter\expandafter\expandafter{\expandafter\cmd\left}
\endgroup
`A parte la caterva di \expandafter, forse mi pare un po’ più leggibile :shock::shock:
Comunque è più flessibile in caso modifichi o ci metti altre opzioni (ma so che non vuoi farlo :)), basta cambiare \cmd, \left e \right.Gli expandafter servono anche a evitare di conservare variabili temporanee. Un’altra cosa che mi sento di consigliarti è usare prefissi come suf@ per i comandi che non dovranno essere usati dall’utente (come per esempio \ivanleftmark, credo).
Comunque sarebbe bene sentire l’opinione di qualche luminare, sicuramente. Io sono solo uno interessato (molto) a queste cose e che si diletta ogni tanto: se vengo smentito imparo qualcosa. 🙂
Ciao,
A.
-
5 Novembre 2011 alle 9:25 #65613::
antonio.macrì” post=64723Quanto all’approccio da usare, ti suggerirei l’idea di annidare le definizioni nei condizionali \ifsuftesi@<...>, e non viceversa, tanto tutte le condizioni di questo tipo non cambiano nelle diverse invocazioni dei comandi. Così sveltisci la compilazione. Anziché
`
\def\sufthepage{\ifsuftesi@sctitles\sufsc{\thepage}\else\thepage\fi}
`
farei:
`
\ifsuftesi@sctitles
\def\sufthepage{\sufsc{\thepage}}
\else
\let\sufthepage\thepage
\fi`Un po’ più difficile è riscrivere:
`
\def\sufrightmark{\ifsuftesi@sctitles\sufsc{\ifsuftesi@authortitle\@title\else\rightmark\fi}% article mode
\else\ifsuftesi@authortitle\nouppercase\@title\else\nouppercase\rightmark\fi\fi}
\def\sufleftmark{\ifsuftesi@sctitles\sufsc{\ifsuftesi@authortitle\@author\else\ivanleftmark\fi}% book mode
\else\ifsuftesi@authortitle\nouppercase\@author\else\nouppercase\ivanleftmark\fi\fi}
`
Si può provare:
`
\begingroup
\ifsuftesi@sctitles
\def\cmd{\sufsc}
\else
\def\cmd{\nouppercase}
\fi
\ifsuftesi@authortitle
\def\right{\@title}
\def\left{\@author}
\else
\def\right{\rightmark}
\def\left{\ivanleftmark}
\fi
\expandafter\expandafter\expandafter\gdef\expandafter\expandafter\expandafter\sufrightmark
\expandafter\expandafter\expandafter{\expandafter\cmd\right}
\expandafter\expandafter\expandafter\gdef\expandafter\expandafter\expandafter\sufleftmark
\expandafter\expandafter\expandafter{\expandafter\cmd\left}
\endgroup
`A parte la caterva di \expandafter, forse mi pare un po’ più leggibile :shock::shock:
Comunque è più flessibile in caso modifichi o ci metti altre opzioni (ma so che non vuoi farlo :)), basta cambiare \cmd, \left e \right.Gli expandafter servono anche a evitare di conservare variabili temporanee. Un’altra cosa che mi sento di consigliarti è usare prefissi come suf@ per i comandi che non dovranno essere usati dall’utente (come per esempio \ivanleftmark, credo).
Comunque sarebbe bene sentire l’opinione di qualche luminare, sicuramente. Io sono solo uno interessato (molto) a queste cose e che si diletta ogni tanto: se vengo smentito imparo qualcosa. 🙂
Ciao,
A.L’idea di usare \left e \right non è proprio buonissima. 🙂
Nelle definizioni del tipo analizzato il valore dei condizionali è già stato stabilito, quindi
`\def\sufthepage{\ifsuftesi@sctitles\sufsc{\thepage}\else\thepage\fi}`
è sbagliato:
`
\ifsuftesi@sctitles
\def\sufthepage{\sufsc{\thepage}}
\else
\def\sufthepage{\thepage}
\fi`
Non \let, perché abbiamo bisogno della rappresentazione del numero di pagina valida al momento in cui si usa \sufthepage (e potrebbe essere in cifre romane, per esempio). Analogamente per \sufrightmark:
`\ifsuftesi@sctitles
\ifsuftesi@authortitle
\def\sufrightmark{\sufsc{\@title}}
\else
\def\sufrightmark{\sufsc{\rightmark}}
\fi
\else
\ifsuftesi@authortitle
\def\sufrightmark{\nouppercase{\@title}}
\else
\def\sufrightmark{\nouppercase{\rightmark}}
\fi
\fi`
Vero che il codice ha un po’ di duplicazioni, ma è molto più leggibile.Versione senza duplicazioni:
`\ifsuftesi@sctitles\def\@tempa{\noexpand\sufsc}\else\def\@tempa{\noexpand\nouppercase}\fi
\ifsuftesi@authortitle\def\@tempb{\noexpand\@title}\else\def\@tempb{\noexpand\rightmark}\fi
\begingroup\edef\x{\endgroup
\def\noexpand\sufrightmark{\@tempa{\@tempb}}}\x`
Nemmeno un \expandafter. 🙂Quanto al problema iniziale è certamente dovuto a listings, che gioca con i codici di categoria, ma poi non rimette le cose a posto al tempo giusto. In ogni caso ~ nella definizione è inutile, come già osservato.
Ciao
Enrico
-
5 Novembre 2011 alle 13:28 #65614::
Grazie Enrico, serviva un intervento come il tuo. 😉egreg9″ post=64725L’idea di usare \left e \right non è proprio buonissima. 🙂
Per evitare confusione coi comandi definiti (credo) da amsmath?
…
Non \let, perché abbiamo bisogno della rappresentazione del numero di pagina valida al momento in cui si usa \sufthepage (e potrebbe essere in cifre romane, per esempio).Oops! Verissimo!
…
Versione senza duplicazioni:
`\ifsuftesi@sctitles\def\@tempa{\noexpand\sufsc}\else\def\@tempa{\noexpand\nouppercase}\fi
\ifsuftesi@authortitle\def\@tempb{\noexpand\@title}\else\def\@tempb{\noexpand\rightmark}\fi
\begingroup\edef\x{\endgroup
\def\noexpand\sufrightmark{\@tempa{\@tempb}}}\x`
Nemmeno un \expandafter. 🙂Il gioco con \edef e \noexpand, giusto! Era un po’ più complicato 🙂
Me lo segno!Ciao,
Antonio
-
5 Novembre 2011 alle 21:58 #65615::
antonio.macrì” post=64742
Il gioco con \edef e \noexpand, giusto! Era un po’ più complicato 🙂
Me lo segno!Io passo… 🙂
L’approccio con i condizionali esterni effettivamente l’avevo preso in considerazione. Anzi avevo usato quel codice proprio nel tentativo di eliminare il conflitto con listings. Pensavo che fosse lì. Non avendolo risolto sono tornato indietro, con quel codice contorto che avevo scritto.
Il problema era proprio nel simbolo ~. Tra l’altro c’era anche un’altra occorrenza che avrebbe potuto dare dei problemi. Ora è tutto risolto.Il codice senza ripetizioni (e senza \expandafter!) alla fine non l’ho usato, forse per timore reverenziale…
Quando riuscirò a capire almeno un decimo di quello che c’è scritto lo userò.Grazie ancora ad Antonio ed Enrico
Ciao
Ivan
-
5 Novembre 2011 alle 22:14 #65616
-
5 Novembre 2011 alle 22:15 #65617
-
5 Novembre 2011 alle 23:29 #65618
-
-
AutoreRisposte
- Devi essere connesso per rispondere a questo topic.