\obeyspaces e tabularx

  • Creatore
    Topic
  • #68903
    Up
    0
    Down
    ::


    Ho definito un comando \thinspaces che sostituisce ogni spazio normale con uno spazio sottile.

    `\documentclass[10pt,a4paper]{article}

    \usepackage[T1]{fontenc}
    \usepackage[utf8]{inputenc}
    \usepackage[italian]{babel}
    \usepackage{tabularx}

    \newcommand\thinspaces{%
    \obeyspaces\begingroup\lccode`~=` \lowercase{\endgroup\def~}%
    {\hskip.16667em}}

    \begin{document}
    {\thinspaces
    23 A6 FE 90 E3 D9 BB 30 69 CF 43 2C FD 4B CF 67 D7 3C 46 22 %
    9A 08 DB 05 1D 45 DC 07 F3 1E 4D 1F 4B 11 23 5B 42 91 14 95 %
    25 88 1F BD 60 E5 6F 84 44 70 7A 95 EC 30 E4 46 4F 37 87 F1 %
    B2 FA 45 04 6F 7C BE 97 25 C7 20 E7 F3 90 55 51 99 3A 72 35 %
    40 F2 E8 E3 36 3A 7D 58 61 9C 91 D6 AC 34 E7 E8 09 27 64 4F %
    2C 4C C2 D2 A3 32 DB 2B 7E F0 B6 F3 69 96 E4 2B C3 2B 42 ED %
    CA 2C 3C C8 F5 AA E6 71}

    \bigskip

    \begin{tabular}{l>\ttfamily p{7.5cm}}
    Public key algorithm: & sha1WithRSAEncryption \\
    &
    {\thinspaces
    23 A6 FE 90 E3 D9 BB 30 69 CF 43 2C FD 4B CF 67 D7 3C 46 22 %
    9A 08 DB 05 1D 45 DC 07 F3 1E 4D 1F 4B 11 23 5B 42 91 14 95 %
    25 88 1F BD 60 E5 6F 84 44 70 7A 95 EC 30 E4 46 4F 37 87 F1 %
    B2 FA 45 04 6F 7C BE 97 25 C7 20 E7 F3 90 55 51 99 3A 72 35 %
    40 F2 E8 E3 36 3A 7D 58 61 9C 91 D6 AC 34 E7 E8 09 27 64 4F %
    2C 4C C2 D2 A3 32 DB 2B 7E F0 B6 F3 69 96 E4 2B C3 2B 42 ED %
    CA 2C 3C C8 F5 AA E6 71}
    \end{tabular}

    \bigskip

    \begin{tabularx}{\textwidth}{l>\ttfamily X}
    Public key algorithm: & sha1WithRSAEncryption \\
    &
    {\thinspaces
    23 A6 FE 90 E3 D9 BB 30 69 CF 43 2C FD 4B CF 67 D7 3C 46 22 %
    9A 08 DB 05 1D 45 DC 07 F3 1E 4D 1F 4B 11 23 5B 42 91 14 95 %
    25 88 1F BD 60 E5 6F 84 44 70 7A 95 EC 30 E4 46 4F 37 87 F1 %
    B2 FA 45 04 6F 7C BE 97 25 C7 20 E7 F3 90 55 51 99 3A 72 35 %
    40 F2 E8 E3 36 3A 7D 58 61 9C 91 D6 AC 34 E7 E8 09 27 64 4F %
    2C 4C C2 D2 A3 32 DB 2B 7E F0 B6 F3 69 96 E4 2B C3 2B 42 ED %
    CA 2C 3C C8 F5 AA E6 71}
    \end{tabularx}

    \end{document}`

    Nel primo e nel secondo caso tutto funziona a modo, nel terzo no. Mi è sembrato di leggere che tabularx ridefinisca diversi codici di categoria e metta mano anche agli spazi. Non capisco perché lo faccia, né come posso ovviare.

    Esiste un modo per usare \thinspaces dentro tabularx? (La colonna X non c’entra: \thinspaces non fa il suo lavoro neanche usando p{7.5cm}.)

    Ciao e grazie,
    Antonio

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

      antonio.macrì” post=68030Ho definito un comando \thinspaces che sostituisce ogni spazio normale con uno spazio sottile.

      `\documentclass[10pt,a4paper]{article}

      \usepackage[T1]{fontenc}
      \usepackage[utf8]{inputenc}
      \usepackage[italian]{babel}
      \usepackage{tabularx}

      \newcommand\thinspaces{%
      \obeyspaces\begingroup\lccode`~=` \lowercase{\endgroup\def~}%
      {\hskip.16667em}}

      \begin{document}
      {\thinspaces
      23 A6 FE 90 E3 D9 BB 30 69 CF 43 2C FD 4B CF 67 D7 3C 46 22 %
      9A 08 DB 05 1D 45 DC 07 F3 1E 4D 1F 4B 11 23 5B 42 91 14 95 %
      25 88 1F BD 60 E5 6F 84 44 70 7A 95 EC 30 E4 46 4F 37 87 F1 %
      B2 FA 45 04 6F 7C BE 97 25 C7 20 E7 F3 90 55 51 99 3A 72 35 %
      40 F2 E8 E3 36 3A 7D 58 61 9C 91 D6 AC 34 E7 E8 09 27 64 4F %
      2C 4C C2 D2 A3 32 DB 2B 7E F0 B6 F3 69 96 E4 2B C3 2B 42 ED %
      CA 2C 3C C8 F5 AA E6 71}

      \bigskip

      \begin{tabular}{l>\ttfamily p{7.5cm}}
      Public key algorithm: & sha1WithRSAEncryption \\
      &
      {\thinspaces
      23 A6 FE 90 E3 D9 BB 30 69 CF 43 2C FD 4B CF 67 D7 3C 46 22 %
      9A 08 DB 05 1D 45 DC 07 F3 1E 4D 1F 4B 11 23 5B 42 91 14 95 %
      25 88 1F BD 60 E5 6F 84 44 70 7A 95 EC 30 E4 46 4F 37 87 F1 %
      B2 FA 45 04 6F 7C BE 97 25 C7 20 E7 F3 90 55 51 99 3A 72 35 %
      40 F2 E8 E3 36 3A 7D 58 61 9C 91 D6 AC 34 E7 E8 09 27 64 4F %
      2C 4C C2 D2 A3 32 DB 2B 7E F0 B6 F3 69 96 E4 2B C3 2B 42 ED %
      CA 2C 3C C8 F5 AA E6 71}
      \end{tabular}

      \bigskip

      \begin{tabularx}{\textwidth}{l>\ttfamily X}
      Public key algorithm: & sha1WithRSAEncryption \\
      &
      {\thinspaces
      23 A6 FE 90 E3 D9 BB 30 69 CF 43 2C FD 4B CF 67 D7 3C 46 22 %
      9A 08 DB 05 1D 45 DC 07 F3 1E 4D 1F 4B 11 23 5B 42 91 14 95 %
      25 88 1F BD 60 E5 6F 84 44 70 7A 95 EC 30 E4 46 4F 37 87 F1 %
      B2 FA 45 04 6F 7C BE 97 25 C7 20 E7 F3 90 55 51 99 3A 72 35 %
      40 F2 E8 E3 36 3A 7D 58 61 9C 91 D6 AC 34 E7 E8 09 27 64 4F %
      2C 4C C2 D2 A3 32 DB 2B 7E F0 B6 F3 69 96 E4 2B C3 2B 42 ED %
      CA 2C 3C C8 F5 AA E6 71}
      \end{tabularx}

      \end{document}`

      Nel primo e nel secondo caso tutto funziona a modo, nel terzo no. Mi è sembrato di leggere che tabularx ridefinisca diversi codici di categoria e metta mano anche agli spazi. Non capisco perché lo faccia, né come posso ovviare.

      Esiste un modo per usare \thinspaces dentro tabularx? (La colonna X non c’entra: \thinspaces non fa il suo lavoro neanche usando p{7.5cm}.)

      Ciao e grazie,
      Antonio

      Il problema di tabularx è che legge il contenuto della tabella come se fosse un argomento e poi agisce su questo, quindi il cambio di codice di categoria non ha influenza: ormai gli spazi sono già dentro la memoria e non li puoi più cambiare. Ma c’è una soluzione “leggermente migliore”:
      `\newcommand{\thinspaces}{\spaceskip=0.16667em }`
      Ciao
      Enrico

    • #68905
      OldClaudio
      Partecipante
        Up
        0
        Down
        ::


        Comunque tabularx ricompone la tabella tre volte; questo implica che memorizzi tutto il contenuto dell’ambiente in una macro o in un registro token, e usi questo contenuto memorizzato epr calcolare la larghezza della tabella con due valori prefissati della colonna X; in base alla larghezze ottenute determina per estrapolazione lineare la larghezza giusta e la terza volta ottiene il risultato.

        È chiaro che l’oggetto mobile costituito dal contenuto della tabella viene ben sbatacchiato fra un comando e l’altro, per cui può darsi benissimo che l’impostazione \obeyspaces si rompa stra facendo e non sia più efficace come nei primi due casi dove la tabella viene composta more solito una volta sola.

        Però ho ridefinito localmente la tilde e funziona:
        `
        \documentclass[10pt,a4paper]{article}

        \usepackage[T1]{fontenc}
        \usepackage[utf8]{inputenc}
        \usepackage[italian]{babel}
        \usepackage{tabularx}

        \newcommand\thinspaces{%
        \obeyspaces
        \begingroup\lccode`\~=`\ \lowercase{\endgroup\def~}{\hskip.16667em}}

        \begin{document}
        {\thinspaces
        23 A6 FE 90 E3 D9 BB 30 69 CF 43 2C FD 4B CF 67 D7 3C 46 22 %
        9A 08 DB 05 1D 45 DC 07 F3 1E 4D 1F 4B 11 23 5B 42 91 14 95 %
        25 88 1F BD 60 E5 6F 84 44 70 7A 95 EC 30 E4 46 4F 37 87 F1 %
        B2 FA 45 04 6F 7C BE 97 25 C7 20 E7 F3 90 55 51 99 3A 72 35 %
        40 F2 E8 E3 36 3A 7D 58 61 9C 91 D6 AC 34 E7 E8 09 27 64 4F %
        2C 4C C2 D2 A3 32 DB 2B 7E F0 B6 F3 69 96 E4 2B C3 2B 42 ED %
        CA 2C 3C C8 F5 AA E6 71

        }

        \bigskip

        \begin{tabular}{l>\ttfamily p{7.5cm}}
        Public key algorithm: & sha1WithRSAEncryption \\
        &
        \thinspaces
        23 A6 FE 90 E3 D9 BB 30 69 CF 43 2C FD 4B CF 67 D7 3C 46 22 %
        9A 08 DB 05 1D 45 DC 07 F3 1E 4D 1F 4B 11 23 5B 42 91 14 95 %
        25 88 1F BD 60 E5 6F 84 44 70 7A 95 EC 30 E4 46 4F 37 87 F1 %
        B2 FA 45 04 6F 7C BE 97 25 C7 20 E7 F3 90 55 51 99 3A 72 35 %
        40 F2 E8 E3 36 3A 7D 58 61 9C 91 D6 AC 34 E7 E8 09 27 64 4F %
        2C 4C C2 D2 A3 32 DB 2B 7E F0 B6 F3 69 96 E4 2B C3 2B 42 ED %
        CA 2C 3C C8 F5 AA E6 71
        \end{tabular}

        \bigskip

        \begin{tabularx}{\textwidth}{l>\ttfamily X}
        Public key algorithm: & sha1WithRSAEncryption \\
        &
        \def~{\hskip.16667em}%
        23~A6~FE~90~E3~D9~BB~30~69~CF~43~2C~FD~4B~CF~67~D7~3C~46~22~%
        9A~08~DB~05~1D~45~DC~07~F3~1E~4D~1F~4B~11~23~5B~42~91~14~95~%
        25~88~1F~BD~60~E5~6F~84~44~70~7A~95~EC~30~E4~46~4F~37~87~F1~%
        B2~FA~45~04~6F~7C~BE~97~25~C7~20~E7~F3~90~55~51~99~3A~72~35~%
        40~F2~E8~E3~36~3A~7D~58~61~9C~91~D6~AC~34~E7~E8~09~27~64~4F~%
        2C~4C~C2~D2~A3~32~DB~2B~7E~F0~B6~F3~69~96~E4~2B~C3~2B~42~ED~%
        CA~2C~3C~C8~F5~AA~E6~71
        \end{tabularx}

        \end{document}
        `

        la definizione con \def resta locale; dentro ad una cella di una tabella qualunque comando o qualunque definizione si esaurisce dentro la cella (la cella funziona in certo senso da gruppo); definendo la tiled ecome uno spazio da 1/6em direttamente dentro alla cella e sostituendo tutti gli spazi con una tilde con un “Replace all” esteso all’intera selezione (il contenuto della cella, cioè la sequenza di byte esadecimali che hai scritto, cosa che richiede una frazione di secondo) ho ottenuto il nuovo contenuto dell’ambiente tabularx e come puoi constatare funziona perfettamente.

        Perché non funziona con una definizione esterna alla cella? non lo so, e i tentativi di tracing che ho fatto non me l’hanno spiegato;
        ho il sospetto che ci siano degli inconvenienti fra il codice attivo dello spazio e il codice lc della tilde quando il comando \thinspaces è sviluppato dentro l’argomento del corpo della tabella espandibile. Con \def si ha una definizione fresca ognuna delle tre volte che si ricompila la tabella.

      • #68906
        Up
        0
        Down
        ::

        OldClaudio” post=68033Comunque tabularx ricompone la tabella tre volte; questo implica che memorizzi tutto il contenuto dell’ambiente in una macro o in un registro token, e usi questo contenuto memorizzato epr calcolare la larghezza della tabella con due valori prefissati della colonna X; in base alla larghezze ottenute determina per estrapolazione lineare la larghezza giusta e la terza volta ottiene il risultato.

        È chiaro che l’oggetto mobile costituito dal contenuto della tabella viene ben sbatacchiato fra un comando e l’altro, per cui può darsi benissimo che l’impostazione \obeyspaces si rompa stra facendo e non sia più efficace come nei primi due casi dove la tabella viene composta more solito una volta sola.

        Ho provato a definire \thinspaces con \DeclareRobustCoomand, ma non basta; forse bisogna mettere qualche \protect dentro la definizione; ma mi si è fatto tardi, quindi ti butto lì solo l’idea.

        Il problema è il solito: con \begin{tabularx}{}{}\end{tabularx} LaTeX esegue, essenzialmente,
        `\toks@={
        }`
        senza espandere nulla. Una volta che questo è accaduto, ciò che è in \toks@ è già stato “tokenizzato” e quindi una dichiarazione \obeyspaces in
        non ha alcun effetto sui token già in memoria.

        Ciao
        Enrico

      • #68907
        Up
        0
        Down
        ::


        Grazie delle vostre spiegazioni e soluzioni! In particolare \spaceskip è utilissimo. 🙂

        [OT]
        Claudio, ne approfitto per farti i complimenti e i miei ringraziamenti per la tua ultima creatura. Fantastico, appena posso lo divoro! 😉
        [/OT]

        Un saluto,
        Antonio

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

    Go to top