Rimuovere le parentesi dagli argomenti di un comando

  • Creatore
    Topic
  • #65554
    Up
    0
    Down
    ::


    Riporto il problema reale che sto affrontando: usare \getrefnumber quando vengono ridefiniti gli enumerate. Per esempio, in suftesi a un certo punto si fa:
    `\setenumerate[1]{font=\normalfont,leftmargin=0pt,label=\arabic*}`
    e questo comporta che nel file aux vengano salvate le label con parentesi graffe in più (che mi sembrano) del tutto inutili.

    Esempio completo:
    `
    \documentclass[11pt,a4paper]{suftesi}
    \usepackage{itnumpar,hyperref,lipsum}

    \def\ordrefm#1{\printordinalem{\getrefnumber{#1}}}

    \begin{document}
    \chapter{Numerato}
    \label{cap}

    Lista:
    \begin{enumerate}
    \item aaaa
    \item \label{item:due} bbb.
    \end{enumerate}

    Riferimento al capitolo: \ordrefm{cap}; riferimento alla lista: \ordrefm{item:due}.
    \end{document}`
    che genera nel file aux una riga con:
    `\newlabel{item:due}{{{{2}}}{1}{Numerato\relax }{Item.2}{}}`
    (evidenzio quel {{{2}}}).

    Ora, quando \printordinalem si vede quelle parentesi in più, si lamenta perché vuole un numero. Inoltre, se specifico come opzione di \setenumerate anche ref=\arabic*, compare un gruppo di parentesi in meno, ma il problema di fondo rimane.

    Come faccio a eliminare quelle parentesi extra?

    Grazie,
    Antonio

