- Questo topic ha 14 risposte, 3 partecipanti ed è stato aggiornato l'ultima volta 11 anni, 4 mesi fa da
claudio.
-
CreatoreTopic
-
25 Aprile 2015 alle 9:02 #101312
-
CreatoreTopic
-
AutoreRisposte
-
-
25 Aprile 2015 alle 15:22 #101313::
claudio” post=101073esiste un modo per generare delle parole in modo casuale, delle frasi composte da due o tre parole tipo un motto latino ?
il pacchetto lipsum non va bene dato che genera capoversi.
consigli?
claudioPer creare una stringa di parole latine prive di un senso qualunque, basta copiare e incollare un capoverso costruito con lipsum in un file PDF, con qualunque visualizzatore di file PDF si può selezionare del testo e incollarlo dove si vuole.
Il pacchetto kantlipsum fa le stesse cose del pacchetto lipsum, ma scrive in inglese dei brani tratti da un testo del filosofo Kant; le frasi hanno senso compiuto, non sono “latinorum” privo di senso come quello che si ottiene con lipsum.
Credo che esista una variante di lipsum per scrivere direttamente alcune parole tratte da quel pacchetto, ma non l’ho mai né cercato né usato, perché a me sembra una perdita di tempo. Per perderne un pochino di meno basta cercare ed aprire il file lipsum.sty e copiare direttamente da lì stringhe di poche parole.
-
25 Aprile 2015 alle 20:18 #101314
-
25 Aprile 2015 alle 21:20 #101315::
La sequenza di parole deve cambiare a ogni compilazione o restare sempre la stessa indipendentemente da quando il documento viene compilato?Una funzione che estrae una parola da un elenco potrebbe essere così concepita:
`
\newcommand*{\SostantivoNominativo}[1]{% #1 deve essere un numero!
\ifcase #1\relax
Lupus\or Leo \or Homo\or …%
\else
\typeout{Parametro fuori dai limiti!}%
\fi
}
`
Puoi definire una macro analoga chiamata [tt]\VerboIndicativoPresente[/tt] (amat/edit/…) e una chiamata [tt]\SostantivoAccusativo[/tt] (agnum/malum/…), e poi scrivere qualcosa come
`
\SostantivoNominativo{1} \VerboIndicativoPresente{2} \SostantivoAccusativo{1}.
\SostantivoNominativo{3} \VerboIndicativoPresente{2} \SostantivoAccusativo{2}.
`
per ottenere «Lupus edit agnum. Homo edit malum.», e cose del genere. Per come scegliere numeri casuali, rispondi prima alla mia domanda iniziale.Ciao.
—
Gustavo
-
26 Aprile 2015 alle 10:27 #101316::
ho risolto così
`
\documentclass{article}
\begin{filecontents*}{elenco4.csv}
n;citazione
1;A bene placito
2;A capite ad calcem
3;A cruce salus
4;A Deucalione
5;A fortiori ratione
6;A latere
7;A mari usque ad mare
8;A mortuo tributum exigere
9;A pedibus usque ad caput
10;A posse ad esse non valet consequentia
11;A quo
12;Ab aestu et tempestate
13;Ab aeterno
14;Ab antiquo
15;Ab assuetis non fit passio
16;Ab epistulis
17;Ab hoc et ab hac
18;Ab illo tempore
19;Ab imis
20;Ab immemorabili
\end{filecontents*}
%\usepackage[first=1, last=20,counter=die]{lcg}
\usepackage[utf8]{inputenc}
\usepackage{datatool}
\DTLsetseparator{;}
\DTLloaddb{myDB}{elenco4.csv}
\newcommand{\cesare}[1]{%
\ifthenelse{#1<\DTLrowcount{myDB}}{% \DTLforeach {myDB} {\n=n,\citazione=citazione}{% \ifthenelse{\DTLiseq{\n}{#1}} {\citazione} {}% }% }{}}% % \newcommand{\oracolo}{ \cesare{\pdfuniformdeviate 20}} \begin{document} come disse \cesare{15} faremo \oracolo \end{document} ` il problema è la funzione per il random che è compilatore dipendente che usare in alternativa? ciao claudio -
26 Aprile 2015 alle 11:28 #101317::
claudio” post=101081ho risolto così
`
\documentclass{article}
\begin{filecontents*}{elenco4.csv}
n;citazione
1;A bene placito
2;A capite ad calcem
3;A cruce salus
4;A Deucalione
5;A fortiori ratione
6;A latere
7;A mari usque ad mare
8;A mortuo tributum exigere
9;A pedibus usque ad caput
10;A posse ad esse non valet consequentia
11;A quo
12;Ab aestu et tempestate
13;Ab aeterno
14;Ab antiquo
15;Ab assuetis non fit passio
16;Ab epistulis
17;Ab hoc et ab hac
18;Ab illo tempore
19;Ab imis
20;Ab immemorabili
\end{filecontents*}
%\usepackage[first=1, last=20,counter=die]{lcg}
\usepackage[utf8]{inputenc}
\usepackage{datatool}
\DTLsetseparator{;}
\DTLloaddb{myDB}{elenco4.csv}
\newcommand{\cesare}[1]{%
\ifthenelse{#1<\DTLrowcount{myDB}}{% \DTLforeach {myDB} {\n=n,\citazione=citazione}{% \ifthenelse{\DTLiseq{\n}{#1}} {\citazione} {}% }% }{}}% % \newcommand{\oracolo}{ \cesare{\pdfuniformdeviate 20}} \begin{document} come disse \cesare{15} faremo \oracolo \end{document} ` il problema è la funzione per il random che è compilatore dipendente che usare in alternativa? ciao claudioOttimo. Ma perché fare ogni volta un ciclo attraverso la base di dati? Usa [tt]\dtlgetrow[/tt]:
`
\documentclass{article}
%\usepackage[first=1, last=20,counter=die]{lcg}
\usepackage[utf8]{inputenc}
\usepackage{datatool}
\DTLsetseparator{;}
\DTLloaddb{myDB}{elenco4.csv}
\newcommand{\cesare}[1]{%
\ifthenelse{#1<\DTLrowcount{myDB}}{% \dtlgetrow{myDB}{#1}% \dtlgetentryfromcurrentrow{\citazione}{2}% \citazione }{}% }% % \newcommand{\oracolo}{ \cesare{\pdfuniformdeviate 20}} \begin{document} come disse \cesare{14} faremo \oracolo \end{document} ` Appare verosimile (ma non lo so con certezza) che la primitiva [tt]\pdfuniformdeviate[/tt] restituisca numeri pseudo-casuali di qualità superiore al semplice generatore a congruenza lineare usato dal pacchetto lcg (che è poi esattamente lo stesso che si trova nel vecchio [tt]random.tex[/tt]); tuttavia, poiché la qualità del generatore non è un parametro critico per un’applicazione come questa 🙂 , penso che tu possa usare tranquillamente lcg, che impiega soltanto l’aritmetica intera presente su ogni compilatore TeX.Attento, però, che`\pdfuniformdeviate 20`ritorna un intero compreso fra 0 e 19, non fra 1 e 20.
Ciao.
—
Gustavo
-
26 Aprile 2015 alle 11:36 #101318::
grazie
ecco le modifiche
solo che non riesco a domare lcg 🙂
`
\documentclass{article}
\usepackage[first=1, last=20,counter=die]{lcg}
\usepackage[utf8]{inputenc}
\usepackage{datatool}
\DTLsetseparator{;}
\DTLloaddb{myDB}{elenco2.csv}
\newcommand{\cesare}[1]{%
\ifthenelse{#1<\DTLrowcount{myDB}}{% \dtlgetrow{myDB}{#1}% \dtlgetentryfromcurrentrow{\citazione}{2}% \citazione }{}% }% % \newcommand{\oracolo}{ \cesare{\pdfuniformdeviate 20}} \rand\cesare{rand}} \begin{document} come disse \cesare{14} faremo \oracolo \end{document} ` non compila claudio -
26 Aprile 2015 alle 11:51 #101319::
Se chiedi al pacchetto lcg di usare come contatore il contatore [tt]die[/tt]`\usepackage[first=1, last=20,counter=die]{lcg}`poi dovrai usare questo contatore, non [tt]rand[/tt]. Inoltre, bisogna “estrarre” il valore dal contatore e, probabilmente per ragioni, a me ancora sconosciute, inerenti al funzionamento interno di datatool, sembra che [tt]\usecounter[/tt] non sia adatto allo scopo. Io ho risolto così:
`
\documentclass{article}
\usepackage[first=1, last=20,counter=die]{lcg}
\usepackage[utf8]{inputenc}
\usepackage{datatool}
\DTLsetseparator{;}
\DTLloaddb{myDB}{elenco4.csv}
\newcommand{\cesare}[1]{%
\ifthenelse{#1<\DTLrowcount{myDB}}{% \dtlgetrow{myDB}{#1}% \dtlgetentryfromcurrentrow{\citazione}{2}% \citazione }{}% }% % \newcommand{\oracolo}{\rand \cesare{\arabic{die}}} \begin{document} come disse \cesare{14} faremo \oracolo \end{document} ` Ciao. -- Gustavo -
26 Aprile 2015 alle 12:04 #101320::
È perché sono una bestia 😳 : non è`\usecounter{die}`ovviamente, bensì`\value{die}`[tt]\usecounter[/tt] si usa con l”ambiente [tt]list[/tt]! Che topica, ragazzi! 😆Dunque:
`
\documentclass{article}
\usepackage[first=1, last=20,counter=die]{lcg}
\usepackage[utf8]{inputenc}
\usepackage{datatool}
\DTLsetseparator{;}
\DTLloaddb{myDB}{elenco4.csv}
\newcommand{\cesare}[1]{%
\ifthenelse{#1<\DTLrowcount{myDB}}{% \dtlgetrow{myDB}{#1}% \dtlgetentryfromcurrentrow{\citazione}{2}% \citazione }{}% }% % \newcommand{\oracolo}{\rand \cesare{\value{die}}} \begin{document} come disse \cesare{14} faremo \oracolo \end{document} ` Chiedo scusa per la svista. Ciao. -- Gustavo -
26 Aprile 2015 alle 13:08 #101321::
Sicuramente ti è sfuggito qualcosa; il contatore die serve per simulare i lanci di un dado (die in inglese) quindi gli interi casuali generati sono fra 1 e 6. Così dice la documentazione.La documentazione dice anche che l’algoritmo è implementato con l’aritmetica interna di TeX, e i limiti imposti al valore minore e al valore maggiore, nonché alla loro differenza dipendono dal fatto che l’aritmetica intera di TeX ha quei limiti. Quindi la domanda
il problema è la funzione per il random che è compilatore dipendente
che usare in alternativa?non è rilevante.
D’altra parte mi pare che il problema sia risolto, a parte l’uso del contatore die. A meno che non sia sfuggito qualcosa a me, bene inteso,…
Io ho dovuto generare speso numeri casuali, ma mi sono guardato bene di usare qualuque cosa che usi l’aritmetica interna di TeX; in questo caso, dove il numero casuale non è determinate, anche lcd può bastare, ma in altri contesti preferisco ricorrere ad un programma esterno e a generare i numeri casuali con un programma serio di matematica; se sapessi usare LuaLaTeX e il linguaggio Lua, probabilmente userei quello, ma Lua ancora mi sfugge…:sad:
Ultima mento ho dovuto permutare in modo casuale e senza ripetizioni più di 500 file da immettere in un documento composto con XeLaTeX; XeLaTeX non e responsabile della mia scelta, ma il programma scritto con un linguaggio serio per la matematica funziona benissimo e impiega il tempo di un battito di ciglio. Bisogna solo usare con sicurezza la funzionalità dello shell-escape non protetto.
-
26 Aprile 2015 alle 14:46 #101322::
OldClaudio” post=101089Sicuramente ti è sfuggito qualcosa; il contatore die serve per simulare i lanci di un dado (die in inglese) quindi gli interi casuali generati sono fra 1 e 6. Così dice la documentazione.
Ovviamente il pacchetto lcg non capisce l’inglese 😉 e per lui [tt]die[/tt] è solo un nome come un altro nel quale memorizzare il numero casuale generato. Non è obbligatorio usarlo solo per numeri tra 1 e 6. Certo che non si vede perché non si possa usare semplicemente il contatore di default del pacchetto, chiamato [tt]rand[/tt].
OldClaudio” post=101089[…]
Io ho dovuto generare speso numeri casuali, ma mi sono guardato bene di usare qualuque cosa che usi l’aritmetica interna di TeX; in questo caso, dove il numero casuale non è determinate, anche lcd può bastare, ma in altri contesti preferisco ricorrere ad un programma esterno e a generare i numeri casuali con un programma serio di matematica […]Qui, ripeto, tiro a indovinare senza saperlo con certezza, ma penso (o per lo meno: mi sembra logico pensare) che la primitiva [tt]\pdfuniformdeviate[/tt] di pdfTeX sia implementata usando funzioni di libreria “allo stato dell’arte”, e che quindi ritorni interi pseudo-casuali di qualità paragonabile a quella ritornata da altri programmi, i quali, presumibilmente, usano le medesime librerie.
Ciao.
—
Gustavo
-
26 Aprile 2015 alle 16:45 #101323::
letteracdp” post=101093
Io ho dovuto generare speso numeri casuali, ma mi sono guardato bene di usare qualunque cosa che usi l’aritmetica interna di TeX; in questo caso, dove il numero casuale non è determinate, anche lcd può bastare, ma in altri contesti preferisco ricorrere ad un programma esterno e a generare i numeri casuali con un programma serio di matematica […]
Qui, ripeto, tiro a indovinare senza saperlo con certezza, ma penso (o per lo meno: mi sembra logico pensare) che la primitiva [tt]\pdfuniformdeviate[/tt] di pdfTeX sia implementata usando funzioni di libreria “allo stato dell’arte”, e che quindi ritorni interi pseudo-casuali di qualità paragonabile a quella ritornata da altri programmi, i quali, presumibilmente, usano le medesime librerie.
No, sicuramente l’algoritmo usato da lcg non è preso da funzioni di libreria, perché comunque anche pdftex di cui quel comando è un comando nativo, non può essere lo stesso identico di programmi che lavorano in floating point e con almeno 64 bit di lunghezza di parola; pdftex lavora in aritmetica intera a 32bit, che cerca di simulare i numeri fratti assumendo che i 16 bit meno significativi rappresentino la parte fratta; quindi è una aritmetica binaria a virgola fissa, l’equivalente di un numero decimale con 5 cifre prima e cinque cifre dopo la virgola fissa; e lavorando a virgola fissa puoi disquisire sull’errore assolto che pioi accumulare sui bit meno significativi, ma non puoi parlare di precisione relativa dei calcoli; non puoi dire che disponi di 10 cifre decimali significative, perché gli zeri a sinistra non contano; in floting point puoi parlare di precisione relativa e di cifre significative e le cifre della cosiddetta mantissa, sono tutte significative; ovviamente accumulando calcoli su numeri già frutto di calcoli, la precisione relativa diminuisce, ma ne è stimabile il degrado; con la virgola fisse tutto ciò è impossibile, specialmente lavorando con numeri piccoli. Se ne accenna nella documentazione di lcg con un generico richiamo all’aritmetica interna di TeX e del numero massimo di bit per ogni parola che si possono usare, oltre che mediante la specificazione dell’intervallo massimo in cui può cadere la differenza fra il minimo numero e il massimo numero del range intero dentro il quale eseguire l’estrazione dei numeri casuali.
Ma, come dici tu, e come ho notato anch’io, lo scopo di estrazione casuale di stringhe di parole latine da un database con pochi dati (20 nel tuo esempio), per giunta senza escludere estrazioni identiche, è perfettamente adeguato; quindi il codice LaTeX che hai proposto va benissimo per questo scopo.
Claudio
-
26 Aprile 2015 alle 18:02 #101324::
OldClaudio” post=101098No, sicuramente l’algoritmo usato da lcg non è preso da funzioni di libreria […]
Aspetta, aspetta, non facciamo confusione: io parlavo della primitiva [tt]\pdfuniformdeviate[/tt] di pdfTeX, non del pacchetto lcg: quest’ultimo, per l’appunto, usa un semplice generatore a congruenza lineare (whence the name) basato sull’aritmetica intera del TeX.
Ripeto: non so nulla di come sia implementata la primitiva [tt]\pdfuniformdeviate[/tt]. Nulla vieta che sia internamente basata su aritmetica ad alta precisione e che poi alla fine restituisca un intero pseudocasuale compreso fra 0 (incluso) e il suo argomento (escluso); ma con ciò intendo solo dire quale sarebbe l’implementazione desiderabile… 🙂
Ciao.
—
Gustavo
-
26 Aprile 2015 alle 18:38 #101325
-
27 Aprile 2015 alle 17:20 #101326::
da segnalare quanto segue
ho un cvs con 1300 voci
utilizzando datatooltk e controvertendolo nel formato texdb
ho ottenuto un aumento nella
velocità di compilazione mostruosoecco il nuovo codice
`
\documentclass{article}
\usepackage[first=1, last=395,counter=die]{lcg}
\usepackage[utf8]{inputenc}
\usepackage{datatool}
\DTLloaddbtex{\myDB}{citazioni.dbtex}
\newcommand{\cesare}[1]{%
\ifthenelse{#1<\DTLrowcount{\myDB}}{% \dtlgetrow{\myDB}{#1}% \dtlgetentryfromcurrentrow{\citazione}{2}% \citazione }{}% }% % \newcommand{\oracolo}{\rand \cesare{\value{die}}} \begin{document} come disse \cesare{14} faremo \oracolo \oracolo \end{document} ` ciao claudio
-
-
AutoreRisposte
- Devi essere connesso per rispondere a questo topic.