- Questo topic ha 38 risposte, 5 partecipanti ed è stato aggiornato l'ultima volta 15 anni, 3 mesi fa da
antonio.macrì.
-
CreatoreTopic
-
2 Giugno 2011 alle 19:11 #59640::
Ciao a tuttiEra 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
-
CreatoreTopic
-
AutoreRisposte
-
-
5 Giugno 2011 alle 14:01 #59641
-
5 Giugno 2011 alle 22:55 #59642::
Interessanti, davvero. TeXworks, dopo GNU Emacs, è l’altro mio editor preferito.
Ad maiora!
OrlandoGrazie 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
-
6 Giugno 2011 alle 10:39 #59643
-
6 Giugno 2011 alle 17:03 #59644::
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,
AntonioPS: 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
-
6 Giugno 2011 alle 17:41 #59645::
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
-
6 Giugno 2011 alle 21:17 #59646::
Grazie per le informazioni, ma la mia era una semplice curiosità anche perché di java non so praticamente nulla.
Ciao
OrlandoJava 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
-
7 Giugno 2011 alle 17:38 #59647::
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)
-
7 Giugno 2011 alle 18:05 #59648
-
7 Giugno 2011 alle 22:59 #59649::
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.1Gli 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.
-
8 Giugno 2011 alle 8:06 #59650::
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,
DomenicoEDIT
Testato su Debian Squeeze, con TW v. 0.4.1 r.829 (launchpad)
Il wizard parte, ma non produce alcun esito.
-
8 Giugno 2011 alle 11:51 #59651::
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,
DomenicoEDIT
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
-
8 Giugno 2011 alle 11:53 #59652::
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,
DomenicoEDIT
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! 😀
-
8 Giugno 2011 alle 12:02 #59653::
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
-
8 Giugno 2011 alle 12:41 #59654::
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.
-
8 Giugno 2011 alle 13:45 #59655::
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
-
8 Giugno 2011 alle 18:31 #59656
-
8 Giugno 2011 alle 22:37 #59657::
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”.
-
9 Giugno 2011 alle 10:19 #59658::
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+Fvar 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.
-
9 Giugno 2011 alle 14:00 #59659::
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
-
9 Giugno 2011 alle 15:09 #59660::
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!
-
9 Giugno 2011 alle 16:57 #59661::
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
-
9 Giugno 2011 alle 17:03 #59662
-
9 Giugno 2011 alle 17:58 #59663::
[…]
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
-
9 Giugno 2011 alle 18:30 #59664::
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+Fvar 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.2Grazie di tutto
-
9 Giugno 2011 alle 18:35 #59665
-
9 Giugno 2011 alle 20:39 #59666::
[…]
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
AntonioIl 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
-
9 Giugno 2011 alle 20:53 #59667::
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.2Grazie di tutto
Prova con questi due e dimmi se vanno.
Ciao,
Antonio
-
10 Giugno 2011 alle 12:02 #59668
-
10 Giugno 2011 alle 17:10 #59669::
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+Fvar 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.`
-
10 Giugno 2011 alle 17:12 #59670
-
10 Giugno 2011 alle 19:23 #59671::
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
-
10 Giugno 2011 alle 19:28 #59672::
Perfetto! Grazie per il chiarimento.
Ti farò allora sapere, se vuoi, anche per Squeeze con qt “vecchie”.
Ciao
DomenicoSì, 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.
-
10 Giugno 2011 alle 19:58 #59673::
[quote]Perfetto! Grazie per il chiarimento.
Ti farò allora sapere, se vuoi, anche per Squeeze con qt “vecchie”.
Ciao
DomenicoSì, 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,
AntonioPS: ovviamente se usandoli ti viene in mente qualcosa che potrei cambiare o migliorare, suggerisci pure!
-
11 Giugno 2011 alle 21:13 #59674
-
11 Giugno 2011 alle 22:21 #59675::
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 72Ho 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
-
12 Giugno 2011 alle 11:33 #59676
-
12 Giugno 2011 alle 11:52 #59677::
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!
-
12 Giugno 2011 alle 21:00 #59678::
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
-
-
AutoreRisposte
- Devi essere connesso per rispondere a questo topic.