Visualizzazione 7 filoni di risposte
  • Autore
    Risposte
    • #65555
      Up
      0
      Down
      ::

      antonio.macrì” post=64633Riporto il problema reale che sto affrontando: usare \getrefnumber quando vengono ridefiniti gli enumerate. Per esempio, in suftesi a un certo punto si fa:
      `\setenumerate[1]{font=\normalfont,leftmargin=0pt,label=\arabic*}`
      e questo comporta che nel file aux vengano salvate le label con parentesi graffe in più (che mi sembrano) del tutto inutili.

      Esempio completo:
      `
      \documentclass[11pt,a4paper]{suftesi}
      \usepackage{itnumpar,hyperref,lipsum}

      \def\ordrefm#1{\printordinalem{\getrefnumber{#1}}}

      \begin{document}
      \chapter{Numerato}
      \label{cap}

      Lista:
      \begin{enumerate}
      \item aaaa
      \item \label{item:due} bbb.
      \end{enumerate}

      Riferimento al capitolo: \ordrefm{cap}; riferimento alla lista: \ordrefm{item:due}.
      \end{document}`
      che genera nel file aux una riga con:
      `\newlabel{item:due}{{{{2}}}{1}{Numerato\relax }{Item.2}{}}`
      (evidenzio quel {{{2}}}).

      Ora, quando \printordinalem si vede quelle parentesi in più, si lamenta perché vuole un numero. Inoltre, se specifico come opzione di \setenumerate anche ref=\arabic*, compare un gruppo di parentesi in meno, ma il problema di fondo rimane.

      Come faccio a eliminare quelle parentesi extra?

      Grazie,
      Antonio

      È un evidente baco di enumitem.
      `\makeatletter
      \def\ordrefm#1{\begingroup\edef\x{\getrefnumber{#1}}%
      \edef\x{\expandafter\@firstofone\x}%
      \edef\x{\endgroup\noexpand\printordinalem{\x}}\x}
      \makeatother`
      Ciao
      Enrico

    • #65556
      Up
      0
      Down
      ::


      In realtà ho dovuto duplicare la riga con \@firstofone:
      `\makeatletter
      \def\ordrefm#1{\begingroup\edef\x{\getrefnumber{#1}}%
      \edef\x{\expandafter\@firstofone\x}%
      \edef\x{\expandafter\@firstofone\x}%
      \edef\x{\endgroup\noexpand\printordinalem{\x}}\x}
      \makeatother`

      Così va, grazie!

    • #65557
      Up
      0
      Down
      ::

      antonio.macrì” post=64654In realtà ho dovuto duplicare la riga con \@firstofone:
      `\makeatletter
      \def\ordrefm#1{\begingroup\edef\x{\getrefnumber{#1}}%
      \edef\x{\expandafter\@firstofone\x}%
      \edef\x{\expandafter\@firstofone\x}%
      \edef\x{\endgroup\noexpand\printordinalem{\x}}\x}
      \makeatother`

      Così va, grazie!

      A me va anche con uno solo. Se chiedo \show\x dopo la prima \edef ottengo {2} e dopo la seconda 2. In effetti la coppia di graffe da rimuovere è una sola. Ma in effetti vedo che nel tuo .aux sono due coppie. Boh. Versioni diverse di enumitem? La mia è 3.3.

      Ciao
      Enrico

    • #65558
      Up
      0
      Down
      ::


      A me ne servono due 😕

      Comunque, è l’approccio giusto mettere tanti \@firstofone a seconda di qual è il massimo numero di parentesi che si prevede di dover rimuovere?
      Voglio che quel codice funzioni anche con 0 (classe book standard), una (\setenumerate con label e ref) e due (\setenumerate con label) coppie di parentesi spurie.

      Grazie,
      A.

    • #65559
      Up
      0
      Down
      ::

      antonio.macrì” post=64657A me ne servono due 😕

      Comunque, è l’approccio giusto mettere tanti \@firstofone a seconda di qual è il massimo numero di parentesi che si prevede di dover rimuovere?
      Voglio che quel codice funzioni anche con 0 (classe book standard), una (\setenumerate con label e ref) e due (\setenumerate con label) coppie di parentesi spurie.

      Come avrai visto, funziona anche con il primo riferimento che nel file .aux compare come
      `\newlabel{cap}{{1}{1}{Numerato\relax }{chapter.1}{}}`
      cioè senza graffe in più.

      La definizione di \@firstofone è semplice:
      `\long\def\@firstofone#1{#1}`
      Perciò, se \x vale {2} (con le graffe in più), avremo successivamente
      `\expandafter\@firstofone\x
      \@firstofone{2}
      2`
      Se invece \x si espande a 1 (senza graffe), avremo
      `\expandafter\@firstofone\x
      \@firstofone 1
      1`
      Ma se anche \x si espandesse a 123, avremmo
      `\expandafter\@firstofone\x
      \@firstofone 123
      123`
      perché l’argomento di \@firstofone è 1.

      Certo, ci sarebbe un problema se \x si espandesse a niente, ma \getrefnumber restituisce 0 se il riferimento non è ancora definito.

      Ciao
      Enrico

    • #65560
      Up
      0
      Down
      ::

      egreg9″ post=64655

      In realtà ho dovuto duplicare la riga con \@firstofone:
      `\makeatletter
      \def\ordrefm#1{\begingroup\edef\x{\getrefnumber{#1}}%
      \edef\x{\expandafter\@firstofone\x}%
      \edef\x{\expandafter\@firstofone\x}%
      \edef\x{\endgroup\noexpand\printordinalem{\x}}\x}
      \makeatother`

      Così va, grazie!

      A me va anche con uno solo. Se chiedo \show\x dopo la prima \edef ottengo {2} e dopo la seconda 2. In effetti la coppia di graffe da rimuovere è una sola. Ma in effetti vedo che nel tuo .aux sono due coppie. Boh. Versioni diverse di enumitem? La mia è 3.3.

      Ciao
      Enrico

      La mia è 3.5.2, la stessa che c’è su CTAN. (Al momento sono su Windows con MiKTeX.)

      egreg9″ post=64658

      A me ne servono due 😕

      Comunque, è l’approccio giusto mettere tanti \@firstofone a seconda di qual è il massimo numero di parentesi che si prevede di dover rimuovere?
      Voglio che quel codice funzioni anche con 0 (classe book standard), una (\setenumerate con label e ref) e due (\setenumerate con label) coppie di parentesi spurie.

      Come avrai visto, funziona anche con il primo riferimento che nel file .aux compare come
      `\newlabel{cap}{{1}{1}{Numerato\relax }{chapter.1}{}}`
      cioè senza graffe in più.

      Ciao
      Enrico

      Sìsì, la mia idea era infatti di metterne due, per farla funzionare con 0, 1 e 2 coppie di parentesi in più. Fisso un massimo di due e sto sulla difensiva (sperando che nelle prossime versioni di enumitem non aumentino ancora di più…:)).

      Ciao e grazie ancora,
      A.

    • #65561
      Up
      0
      Down
      ::

      antonio.macrì” post=64660La mia è 3.5.2, la stessa che c’è su CTAN. (Al momento sono su Windows con MiKTeX.)

      Mi ero dimenticato che tempo fa avevo scaricato la 3.3 nell’albero locale prima che andasse su TeX Live. Ho rimesso a posto e infatti viene una coppia di graffe in più.

      Succede questo. Se carichi enumitem ma non fai nulla di particolare, viene registrato 2; se usi l’argomento opzionale a enumerate, viene registrato {2}; se usi \setenumerate per impostare globalmente le liste, viene registrato {{2}}.

      Se usi il codice
      `\makeatletter
      \def\enit@reflabel#1#2{%
      \ifnum\enit@depth=\@ne\else % no level 0
      \advance\enit@depth\@ne
      \@namedef{p@\@enumctr}{}% Don't accumulate labels
      \advance\enit@depth\m@ne
      \fi
      \ifcase#2%
      \@namedef{the\@enumctr}{#1}%
      \else
      \enit@normlabel{\csname the\@enumctr\endcsname}{#1}%
      \fi}
      \def\enit@normlabel#1#2{%
      \begingroup
      \def\value{\enit@refstar@i\value}%
      \let\enit@elt\enit@refstar
      \enit@labellist
      \protected@xdef\enit@a{#2}
      \endgroup
      \expandafter\let#1\enit@a}
      \makeatother`
      le graffe in più non appaiono. Sinceramente non so perché Bezos le abbia aggiunte.

      Ciao
      Enrico

    • #65562
      Up
      0
      Down
      ::

      egreg9″ post=64662
      Se usi il codice
      `\makeatletter
      \def\enit@reflabel#1#2{%
      \ifnum\enit@depth=\@ne\else % no level 0
      \advance\enit@depth\@ne
      \@namedef{p@\@enumctr}{}% Don't accumulate labels
      \advance\enit@depth\m@ne
      \fi
      \ifcase#2%
      \@namedef{the\@enumctr}{#1}%
      \else
      \enit@normlabel{\csname the\@enumctr\endcsname}{#1}%
      \fi}
      \def\enit@normlabel#1#2{%
      \begingroup
      \def\value{\enit@refstar@i\value}%
      \let\enit@elt\enit@refstar
      \enit@labellist
      \protected@xdef\enit@a{#2}
      \endgroup
      \expandafter\let#1\enit@a}
      \makeatother`
      le graffe in più non appaiono. Sinceramente non so perché Bezos le abbia aggiunte.

      Ciao
      Enrico

      Ci mette pure un commento in uno dei punti dove aggiunge parentesi:
      `
      \protected@xdef\enit@a{{#2}}% Added braces as \ref is in the global scope.`
      Ovviamente non ho la più pallida idea di che cosa intenda. 😕

      Grazie della tua assistenza. 🙂

      Ciao,
      A.

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

Go to top