upercase e lowercase

  • Creatore
    Topic
  • #44012
    OldClaudio
    Partecipante
      Up
      0
      Down
      ::


      Supponiamo di dover creare un nuovo comando \test che rivede un argomento solo e che poi usi questo argomento sia trasformandolo in tutto minuscolo sia in tutto maiuscolo, per esempio:
      `
      \newcommand\text[1]{\def\nome{\lowercase{#1}}\def\NOME{\uppercase{#1}}
      …}
      `

      Se si chiama la macro test con un argomento costituito da una stringa, funziona benissimo, se la si chiama con un argomento costituito da una macro che a sua volta contiene una stringa, non funziona.

      La cosa è spiegata nel TeXbook e per costruzione le cose vanno così.

      Qualcuno ha un’idea di come poter fare, tra \expandafter ed \edef o altro per ottenere il risultato?

      Grazie mille

    Visualizzazione 2 filoni di risposte
    • Autore
      Risposte
      • #44013
        Up
        0
        Down
        ::

        Supponiamo di dover creare un nuovo comando \test che rivede un argomento solo e che poi usi questo argomento sia trasformandolo in tutto minuscolo sia in tutto maiuscolo, per esempio:
        `
        \newcommand\text[1]{\def\nome{\lowercase{#1}}\def\NOME{\uppercase{#1}}
        …}
        `

        Se si chiama la macro test con un argomento costituito da una stringa, funziona benissimo, se la si chiama con un argomento costituito da una macro che a sua volta contiene una stringa, non funziona.

        La cosa è spiegata nel TeXbook e per costruzione le cose vanno così.

        Qualcuno ha un’idea di come poter fare, tra \expandafter ed \edef o altro per ottenere il risultato?

        `\newcommand{\text}[1]{%
        \edef\nome{#1}%
        \edef\NOME{#1}%
        \lowercase\expandafter{\expandafter\def\expandafter\nome\expandafter{\nome}}%
        \uppercase\expandafter{\expandafter\def\expandafter\NOME\expandafter{\NOME}}}`
        Per la prima definizione di \nome uso un \edef che elimina tutte le macro; con la seconda espando \nome prima che il tutto passi attraverso \lowercase. Analogamente per \NOME. Ovviamente il tutto ha notevoli limitazioni: non si possono usare, per esempio, comandi come \ss oppure \o né lettere accentate con il pacchetto inputenc.

        Se usi la codifica latin1, può funzionare, ma non per tutti i caratteri, scrivere
        `\edef\nome{\detokenize{#1}}`
        e analogamente per \NOME; ovviamente, l’espansione finale di \nome e \NOME consisterà di token di categoria 12. Temo che non funzioni proprio con utf8.

        Ciao
        Enrico

      • #44014
        OldClaudio
        Partecipante
          Up
          0
          Down
          ::


          Grazie Enrico; tra l’altro ho provato anche ad usare \MakeUppercase e \MakeLowercase, che dovrebbero essere in grado di convetire in maiuscolo/minuscolo anche i caratteri non ASCII e i caratteri speciali come \ss e \o, ma viene anche peggio; i tuoi \edef e \expandafter, invece, sembrano essere nella sequenza giusta; ora provo nella mia macro vera e vediamo se va.

          Ciao
          Claudio

        • #44015
          Up
          0
          Down
          ::

          Grazie Enrico; tra l’altro ho provato anche ad usare \MakeUppercase e \MakeLowercase, che dovrebbero essere in grado di convetire in maiuscolo/minuscolo anche i caratteri non ASCII e i caratteri speciali come \ss e \o, ma viene anche peggio; i tuoi \edef e \expandafter, invece, sembrano essere nella sequenza giusta; ora provo nella mia macro vera e vediamo se va.

          Purtroppo \MakeUppercase e \MakeLowercase usano assegnazioni e quindi non possono funzionare in un contesto nel quale serva l’espansione completa. D’altra parte, con latin1 si può avere una corrispondenza corretta che però non necessariamente si accorda con la codifica di output. 🙁 C’è però la scappatoia di \scantokens.

          Fammi sapere.

          Ciao
          Enrico

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

      Go to top