LaTeX3: iterare su una lista di variabili separate da virgola

  • Questo topic ha 5 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 5 anni, 7 mesi fa da ivan.
  • Creatore
    Topic
  • #119500
    Up
    0
    Down
    ::


    Il codice qui sotto è un estratto, leggermente modificato, di quello presente in fontsize.
    Si tratta di definire un comando che produca un esempio di testo per ogni grandezza: \large,\small,\normalsize, ecc. Il comando in questione ha il terzo argomento opzionale, che contiene una lista di grandezze. Se l’argomento è vuoto allora il comando stampa un esempio per ogni grandezza; altrimenti stampa un esempio solo per le grandezze nella lista.

    Ora la soluzione che ho adottato, e che funziona correttamnte, è ibrida: in parte usa le funzionalità di etoolbox e in parte usa codice LaTeX3.

    Come si fa a ottenere lo stesso risultato ma usando solo LaTeX3?

    `
    \documentclass{article}
    \usepackage[fontsize=11]{fontsize}

    \makeatletter
    \chardef\fsbslash=`\\
    % Thanks to @Werner (https://tex.stackexchange.com/a/87423/231952)
    \newcommand{\mysizesamples}[1]{%
    \def\nextitem{\par}% Separator
    \renewcommand*{\do}[1]{\nextitem\bgroup\csname##1\endcsname
    \noindent{\csname ##1\endcsname \texttt{\fsbslash ##1}:
    \getlength[2]{\f@size}\,pt on \getlength[2]{\the\baselineskip}\,pt.}
    Lorem ipsum dolor sit manet\par\egroup
    }% How to process each item
    \docsvlist{#1}% Process list
    }
    \makeatother

    \NewDocumentCommand \myprintsamples { m m O{
    tiny,scriptsize,footnotesize,small,
    normalsize,large,Large,LARGE,huge,Huge} }
    {
    \changefontsize[#1]{#2}
    \subsubsection*{Text samples for #2 on #1}
    \sizesamples{#3}
    }

    \begin{document}

    \section{Stampa solo le due dimensioni nel terzo argomento}

    \verb!\myprintsamples{13pt}{11pt}[small,footnotesize]!

    \myprintsamples{13pt}{11pt}[small,footnotesize]

    \section{Stampa tutte le dimensioni}

    \verb!\myprintsamples{13pt}{11pt}!

    \myprintsamples{13pt}{11pt}

    \end{document}

    `

    Ciao
    Ivan

Visualizzazione 4 filoni di risposte
  • Autore
    Risposte
    • #119501
      Up
      0
      Down
      ::


      La funzione da adoperare è [tt]\clist_map_inline:nn[/tt].

      `
      \RequirePackage{fix-cm}% scalable CM fonts
      \documentclass{article}
      \usepackage[fontsize=11]{fontsize}
      \usepackage{kantlipsum}

      \ExplSyntaxOn

      \NewDocumentCommand{\myprintsamples}
      {
      m
      m
      O{tiny,scriptsize,footnotesize,small,normalsize,large,Large,LARGE,huge,Huge}
      }
      {
      \ivan_printsamples:nnn { #1 } { #2 } { #3 }
      }

      % helper function to print the rounded sizes
      \cs_new:Nn \__ivan_round_f:n
      {
      \fp_eval:n { round(\use:c{f@#1},1) } pt
      }

      % the main function
      \cs_new_protected:Nn \ivan_printsamples:nnn
      {
      % group to bound the font changes
      \group_begin:
      % we want no indent
      \setlength{\parindent}{0pt}
      % set the size
      \changefontsize[#1]{#2}\selectfont
      % header
      \subsubsection*{Text~samples~for~#2~on~#1}
      % map through the desired sizes
      \clist_map_inline:nn { #3 }
      {
      \use:c{##1} % set the font size
      \texttt{\symbol{92}##1}:~ % print the font size command
      \__ivan_round_f:n {size}~ % print the size in points
      \__ivan_round_f:n {baselineskip}.~ % print the baseline skip in points
      \kant[1][1-4] % sample text
      \par\addvspace{\medskipamount} % finish up
      }
      % close the group
      \group_end:
      }
      \ExplSyntaxOff

      \begin{document}

      \section{Stampa solo le due dimensioni nel terzo argomento}

      \verb!\myprintsamples{13pt}{11pt}[small,footnotesize]!

      \myprintsamples{13pt}{11pt}[small,footnotesize]

      \section{Stampa tutte le dimensioni}

      \verb!\myprintsamples{13pt}{11pt}!

      \myprintsamples{13pt}{11pt}

      \end{document}

      `

      Ciao
      Enrico

    • #119502
      Up
      0
      Down
      ::


      Grazie mille! Funziona alla grande.
      Ora me la studio.

      Ciao
      Ivan

    • #119503
      Up
      0
      Down
      ::


      ` \setlength{\parindent}{0pt}`
      lì dove è ora non funziona. Spostandolo denntro \clist_map_inline:nn funziona, ma questo punto ho preferito \noindent:
      `\clist_map_inline:nn { #3 }
      {
      \use:c{##1} % set the font size
      \noindent\texttt{\symbol{92}##1}:~ % print the font size command
      \__ivan_round_f:n {size}~ % print the size in points
      \__ivan_round_f:n {baselineskip}.~ % print the baseline skip in points
      \kant[1][1-3] % sample text
      \par\addvspace{\medskipamount} % finish up
      }`

      Ciao
      Ivan

    • #119504
      Up
      0
      Down
      ::

      ivan” post=119980` \setlength{\parindent}{0pt}`
      lì dove è ora non funziona. Spostandolo denntro \clist_map_inline:nn funziona, ma questo punto ho preferito \noindent:

      Be’, la colpa è del pacchetto [tt]fontsize[/tt] che, per qualche misterioso motivo a me oscurissimo, esegue [tt]\setlength{\parindent}{\f@size pt}[/tt] quando si chiama [tt]\changefontsize[/tt]. Scelta davvero discutibile.

      Non è chiaro nemmeno perché modifichi [tt]\headheight[/tt].

      Ciao
      Enrico

    • #119505
      Up
      0
      Down
      ::

      egreg9″ post=119981

      ` \setlength{\parindent}{0pt}`
      lì dove è ora non funziona. Spostandolo denntro \clist_map_inline:nn funziona, ma questo punto ho preferito \noindent:

      Be’, la colpa è del pacchetto [tt]fontsize[/tt] che, per qualche misterioso motivo a me oscurissimo, esegue [tt]\setlength{\parindent}{\f@size pt}[/tt] quando si chiama [tt]\changefontsize[/tt]. Scelta davvero discutibile.

      Non è chiaro nemmeno perché modifichi [tt]\headheight[/tt].

      Ciao
      Enrico

      Ho deciso di modificare \parindent perché ho pensato che in questo modo, nel momento in cui si sceglie il font normale, il rientro della prima riga è impostato allo stesso valore. Quindi font normale 11pt, rientro 11pt; font normale 11.5pt, rientro 11.5pt. Invece il motivo per cui modifico \headheight è legato all’errore che compare con fancyhdr quando si cambia dimensione del font. Siccome l’altezza della testatina dipende dal corpo del font, mi sembrava corretto legarla a questo.

      C’è qualche rischio di cui non sono a conoscenza per evitare queste due definizioni? In effetti, il pacchetto scrextend, di cui fontsize è una specie di clone indipendente da Koma, non ridefinisce né \parindent né \headheight (e nemmeno i vari \…skipamount, che io ho ridefinito per “completezz”)

      Ciao
      Ivan

      EDIT
      Forse, nel caso, è meglio definire queste lunghezze usando \@tempdimb invece di \f@size

Visualizzazione 4 filoni di risposte
  • Devi essere connesso per rispondere a questo topic.

Go to top