Re: suftesi+sctitles, listings e babel

#65613
Up
0
Down
::

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

Go to top