- Questo topic ha 5 risposte, 3 partecipanti ed è stato aggiornato l'ultima volta 6 anni, 6 mesi fa da
Marco Riggirello.
-
CreatoreTopic
-
22 Febbraio 2020 alle 16:28 #117314::
Scrivendo una relazione di laboratorio mi trovo a dover trattare alcune tabelle di dati, contenuti in un file txt strutturato in modo simile a questo
`
#a da
1.2345 0.003
2.3456 1.1
3.4567 0.02
4.5678 0.0006
`
dove “a” è il dato e “da” è la sua incertezza. Per tabulare senza troppo intervento manuale questi dati ho pensato di usare il pacchetto PgfplotsTable. Non riesco però a figurarmi come trattare correttamente l’arrotondamento dei dati: il pacchetto infatti permette di specificare la “precision” per ogni colonna, mentre nel mio caso servirebbe specificare il numero di cifre significative per ogni componente della tabella.(anche se è una possibile soluzione, preferisco non modificare il file txt)
-
CreatoreTopic
-
AutoreRisposte
-
-
24 Febbraio 2020 alle 7:33 #117315::
MarcoRiggirello” post=117733Scrivendo una relazione di laboratorio mi trovo a dover trattare alcune tabelle di dati, contenuti in un file txt strutturato in modo simile a questo
`
#a da
1.2345 0.003
2.3456 1.1
3.4567 0.02
4.5678 0.0006
`
dove “a” è il dato e “da” è la sua incertezza. Per tabulare senza troppo intervento manuale questi dati ho pensato di usare il pacchetto PgfplotsTable. Non riesco però a figurarmi come trattare correttamente l’arrotondamento dei dati: il pacchetto infatti permette di specificare la “precision” per ogni colonna, mentre nel mio caso servirebbe specificare il numero di cifre significative per ogni componente della tabella.(anche se è una possibile soluzione, preferisco non modificare il file txt)
Ciao.
Puoi postare tra i tag code un esempio minimo compilabile del grafico?
Altrimenti non riesco ad aiutarti.
Grazie.
R.
-
28 Febbraio 2020 alle 13:16 #117316::
certamente, ecco qui`
\documentclass{article}\usepackage{pgfplotstable}
\begin{filecontents}{tabella.txt}
#V dV
1.23450 0.0002
2.34560 0.1
3.45670 0.004
\end{filecontents}\begin{document}
Quello che vorrei ottenere:
\begin{tabular}{c}
$V$ \\
$1.2345 \pm 0.0002$ \\
$2.3 \pm 0.1$ \\
$3.457 \pm 0.004$
\end{tabular}Va anche bene:
\begin{tabular}{cc}
$V$ & $\Delta V$ \\
1.2345 & 0.0002 \\
2.3 & 0.1 \\
3.457 & 0.004
\end{tabular}Quello che riesco a ottenere:
\pgfplotstabletypeset[
columns/0/.style={
column name={V}, precision=4},
columns/1/.style={
column name={$\Delta V$}},
]{tabella.txt}\end{document}
`Spero che cosi’ sia piu’ chiaro il mio problema.
-
28 Febbraio 2020 alle 14:34 #117317::
Ho usato pgplots abbastanza poco, anche se ho ottenuto qualche bel risultato. Tuttavia non mi considero affatto un esperto e rispondo senza fare riferimento a pgfplots.Chi mi legge qui nel forum e negli articoli che scrivo si ArsTeXnica o nelle guide tematiche, sa che io preferisco usare l’ambiente picture, nativo di LaTeX, sia pure arricchito con le varie estensioni fornite dai pacchetti pict2e (l’ultima versione del quale elimina tutte le restrizioni dell’ambiente originale (e non erano poche)) e aggiunge altre macro per disegnare nell’ambiente picture; già nel 2006 avevo ulteriormente esteso le funzionalità di pict2e, scrivendo il pacchetto curve2e, che estende moltissimo le funzionalità dell’ambiente picture, ma, che, secondo me, mette a disposizione dell’utente na quantità di strumenti, con i quali egli può costruirsi macro ad hoc per fare cose ancora più avanzate.
Assolutamente non voglio dire che picture +pict2e + curve2e sia la panacea di tutte le difficoltà che nascono cercando di ottenere il meglio da pgfplots e da tikz. Dico solo che con questa terna di ambiente e pacchetti si possono fare moltissime cose leggendo documentazioni di poche decine di pagine; compresi i disegni la documentazione di pict2e (che contiene anche quella di picture) ammonta a 39 pagine; quella dell’ “user manual” di curve2e ammonta a 25 pagine, compresi i disegni. Direi che quest’ultimo manuale contiene anche il necessario per usare i vecchi e i nuovi comandi di picture e di pict2e, magari non con lo stesso dettaglio, ma in modo abbastanza utile.Detto questo, mi parrebbe che il disegno che vuoi fare si potrebbe realizzare usando anche solo pict2e, meglio ancora se si usa curve2e. Il concetto, secondo me, è quello di rendere in forma grafica la tua prima tabella dove ogni elemento da rappresentare è definito da un valore e da una fascia di incertezza; per generalità chiamiamo il primo V e il secondo D. Usando curve2e puoi definire una macro che contenga quello che qui descrivo solo con singoli comandi elementari:`\documentclass[…]{…}
…
\usepackage[curve2e}
…
\begin{document}
…
\begin{figure)[…]
\centering\unitlength=0.07\linewidth % unità di misura del disegno
\begin{picture}(10,7) % dimensioni del disegno in totale 7/10 della larghezza del blocco testo e la stessa poprozione per l'altezza, rispetto alla larghezza
\VECTOR(0,0)(10,0)\Zbox(10,0)[t]{$x$} % al posto di x [ipo metterci qualunque altro simbolo, anche niente, se vuoi
\VECTOR(0,0)(0,7)\Zbox(0,7)[l]{$V \pm D$} % etichetta delle ordinate (fra parentesi quadre c'è una “L” minuscola
\put(i,Vi){\circle*{0.1}}\put(i,Vi+Di){\circle*{0.07}}\put(i, Vi-Di){\circle*{0.07}}% per i, Vi, e Di vedi sotto
\put(i,Vi-Di){line(0,1){2Di}}% per 2Di vedi sotto
… % ripeti quante volte vuoi
\end{picture}
\end{figure}
…
\end{document}`Attento: è solo un paradigma, non è codice completo e collaudato.
Tieni presente che nel codice precedente:
a) i è un numero intero progressivo da incrementare per ogni valore che vuoi mettere nel diagramma; se ne devi mettere più di 9 ti conviene usare per i dei valori fratti in modo che l’ultimo della serie sia inferiore a 10; se invece in ascisse devi riportare il nome di una variabile, allora la cosa è legata alla variabile stessa, ma sostanzialmente si tratta di mettere un nome sotto ad ogni “barra” dell’istogramma che non è formatto da colonnine rettangolari, ma da pallini grossi al centro di una linea verticale che termina su pallini piccoli, e che “disegna” l’incertezza mediante questa linea verticale
b) Vi e Di sono i valori assoluti della i-esima variabile V e del suo valore di incertezza.
c) 2Di è l’intero intervallo di incertezza. Se non ti va di eseguire il calcolo, nella macro che puoi definirti puoi mettere due linee verticali lunghe Di ma una con la direzione 1 e l’altra con direzione -1, entrambe che partono da Vi, invece di una sola linea verticale che parte da Vi-Di, in verticale, ma con lunghezza 2Di, come ho indicato io nel paradigma.Certo che sevi mettere nel diagramma non 4 valori con le incertezze come dalla tua tabella esemplificatrice, ma ne devi mettere decine o centinaia la cosa diventa più laboriosa da fare a mano, ma non sarebbe impossibile; ma certamente sarebbe molto più laboriosa da programmare.
-
28 Febbraio 2020 alle 18:10 #117318::
MarcoRiggirello” post=117779certamente, ecco qui
`
\documentclass{article}\usepackage{pgfplotstable}
\begin{filecontents}{tabella.txt}
#V dV
1.23450 0.0002
2.34560 0.1
3.45670 0.004
\end{filecontents}\begin{document}
Quello che vorrei ottenere:
\begin{tabular}{c}
$V$ \\
$1.2345 \pm 0.0002$ \\
$2.3 \pm 0.1$ \\
$3.457 \pm 0.004$
\end{tabular}Va anche bene:
\begin{tabular}{cc}
$V$ & $\Delta V$ \\
1.2345 & 0.0002 \\
2.3 & 0.1 \\
3.457 & 0.004
\end{tabular}Quello che riesco a ottenere:
\pgfplotstabletypeset[
columns/0/.style={
column name={V}, precision=4},
columns/1/.style={
column name={$\Delta V$}},
]{tabella.txt}\end{document}
`Spero che cosi’ sia piu’ chiaro il mio problema.
Ciao,
ti presento una soluzione indipendente da pgfplotstable e da qualsiasi altro pacchetto perché basata su Lua.
Per provarla dovrai compilare con LuaLaTeX.Ecco il codice di esempio:
In un file che chiamerai “lib.lua” salva il seguente codice:
`
local function parseline(l) –> table
local x, d = l:match(“^(.-)%s+(.-)$”)
return {x, d}
endlocal lib = {}
function lib.parsefile(fn) –>
local t = {}
t[#t + 1] = [[\begin{tabular}{c}]]
local fmt = “$%s \\pm %s$\\\\”
local isfirst = true
for line in io.lines(fn) do
local r = parseline(line)
if isfirst then
t[#t + 1] = string.format(fmt, r[1], r[2])
isfirst = false
else
t[#t + 1] = string.format(fmt, r[1], r[2])
end
end
t[#t + 1] = [[\end{tabular}]]
return t
end
print()
print(table.concat(lib.parsefile(“tabella.txt”), “\n”))
print()
return lib
`E poi nella stessa cartella salva un file test.tex con:
`
% !TeX program = LuaLaTeX
\begin{filecontents*}{tabella.txt}
V dV
1.2345 0.0002
2.3 0.1
3.457 0.004
\end{filecontents*}\documentclass{article}
\directlua{lib = require [[lib]]}\newcommand{\parsefile}[1]{\directlua{
local fn = [[#1]]
local t = lib.parsefile(fn)
tex.tprint(t)
}}\begin{document}
Quello che vorrei ottenere:\begin{tabular}{c}
$V \pm dV$ \\
$1.2345 \pm 0.0002$ \\
$2.3 \pm 0.1$ \\
$3.457 \pm 0.004$
\end{tabular}\bigskip
Quello che ottieni:\parsefile{tabella.txt}
\end{document}
`La libreria lib.lua contiene una manciata di linee di codice. Davvero breve.
Legge il file e separa sulla stessa riga un primo gruppo di caratteri da un secondo separati da uno o più caratteri spazio o tabulazioni.
Non si occupa se si tratta di numeri o testo, ma distingue solo la prima linea di fatto inutilmente ma con una modifica del codice, potrebbe tener conto di una diversa formattazione o regola di parsing.Ogni volta che viene letto il file, solo dimostrazione, la piccola libreria stampa a terminale il codice che viene generato.
Si può fare molto di più a seconda delle tue esigenze.
Ritengo quindi la tua domanda molto interessante perché:
— dimostra un uso di TeX in ambito professionale e non accademico;
— dimostra le potenzialità di Lua per il sistema TeX (e non è certo questa la prima dimostrazione).
Alla prossima.
R.
-
5 Marzo 2020 alle 13:31 #117319::
robitex” post=117781
Ritengo quindi la tua domanda molto interessante perché:
— dimostra un uso di TeX in ambito professionale e non accademico;
— dimostra le potenzialità di Lua per il sistema TeX (e non è certo questa la prima dimostrazione).
Alla prossima.
R.Beh, sono costretto a smentirti: queste tabelle servono per relazioni di laboratorio in ambito accademico 😀
Comunque sia il mio e’ un problema che puo’ presentarsi in ogni contesto dove i dati da presentare sono generati dopo una qualche manipolazione, sono frutto di analisi e/o sono troppi per aver la voglia di fare tutto a mano.In realta’ prima della pubbliazione della domanda avevo gia’ risolto il problema scrivendo un piccolo script in python che scrive su file i dati nella forma consona all’ambiente tabular; la mia curiosita’ riguardava la possibilita’ di gestire tutto il processo tramite LaTeX: le vostre risposte offrono diverse possibilita’, percio’ non posso far altro che ringraziarvi della disponibilita’.
Per quanto riguarda LuaTeX, non l’ho mai usato, potrebbe essere questa l’occasione per scoprirlo… 😉
-
-
AutoreRisposte
- Devi essere connesso per rispondere a questo topic.