[LuaTeX] lo strano caso di \% carattere di escaping

  • Creatore
    Topic
  • #87654
    robitex
    Amministratore del forum
      Up
      0
      Down
      ::


      Ciao,
      sarà anche tardi ma non riesco a risolvere il seguente problema:
      Il codice seguente funzionava (compilando naturalmente con lualatex) ma adesso non più dopo aver aggiornato la distribuzione dalla 2011 alla 2013 (TeX Live):
      `\documentclass{article}

      \begin{document}

      \directlua{
      tex.sprint(string.format(“\%0.3f”, math.pi))
      }

      \end{document}`
      Ricevo l’errore:
      `! LuaTeX error [string “\directlua “]:1: invalid escape sequence near '\%'.
      l.7 }`
      Qualcuno mi sa spiegare perché non funziona più e come posso fare per rimediare?
      In ConTeXt si userebbe \letterpercent…

      Grazie mille.
      R.

    Visualizzazione 8 filoni di risposte
    • Autore
      Risposte
      • #87655
        Up
        0
        Down
        ::


        Sul perché, vedi la seconda parte di questa risposta: http://tex.stackexchange.com/a/94265/31416

      • #87656
        robitex
        Amministratore del forum
          Up
          0
          Down
          ::

          Elrond” post=87125Sul perché, vedi la seconda parte di questa risposta: http://tex.stackexchange.com/a/94265/31416

          Grazie Elrond.
          Grazie al tuo link che ieri sera mi era sfuggito, ho capito la questione:
          In effetti ho assistito a crash di Lua solo perché avevo inserito codici non previsti:
          vedi questo post per esempio.

          Dunque Lua 5.2 ha irrobustito il parser delle stringhe.
          Ho risolto sbirciando nel codice di LaTeX trovando un comando già pronto che è un alias di %:
          \@percentchar

          Ecco il codice:
          `\documentclass{article}

          \makeatletter
          \let\lualatexpercent\@percentchar
          \makeatother

          \begin{document}
          \directlua{
          tex.sprint(string.format(“\lualatexpercent 0.3f”, math.pi))
          }
          \end{document}`

          Grazie.
          R.

        • #87657
          Up
          0
          Down
          ::

          robitex” post=87126Dunque Lua 5.2 ha irrobustito il parser delle stringhe.

          Mi vien da dire «peccato per questo irrobustimento», ora il formato della stringa diventa un po’ meno leggibile

        • #87658
          robitex
          Amministratore del forum
            Up
            0
            Down
            ::

            Elrond” post=87127

            Dunque Lua 5.2 ha irrobustito il parser delle stringhe.

            Mi vien da dire «peccato per questo irrobustimento», ora il formato della stringa diventa un po’ meno leggibile

            Perché?
            La differenza rispetto alla 5.1 è che caratteri non supportati nel formato “printf” prima venivano ignorati mentre ora non vengono più accettati.
            Puoi spiegarti meglio?
            Grazie.
            R.

          • #87659
            robitex
            Amministratore del forum
              Up
              0
              Down
              ::


              Tornando al problema TeXnico, il comando “trucco” è definito nel kernel di LaTeX così:
              `\catcode`\%=12
              \def\@percentchar{%}
              \catcode`\%=14`

              Quello che mi incuriosisce è questo:
              Come fa a lavorare il comando \catcode sul token \% che mi pare al momento dell’esecuzione non è ancora stato definito?
              R.

            • #87660
              Up
              0
              Down
              ::

              robitex” post=87128Puoi spiegarti meglio?

              `tex.sprint(string.format(“\%0.3f”, math.pi))`
              mi sembra di più immediata comprensione rispetto a
              `tex.sprint(string.format(“\lualatexpercent 0.3f”, math.pi))`
              dato che in numerosi linguaggi di programmazione i formati di stampa si specificano con [tt]%[/tt]. Tutto qua 🙂

            • #87661
              robitex
              Amministratore del forum
                Up
                0
                Down
                ::

                Elrond” post=87131

                Puoi spiegarti meglio?

                `tex.sprint(string.format(“\%0.3f”, math.pi))`
                mi sembra di più immediata comprensione rispetto a
                `tex.sprint(string.format(“\lualatexpercent 0.3f”, math.pi))`
                dato che in numerosi linguaggi di programmazione i formati di stampa si specificano con [tt]%[/tt]. Tutto qua 🙂

                Ah, ok.
                Tieno conto che dovrebbe capitare abbastanza raramente di scrivere codice del genere: quando il gioco si fa duro il codice Lua dovrebbe essere scritto in file a parte, dove torna la sintassi standard.
                Nel mio caso, un documento LuaLaTeX si connette ad un database PostgreSQL eseguendo del codice all’interno del documento, ma sono abbastanza pigro da non volerlo spostare in un file a parte 🙂
                Grazie.
                R.

              • #87662
                OldClaudio
                Partecipante
                  Up
                  0
                  Down
                  ::

                  robitex” post=87129Tornando al problema TeXnico, il comando “trucco” è definito nel kernel di LaTeX così:
                  `\catcode`\%=12
                  \def\@percentchar{%}
                  \catcode`\%=14`

                  Quello che mi incuriosisce è questo:
                  Come fa a lavorare il comando \catcode sul token \% che mi pare al momento dell’esecuzione non è ancora stato definito?
                  R.

                  Roberto, \catcode non lavora sula token \% ma sul “token” `\%; per TeX a livello di Knuth, ma suppongo ancora conservato in tutti i suoi figli, compreso luatex, \catcode lavora su un numero che rappresente l’indirizzo di un carattere; nel caso specifico il carattere è %, ma `% vuol dire “indirizzo di %”; per vari motivi di definizioni di macro è meglio non usare nelle assegnazioni di un codice di categoria il carattere come tale, ma è meglio farlo precedere da un backslash; anche se la contorl sequence non è definita, `\% continua a voler dire “indirizzo di %”.

                  Mi sono trovato a dovere assegnare un codice di categoria al carattere corripondente a un parametro di una macro, ma in quel caso non ho potuto usare il backslash, ma ho dovuto scrivere `#1 per riferirmi all’indirizzo del carattere passato come primo argomento alla macro; se avessi scritto `\#1, avrebbe segnalato un errore, perché avrebbe preso l’indirizzo di # a cui avrebbe aggiunto in coda la cifra 1, in sostanza come se avesse moltiplicato epr 10 l’indirizzo di # e vi avesse aggiunto 1.

                  Il tutto è spiegato nel TeXbook.

                  Il codice di categoria 14 è quello del carattere di commento; quindi quel piccolo brano di codice dice: “cambia il codice di categoria del segno % per trattarlo come codice di un carattere analfabetico (lo stesso dei segni di inteprunzione e simili); definisci \@percentchar come un segno % di categoria “analfabetica”; riporta il codice di categoria di % al suo valore originale di carattere di commento. Senza questo trucchetto \@percentchar sarebbe praticamente l’equivalente di un carattere di commento.

                • #87663
                  robitex
                  Amministratore del forum
                    Up
                    0
                    Down
                    ::


                    Ok,
                    ho capito.
                    Grazie mille Claudio.

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

                Go to top