ivan” post=82845Ciao a tutti!
Marco Daniel, uno degli autori di mdframed, ha risolto il bug che avevo segnalato nel primo post.
Questo il codice (le parti commentate servono solo per testarlo):
`
\documentclass[style=italic3,11pt]{suftesi}\makeatletter
\def\patteernstring{style=italic3}%\let\@classoptionslistorig\XKV@classoptionslist
\let\@classoptionslisttemp\@empty
\@for\tempsearch:=\XKV@classoptionslist\do{%
\ifx\tempsearch\@empty\else
\@expandtwoargs\in@{,\tempsearch,}{,\patteernstring,}%
\ifin@\wlog{***remove option style***} \else
\wlog{***add option \tempsearch***}
\edef\@classoptionslisttemp{\@classoptionslisttemp,\tempsearch}
\fi
\fi}%
\let\XKV@classoptionslist\@classoptionslisttemp%\edef\printorig{\@classoptionslistorig}
%\edef\printmodified{\@classoptionslist}\makeatother
\usepackage{mdframed}
\begin{document}
\chapter{Titolo}
\begin{mdframed}
ciao
\end{mdframed}%\printorig
%\printmodified
\end{document}
`In pratica è sufficiente aggiungere, all’interno della rispettiva definizione nel file di classe, la stringa
`
\def\patteernstring{style=*}
`
sostituendo a * il valore dell’opzione. Poi si deve aggiunge anche il resto del codice e il gioco è fatto.
Qualcuno mi sa spiegare in dettaglio il codice qui sopra?
Una parte è documentato in source2e. Forse qualcosa si può eliminare?
Il codice semplicemente ricostruisce la lista delle opzioni globali [tt]\XKV@classoptionslist[/tt] facendo un ciclo sulla lista stessa e aggiungendo a una lista temporanea solo le opzioni che non sono quella da escludere. L’unica complicazione è che la procedura per confrontare due stringhe con le macro del nucleo di LaTeX è contorta e dura da digerire. Sarebbe più semplice se si dovesse eliminare una sola opzione.
Il problema maggiore è che devi ripetere la faccenda per ogni valore dell’opzione [tt]style[/tt] e mi pare che siano parecchie.
Questo si risolve con mezzi un po’ più potenti:
`\documentclass[style = italic3,11pt]{suftesi}
\usepackage{expl3}
\makeatletter
\ExplSyntaxOn
\seq_new:N \l__suftesi_nonglobaloptions_seq
\seq_new:N \l__suftesi_givenoptions_seq
\bool_new:N \l__suftesi_keepoption_bool
\clist_new:N \l__suftesi_globaloptions_clist
%%% Inserire, una per volta, le opzioni da escludere con '=' alla fine
\seq_put_right:Nn \l__suftesi_nonglobaloptions_seq { style= }
% \seq_put_right:Nn \l__suftesi_nonglobaloptions_seq {
%%% Routine per eliminare le opzioni da non passare ai pacchetti
\seq_set_from_clist:NN \l__suftesi_givenoptions_seq \XKV@classoptionslist
\seq_map_inline:Nn \l__suftesi_givenoptions_seq
{
\bool_set_true:N \l__suftesi_keepoption_bool
% eliminiamo gli spazi interni all'opzione
\tl_set:Nn \l__suftesi_option_tl { #1 }
\tl_remove_all:Nn \l__suftesi_option_tl { ~ }
\seq_map_inline:Nn \l__suftesi_nonglobaloptions_seq
{
\tl_if_in:NnT \l__suftesi_option_tl { ##1 }
{
\bool_set_false:N \l__suftesi_keepoption_bool
\seq_map_break:
}
}
% se il condizionale e' ancora vero, aggiungiamo l'opzione
\bool_if:NT \l__suftesi_keepoption_bool
{ \clist_put_right:Nn \l__suftesi_globaloptions_clist { #1 } }
}
\clist_set_eq:NN \XKV@classoptionslist \l__suftesi_globaloptions_clist
\ExplSyntaxOff
\makeatother
\usepackage{mdframed}
\begin{document}
\chapter{Titolo}
\begin{mdframed}
ciao
\end{mdframed}
%\printorig
%\printmodified
\end{document}`
Un po’ più breve, per la sola opzione [tt]style[/tt], ma facilmente ampliabile:
`\documentclass[style = italic3,11pt]{suftesi}
\usepackage{expl3,l3regex}
\makeatletter
\ExplSyntaxOn
\regex_replace_all:nnN { style \s* = [^,]*? , } { , } \XKV@classoptionslist
\ExplSyntaxOff
\makeatother
\usepackage{mdframed}
\begin{document}
\chapter{Titolo}
\begin{mdframed}
ciao
\end{mdframed}
%\printorig
%\printmodified
\end{document}`
Ciao
Enrico