Conversione sp in pt

  • Creatore
    Topic
  • #119206
    Up
    0
    Down
    ::


    Ciao a tutti!

    Il comando \number permette di ottenere il valore di una lunghezza espresso in sp (65536 sp = 1 pt).
    Per esempio:
    `\newcommand*{\getlength}[1]{\number#1}
    \getlength{\smallskipamount}
    `
    Restituisce un numero intero, che dipende dal font in uso, espresso in sp.
    Come trasformare il comando \getlength in modo che restituisca il relativo valore espresso in pt?
    Condizione: l’output non deve contenere l’unità di misura pt né le eventuali “colle”, ma il solo valore numerico.
    Questo
    `\newcommand*{\getlength}[1]{\the\numexpr(\number#1/65536)}
    `
    restituisce solo la parte intera del numero, e non va bene.
    Questo, invece, non funziona
    `\newcommand*{\getlength}[1]{\the\dimexpr \number#1 pt / 65536\relax}
    `

    Ovviamente è ben accetta anche una soluzione che non usa \number ma qualche altro comando di cui ignoro l’esistenza

    Grazie in anticipo ai guru!

    Ciao
    Ivan

Visualizzazione 6 filoni di risposte
  • Autore
    Risposte
    • #119207
      OldClaudio
      Partecipante
        Up
        0
        Down
        ::


        Intanto prova con \showthe\snallskiamount.

        dopo di che proababilmente vuoi togliere l’indicazione pt e allora suas il comando \strip@pt

        Dopo di che un comando del tipo`\makeatletter
        \newcommand\getlength[1]{\strip@pt\the#1}
        \makeatother` dovrebbe fare al caso tuo.

      • #119208
        Up
        0
        Down
        ::


        Grazie, Claudio! Tuttavia, questo non funziona:
        `\documentclass{article}
        \makeatletter
        \newcommand\getlength[1]{\strip@pt\the#1}
        \makeatother
        \begin{document}
        \getlength{\smallskipamount}
        \end{document}`

        Ciao
        Ivan

      • #119209
        OldClaudio
        Partecipante
          Up
          0
          Down
          ::


          Eh, la fretta. ci sono due errori: \strip@pt prvvede già da solo a sviluppare il registro che lo segue; ma se il registro è di tipo glue, come \smallskipampount, produce sia il valore naturale sia le componenti di allungamento e accorciamento; quaindi prima bisogna copiare l’argomento dela funzione in una registro di lunghezza rigida (solo TeX, Latex con newlength alloca un registro di tipo glue) poi si può aplicare \strip@pt al nome di questo registro lunghezza; per convenzione i primi registri non allocati con numero pari sono da usare come registri scatch, quindi non ha importanza che cosa contengano prima e che cosa vi resta dentro dopo. Cosi dice Knuth nel suo TeXbook.
          Questo funziona`\documentclass{article}
          \makeatletter
          \newcommand\getlength[1]{\dimen10=#1\strip@pt\dimen10}
          \makeatother
          \begin{document}
          \getlength{\smallskipamount}
          \end{document}`e con \skimamount che vale 3pt plus 0pt minus 1pt, il risultato è semplicemente 3.

        • #119210
          Up
          0
          Down
          ::


          O anche, più semplicemente (ed in modo alla fine equivalente),
          `
          \documentclass{article}
          \makeatletter
          \newcommand*\getlength[1]{\strip@pt\dimexpr #1\relax}
          \makeatother
          \begin{document}
          \getlength{\bigskipamount}
          \end{document}
          `
          lasciando a (e-)TeX il compito di allocare il registro temporaneo (perché, appunto, alla fine è così che viene implementato [tt]\dimexpr[/tt], come ho letto da qualche parte, al momento non ricordo dove). Tanto per cambiare, ho usato [tt]\bigskipamount[/tt], e il risultato è 12.

          CIao.


          Gustavo

        • #119211
          OldClaudio
          Partecipante
            Up
            0
            Down
            ::


            No, Gustavo, il codice di eTeX, da qualche anno parte integrante del nucleo di LaTeX, non alloca registri, ma esegue direttamente i calcoli nella CPU. e quando si usa \dimexpr e un argomento è di tipo skip, ne usa solo la dimensione naturale, scartando l’allungamento e l’accorciamento.
            Ivan infatti “dovrebbe” usare la tua soluzione, non la mia; io ho evitato \dimexpr (che ormai dovrebbe essere diventata di uso comune) perché alcuni non ne hanno ancora sufficiente dimestichezza. Sono sicuro che Ivan ne ha la necessaria dimestichezza, ma non i lettori in generale.
            Ma hai fatto benissimo a esporre anche questa soluzione.

          • #119212
            Up
            0
            Down
            ::


            Grazie a entrambi!

            Ciao
            Ivan

          • #119213
            Up
            0
            Down
            ::


            Andrei con [tt]expl3[/tt]. L’argomento facoltativo è il numero di cifre decimali a cui arrotondare.

            `
            \documentclass{article}
            %\usepackage{xparse} % togli il commento per LaTeX precedente a 2020-10-01

            \ExplSyntaxOn

            \NewExpandableDocumentCommand{\getlength}{O{5}m}
            {
            \fp_eval:n { round(#2,#1) }
            }

            \ExplSyntaxOff

            \begin{document}

            \getlength{65536sp}

            \getlength{1cm}

            \getlength[2]{1cm}

            \getlength{\smallskipamount}

            \getlength{\textwidth}

            \end{document}
            `

            [attachment=2575]Screenshot2020-12-14at16.43.26.png[/attachment]

            Ciao
            Enrico

            Attachments:
            You must be logged in to view attached files.
        Visualizzazione 6 filoni di risposte
        • Devi essere connesso per rispondere a questo topic.

        Go to top