Script TeXworks per creazione e formattazione di tabelle

  • Creatore
    Topic
  • #59640
    Up
    0
    Down
    ::


    Ciao a tutti

    Era da un po’ che avevo la curiosità di buttare giù qualche script per TeXworks così da rendermi conto di cosa si può e cosa non si può fare. Mi sono cimentato nello scriverne uno che faciliti l’inserimento e la formattazione di tabelle o matrici. (Anche qualcun altro qui nel forum diceva che gli sarebbe stato utile.)

    Questo è il link per scaricarlo: sono quattro file in tutto.

    Ne faccio una breve descrizione. Due sono le funzionalità che offre:

    1. la formattazione di una tabella (o matrice) già scritta;
    2. l’inserimento di una nuova tabella (o matrice).

    Per formattare rapidamente una tabella già scritta, basta selezionarne il codice e premere la combinazione Ctrl+K,Ctrl+F. Non bisogna però selezionare tutto l’ambiente ma solo il codice interno: per intenderci, va selezionato solo il contenuto di tabular, array, pmatrix e simili, escludendo \begin{}/\end{}. Nel caso di formattazione rapida, vengono riapplicate le ultime impostazioni di formattazione usate.

    Se invece viene avviato il wizard (Ctrl+K,Ctrl+T) per la creazione di una nuova tabella mentre è selezionato del testo nell’editor, allora il testo viene analizzato e usato per riempire la finestra di dialogo, consentendo di modificare i campi nelle celle e di modificare le opzioni per la formattazione.

    Se infine si vuole inserire una tabella da zero, allora basta semplicemente avviare il wizard (Ctrl+K,Ctrl+T) senza selezione. Compaiono in sequenza due finestre di dialogo, la prima che chiede il numero di righe e colonne:

    mentre nella seconda si inserisce effettivamente il testo delle celle e si modificano le opzioni di formattazione:

    Nel caso dell’immagine precedente, il codice generato è:
    `\begin{tabular}{ccc}
    prima cella & seconda cella & questa è la
    terza cella \\
    inizio
    seconda
    riga & se una cella
    contiene un
    testo molto
    lungo ed è
    attivo il
    limite
    massimo di
    larghezza per
    le celle,
    allora le
    parole
    vengono
    suddivise in
    più righe & qui
    riprende la
    terza cella \\
    poi si
    continua
    qui sotto & \dots & \dots e si
    finisce
    qui!
    \end{tabular}`

    Se a questo punto aggiungo:
    `prima cella & seconda cella & questa è la
    terza cella \\
    inizio
    seconda
    riga & se una cella
    contiene un
    testo molto
    lungo (o-una-parola-lunghissima) ed è
    attivo il
    limite
    massimo di
    larghezza per
    le celle,
    allora le
    parole
    vengono
    suddivise in
    più righe & qui
    riprende la
    terza cella \\
    poi si
    continua
    qui sotto & \dots & \dots e si
    finisce
    qui! `
    e faccio Ctrl+K,Ctrl+F per la formattazione rapida, il tutto viene riformattato come:
    `prima cella & seconda cella & questa è la
    terza cella \\
    inizio
    seconda
    riga & se una cella contiene un
    testo molto lungo
    (o-una-parola-lunghissima)
    ed è attivo il limite
    massimo di larghezza per
    le celle, allora le parole
    vengono suddivise in più
    righe & qui
    riprende la
    terza cella \\
    poi si
    continua
    qui sotto & \dots & \dots e si
    finisce
    qui! `
    anche se c’è il limite di 15 caratteri (per forza di cose).

    Una nota. Vengono automaticamente salvate su file le ultime impostazioni di formattazione usate, ma perché ciò sia possibile è necessario che sia stata spuntata l’opzione “Allow scripts to write files” in Modifica/Preferenze/Scripts.

    Voglio fare un’ultima considerazione. Ho implementato tutta la logica in “javascript” (quel linguaggio non è proprio Javascript, ma per intenderci…) e ho scritto un altro file “.ui” per l’interfaccia grafica. TeXworks è validissimo per alcuni aspetti. È una gran cosa disporre di un linguaggio di scripting come Javascript, che ha una potenza espressiva eccezionale (per alcuni è in assoluto il linguaggio più sottovalutato). Poter creare anche un’interfaccia grafica e distribuirla come codice XML consente poi di arricchire ancora di più le possibilità. Il risultato potrebbe essere fenomenale, ma purtroppo l’interazione tra lo script e l’interfaccia utente è in alcuni aspetti un po’ lacunosa e impone di trovare soluzioni alternative non sempre validissime. Sarebbe meglio disporre di un’architettura a plugin flessibile, ma è ben più difficile da implementare. Sarebbe molto interessante metter mano anche lì, vediamo cosa ci promettono le prossime versioni…

    Spero che questi due script siano utili anche a qualcuno di voi. E ovviamente se c’è qualche baco, fatemelo sapere!

    Ciao,
    Antonio

