Numerazione ordinale per i contatori

  • Questo topic ha 4 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 20 anni, 6 mesi fa da DMW.
  • Creatore
    Topic
  • #8242
    DMW
      Up
      0
      Down
      ::


      Salve a tutti,

      Come scritto in oggetto io vorrei usare un nuovo sistema di numerazione simile ai più noti \Roman \arabic…
      In un testo scritto palesemente in latex o visto che le parti sono “numerate” o ordinate nel seguente modo, se non mi sbaglio è il sistema numerale ordinale:

      Parte prima
      Capitolo 1
      ….
      Parte seconda
      Capitolo 7
      ….

      Io vi chiedo se è possibile definire una nuova numerazione in modo da poter scrivere:
      `%semplice esempio
      \renewcommand{\thepart}{\ordinalefs{part}}%ordinale femminile singolare
      \setcounter{part}{2}% parte seconda
      ..
      \part{titolo parte seconda}
      `

      senza dover fare una struttura iterativa tipo questa:

      `\usepackage{ifthen}
      \renewcommand{\thepart}{\ifthenelse{…=1}{prima}{\ifthenelse…}}`

      Ciao

      Andrea

    Visualizzazione 3 filoni di risposte
    • Autore
      Risposte
      • #8243
        Up
        0
        Down
        ::

        Come scritto in oggetto io vorrei usare un nuovo sistema di numerazione simile ai più noti \Roman \arabic…
        In un testo scritto palesemente in latex o visto che le parti sono “numerate” o ordinate nel seguente modo, se non mi sbaglio è il sistema numerale ordinale:

        Parte prima
        Capitolo 1
        ….
        Parte seconda
        Capitolo 7
        ….

        Io vi chiedo se è possibile definire una nuova numerazione in modo da poter scrivere:`%semplice esempio
        \renewcommand{\thepart}{\ordinalefs{part}}%ordinale femminile singolare
        \setcounter{part}{2}% parte seconda
        ..
        \part{titolo parte seconda}`senza dover fare una struttura iterativa tipo questa:`\usepackage{ifthen}
        \renewcommand{\thepart}{\ifthenelse{…=1}{prima}{\ifthenelse…}}`

        Imitando ciò che fa LaTeX per i simboli di nota (\fnsymbol)
        `\makeatletter
        \def\ordinalefs#1{\expandafter\@ordinalefs\csname c@#1\endcsname}
        \def\@ordinalefs#1{\ifcase#1\or prima\or seconda\or terza\or quarta\or
        quinta\or sesta\or settima\or ottava\or nona\else\@ctrerr\fi}
        \makeatother`Ora puoi dare comandi come`\renewcommand{\thepart}{\ordinalefs{part}}`Se vuoi andare oltre la nona parte 😀 basta allungare la lista nella definizione.

        Si può dare una definizione più in stile LaTeX, ma con questa impariamo un po’ di cose:
        (1) il valore del contatore “pippo” è disponibile come \c@pippo (oltre che come \value{pippo});
        (2) Quando LaTeX si trova davanti il comando \ordinalefs{part} sostituisce \@ordinalefs{\c@part}; la sequenza di controllo \c@part è costruita in modo indiretto, usando l’argomento di \ordinalefs;
        (3) \ifcase permette una scelta di casi fra più valori:`\ifcase\or\or…\or\else\fi`Il numero può essere passato come argomento di una macro (come nel nostro caso); LaTeX guarda questo numero e sostituisce il testo opportuno. Se il numero non ha un valore fra 0 e n, viene sostituito il testo dopo \else; nel nostro caso \@ctrerr che produce un messaggio di errore (Counter too large).

        Con \ifthenelse potresti ottenere un effetto di questo tipo, ma con molta più fatica.

        Ciao
        Enrico

      • #8244
        DMW
          Up
          0
          Down
          ::


          Perfetto!!
          A parte la spiegazione molto chiara, c’è un modo un po’ più comodo, come dici tu più in stile latex, per farlo? Un po’ più diretto?

        • #8245
          Up
          0
          Down
          ::

          Perfetto!!
          A parte la spiegazione molto chiara, c’è un modo un po’ più comodo, come dici tu più in stile latex, per farlo? Un po’ più diretto?

          `\makeatletter
          \newcommand{\ordinalefs}[1]{\ifcase\value{#1}\or prima\or seconda\or terza\or
          quarta\or quinta\or sesta\or settima\or ottava\or nona\else\@ctrerr\fi}
          \makeatother`In LaTeX non c’è un’interfaccia per \ifcase come per gli altri condizionali attraverso il pacchetto ifthen.

          Questo è più semplice, ma meno istruttivo e meno in stile “LaTeX interno”; vuoi mettere una bella definizione con due \def, un \expandafter e un \csname? 😀

          In realtà questa è più semplice, ma usa più risorse.

          Ciao
          Enrico

        • #8246
          DMW
            Up
            0
            Down
            ::

            Perfetto!!
            A parte la spiegazione molto chiara, c’è un modo un po’ più comodo, come dici tu più in stile latex, per farlo? Un po’ più diretto?

            `\makeatletter
            \newcommand{\ordinalefs}[1]{\ifcase\value{#1}\or prima\or seconda\or terza\or
            quarta\or quinta\or sesta\or settima\or ottava\or nona\else\@ctrerr\fi}
            \makeatother`In LaTeX non c’è un’interfaccia per \ifcase come per gli altri condizionali attraverso il pacchetto ifthen.

            Questo è più semplice, ma meno istruttivo e meno in stile “LaTeX interno”; vuoi mettere una bella definizione con due \def, un \expandafter e un \csname? 😀

            In realtà questa è più semplice, ma usa più risorse.

            Ciao
            Enrico

            Grazie di nuovo.

            Andrea

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

        Go to top