- Questo topic ha 10 risposte, 4 partecipanti ed è stato aggiornato l'ultima volta 14 anni, 9 mesi fa da
antonio.macrì.
-
CreatoreTopic
-
20 Novembre 2011 alle 9:14 #66391::
Avrei la necessità di scrivere una serie di nomi con particolari formati, c’è modo in latex di definire uno o più dizionari in cui le parole definite all’interno hanno tutte lo stesso stile?
La soluzione più simile che ho pensato è definire un comando nuovo per ogni parola e mi andrebbe anche bene se fossero 3-4 parole xD ma sono una ventina e come soluzione non mi pare la più ottimale.
Suggerimenti?
-
CreatoreTopic
-
AutoreRisposte
-
-
20 Novembre 2011 alle 9:29 #66392::
Stai parlando di glossari o di voci come in un dizionario vero e proprio?Innanzi tutto, se lo stile ti aggrada basta usare l’ambiente description (per una ventina di lemmi dovrebbe essere più che sufficiente); se non ti va il nero con grazie, e vuoi, per esempio il nero senza grazie, copiati la definizione di \description label nel tuo preambolo (o all’inizio di un gruppo che racchiude il tuo ambiente description} e aggiungi oltre alla dichiarazione \bfserie la dichiarazione \sffamily. Se vuoi il font medio senza grazie togli \bfseries e lascia \sffamily; e puoi fare questo usando le dichiarazioni che vuoi (non i comandi del tipo \texsf{…}). Se devi cambiare lo stile della scrittura da un “dizionario all’altro} usa un diversa ridefinizione di \descriptionlabel mantenendo la ridefinizione sempre solo dentro al gruppo che si riferisce al particolare dizionario.
Che cosa è un gruppo? Questo
`
\begingroup
…
\endgroup
`Se usi un glossario ti suggerisco il pacchetto glossaries leggendone la documentazione con texdoc glossaries.
-
20 Novembre 2011 alle 23:50 #66393::
Credo di non essermi spiegato bene xD
Io ho più insiemi di parole che voglio siano formattate allo stesso modo. Per esempio ho 2 insiemi del tipoInsieme 1:
cane, gatto, topo
Insieme 2:
tavolo, penna, matitae voglio che le parole nell’insieme 1 siano sempre in grassetto e quelle nell’insieme 2 sottolineate. Siccome ho la necessità di poter aggiungere e togliere parole dagli insiemi, mi è scomodo creare un comando per ogni parola (ad esempio \cane, \gatto ecc.) e pure creare comandi per ogni insieme (\insieme1{parola}, \insieme2{parola}) perchè allora se sposto una parola da un insieme all’altro dovrei sostituire in tutto il testo. Quindi mi chiedevo se ci fosse il modo di definire questi “insiemi” di modo che ogni volta io scrivo “cane” e poi compilo, mi generei “cane“. Oppure, se non fosse possibile una cosa così trasparente, ce esiste il modo di definire una “hashtable” del tipo \myhash{cane} e mi resituisce \textbf{cane} (e quindi “cane“).
Spero di essere stato più chiaro adesso 😀
-
21 Novembre 2011 alle 9:40 #66394::
Quindi i tuoi dizionari sono solo insiemi di parole, senza descrizione, magari in linea e separati da virgole?
Definire \insiemen{…} che ti permetta di usare la lista di parole in un modo particolare ma senza applicarlo con un comando apposta ad ogni parola non è difficile, il difficile, caso mai è fare si che la virgola non sia trattata come le parole dell’insieme. Se mi confermi, ci penso su.PS: se puoi evitare di sottolineare sarebbe meglio, perché in tipografia “vera” non si sottolinea mai; certo per esigenze speciali… Ma con la scelta di font che LaTeX ti consente, tra forme e serie, compresa la famiglia del typewriter type a spaziatura variabile, hai una dozzina di varietà diverse senza bisogno di sottolineare.
-
21 Novembre 2011 alle 10:06 #66395::
Da quello che ho capito io, Alessandro cerca una soluzione tipo un comando \formatta{cane} che, a seconda che la parola cane si trovi definita in una lista piuttosto che nell’altra, applichi ad ogni ricorrenza di “cane” nel testo, la formattazione comune che è stata scelta per tutti gli elementi di quella lista; in modo tale che, semplicemente spostando “cane” da una lista all’altra, si possa cambiare la formattazione a tutte le sue ricorrenze nel testo.
-
21 Novembre 2011 alle 10:10 #66396::
Come vengano definiti sintatticamente questi esempi in latex non mi importa molto, non mi faccio problemi se ha bisogno di virgole o altro, l’importante è che poi le parole nell’insieme N siano tutte formattate nella maniera definita per l’insieme N e che poi se la tal parola la sposto nell’insieme M allora sia formattata sempre come definito nell’insieme M.
Questa esigenza viene dal fatto che nel testo che devo scrivere uso delle parole particolari che vorrei avessero una resa loro, come ad esempio avviene per l’uso delle parole straniere in latex. Solo che non ho una vera e propria lingua di riferimento, per cui possa dividere queste parole per lingua e quindi usando un comando nuovo per ogni insieme \insiemeN{} e dovrò avere la libertà di spostare le parole senza dover cambiare ogni volta il comando da \insiemeN{parola} a \insiemeM{parola}.
Se dovessi farlo in Java userei una hashtable (opportunamente definita) xD come detto prima, di modo che nel testo chiamerei la funzione passando come chiave la parola stessa retituendomi direttamente la parola con la formattazione voluta. In Latex non so sia possibile fare una cosa del genere, essendo io alle prime armi conosco poco o nulla sulla programmazione in latex (che mi dicono essere Turing Completo).EDIT:
@Liverpool: esattamente quello che hai detto tu! 😀
-
21 Novembre 2011 alle 10:47 #66397::
Prova questo codice, negli esempi gli spazi dopo le virgole sono necessari:
`
\documentclass{article}\makeatletter
\newcommand\lista[2][\upshape]{\def\fontlista{#1}\@lista#2,!}
\def\@lista#1,#2,#3!{\def\@tempA{#2}\def\@tempB{{\fontlista #1}}\def\@tempC{{\fontlista #1},\@lista#2,#3,!}
\ifx\@tempA\empty\expandafter\@firstoftwo\else\expandafter\@secondoftwo\fi\@tempB\@tempC}\begin{document}
\lista[\bfseries]{pippo, pluto, paperino}\lista[\scshape]{topo, ratto, mustelide}
\end{document}
`In questo modo la lista ti viene formattata, tranne le virgole, in nero nel primo esempio, e in maiuscoletto nel secondo; l’importante è che il primo argomento facoltativo sia formato da una o più dichiarazioni relative ai font, tipo \large, \upshape, \itshape \sffamily, eccetera, anche più di una, ma non siano usati i relativi comandi, come per esempio \textbf, che richiedono un argomento (si potrebbe definire la macro \@lista differentemente per usare questa possibilità ma bisognrebbe usare dichiarazioni lo stesso se se ne devono usare più di una.
Poi naturalmente ti puoi deifnire dei comandi più semplici come interfaccia tra te e il comando \lista, per esempio
`
\newcommand\insiemeA{\lista[\fseries]}
\newcoomand\insiemeB{\lista[\scshape]}
\newcommand\insiemeC{\lista[\bfseries\itshape]}
…
`
scegliendo al posto di \insiemeA, \insiemeB,…, dei nomi mnemonici più adatti. Tieni presente che la lista dei nomi può contenere anche un solo nome.
-
21 Novembre 2011 alle 12:28 #66398::
Forse intende qualcosa di questo tipo:
`\documentclass{article}\usepackage{etoolbox}
\makeatletter
\newcommand{\declarelist}[3]{%
\listadd{\lists@}{list@#1}%
\forcsvlist{\listcsadd{list@#1}}{#3}%
\csdef{list@#1@font}{#2}}
\def\lists@find#1{%
\xifinlistcs{\lists@tofind}{#1}%
{\csname #1@font\endcsname{\lists@tofind}}{}}
\newcommand\formatitem[1]{%
\def\lists@tofind{#1}%
\forlistloop{\lists@find}{\lists@}}
\makeatother\declarelist{disney}{\textbf}{pippo, pluto, paperino}
\declarelist{animals}{\textsc}{topo, ratto, mustelide}\begin{document}
\formatitem{pippo}, \formatitem{ratto}
\end{document}`Ok che magari il codice fa schifo e potrebbe essere migliorato… 🙂
Se servono, si possono anche creare comandi che consentano di spostare elementi da una lista all’altra o che stampano una lista per intero…
Ciao,
Antonio
-
23 Novembre 2011 alle 13:03 #66399::
@antonio.macrì: grazie mille funziona!
@old.antoio: grazie ma non credo di aver intuito come funziona xD@entrambi: potreste gentilmente se potete xD spiegarmi come funzionani i vostri codici (cosa e come fanno in pratica) così almeno magari mi si chiarisce come funziona la programmazione latex? grazie 😀
-
23 Novembre 2011 alle 14:52 #66400::
L’importante è che funzioni, ma il mio comando \@lista, quello che fa tuto il lavoro, si appoggia ad una funzionalità del linguaggio primitivo di TeX, quindi è difficile da capire.
Cerco di spiegarmi, anche se trovi una spiegazione migliore con altri esempi se cerchi nella cartella di ArsTeXnica il mio articolo sugli “Argomenti delimitati.In poche parole (e poche parole non bastano) \@lista prende una lista di nomi separati da virgole che funzionano da delimitatori degli argomenti; il punto esclamativo alla fine funziona da delimitatore finale. Allora i tre argomenti di \@lista separano il primo nome prima della prima virgola, il secondo nome prima della seconda virgola e poi tutto il resto fino alla fine. Se il secondo argomento è vuoto, vuol dire che il primo argomento era l’ultimo della lista, quindi lo emette pronto per essere stampato; se invece il secondo non è vuoto lo emette seguito da una virgola e poi uno spazio e infine richiama se stesso (\@lista) rimettendo in file il secondo e il terzo argomento. L’argomento facoltativo di \lista contiene la dichiarazione con cui viene specificato la serie, la forma, volendo la famiglia e il corpo del nome da stampare, quindi il primo o unico elemento della lista viene in realtà emesso dentro un gruppo e preceduto dalla dichiarazione o dalla dichiarazioni relative ai font da usare; siccome queste dichiarazioni compaiono dentro un gruppo esse valgono solo dentro il gruppo e non si propagano fuori.
Si può fare di meglio, ma ho scritto il codice di getto e non sono stato lì a rifinire; ci sono altri comandi primitivi di TeX o di plain TeX che lavorano a basso livello, una specie di linguaggio macchina, ma che permettono di fare altri giochetti del genere e forse in modo più efficiente.
Io ti suggerirei di non preoccuparti troppo di queste cose; prima di imparare a scriverle tu stesso/a ci vuole del tempo e molta pratica (quindi anche molti errori…); bisogna studiare gli Elementi di programmazione in TeX e LaTeX di Enrico; poi bisogna approfondire nel TeXbook; è lunga, molto lunga questa strada; la si accorcia se si ha una forte passione per questo tipo di programmazione con un linguaggio interpretato e sulla base delle conoscenze informatiche che si possono già possedere. Io per esempio non ho nessuna nozione di Java o di Python, nemmeno di Bash (tutti linguaggi interpretati), che oggi fanno parte del normale curriculum di studi per studenti universitari, non necessariamente nei corsi di laurea di informatica delle facoltà di scienze o di ingegneria. Quindi ci ho messo molto tempo; siccome ho cominciato quasi 30 anni fa, di tempo ne ho avuto molto…
-
23 Novembre 2011 alle 14:57 #66401::
xela” post=65617 @antonio.macrì: grazie mille funziona!
@old.antoio: grazie ma non credo di aver intuito come funziona xD@entrambi: potreste gentilmente se potete xD spiegarmi come funzionani i vostri codici (cosa e come fanno in pratica) così almeno magari mi si chiarisce come funziona la programmazione latex? grazie 😀
Senza scender troppo nei dettagli, innanzitutto \makeatletter e \makeatother servono per poter usare la chiocciola nei nomi dei comandi (un po’ come per dire: quel codice non lo devi usare direttamente! :)).
`\newcommand{\declarelist}[3]{%
\listadd{\lists@}{list@#1}%
\forcsvlist{\listcsadd{list@#1}}{#3}%
\csdef{list@#1@font}{#2}}`
Ogni volta che chiami \declarelist, viene aggiunto il nome della lista (disney o animals: in realtà viene aggiunto list@disney o list@animals) ad una lista chiamata \lists@ (che, diciamo, è una lista di primo livello). Quindi si prende ogni elemento che viene passato (pippo, pluto, …) e lo si aggiunge alle liste di secondo livello (list@disney e list@animals). Infine si memorizza per ogni lista di secondo livello il font che hai specificato. Vediamo \formatitem:
`\newcommand\formatitem[1]{%
\def\lists@tofind{#1}%
\forlistloop{\lists@find}{\lists@}}`
Viene messo nella “variabile” \lists@tofind il nome da formattare, quindi lo cerchiamo chiamando, per ogni lista di secondo livello che sta in \lists@, il seguente comando:
`\def\lists@find#1{%
\xifinlistcs{\lists@tofind}{#1}%
{\csname #1@font\endcsname{\lists@tofind}}{}}`
che non fa altro che scorrere la lista finché non trova il comando e, se lo trova, lo stampa con il font che era stato salvato all’inizio.Comunque ripeto che il codice probabilmente può essere migliorato. Sono comandi presi dal pacchetto etoolbox, puoi leggerne la documentazione scrivendo texdoc etoolbox da shell/prompt dei comandi.
Comunque, se non ti serve stampare una lista per intero, ma ti serve solo un comando tipo \formatitem, il codice si riduce di molto. (In sostanza in questo codice i nomi delle liste, disney, animals, eccetera, potrebbero essere benissimo ignorati e tutto funzionerebbe lo stesso.) Al contrario se devi fare cose più complesse anche il codice può complicarsi un bel po’ 🙂
Ciao
-
-
AutoreRisposte
- Devi essere connesso per rispondere a questo topic.