Visualizzazione 37 filoni di risposte
  • Autore
    Risposte
    • #59641
      admin
      Amministratore del forum
        Up
        0
        Down
        ::


        Interessanti, davvero. TeXworks, dopo GNU Emacs, è l’altro mio editor preferito.

        Ad maiora!
        Orlando

        EDIT: Che linguaggio si usa per scrivere questi script? Dove poter reperire un breve tutorial?

      • #59642
        Up
        0
        Down
        ::

        Interessanti, davvero. TeXworks, dopo GNU Emacs, è l’altro mio editor preferito.

        Ad maiora!
        Orlando

        Grazie del’interesse, mi fa piacere che qualcuno li abbia apprezzati!

        EDIT: Che linguaggio si usa per scrivere questi script? Dove poter reperire un breve tutorial?

        Il codice è scritto in un linguaggio che sembra venga chiamato TwScript. A volte viene anche chiamato (un po’ impropriamente, secondo me) QtScript. È una implementazione dello standard ECMAScript, lo stesso che viene usato nei vari browser col nome di Javascript. In parole povere, lo standard ECMAScript definisce le caratteristiche di base del linguaggio, come i tipi di dato, gli operatori, la sintassi in generale. Ciascuna implementazione aggiunge degli oggetti specifici. Così ci sono le implementazioni fornite dai browser che espongono degli oggetti (window, document, location, eccetera) per lavorare con le pagine web. Quella di TeXworks invece fornisce l’oggetto TW, tramite il quale si accede ad alcune funzionalità di TeXworks stesso: al documento corrente, alla selezione, e così via.

        Il motore che esegue lo script (perché riconosce il linguaggio ECMAScript) è in realtà fornito dalle Qt: QtScript è propriamente il modulo Qt che si occupa di ciò. TeXworks gli dice solamente quali altri oggetti esporre (TW).

        A questa pagina trovi delle informazioni molto generali. Un buon punto di partenza è la guida TexWorksQtScripting, per vedere gli oggetti forniti da TeXworks e che dà anche alcuni consigli generali. Per conoscere più a fondo l’ECMAScript, basta una qualsiasi guida Javascript. Se vuoi creare anche delle interfacce grafiche, allora anziché scrivere direttamente l’XML ti conviene scaricare il Qt SDK e in particolare il Qt Creator, che serve proprio a disegnare le finestre di dialogo. Il resto è tutto smanettare e leggere il manuale (“Qt Reference Documentation”, visualizzabile dallo stesso Qt Creator). Come dicevo nell’altro post, purtroppo non tutti i metodi sono accessibili da script, ma solo gli “slots”, e ancora maggiori sono le limitazioni nella creazione di nuovi oggetti da script, ma si riesce comunque a fare cose interessanti.

        PS: ho fatto un paio di modifiche al codice, una sull’interfaccia (niente di importante), l’altra era una svista che faceva eseguire dei cicli inutili. Conviene che li riscarichi.

        Ciao,
        Antonio

      • #59643
        Up
        0
        Down
        ::


        Comunque non ti fare impressionare da tutti quei nomi!
        In fondo non è così complesso come può sembrare.
        Se conosci più o meno Javascript sei già praticamente a posto!

        Ciao,
        Antonio

        PS: ho fatto un altro paio di modifiche al codice.

      • #59644
        admin
        Amministratore del forum
          Up
          0
          Down
          ::

          Comunque non ti fare impressionare da tutti quei nomi!
          In fondo non è così complesso come può sembrare.
          Se conosci più o meno Javascript sei già praticamente a posto!

          Ciao,
          Antonio

          PS: ho fatto un altro paio di modifiche al codice.

          Grazie per le informazioni, ma la mia era una semplice curiosità anche perché di java non so praticamente nulla.

          Ciao
          Orlando

        • #59645
          Up
          0
          Down
          ::


          Scripts interessanti, tuttavia non sono riuscito a capire come attivarli. Ho creato una cartella Table nella cartella scripts in .Texworks ma non compaiono nel menù scripts anche dopo aver lanciato il comando “ricarica lista scripts”. Sicuramente mi sono scordato un passaggio (o più forse). SO: ubuntu 11.04

        • #59646
          Up
          0
          Down
          ::

          Grazie per le informazioni, ma la mia era una semplice curiosità anche perché di java non so praticamente nulla.

          Ciao
          Orlando

          Java e Javascript sono per fortuna molto diversi tra loro…

          Scripts interessanti, tuttavia non sono riuscito a capire come attivarli. Ho creato una cartella Table nella cartella scripts in .Texworks ma non compaiono nel menù scripts anche dopo aver lanciato il comando “ricarica lista scripts”. Sicuramente mi sono scordato un passaggio (o più forse). SO: ubuntu 11.04

          Non ci sono molti passaggi da fare. Assicurati semplicemente che la cartella Script sia quella giusta: aprila andando dal menu Script/TeXworks scripting/Mostra cartella script. Metti tutti e quattro i file insieme nella stessa cartella o sottocartella. Se li metti nella sottocartella Table, allora non ti compaiono direttamente nel menu Script, ma in un sottomenu di nome appunto Table. Dovrebbero comparire due elementi: Creazione tabella/matrice e Formatta tabella/matrice.

          Perché funzionino correttamente devi avere almeno la versione 0.4 di TeXworks (ma in realtà dovrebbe caricarli comunque, salvo che poi darebbero errore).

          Fammi sapere se risolvi.

          Ciao,
          Antonio

        • #59647
          Up
          0
          Down
          ::


          Ho controllato la correttezza della cartella come hai suggerito e confermo che è quella giusta (dove sono presenti altri script che ho trovato installati di default) però non mi compaiono comunque. Boh…La versione è la 0.4.1r829 (presente attualmente sul repository texworks-stable per ubuntu/debian)

        • #59648
          Doc
          Partecipante
            Up
            0
            Down
            ::


            Debian Sid
            Texworks 0.5 r.1

            Gli script si installano e vengono riconosciuti, ma, se lanciati, si ottiene il seguente errore:
            `ReferenceError: Can't find variable: __FILE__`

            Ad ogni modo, grazie per il lavoro svolto,
            Domenico

          • #59649
            Up
            0
            Down
            ::


            Ho testato gli script sia su Windows 7 con le versioni 0.4.1 r.827 e 0.5 r.834 di TeXworks che su Ubuntu 11.04 con la 0.5 r.834.

            Debian Sid
            Texworks 0.5 r.1

            Gli script si installano e vengono riconosciuti, ma, se lanciati, si ottiene il seguente errore:
            `ReferenceError: Can't find variable: __FILE__`

            Ad ogni modo, grazie per il lavoro svolto,
            Domenico

            È un po’ anomalo come errore. Ho modificato gli script in modo che scompaia, ma mi vien da pensare che se davano quell’errore ne possano dare anche altri. Riscarica entrambi i file js e fammi sapere.

            Ho controllato la correttezza della cartella come hai suggerito e confermo che è quella giusta (dove sono presenti altri script che ho trovato installati di default) però non mi compaiono comunque. Boh…La versione è la 0.4.1r829 (presente attualmente sul repository texworks-stable per ubuntu/debian)

            Sinceramente non ho la più pallida idea del perché TeXworks non riesca a vederli. L’unico motivo razionale sarebbe un errore nell’intestazione degli script (le righe dei commenti iniziali). Prova a mandarmi l’intestazione di uno script che ti vede correttamente, è nella forma:
            `// TeXworksScript
            // Title: &Crea tabella/matrice…
            // Description: Apre una finestra di dialogo che agevola la creazione di tabelle o matrici.
            // Author: Antonio Macrì
            // Version: 0.9.2
            // Date: 2011-06-06
            // Script-Type: standalone
            // Context: TeXDocument
            // Shortcut: Ctrl+K, Ctrl+T`
            Ho anche cambiato la codifica di “tableFormatter.js”, mi sono reso conto che non era UTF-8: riscaricalo (anzi, riscarica pure “tableWizard.js”). Dimmi se con queste modifiche funzionano. A limite, appena ho tempo domani posso dare un’occhiata ai sorgenti TeXworks in cerca di altre possibili fonti d’errore.

            Tra l’altro ho notato un piccolo bug… l’ho corretto.

            Ciao e grazie delle segnalazioni.

          • #59650
            Doc
            Partecipante
              Up
              0
              Down
              ::


              Ora paiono funzionare, ma non ho capito come si fa ad inserire le tabelle in ambienti.
              Infatti, se metto la spunta alla corrispondente voce ed indico, ad esempio, “tabular”, non fa niente.

              Ciao,
              Domenico

              EDIT
              Testato su Debian Squeeze, con TW v. 0.4.1 r.829 (launchpad)
              Il wizard parte, ma non produce alcun esito.

            • #59651
              Up
              0
              Down
              ::

              Ora paiono funzionare, ma non ho capito come si fa ad inserire le tabelle in ambienti.
              Infatti, se metto la spunta alla corrispondente voce ed indico, ad esempio, “tabular”, non fa niente.

              Ciao,
              Domenico

              EDIT
              Testato su Debian Squeeze, con TW v. 0.4.1 r.829 (launchpad)
              Il wizard parte, ma non produce alcun esito.

              La formattazione invece funzionava, giusto? Credo di aver risolto (ieri sera avevo sonno…)

              Ciao

            • #59652
              Doc
              Partecipante
                Up
                0
                Down
                ::

                Ora paiono funzionare, ma non ho capito come si fa ad inserire le tabelle in ambienti.
                Infatti, se metto la spunta alla corrispondente voce ed indico, ad esempio, “tabular”, non fa niente.

                Ciao,
                Domenico

                EDIT
                Testato su Debian Squeeze, con TW v. 0.4.1 r.829 (launchpad)
                Il wizard parte, ma non produce alcun esito.

                La formattazione invece funzionava, giusto? Credo di aver risolto (ieri sera avevo sonno…)

                Ciao

                La formattazione?
                O non ho capito come funziona oppure…. non funziona! 😀

              • #59653
                Up
                0
                Down
                ::

                La formattazione?
                O non ho capito come funziona oppure…. non funziona! 😀

                Selezioni il codice di una tabella, ad esempio:
                `prima cella & seconda cella & questa è la terza cella \\
                inizio seconda riga & se una cella contiene un testo molto lungo ed è attivo il limite massimo di larghezza per le celle, allora le parole vengono suddivise in più righe & qui riprende la terza cella \\
                poi si continua qui sotto & \dots & \dots e si finisce qui!`
                poi vai al menu Script e Formatta tabella/matrice.

                Se non funziona è perché la formattazione riapplica in automatico le ultime impostazioni usate nel wizard, che magari non fanno nulla. Se vuoi anche solo formattare la tabella ma modificando le impostazioni, usa il wizard.

                Comunque dai qualche minuto di tempo a Dropbox che proprio adesso sta aggiornando i file…

                Ciao

              • #59654
                Doc
                Partecipante
                  Up
                  0
                  Down
                  ::


                  Mi dispiace farti impazzire, ma la situazione è peggiorata. 😀

                  Debian Squeeze Amd64
                  TexWorks Versione 0.4.1 r.829 (launchpad)

                  Errore (per creare una tabella):
                  `TypeError: Result of expression 'cells[j].trim' [undefined] is not a function`

                  P.S.: allora avevo capito come funziona l’altro script, quello per modificare una tabella, ma debbo confermare che non va, almeno sulle mie macchine.

                • #59655
                  Antonio Ledda
                  Partecipante
                    Up
                    0
                    Down
                    ::


                    Per quanto riguarda lo script “Crea tabella/matrice”, il Wizard viene eseguito apparentemente senza problemi. L’altro script “Formatta tabella/matrice” non sembra funzionare, ma non ricevo alcun messaggio di errore da segnalare. Per la prova — su XP — ho usato TeXworks 0.5 r.834 e la TeX Live 2011/pretest aggiornata a oggi.

                    Ciao
                    Antonio

                  • #59656
                    Up
                    0
                    Down
                    ::


                    Ora gli scripts vengono riconosciuti, tuttavia ho provato a creare una tabella da 0 ma mi viene riportato questo errore:

                    `Script”&Crea tabella/matrice…”:TypeError:Result of expression 'dialog' [null] is not an object`

                  • #59657
                    Up
                    0
                    Down
                    ::


                    Vi ringrazio per le segnalazioni. Mi dispiace ma purtroppo in questi giorni sono stato impegnato, domani cercherò di essere più presente sul forum.

                    Purtroppo non posso intervenire da qui, se non ho informazioni aggiuntive. Vi chiedo di essere così gentili da eseguire alcuni passaggi sulle vostre macchine, per diagnosticare meglio l’errore. Innanzitutto, abilitate il debugger andando in Modifica/Preferenze/Script e spuntando la voce “Abilita il debugger QtScript”. Quindi tornate su TeXworks e eseguite l’operazione che dava l’errore. Dovrebbe comparire la finestra del “Qt Script Debugger” (immagine). In basso a sinistra (dove dice “qsdb>”, come indicato dalla freccia rossa nell’immagine) dovreste inserire alcuni comandi, rispedendomi l’output. Per primi immettete, uno alla volta, i comandi:
                    `.backtrace
                    .info locals
                    .up`
                    Quindi digitate più volte la coppia di comandi:
                    `.info locals
                    .up`
                    (ma sempre immettendo i comandi uno alla volta) finché non dice “Already at top (outermost) frame”.

                    Inserite tutti questi comandi e mandatemi l’output, magari in privato, così evitiamo di insozzare il forum.

                    Grazie della collaborazione.

                    PS: consiglio in ogni caso di attivare tra le Preferenze anche “Permetti agli script di scrivere i file”.

                  • #59658
                    Doc
                    Partecipante
                      Up
                      0
                      Down
                      ::


                      Debian Squeeze AMD64
                      TexWorks Versione 0.4.1 r.829 (launchpad)

                      `qsdb> .backtrace
                      #0 BuildCellLines() at -1
                      #1 () at 305
                      #2 () at /home/domenico/.TeXworks/scripts/Tables/tableWizard.js:175`

                      `qsdb> .info locals
                      cellLines :
                      toReDo :
                      rows : 1
                      j : 0
                      returned : undefined
                      row : undefined
                      colWidths :
                      cols : 3
                      desired : 15
                      i : 0`

                      `qsdb> .up
                      #1 () at 305`

                      `qsdb> .info locals
                      cells : prova,prova,prova
                      environment : null
                      addTerminalEmptyCells : false
                      SplitText : function SplitText(text, desiredWidth) {
                      if (text.length > desiredWidth && desiredWidth != 0)
                      {
                      var lines = text.split(/\s+/);

                      // Prima di tutto prendo la lunghezza di ogni sottostringa e se è maggiore di desiredWidth
                      // allora quest'ultimo deve essere aggiornato con la lunghezza massima. Faccio questo
                      // all'inizio così il riaggiustamento della larghezza massima ha effetto anche sulle linee
                      // precedenti (anziché dal momento in cui lo riaggiusto in poi)
                      for (var i = 0; i < lines.length; i++) if (desiredWidth < lines[i].length) desiredWidth = lines[i].length; var maxUsedWidth = 0; var line = -1; var current = 0; while (current < lines.length) { line++; lines[line] = lines[current]; current++; while (current < lines.length && lines[line].length + lines[current].length < desiredWidth) { lines[line] += ' ' + lines[current]; current++; } maxUsedWidth = Math.max(maxUsedWidth, lines[line].length); } var result = lines.slice(0, line + 1); return { "Result": result, "MaxUsedWidth": maxUsedWidth }; } var result = new Array(); result[0] = text; return { "Result": result, "MaxUsedWidth": text.length }; } returned : undefined BuildLaTeXCode : function BuildLaTeXCode(cellLines, colWidths) { var terminator = "\n"; var result = ""; var rows = cellLines.length; for (var i = 0; i < rows; i++) { var columnStartPosition = 0; var buffer = ""; var cols = cellLines[i].length; for (var j = 0; j < cols; j++) { var cell = cellLines[i][j]; for (var k = 0; k < cell.length; k++) { if (k > 0) {
                      buffer += terminator + “”.padRight(columnStartPosition);
                      }
                      var t = insertPadding ? cell[k].padRight(colWidths[j]) : cell[k];
                      buffer += t;
                      if(cell[k].length > 0) {
                      result += buffer;
                      buffer = “”;
                      }
                      cell[k] = t;
                      }

                      columnStartPosition += cell[cell.length – 1].length;
                      if (j < cols - 1) { buffer += " & "; columnStartPosition += 3; } } if (addTerminalEmptyCells) { result += buffer; for (var j = cols; j < colWidths.length; j++) result += " & " + (insertPadding ? "".padRight(colWidths[j]) : ""); } if (i < rows - 1) result += " \\\\"; result += terminator; } if (environment) { var name = environment.trim(); var columns = RequiresColumnSpecifiers(name) ? "{" + "c".padRight(colWidths.length, "c") + "}" : ""; if (name.length > 0)
                      result = “\\begin{” + name + “}” + columns + terminator + result + “\\end{” + name + “}” + terminator;
                      }

                      return result;
                      }
                      maxColumnWidth : 15
                      insertPadding : true
                      BuildCellLines : function BuildCellLines() {
                      var toReDo = new Array(); // indica che per le righe da 0 a toReDo[j] della colonna j bisogna ricalcolare la larghezza
                      var colWidths = new Array(); // colWidths[j] contiene la larghezza massima della colonna j su tutte le righe
                      var cellLines = new Array(); // cellLines[j] è un array contenente le linee in cui è stato suddiviso il testo della cella (i,j)

                      var rows = cells.length;
                      for (var i = 0; i < rows; i++) { cellLines[i] = new Array(); var cols = cells[i].length; for (var j = 0; j < cols; j++) { var desired = typeof(colWidths[j]) == "undefined" || maxColumnWidth == 0 ? maxColumnWidth : Math.max(maxColumnWidth, colWidths[j]); var returned = SplitText(cells[i][j].trim(), desired); cellLines[i][j] = returned.Result; if (typeof(colWidths[j]) != "undefined") { if(returned.MaxUsedWidth > colWidths[j])
                      {
                      // È stata modificata la larghezza, quindi dovrà ricalcolare le sottostringhe per
                      // le celle precedenti. Da notare che può succedere che toReDo venga sovrascritto,
                      // ovviamente con un valore maggiore (indici più avanti) ma perché la larghezza
                      // è ulteriormente aumentata
                      toReDo[j] = i – 1;
                      }
                      else continue;
                      }
                      colWidths[j] = returned.MaxUsedWidth;
                      }
                      }

                      for (var j = 0; j < toReDo.length; j++) { var row = toReDo[j]; if(typeof(row) != "undefined") { while (row >= 0)
                      {
                      if (cells[row][j])
                      cellLines[row][j] = SplitText(cells[row][j].trim(), colWidths[j]).Result;
                      row–;
                      }
                      }
                      }

                      return { “CellLines”: cellLines, “ColumnWidths”: colWidths };
                      }
                      qsdb> .up
                      #2 () at /home/domenico/.TeXworks/scripts/Tables/tableWizard.js:175
                      qsdb> .info locals
                      Math : [object Math]
                      NaN : NaN
                      undefined : undefined
                      Infinity : Infinity
                      JSON : [object JSON]
                      Object : function Object() {
                      [native code]
                      }
                      Function : function Function() {
                      [native code]
                      }
                      Array : function Array() {
                      [native code]
                      }
                      Boolean : function Boolean() {
                      [native code]
                      }
                      String : function String() {
                      [native code]
                      }
                      Number : function Number() {
                      [native code]
                      }
                      Date : function Date() {
                      [native code]
                      }
                      RegExp : function RegExp() {
                      [native code]
                      }
                      Error : function Error() {
                      [native code]
                      }
                      EvalError : function EvalError() {
                      [native code]
                      }
                      RangeError : function RangeError() {
                      [native code]
                      }
                      ReferenceError : function ReferenceError() {
                      [native code]
                      }
                      SyntaxError : function SyntaxError() {
                      [native code]
                      }
                      TypeError : function TypeError() {
                      [native code]
                      }
                      URIError : function URIError() {
                      [native code]
                      }
                      eval : function eval() {
                      [native code]
                      }
                      parseInt : function parseInt() {
                      [native code]
                      }
                      parseFloat : function parseFloat() {
                      [native code]
                      }
                      isNaN : function isNaN() {
                      [native code]
                      }
                      isFinite : function isFinite() {
                      [native code]
                      }
                      escape : function escape() {
                      [native code]
                      }
                      unescape : function unescape() {
                      [native code]
                      }
                      decodeURI : function decodeURI() {
                      [native code]
                      }
                      decodeURIComponent : function decodeURIComponent() {
                      [native code]
                      }
                      encodeURI : function encodeURI() {
                      [native code]
                      }
                      encodeURIComponent : function encodeURIComponent() {
                      [native code]
                      }
                      print : function () {
                      [native code]
                      }
                      gc : function gc() {
                      [native code]
                      }
                      version : function version() {
                      [native code]
                      }
                      TW : TWScriptAPI(name = “”)
                      __FILE__ : undefined
                      __LINE__ : -1
                      CANNOT_OPEN_FILE : Errore: impossibile aprire il file
                      formatterScript : tableFormatter.js
                      wizardScript : tableWizard.js
                      file : // TeXworksScript
                      // Title: &Formatta tabella/matrice
                      // Description: Formatta il codice di una tabella o di una matrice.
                      // Author: Antonio Macrì
                      // Version: 0.9.3
                      // Date: 2011-06-07
                      // Script-Type: standalone
                      // Context: TeXDocument
                      // Shortcut: Ctrl+K, Ctrl+F

                      var formatterScript = “tableFormatter.js”;

                      /**
                      * Usato per sapere se un ambiente LaTeX richiede l'argomento con gli
                      * specificatori di colonna (ad esempio: {ccccc}).
                      */
                      function RequiresColumnSpecifiers(environment)
                      {
                      return environment == “array” || environment == “tabular”;
                      }

                      /**
                      * Aggiunge un carattere a destra di una stringa fino a raggiungere una data lunghezza.
                      *
                      * @param {number} width
                      * @param {string} c Il carattere da replicare in coda alla stringa.
                      */
                      String.prototype.padRight = function(width, c)
                      {
                      return (width > this.length) ? (this + (c == null ? ” ” : c)).padRight(width, c) : this;
                      }

                      function TableFormatter()
                      {
                      this.Settings = {
                      AddTerminalEmptyCells: false,
                      MaxColumnWidth: 15,
                      InsertPadding: true,
                      Environment: null
                      }
                      }

                      TableFormatter.prototype.LoadSettings = function()
                      {
                      var settings = TW.readFile(formatterScript.replace(“.js”, “-settings.json”));
                      if (settings.status != 0) {
                      // Qualcosa è andata storta: non faccio niente.
                      return;
                      }
                      // Evito di riscrivere tutto Settings, ma aggiorno leggendole dal file solo le
                      // proprietà già presenti. Così facendo, se nel file ne manca qualcuna, rimane
                      // quella impostata nel costruttore e se invece ce ne sono di vecchie evito di
                      // portarmele dietro in eterno.
                      var properties = JSON.parse(settings.result);
                      for (var p in properties)
                      if (typeof(this.Settings[p]) != “undefined”) this.Settings[p] = properties[p];
                      }

                      TableFormatter.prototype.SaveSettings = function()
                      {
                      var r = TW.writeFile(formatterScript.replace(“.js”, “-settings.json”), JSON.stringify(this.Settings));
                      if (r == 2) {
                      // L'utente dovrebbe mettere la spunta a “Allow scripts to write files”:
                      // non faccio niente e semplicemente non salvo le impostazioni.
                      }
                      }

                      /**
                      * Analizza il codice LaTeX di una tabella/matrice ricavandone le righe e le colonne.
                      *
                      * @param {string} text Il codice LaTeX da analizzare.
                      */
                      TableFormatter.prototype.ParseCode = function(text)
                      {
                      // Faccio una cosa molto semplice ma efficace (in prima approssimazione…)
                      // altrimenti il codice qui si complicherebbe di molto
                      var regex = /^(?:(?!\\\\).|\n)+(?:\\\\|(?=$))/;
                      var rows = new Array();
                      for (var i = 0; (matches = regex.exec(text)) != null; i++)
                      {
                      // Purtroppo non è supportato il costrutto di lookbehind nelle espressioni regolari
                      // Qt (altrimenti potrei fare .split(/(?<!\\)&/) per suddividere la riga in celle). // Mi tocca invece farlo a mano rows[i] = new Array(); var m = rows[i][0] = matches[0]; for (var pos = m.indexOf("&"); pos >= 0; pos = m.indexOf(“&”, pos))
                      {
                      if (pos == 0 || m[pos-1] != '\\')
                      {
                      rows[rows.length – 1] = m.substr(0, pos).replace(/\s+/g,” “).trim();
                      m = rows[rows.length] = m.substr(pos + 1);
                      pos = 0;
                      }
                      else pos++;
                      }
                      rows[rows.length – 1] = (m.substr(m.length-2) == “\\\\” ? m.substr(0, m.length-2) : m).replace(/\s+/g,” “).trim();

                      text = text.substring(matches[0].length);
                      }
                      this.Table = rows;
                      }

                      /**
                      * Genera il codice LaTeX di una tabella, aggiungendo opzionalmente degli spazi di
                      * riempimento e racchiudendo eventualmente il tutto in un ambiente.
                      *
                      * @param {object} [cells=this.Table] Una matrice bidimensionale di stringhe contenenti il
                      * testo della rispettiva cella. Righe differenti possono avere numero di colonne diverso.
                      * @param {number} [maxColumnWidth=this.Settings.MaxColumnWidth] La larghezza massima di
                      * una colonna del sorgente generato. Se vale zero, allora non viene usato alcun limite.
                      * @param {boolean} [addTerminalEmptyCells=this.Settings.AddTerminalEmptyCells] Specifica
                      * se tutte le righe generate devono avere lo stesso numero di colonne (si aggiungeranno,
                      * cioè, i delimitatori di colonna anche per le celle vuote finali).
                      * @param {boolean} [insertPadding=this.Settings.InsertPadding] Un booleano che specifica se
                      * inserire degli spazi di riempimento in modo da avere tutte le colonne del sorgente
                      * della stessa larghezza (i delimitatori di colonna '&' risulteranno così allineati).
                      * @param {string} [environment=this.Settings.Environment] Il nome dell'ambiente in cui
                      * inserire il codice.
                      */
                      TableFormatter.prototype.GenerateCode = function(cells, maxColumnWidth, addTerminalEmptyCells, insertPadding, environment)
                      {
                      cells = cells ? cells : this.Table;
                      maxColumnWidth = maxColumnWidth ? maxColumnWidth : this.Settings.MaxColumnWidth;
                      addTerminalEmptyCells = typeof(addTerminalEmptyCells) != “undefined” ? addTerminalEmptyCells : this.Settings.AddTerminalEmptyCells;
                      insertPadding = typeof(insertPadding) != “undefined” ? insertPadding : this.Settings.InsertPadding;
                      environment = environment ? environment : this.Settings.Environment;

                      /**
                      * Divide una stringa in sottostringhe aventi (se possibile) la lunghezza specificata.
                      * Può accadere che la lunghezza di qualche sottostringa debba essere necessariamente
                      * maggiore di desiredWidth: tale valore viene comunque restituito al chiamante.
                      *
                      * @param {string} text La stringa da suddividere.
                      * @param {number} desiredWidth La dimensione ideale di ciascuna sottostringa.
                      * @returns {object} Restituisce un oggetto contenente nella proprietà Result un
                      * vettore con l'insieme di sottostringhe ottenute e nella proprietà MaxUsedWidth la
                      * lunghezza massima tra tutte le sottostringhe restituite (che può essere anche
                      * maggiore o minore del valore passato in desiredWidth).
                      */
                      function SplitText(text, desiredWidth)
                      {
                      if (text.length > desiredWidth && desiredWidth != 0)
                      {
                      var lines = text.split(/\s+/);

                      // Prima di tutto prendo la lunghezza di ogni sottostringa e se è maggiore di desiredWidth
                      // allora quest'ultimo deve essere aggiornato con la lunghezza massima. Faccio questo
                      // all'inizio così il riaggiustamento della larghezza massima ha effetto anche sulle linee
                      // precedenti (anziché dal momento in cui lo riaggiusto in poi)
                      for (var i = 0; i < lines.length; i++) if (desiredWidth < lines[i].length) desiredWidth = lines[i].length; var maxUsedWidth = 0; var line = -1; var current = 0; while (current < lines.length) { line++; lines[line] = lines[current]; current++; while (current < lines.length && lines[line].length + lines[current].length < desiredWidth) { lines[line] += ' ' + lines[current]; current++; } maxUsedWidth = Math.max(maxUsedWidth, lines[line].length); } var result = lines.slice(0, line + 1); return { "Result": result, "MaxUsedWidth": maxUsedWidth }; } var result = new Array(); result[0] = text; return { "Result": result, "MaxUsedWidth": text.length }; } /** * Analizza le celle della tabella e genera una matrice bidimensionale contenente in * ogni elemento (i,j) un array con le linee in cui viene spezzato il testo del sorgente * relativo alla cella (i,j). */ function BuildCellLines() { var toReDo = new Array(); // indica che per le righe da 0 a toReDo[j] della colonna j bisogna ricalcolare la larghezza var colWidths = new Array(); // colWidths[j] contiene la larghezza massima della colonna j su tutte le righe var cellLines = new Array(); // cellLines[i][j] è un array contenente le linee in cui è stato suddiviso il testo della cella (i,j) var rows = cells.length; for (var i = 0; i < rows; i++) { cellLines[i] = new Array(); var cols = cells[i].length; for (var j = 0; j < cols; j++) { var desired = typeof(colWidths[j]) == "undefined" || maxColumnWidth == 0 ? maxColumnWidth : Math.max(maxColumnWidth, colWidths[j]); var returned = SplitText(cells[i][j].trim(), desired); cellLines[i][j] = returned.Result; if (typeof(colWidths[j]) != "undefined") { if(returned.MaxUsedWidth > colWidths[j])
                      {
                      // È stata modificata la larghezza, quindi dovrà ricalcolare le sottostringhe per
                      // le celle precedenti. Da notare che può succedere che toReDo venga sovrascritto,
                      // ovviamente con un valore maggiore (indici più avanti) ma perché la larghezza
                      // è ulteriormente aumentata
                      toReDo[j] = i – 1;
                      }
                      else continue;
                      }
                      colWidths[j] = returned.MaxUsedWidth;
                      }
                      }

                      for (var j = 0; j < toReDo.length; j++) { var row = toReDo[j]; if(typeof(row) != "undefined") { while (row >= 0)
                      {
                      if (cells[row][j])
                      cellLines[row][j] = SplitText(cells[row][j].trim(), colWidths[j]).Result;
                      row–;
                      }
                      }
                      }

                      return { “CellLines”: cellLines, “ColumnWidths”: colWidths };
                      }

                      /**
                      * Genera il codice LaTeX di una tabella, aggiungendo opzionalmente gli spazi di
                      * riempimento e racchiudendo eventualmente il tutto in un ambiente.
                      *
                      * @param {string[][][]} cellLines Una matrice bidimensionale contenente in ogni
                      * elemento (i,j) un array con le linee in cui è stato spezzato il testo del sorgente
                      * relativo alla cella (i,j).
                      * @param {number} colWidths La larghezza (in caratteri) di ciascuna colonna nel sorgente.
                      */
                      function BuildLaTeXCode(cellLines, colWidths)
                      {
                      var terminator = “\n”;
                      var result = “”;
                      var rows = cellLines.length;
                      for (var i = 0; i < rows; i++) { var columnStartPosition = 0; var buffer = ""; var cols = cellLines[i].length; for (var j = 0; j < cols; j++) { var cell = cellLines[i][j]; for (var k = 0; k < cell.length; k++) { if (k > 0) {
                      buffer += terminator + “”.padRight(columnStartPosition);
                      }
                      var t = insertPadding ? cell[k].padRight(colWidths[j]) : cell[k];
                      buffer += t;
                      if(cell[k].length > 0) {
                      result += buffer;
                      buffer = “”;
                      }
                      cell[k] = t;
                      }

                      columnStartPosition += cell[cell.length – 1].length;
                      if (j < cols - 1) { buffer += " & "; columnStartPosition += 3; } } if (addTerminalEmptyCells) { result += buffer; for (var j = cols; j < colWidths.length; j++) result += " & " + (insertPadding ? "".padRight(colWidths[j]) : ""); } if (i < rows - 1) result += " \\\\"; result += terminator; } if (environment) { var name = environment.trim(); var columns = RequiresColumnSpecifiers(name) ? "{" + "c".padRight(colWidths.length, "c") + "}" : ""; if (name.length > 0)
                      result = “\\begin{” + name + “}” + columns + terminator + result + “\\end{” + name + “}” + terminator;
                      }

                      return result;
                      }

                      var returned = BuildCellLines();
                      return BuildLaTeXCode(returned.CellLines, returned.ColumnWidths);
                      }

                      formatter : [object Object]
                      selection :
                      RequiresColumnSpecifiers : function RequiresColumnSpecifiers(environment) {
                      return environment == “array” || environment == “tabular”;
                      }
                      TableFormatter : function TableFormatter() {
                      this.Settings = {
                      AddTerminalEmptyCells: false,
                      MaxColumnWidth: 15,
                      InsertPadding: true,
                      Environment: null
                      }
                      }
                      qsdb> .up
                      Already at top (outermost) frame.`

                      P.S.: mi pare di ricordare che ieri su Sid, con TW v. 5, gli scripts andassero.. Riprovo dopo sull’altra macchina e ti fo sapere.

                    • #59659
                      Up
                      0
                      Down
                      ::

                      Debian Squeeze AMD64
                      TexWorks Versione 0.4.1 r.829 (launchpad)

                      `qsdb> .backtrace
                      #0 BuildCellLines() at -1
                      #1 () at 305
                      #2 () at /home/domenico/.TeXworks/scripts/Tables/tableWizard.js:175`

                      `qsdb> .info locals
                      cellLines :
                      toReDo :
                      rows : 1
                      j : 0
                      returned : undefined
                      row : undefined
                      colWidths :
                      cols : 3
                      desired : 15
                      i : 0`

                      `qsdb> .up
                      #1 () at 305`

                      `qsdb> .info locals
                      …`

                      P.S.: mi pare di ricordare che ieri su Sid, con TW v. 5, gli scripts andassero.. Riprovo dopo sull’altra macchina e ti fo sapere.

                      Negli output che hai riportato sembra sembra quasi tutto a posto, tranne una cosina che imputerei al debugger stesso o alle Qt (che versione delle Qt hai installata?). Non riesco a trovare alcuna correlazione tra l’output e l’errore:
                      `TypeError: Result of expression 'cells[j].trim' [undefined] is not a function`
                      Mi vien ancora di più da pensare che il problema sia nelle Qt: la funzione trim è parte di uno standard che è implementato dalle Qt 4.7, mentre non è definita nella versione 4.6 (che si rifà a uno standard precedente).

                      Ho fatto qualche test sul mio Ubuntu Natty Narwhal con esattamente la versione tua di TeXworks (0.4.1 r.829 lauchpad) e le Qt 4.7.2, e tutto funziona correttamente.

                      Edit: Se il problema è solo questo, è comunque facile risolvere, senza installare nulla: basta aggiungere all’inizio di tableFormatter.js (ovviamente dopo le righe di intestazione) il codice
                      `if(typeof(String.prototype.trim) == “undefined”)
                      {
                      String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, “”); };
                      }
                      `
                      (Ho aggiornato con queste righe anche il file su Dropbox.)

                      Ciao,
                      Antonio

                    • #59660
                      Doc
                      Partecipante
                        Up
                        0
                        Down
                        ::


                        Allora ci siamo: su Squeeze ci sono le QT 4.6!
                        Invece, su Sid proprio le 4.7, cosa che spiega perché lo script mi funzionava.

                        Ora ho provato i nuovi scripts su Sid (dopo, forse domani, però, li riprovo anche su Squeeze).
                        Quello per creare le tabelle, va, ma PARE che quello per formattarle NON funzioni. Si limita infatti a duplicare le impostazioni dell’ambiente, creando qualcosa di questo genere:
                        `\begin{tabular}{ccc}
                        \begin{tabular}{ccc}
                        prova & prova & prova \\
                        prova & prova & prova
                        \end{tabular}
                        \end{tabular}`
                        Non parte però alcun debug.

                        P.S.: spero di non stare abusando della tua pazienza!

                      • #59661
                        Up
                        0
                        Down
                        ::

                        Allora ci siamo: su Squeeze ci sono le QT 4.6!
                        Invece, su Sid proprio le 4.7, cosa che spiega perché lo script mi funzionava.

                        Ottimo!

                        Ora ho provato i nuovi scripts su Sid (dopo, forse domani, però, li riprovo anche su Squeeze).
                        Quello per creare le tabelle, va, ma PARE che quello per formattarle NON funzioni. Si limita infatti a duplicare le impostazioni dell’ambiente, creando qualcosa di questo genere:
                        `\begin{tabular}{ccc}
                        \begin{tabular}{ccc}
                        prova & prova & prova \\
                        prova & prova & prova
                        \end{tabular}
                        \end{tabular}`
                        Non parte però alcun debug.

                        È semplice: quella tabella è già formattata! Le celle sono tutte già incolonnate, non c’è alcun riempimento da inserire e non c’è bisogno di suddividere il testo delle celle in più righe. Quindi formattando il codice:
                        `prova & prova & prova \\
                        prova & prova & prova`
                        riottieni esattamente lo stesso codice. Con la differenza che hai attivata l’opzione di includerlo in un ambiente tabular: ma è già incluso in un ambiente tabular! Per questo viene duplicato l’ambiente.

                        Se vuoi la controprova, formatta quacosa come (lo so, ha poco senso):`prova
                        &
                        prova & prova \\
                        prova & prova & prova`
                        o, ancora meglio, il codice di quella tabella che ti avevo suggerito qualche post fa.

                        P.S.: spero di non stare abusando della tua pazienza!

                        Assolutamente no! Anzi, sono io a ringraziare te per la tenacia.

                        Ciao,
                        Antonio

                      • #59662
                        Doc
                        Partecipante
                          Up
                          0
                          Down
                          ::


                          Perfetto! Grazie per il chiarimento.

                          Ti farò allora sapere, se vuoi, anche per Squeeze con qt “vecchie”.

                          Ciao
                          Domenico

                        • #59663
                          Antonio Ledda
                          Partecipante
                            Up
                            0
                            Down
                            ::

                            […]
                            PS: consiglio in ogni caso di attivare tra le Preferenze anche “Permetti agli script di scrivere i file”.

                            Dopo questo passaggio, e in seguito al riavvio di TeXworks, anche lo script “Formatta tabella/matrice” pare che abbia iniziato a funzionare. (Giusto per curiosità ho poi disattivato nuovamente l’opzione “Permetti agli script di scrivere i file” e, stranamente, anche dopo aver riavviato TeXworks lo script ha fatto il suo dovere.)

                            Grazie per il tuo lavoro.

                            Ciao
                            Antonio

                          • #59664
                            Up
                            0
                            Down
                            ::


                            A me lo script per la formattazione funziona mentre non funziona quello per la creazione.
                            Ecco l’output del debugger

                            `qsdb> .backtrace
                            #0 () at /home/jack/.TeXworks/scripts/tableWizard.js:72
                            #1 () at /home/jack/.TeXworks/scripts/tableWizard.js:174`

                            `qsdb> .info locals
                            i : undefined
                            chkInsertPadding : undefined
                            chkAddTerminalEmptyCells : undefined
                            dialog : null
                            editors : undefined
                            cells : undefined
                            environment : null
                            rows : 0
                            addTerminalEmptyCells : false
                            EnvironmentChanged : undefined
                            j : undefined
                            chkEncloseInEnvironment : undefined
                            items : undefined
                            spinBoxNumberOfCols : null
                            ColumnWidthLimitChanged : undefined
                            chkLimitColumnWidth : undefined
                            spinBoxNumberOfRows : null
                            filename : undefined
                            cols : 0
                            maxColumnWidth : 15
                            cmbEnvironment : undefined
                            spinBoxColumnWidthLimit : undefined
                            xml : undefined
                            insertPadding : true`

                            `#1 () at /home/jack/.TeXworks/scripts/tableWizard.js:174`

                            `qsdb> .info locals
                            Math : [object Math]
                            NaN : NaN
                            undefined : undefined
                            Infinity : Infinity
                            JSON : [object JSON]
                            Object : function Object() {
                            [native code]
                            }
                            Function : function Function() {
                            [native code]
                            }
                            Array : function Array() {
                            [native code]
                            }
                            Boolean : function Boolean() {
                            [native code]
                            }
                            String : function String() {
                            [native code]
                            }
                            Number : function Number() {
                            [native code]
                            }
                            Date : function Date() {
                            [native code]
                            }
                            RegExp : function RegExp() {
                            [native code]
                            }
                            Error : function Error() {
                            [native code]
                            }
                            EvalError : function EvalError() {
                            [native code]
                            }
                            RangeError : function RangeError() {
                            [native code]
                            }
                            ReferenceError : function ReferenceError() {
                            [native code]
                            }
                            SyntaxError : function SyntaxError() {
                            [native code]
                            }
                            TypeError : function TypeError() {
                            [native code]
                            }
                            URIError : function URIError() {
                            [native code]
                            }
                            eval : function eval() {
                            [native code]
                            }
                            parseInt : function parseInt() {
                            [native code]
                            }
                            parseFloat : function parseFloat() {
                            [native code]
                            }
                            isNaN : function isNaN() {
                            [native code]
                            }
                            isFinite : function isFinite() {
                            [native code]
                            }
                            escape : function escape() {
                            [native code]
                            }
                            unescape : function unescape() {
                            [native code]
                            }
                            decodeURI : function decodeURI() {
                            [native code]
                            }
                            decodeURIComponent : function decodeURIComponent() {
                            [native code]
                            }
                            encodeURI : function encodeURI() {
                            [native code]
                            }
                            encodeURIComponent : function encodeURIComponent() {
                            [native code]
                            }
                            print : function () {
                            [native code]
                            }
                            gc : function gc() {
                            [native code]
                            }
                            version : function version() {
                            [native code]
                            }
                            TW : TWScriptAPI(name = “”)
                            __FILE__ : /home/jack/.TeXworks/scripts/tableWizard.js
                            __LINE__ : -1
                            CANNOT_OPEN_FILE : Errore: impossibile aprire il file
                            formatterScript : tableFormatter.js
                            wizardScript : tableWizard.js
                            file : // TeXworksScript
                            // Title: &Formatta tabella/matrice
                            // Description: Formatta il codice di una tabella o di una matrice.
                            // Author: Antonio Macrì
                            // Version: 0.9.3
                            // Date: 2011-06-07
                            // Script-Type: standalone
                            // Context: TeXDocument
                            // Shortcut: Ctrl+K, Ctrl+F

                            var formatterScript = “tableFormatter.js”;

                            /**
                            * Usato per sapere se un ambiente LaTeX richiede l'argomento con gli
                            * specificatori di colonna (ad esempio: {ccccc}).
                            */
                            function RequiresColumnSpecifiers(environment)
                            {
                            return environment == “array” || environment == “tabular”;
                            }

                            /**
                            * Aggiunge un carattere a destra di una stringa fino a raggiungere una data lunghezza.
                            *
                            * @param {number} width
                            * @param {string} c Il carattere da replicare in coda alla stringa.
                            */
                            String.prototype.padRight = function(width, c)
                            {
                            return (width > this.length) ? (this + (c == null ? ” ” : c)).padRight(width, c) : this;
                            }

                            function TableFormatter()
                            {
                            this.Settings = {
                            AddTerminalEmptyCells: false,
                            MaxColumnWidth: 15,
                            InsertPadding: true,
                            Environment: null
                            }
                            }

                            TableFormatter.prototype.LoadSettings = function()
                            {
                            var settings = TW.readFile(formatterScript.replace(“.js”, “-settings.json”));
                            if (settings.status != 0) {
                            // Qualcosa è andata storta: non faccio niente.
                            return;
                            }
                            // Evito di riscrivere tutto Settings, ma aggiorno leggendole dal file solo le
                            // proprietà già presenti. Così facendo, se nel file ne manca qualcuna, rimane
                            // quella impostata nel costruttore e se invece ce ne sono di vecchie evito di
                            // portarmele dietro in eterno.
                            var properties = JSON.parse(settings.result);
                            for (var p in properties)
                            if (typeof(this.Settings[p]) != “undefined”) this.Settings[p] = properties[p];
                            }

                            TableFormatter.prototype.SaveSettings = function()
                            {
                            var r = TW.writeFile(formatterScript.replace(“.js”, “-settings.json”), JSON.stringify(this.Settings));
                            if (r == 2) {
                            // L'utente dovrebbe mettere la spunta a “Allow scripts to write files”:
                            // non faccio niente e semplicemente non salvo le impostazioni.
                            }
                            }

                            /**
                            * Analizza il codice LaTeX di una tabella/matrice ricavandone le righe e le colonne.
                            *
                            * @param {string} text Il codice LaTeX da analizzare.
                            */
                            TableFormatter.prototype.ParseCode = function(text)
                            {
                            // Faccio una cosa molto semplice ma efficace (in prima approssimazione…)
                            // altrimenti il codice qui si complicherebbe di molto
                            var regex = /^(?:(?!\\\\).|\n)+(?:\\\\|(?=$))/;
                            var rows = new Array();
                            for (var i = 0; (matches = regex.exec(text)) != null; i++)
                            {
                            // Purtroppo non è supportato il costrutto di lookbehind nelle espressioni regolari
                            // Qt (altrimenti potrei fare .split(/(?<!\\)&/) per suddividere la riga in celle). // Mi tocca invece farlo a mano rows[i] = new Array(); var m = rows[i][0] = matches[0]; for (var pos = m.indexOf("&"); pos >= 0; pos = m.indexOf(“&”, pos))
                            {
                            if (pos == 0 || m[pos-1] != '\\')
                            {
                            rows[rows.length – 1] = m.substr(0, pos).replace(/\s+/g,” “).trim();
                            m = rows[rows.length] = m.substr(pos + 1);
                            pos = 0;
                            }
                            else pos++;
                            }
                            rows[rows.length – 1] = (m.substr(m.length-2) == “\\\\” ? m.substr(0, m.length-2) : m).replace(/\s+/g,” “).trim();

                            text = text.substring(matches[0].length);
                            }
                            this.Table = rows;
                            }

                            /**
                            * Genera il codice LaTeX di una tabella, aggiungendo opzionalmente degli spazi di
                            * riempimento e racchiudendo eventualmente il tutto in un ambiente.
                            *
                            * @param {object} [cells=this.Table] Una matrice bidimensionale di stringhe contenenti il
                            * testo della rispettiva cella. Righe differenti possono avere numero di colonne diverso.
                            * @param {number} [maxColumnWidth=this.Settings.MaxColumnWidth] La larghezza massima di
                            * una colonna del sorgente generato. Se vale zero, allora non viene usato alcun limite.
                            * @param {boolean} [addTerminalEmptyCells=this.Settings.AddTerminalEmptyCells] Specifica
                            * se tutte le righe generate devono avere lo stesso numero di colonne (si aggiungeranno,
                            * cioè, i delimitatori di colonna anche per le celle vuote finali).
                            * @param {boolean} [insertPadding=this.Settings.InsertPadding] Un booleano che specifica se
                            * inserire degli spazi di riempimento in modo da avere tutte le colonne del sorgente
                            * della stessa larghezza (i delimitatori di colonna '&' risulteranno così allineati).
                            * @param {string} [environment=this.Settings.Environment] Il nome dell'ambiente in cui
                            * inserire il codice.
                            */
                            TableFormatter.prototype.GenerateCode = function(cells, maxColumnWidth, addTerminalEmptyCells, insertPadding, environment)
                            {
                            cells = cells ? cells : this.Table;
                            maxColumnWidth = maxColumnWidth ? maxColumnWidth : this.Settings.MaxColumnWidth;
                            addTerminalEmptyCells = typeof(addTerminalEmptyCells) != “undefined” ? addTerminalEmptyCells : this.Settings.AddTerminalEmptyCells;
                            insertPadding = typeof(insertPadding) != “undefined” ? insertPadding : this.Settings.InsertPadding;
                            environment = environment ? environment : this.Settings.Environment;

                            /**
                            * Divide una stringa in sottostringhe aventi (se possibile) la lunghezza specificata.
                            * Può accadere che la lunghezza di qualche sottostringa debba essere necessariamente
                            * maggiore di desiredWidth: tale valore viene comunque restituito al chiamante.
                            *
                            * @param {string} text La stringa da suddividere.
                            * @param {number} desiredWidth La dimensione ideale di ciascuna sottostringa.
                            * @returns {object} Restituisce un oggetto contenente nella proprietà Result un
                            * vettore con l'insieme di sottostringhe ottenute e nella proprietà MaxUsedWidth la
                            * lunghezza massima tra tutte le sottostringhe restituite (che può essere anche
                            * maggiore o minore del valore passato in desiredWidth).
                            */
                            function SplitText(text, desiredWidth)
                            {
                            if (text.length > desiredWidth && desiredWidth != 0)
                            {
                            var lines = text.split(/\s+/);

                            // Prima di tutto prendo la lunghezza di ogni sottostringa e se è maggiore di desiredWidth
                            // allora quest'ultimo deve essere aggiornato con la lunghezza massima. Faccio questo
                            // all'inizio così il riaggiustamento della larghezza massima ha effetto anche sulle linee
                            // precedenti (anziché dal momento in cui lo riaggiusto in poi)
                            for (var i = 0; i < lines.length; i++) if (desiredWidth < lines[i].length) desiredWidth = lines[i].length; var maxUsedWidth = 0; var line = -1; var current = 0; while (current < lines.length) { line++; lines[line] = lines[current]; current++; while (current < lines.length && lines[line].length + lines[current].length < desiredWidth) { lines[line] += ' ' + lines[current]; current++; } maxUsedWidth = Math.max(maxUsedWidth, lines[line].length); } var result = lines.slice(0, line + 1); return { "Result": result, "MaxUsedWidth": maxUsedWidth }; } var result = new Array(); result[0] = text; return { "Result": result, "MaxUsedWidth": text.length }; } /** * Analizza le celle della tabella e genera una matrice bidimensionale contenente in * ogni elemento (i,j) un array con le linee in cui viene spezzato il testo del sorgente * relativo alla cella (i,j). */ function BuildCellLines() { var toReDo = new Array(); // indica che per le righe da 0 a toReDo[j] della colonna j bisogna ricalcolare la larghezza var colWidths = new Array(); // colWidths[j] contiene la larghezza massima della colonna j su tutte le righe var cellLines = new Array(); // cellLines[i][j] è un array contenente le linee in cui è stato suddiviso il testo della cella (i,j) var rows = cells.length; for (var i = 0; i < rows; i++) { cellLines[i] = new Array(); var cols = cells[i].length; for (var j = 0; j < cols; j++) { var desired = typeof(colWidths[j]) == "undefined" || maxColumnWidth == 0 ? maxColumnWidth : colWidths[j]; var returned = SplitText(cells[i][j].trim(), desired); cellLines[i][j] = returned.Result; if (typeof(colWidths[j]) != "undefined") { if(returned.MaxUsedWidth > colWidths[j])
                            {
                            // È stata modificata la larghezza, quindi dovrà ricalcolare le sottostringhe per
                            // le celle precedenti. Da notare che può succedere che toReDo venga sovrascritto,
                            // ovviamente con un valore maggiore (indici più avanti) ma perché la larghezza
                            // è ulteriormente aumentata
                            toReDo[j] = i – 1;
                            }
                            else continue;
                            }
                            colWidths[j] = returned.MaxUsedWidth;
                            }
                            }

                            for (var j = 0; j < toReDo.length; j++) { var row = toReDo[j]; if(typeof(row) != "undefined") { while (row >= 0)
                            {
                            if (cells[row][j])
                            cellLines[row][j] = SplitText(cells[row][j].trim(), colWidths[j]).Result;
                            row–;
                            }
                            }
                            }

                            return { “CellLines”: cellLines, “ColumnWidths”: colWidths };
                            }

                            /**
                            * Genera il codice LaTeX di una tabella, aggiungendo opzionalmente gli spazi di
                            * riempimento e racchiudendo eventualmente il tutto in un ambiente.
                            *
                            * @param {string[][][]} cellLines Una matrice bidimensionale contenente in ogni
                            * elemento (i,j) un array con le linee in cui è stato spezzato il testo del sorgente
                            * relativo alla cella (i,j).
                            * @param {number} colWidths La larghezza (in caratteri) di ciascuna colonna nel sorgente.
                            */
                            function BuildLaTeXCode(cellLines, colWidths)
                            {
                            var terminator = “\n”;
                            var result = “”;
                            var rows = cellLines.length;
                            for (var i = 0; i < rows; i++) { var columnStartPosition = 0; var buffer = ""; var cols = cellLines[i].length; for (var j = 0; j < cols; j++) { var cell = cellLines[i][j]; for (var k = 0; k < cell.length; k++) { if (k > 0) {
                            buffer += terminator + “”.padRight(columnStartPosition);
                            }
                            var t = insertPadding ? cell[k].padRight(colWidths[j]) : cell[k];
                            buffer += t;
                            if(cell[k].length > 0) {
                            result += buffer;
                            buffer = “”;
                            }
                            cell[k] = t;
                            }

                            columnStartPosition += cell[cell.length – 1].length;
                            if (j < cols - 1) { buffer += " & "; columnStartPosition += 3; } } if (addTerminalEmptyCells) { result += buffer; for (var j = cols; j < colWidths.length; j++) result += " & " + (insertPadding ? "".padRight(colWidths[j]) : ""); } if (i < rows - 1) result += " \\\\"; result += terminator; } if (environment) { var name = environment.trim(); var columns = RequiresColumnSpecifiers(name) ? "{" + "c".padRight(colWidths.length, "c") + "}" : ""; if (name.length > 0)
                            result = “\\begin{” + name + “}” + columns + terminator + result + “\\end{” + name + “}” + terminator;
                            }

                            return result;
                            }

                            var returned = BuildCellLines();
                            return BuildLaTeXCode(returned.CellLines, returned.ColumnWidths);
                            }

                            formatter : [object Object]
                            selection :
                            RequiresColumnSpecifiers : function RequiresColumnSpecifiers(environment) {
                            return environment == “array” || environment == “tabular”;
                            }
                            TableFormatter : function TableFormatter() {
                            this.Settings = {
                            AddTerminalEmptyCells: false,
                            MaxColumnWidth: 15,
                            InsertPadding: true,
                            Environment: null
                            }
                            }`

                            `qsdb> .up
                            Already at top (outermost) frame.`

                            TexWorks 0.4.1 r.829 su Ubuntu 11.04 32bit
                            Qt application framework v4.7.2

                            Grazie di tutto

                          • #59665
                            Up
                            0
                            Down
                            ::

                            Perfetto! Grazie per il chiarimento.

                            Ti farò allora sapere, se vuoi, anche per Squeeze con qt “vecchie”.

                            Ciao
                            Domenico

                            Sì, grazie.

                            Sapevamo già che serve almeno TeXworks 0.4. Abbiamo capito che vanno bene le Qt 4.7, vediamo se si può adattare per le Qt 4.6.

                            Ciao

                          • #59666
                            Up
                            0
                            Down
                            ::

                            […]
                            PS: consiglio in ogni caso di attivare tra le Preferenze anche “Permetti agli script di scrivere i file”.

                            Dopo questo passaggio, e in seguito al riavvio di TeXworks, anche lo script “Formatta tabella/matrice” pare che abbia iniziato a funzionare. (Giusto per curiosità ho poi disattivato nuovamente l’opzione “Permetti agli script di scrivere i file” e, stranamente, anche dopo aver riavviato TeXworks lo script ha fatto il suo dovere.)

                            Grazie per il tuo lavoro.

                            Ciao
                            Antonio

                            Il motivo è che lo script per la formattazione (dato che non interagisce con l’utente) è costretto a usare delle impostazioni che il wizard ha salvato da qualche parte. In particolare, il wizard salva le impostazioni su disco.

                            All’inizio, se non è attiva l’opzione “Permetti agli script di scrivere i file”, il formatter (non trovando nulla su disco) usa le impostazioni con le quali l’ho inizializzato nel file js. Quando abiliti la scrittura e dopo usi il wizard, questo scrive le impostazione su disco. Anche se poi disattivi la scrittura su disco, il formatter continuerà a usare le impostazioni salvate, anche se riavvii TeXworks.

                            Questo in realtà è quello che accadeva fino a mezz’ora fa 🙂

                            Ho modificato i sorgenti in modo che le impostazioni vengano salvate anche in RAM, non solo su disco. In tal modo, se non sono presenti sul disco, il formatter le può sempre leggere dalla RAM, ma ovviamente vengono perse riavviando TeXworks. La scrittura su disco garantisce la persistenza anche rispetto a riavvii di TW.

                            Ciao,
                            Antonio

                          • #59667
                            Up
                            0
                            Down
                            ::

                            A me lo script per la formattazione funziona mentre non funziona quello per la creazione.
                            Ecco l’output del debugger

                            `qsdb> .backtrace
                            #0 () at /home/jack/.TeXworks/scripts/tableWizard.js:72
                            #1 () at /home/jack/.TeXworks/scripts/tableWizard.js:174`

                            `qsdb> .info locals
                            …`

                            TexWorks 0.4.1 r.829 su Ubuntu 11.04 32bit
                            Qt application framework v4.7.2

                            Grazie di tutto

                            Prova con questi due e dimmi se vanno.

                            Ciao,
                            Antonio

                          • #59668
                            Up
                            0
                            Down
                            ::


                            Ho provato ma non funzionano….appena posso rifaccio la procedura di debug e posto i risultati

                          • #59669
                            Up
                            0
                            Down
                            ::


                            Ecco quanto mi restituisce il debugger quando lancio il table wizard

                            `Welcome to the Qt Script debugger.
                            Debugger commands start with a . (period).
                            Any other input will be evaluated by the script interpreter.
                            Type “.help” for help.

                            Uncaught exception at /home/jack/.TeXworks/scripts/tableWizard.js:72: TypeError: Result of expression 'dialog' [null] is not an object.
                            72 if (dialog.exec() != 1) {

                            qsdb> .backtrace
                            #0 () at /home/jack/.TeXworks/scripts/tableWizard.js:72
                            #1 () at /home/jack/.TeXworks/scripts/tableWizard.js:174
                            qsdb> .info locals
                            i : undefined
                            chkInsertPadding : undefined
                            chkAddTerminalEmptyCells : undefined
                            dialog : null
                            editors : undefined
                            cells : undefined
                            environment : null
                            rows : 0
                            addTerminalEmptyCells : false
                            EnvironmentChanged : undefined
                            j : undefined
                            chkEncloseInEnvironment : undefined
                            items : undefined
                            spinBoxNumberOfCols : null
                            ColumnWidthLimitChanged : undefined
                            chkLimitColumnWidth : undefined
                            spinBoxNumberOfRows : null
                            filename : undefined
                            cols : 0
                            maxColumnWidth : 15
                            cmbEnvironment : undefined
                            spinBoxColumnWidthLimit : undefined
                            xml : undefined
                            insertPadding : true
                            qsdb> .up
                            #1
                            () at /home/jack/.TeXworks/scripts/tableWizard.js:174
                            qsdb> .info locals
                            Math : [object Math]
                            NaN : NaN
                            undefined : undefined
                            Infinity : Infinity
                            JSON : [object JSON]
                            Object : function Object() {
                            [native code]
                            }
                            Function : function Function() {
                            [native code]
                            }
                            Array : function Array() {
                            [native code]
                            }
                            Boolean : function Boolean() {
                            [native code]
                            }
                            String : function String() {
                            [native code]
                            }
                            Number : function Number() {
                            [native code]
                            }
                            Date : function Date() {
                            [native code]
                            }
                            RegExp : function RegExp() {
                            [native code]
                            }
                            Error : function Error() {
                            [native code]
                            }
                            EvalError : function EvalError() {
                            [native code]
                            }
                            RangeError : function RangeError() {
                            [native code]
                            }
                            ReferenceError : function ReferenceError() {
                            [native code]
                            }
                            SyntaxError : function SyntaxError() {
                            [native code]
                            }
                            TypeError : function TypeError() {
                            [native code]
                            }
                            URIError : function URIError() {
                            [native code]
                            }
                            eval : function eval() {
                            [native code]
                            }
                            parseInt : function parseInt() {
                            [native code]
                            }
                            parseFloat : function parseFloat() {
                            [native code]
                            }
                            isNaN : function isNaN() {
                            [native code]
                            }
                            isFinite : function isFinite() {
                            [native code]
                            }
                            escape : function escape() {
                            [native code]
                            }
                            unescape : function unescape() {
                            [native code]
                            }
                            decodeURI : function decodeURI() {
                            [native code]
                            }
                            decodeURIComponent : function decodeURIComponent() {
                            [native code]
                            }
                            encodeURI : function encodeURI() {
                            [native code]
                            }
                            encodeURIComponent : function encodeURIComponent() {
                            [native code]
                            }
                            print : function () {
                            [native code]
                            }
                            gc : function gc() {
                            [native code]
                            }
                            version : function version() {
                            [native code]
                            }
                            TW : TWScriptAPI(name = “”)
                            __FILE__ : /home/jack/.TeXworks/scripts/tableWizard.js
                            __LINE__ : -1
                            CANNOT_OPEN_FILE : Errore: impossibile aprire il file
                            wizardScript : /home/jack/.TeXworks/scripts/tableWizard.js
                            formatterScript : /home/jack/.TeXworks/scripts/tableFormatter.js
                            file : // TeXworksScript
                            // Title: &Formatta tabella/matrice
                            // Description: Formatta il codice di una tabella o di una matrice.
                            // Author: Antonio Macrì
                            // Version: 0.9.5
                            // Date: 2011-06-09
                            // Script-Type: standalone
                            // Context: TeXDocument
                            // Shortcut: Ctrl+K, Ctrl+F

                            var formatterScript = __FILE__ ? __FILE__ : wizardScript.replace(“Wizard.js”,”Formatter.js”);

                            /**
                            * Usato per sapere se un ambiente LaTeX richiede l'argomento con gli
                            * specificatori di colonna (ad esempio: {ccccc}).
                            */
                            function RequiresColumnSpecifiers(environment)
                            {
                            return environment == “array” || environment == “tabular”;
                            }

                            /**
                            * Aggiunge un carattere a destra di una stringa fino a raggiungere una data lunghezza.
                            *
                            * @param {number} width
                            * @param {string} c Il carattere da replicare in coda alla stringa.
                            */
                            String.prototype.padRight = function(width, c)
                            {
                            return (width > this.length) ? (this + (c == null ? ” ” : c)).padRight(width, c) : this;
                            }

                            // Definisco la String.trim() se questa non esiste già (non tutte le versioni Qt la forniscono)
                            if(typeof(String.prototype.trim) == “undefined”)
                            {
                            String.prototype.trim = function() { return this.replace(/^\s+|\s+$/g, “”); };
                            }

                            function TableFormatter()
                            {
                            this.Settings = {
                            AddTerminalEmptyCells: false,
                            MaxColumnWidth: 15,
                            InsertPadding: true,
                            Environment: null
                            }
                            }

                            TableFormatter.prototype.LoadSettings = function()
                            {
                            if (TW.app.hasGlobal(“TableFormatterSettings”))
                            {
                            this.Settings = TW.app.getGlobal(“TableFormatterSettings”);
                            return;
                            }
                            var settings = TW.readFile(formatterScript.replace(“.js”, “-settings.json”));
                            if (settings.status != 0) {
                            // Qualcosa è andata storta: non faccio niente.
                            return;
                            }
                            // Evito di riscrivere tutto Settings, ma aggiorno leggendole dal file solo le
                            // proprietà già presenti. Così facendo, se nel file ne manca qualcuna, rimane
                            // quella impostata nel costruttore e se invece ce ne sono di vecchie evito di
                            // portarmele dietro in eterno.
                            var properties = JSON.parse(settings.result);
                            for (var p in properties)
                            if (typeof(this.Settings[p]) != “undefined”) this.Settings[p] = properties[p];
                            }

                            TableFormatter.prototype.SaveSettings = function()
                            {
                            TW.app.setGlobal(“TableFormatterSettings”, this.Settings);

                            var r = TW.writeFile(formatterScript.replace(“.js”, “-settings.json”), JSON.stringify(this.Settings));
                            if (r == 2) {
                            // L'utente dovrebbe mettere la spunta a “Allow scripts to write files”:
                            // non faccio niente e semplicemente non salvo le impostazioni.
                            }
                            }

                            /**
                            * Analizza il codice LaTeX di una tabella/matrice ricavandone le righe e le colonne.
                            *
                            * @param {string} text Il codice LaTeX da analizzare.
                            */
                            TableFormatter.prototype.ParseCode = function(text)
                            {
                            // Faccio una cosa molto semplice ma efficace (in prima approssimazione…)
                            // altrimenti il codice qui si complicherebbe di molto
                            var regex = /^(?:(?!\\\\).|\n)+(?:\\\\|(?=$))/;
                            var rows = new Array();
                            for (var i = 0; (matches = regex.exec(text)) != null; i++)
                            {
                            // Purtroppo non è supportato il costrutto di lookbehind nelle espressioni regolari
                            // Qt (altrimenti potrei fare .split(/(?<!\\)&/) per suddividere la riga in celle). // Mi tocca invece farlo a mano rows[i] = new Array(); var m = rows[i][0] = matches[0]; for (var pos = m.indexOf("&"); pos >= 0; pos = m.indexOf(“&”, pos))
                            {
                            if (pos == 0 || m[pos-1] != '\\')
                            {
                            rows[rows.length – 1] = m.substr(0, pos).replace(/\s+/g,” “).trim();
                            m = rows[rows.length] = m.substr(pos + 1);
                            pos = 0;
                            }
                            else pos++;
                            }
                            rows[rows.length – 1] = (m.substr(m.length-2) == “\\\\” ? m.substr(0, m.length-2) : m).replace(/\s+/g,” “).trim();

                            text = text.substring(matches[0].length);
                            }
                            this.Table = rows;
                            }

                            /**
                            * Genera il codice LaTeX di una tabella, aggiungendo opzionalmente degli spazi di
                            * riempimento e racchiudendo eventualmente il tutto in un ambiente.
                            *
                            * @param {object} [cells=this.Table] Una matrice bidimensionale di stringhe contenenti il
                            * testo della rispettiva cella. Righe differenti possono avere numero di colonne diverso.
                            * @param {number} [maxColumnWidth=this.Settings.MaxColumnWidth] La larghezza massima di
                            * una colonna del sorgente generato. Se vale zero, allora non viene usato alcun limite.
                            * @param {boolean} [addTerminalEmptyCells=this.Settings.AddTerminalEmptyCells] Specifica
                            * se tutte le righe generate devono avere lo stesso numero di colonne (si aggiungeranno,
                            * cioè, i delimitatori di colonna anche per le celle vuote finali).
                            * @param {boolean} [insertPadding=this.Settings.InsertPadding] Un booleano che specifica se
                            * inserire degli spazi di riempimento in modo da avere tutte le colonne del sorgente
                            * della stessa larghezza (i delimitatori di colonna '&' risulteranno così allineati).
                            * @param {string} [environment=this.Settings.Environment] Il nome dell'ambiente in cui
                            * inserire il codice.
                            */
                            TableFormatter.prototype.GenerateCode = function(cells, maxColumnWidth, addTerminalEmptyCells, insertPadding, environment)
                            {
                            cells = cells ? cells : this.Table;
                            maxColumnWidth = maxColumnWidth ? maxColumnWidth : this.Settings.MaxColumnWidth;
                            addTerminalEmptyCells = typeof(addTerminalEmptyCells) != “undefined” ? addTerminalEmptyCells : this.Settings.AddTerminalEmptyCells;
                            insertPadding = typeof(insertPadding) != “undefined” ? insertPadding : this.Settings.InsertPadding;
                            environment = environment ? environment : this.Settings.Environment;

                            /**
                            * Divide una stringa in sottostringhe aventi (se possibile) la lunghezza specificata.
                            * Può accadere che la lunghezza di qualche sottostringa debba essere necessariamente
                            * maggiore di desiredWidth: tale valore viene comunque restituito al chiamante.
                            *
                            * @param {string} text La stringa da suddividere.
                            * @param {number} desiredWidth La dimensione ideale di ciascuna sottostringa.
                            * @returns {object} Restituisce un oggetto contenente nella proprietà Result un
                            * vettore con l'insieme di sottostringhe ottenute e nella proprietà MaxUsedWidth la
                            * lunghezza massima tra tutte le sottostringhe restituite (che può essere anche
                            * maggiore o minore del valore passato in desiredWidth).
                            */
                            function SplitText(text, desiredWidth)
                            {
                            if (text.length > desiredWidth && desiredWidth != 0)
                            {
                            var lines = text.split(/\s+/);

                            // Prima di tutto prendo la lunghezza di ogni sottostringa e se è maggiore di desiredWidth
                            // allora quest'ultimo deve essere aggiornato con la lunghezza massima. Faccio questo
                            // all'inizio così il riaggiustamento della larghezza massima ha effetto anche sulle linee
                            // precedenti (anziché dal momento in cui lo riaggiusto in poi)
                            for (var i = 0; i < lines.length; i++) if (desiredWidth < lines[i].length) desiredWidth = lines[i].length; var maxUsedWidth = 0; var line = -1; var current = 0; while (current < lines.length) { line++; lines[line] = lines[current]; current++; while (current < lines.length && lines[line].length + lines[current].length < desiredWidth) { lines[line] += ' ' + lines[current]; current++; } maxUsedWidth = Math.max(maxUsedWidth, lines[line].length); } var result = lines.slice(0, line + 1); return { "Result": result, "MaxUsedWidth": maxUsedWidth }; } var result = new Array(); result[0] = text; return { "Result": result, "MaxUsedWidth": text.length }; } /** * Analizza le celle della tabella e genera una matrice bidimensionale contenente in * ogni elemento (i,j) un array con le linee in cui viene spezzato il testo del sorgente * relativo alla cella (i,j). */ function BuildCellLines() { var toReDo = new Array(); // indica che per le righe da 0 a toReDo[j] della colonna j bisogna ricalcolare la larghezza var colWidths = new Array(); // colWidths[j] contiene la larghezza massima della colonna j su tutte le righe var cellLines = new Array(); // cellLines[i][j] è un array contenente le linee in cui è stato suddiviso il testo della cella (i,j) var rows = cells.length; for (var i = 0; i < rows; i++) { cellLines[i] = new Array(); var cols = cells[i].length; for (var j = 0; j < cols; j++) { var desired = typeof(colWidths[j]) == "undefined" || maxColumnWidth == 0 ? maxColumnWidth : Math.max(maxColumnWidth, colWidths[j]); var returned = SplitText(cells[i][j].trim(), desired); cellLines[i][j] = returned.Result; if (typeof(colWidths[j]) != "undefined") { if(returned.MaxUsedWidth > colWidths[j])
                            {
                            // È stata modificata la larghezza, quindi dovrà ricalcolare le sottostringhe per
                            // le celle precedenti. Da notare che può succedere che toReDo venga sovrascritto,
                            // ovviamente con un valore maggiore (indici più avanti) ma perché la larghezza
                            // è ulteriormente aumentata
                            toReDo[j] = i – 1;
                            }
                            else continue;
                            }
                            colWidths[j] = returned.MaxUsedWidth;
                            }
                            }

                            for (var j = 0; j < toReDo.length; j++) { var row = toReDo[j]; if(typeof(row) != "undefined") { while (row >= 0)
                            {
                            if (cells[row][j])
                            cellLines[row][j] = SplitText(cells[row][j].trim(), colWidths[j]).Result;
                            row–;
                            }
                            }
                            }

                            return { “CellLines”: cellLines, “ColumnWidths”: colWidths };
                            }

                            /**
                            * Genera il codice LaTeX di una tabella, aggiungendo opzionalmente gli spazi di
                            * riempimento e racchiudendo eventualmente il tutto in un ambiente.
                            *
                            * @param {string[][][]} cellLines Una matrice bidimensionale contenente in ogni
                            * elemento (i,j) un array con le linee in cui è stato spezzato il testo del sorgente
                            * relativo alla cella (i,j).
                            * @param {number} colWidths La larghezza (in caratteri) di ciascuna colonna nel sorgente.
                            */
                            function BuildLaTeXCode(cellLines, colWidths)
                            {
                            var terminator = “\n”;
                            var result = “”;
                            var rows = cellLines.length;
                            for (var i = 0; i < rows; i++) { var columnStartPosition = 0; var buffer = ""; var cols = cellLines[i].length; for (var j = 0; j < cols; j++) { var cell = cellLines[i][j]; for (var k = 0; k < cell.length; k++) { if (k > 0) {
                            buffer += terminator + “”.padRight(columnStartPosition);
                            }
                            var t = insertPadding ? cell[k].padRight(colWidths[j]) : cell[k];
                            buffer += t;
                            if(cell[k].length > 0) {
                            result += buffer;
                            buffer = “”;
                            }
                            cell[k] = t;
                            }

                            columnStartPosition += cell[cell.length – 1].length;
                            if (j < cols - 1) { buffer += " & "; columnStartPosition += 3; } } if (addTerminalEmptyCells) { result += buffer; for (var j = cols; j < colWidths.length; j++) result += " & " + (insertPadding ? "".padRight(colWidths[j]) : ""); } if (i < rows - 1) result += " \\\\"; result += terminator; } if (environment) { var name = environment.trim(); var columns = RequiresColumnSpecifiers(name) ? "{" + "c".padRight(colWidths.length, "c") + "}" : ""; if (name.length > 0)
                            result = “\\begin{” + name + “}” + columns + terminator + result + “\\end{” + name + “}” + terminator;
                            }

                            return result;
                            }

                            var returned = BuildCellLines();
                            return BuildLaTeXCode(returned.CellLines, returned.ColumnWidths);
                            }

                            formatter : [object Object]
                            selection :
                            RequiresColumnSpecifiers : function RequiresColumnSpecifiers(environment) {
                            return environment == “array” || environment == “tabular”;
                            }
                            TableFormatter : function TableFormatter() {
                            this.Settings = {
                            AddTerminalEmptyCells: false,
                            MaxColumnWidth: 15,
                            InsertPadding: true,
                            Environment: null
                            }
                            }
                            qsdb> .up
                            Already at top (outermost) frame.`

                          • #59670
                            Up
                            0
                            Down
                            ::


                            Lo script per la formattazione invece adesso pare funzionare

                          • #59671
                            Up
                            0
                            Down
                            ::

                            Ecco quanto mi restituisce il debugger quando lancio il table wizard

                            `Welcome to the Qt Script debugger.
                            Debugger commands start with a . (period).
                            Any other input will be evaluated by the script interpreter.
                            Type “.help” for help.

                            Uncaught exception at /home/jack/.TeXworks/scripts/tableWizard.js:72: TypeError: Result of expression 'dialog' [null] is not an object.
                            72 if (dialog.exec() != 1) {

                            qsdb> .backtrace
                            …`

                            Guarda, purtroppo non riesco a trovare spiegazioni serie. La più banale è che non trova il file
                            `/home/jack/.TeXworks/scripts/tableWizard-1.ui`
                            ma mi rifiuto di pensare che sia davvero questo il motivo. ❓

                            Comunque ora aggiungo i controlli mancanti al codice, così (per quanto possibile) vi evito giustamente l’uso del debugger: non è compito vostro. Anzi, vi ringrazio per la pazienza dimostrata 🙂

                            Ciao,
                            Antonio

                          • #59672
                            Doc
                            Partecipante
                              Up
                              0
                              Down
                              ::

                              Perfetto! Grazie per il chiarimento.

                              Ti farò allora sapere, se vuoi, anche per Squeeze con qt “vecchie”.

                              Ciao
                              Domenico

                              Sì, grazie.

                              Sapevamo già che serve almeno TeXworks 0.4. Abbiamo capito che vanno bene le Qt 4.7, vediamo se si può adattare per le Qt 4.6.

                              Ciao

                              Provati su Squeeze. Paiono funzionare correttamente.

                              Grazie mille di tutto.

                            • #59673
                              Up
                              0
                              Down
                              ::

                              [quote]Perfetto! Grazie per il chiarimento.

                              Ti farò allora sapere, se vuoi, anche per Squeeze con qt “vecchie”.

                              Ciao
                              Domenico

                              Sì, grazie.

                              Sapevamo già che serve almeno TeXworks 0.4. Abbiamo capito che vanno bene le Qt 4.7, vediamo se si può adattare per le Qt 4.6.

                              Ciao

                              Provati su Squeeze. Paiono funzionare correttamente.

                              Grazie mille di tutto.[/quote]
                              Buono a sapersi! 😉

                              Grazie e ciao,
                              Antonio

                              PS: ovviamente se usandoli ti viene in mente qualcosa che potrei cambiare o migliorare, suggerisci pure!

                            • #59674
                              Up
                              0
                              Down
                              ::


                              I files .ui naturalmente ci sono, ho provato anche a rinominarli ma non ho ottenuto risultati.
                              Il debugger mi segnala sempre un errore alla riga 72

                            • #59675
                              Up
                              0
                              Down
                              ::

                              I files .ui naturalmente ci sono, ho provato anche a rinominarli ma non ho ottenuto risultati.
                              Il debugger mi segnala sempre un errore alla riga 72

                              Ho provato a sistemare alcune cose che potevano creare il problema. Riprova con questi e vediamo che succede.

                              Se tutto va bene, siamo a posto :). Altrimenti, facciamo comunque un piccolo passo avanti, capendo se non riesce davvero a leggere il file o se trova un errore nel formato: ti apparirà una finestrella a specificarti quale tra i due è il motivo.

                              Ciao,
                              Antonio

                            • #59676
                              Up
                              0
                              Down
                              ::


                              Ok, adesso lo script per la creazione di tabelle pare funzionare. Non ho capito bene se l’ambiente in cui devo racchiudere la tabella lo devo scrivere io o sceglierlo da un elenco (che però non viene presentato).

                              Comunque complimenti per l’ottimo lavoro

                            • #59677
                              Up
                              0
                              Down
                              ::

                              Ok, adesso lo script per la creazione di tabelle pare funzionare. Non ho capito bene se l’ambiente in cui devo racchiudere la tabella lo devo scrivere io o sceglierlo da un elenco (che però non viene presentato).

                              Comunque complimenti per l’ottimo lavoro

                              Devi scriverlo tu, a meno che non compaia già nell’elenco… 🙂 ma siccome non pare esistere un modo non troppo complicato per aggiungere elementi a quell’elenco (da uno script, mannaggia alle Qt…) per ora non compare nulla nell’elenco! 😯 Vedrò se riesco a trovare qualche soluzione.

                              Ciao!

                            • #59678
                              Up
                              0
                              Down
                              ::


                              Ho fatto le ultime modifiche agli script, penso che così possano andare.

                                1) È ora salvata e mostrata automaticamente la lista degli ambienti usati (tabular, array, pmatrix eccetera). Tuttavia rimane un piccolo problema: attenzione al completamento automatico, che è case insensitive, e quindi rischia di sostituirvi, chessò, “Vmatrix” con “vmatrix”. ❗ (Questo problema, fortunatamente piccolo, non è risolvibile da script, allo stato attuale. :()

                                2) Viene rilasciata correttamente la memoria non più usata dal wizard.

                                3) Si informa l’utente con opportuni messaggi in caso di problemi nel caricare un file o una finestra. Inoltre, sulla barra di stato viene mostrato dove sono state salvate o caricate le impostazioni (può notificare, senza invasività, che non si riesce a scrivere sul disco). Purtroppo TeXworks è piuttosto pigro nell’aggiornare la barra di stato dietro la richiesta di uno script, speriamo che migliori nelle prossime versioni (ancora non è stato corretto nella 0.5).

                              Per comodità riporto anche qui il collegamento agli script.

                              Ciao,
                              Antonio

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

                          Go to top