- Questo topic ha 11 risposte, 2 partecipanti ed è stato aggiornato l'ultima volta 7 anni, 3 mesi fa da
MatteoF.
-
CreatoreTopic
-
16 Maggio 2019 alle 5:56 #115744::
Buongiorno,
ho la necessità di evidenziare alcuni lemmi nell’indice analitico mediante un asterisco.Ho definito la seguente macro
`\newcommand*\idxstar[1]{\leavevmode\llap{*\,}#1}`che utilizzo per la creazione delle voci asteriscate, nella forma σ@τ propria di MakeIndex, ovvero
`\index{@\idxstar{ }}` Premetto che ho competenze elementari nella programmazione di TeX/LaTeX e sicuramente il mio comando può essere migliorato in termini di efficienza ed eleganza del codice (ogni suggerimento è ben accetto).
La mia volontà, comunque, è quella di spingermi oltre e poter utilizzare un comando ([tt]\indexstar[/tt]) che risolva la formattazione del lemma in tutte le possibili configurazioni, da quella più semplice
`\indexstar{}`
a quella più complessa
`\indexstar{- !
! @ | }` Immagino che tutto ciò implichi un livello di programmazione molto avanzato.
Inoltre, si dovrebbe considerare la compatibilità con quei pacchetti e/o classi (es. [tt]imakeidx[/tt] o [tt]memoir[/tt]) che espandono le funzionalità standard di indexing e che ormai sono imprescindibili per la creazione di indici di una certa complessità.Qualcuno vuole provare a cimentarsi nell’impresa? 😛
- !
-
CreatoreTopic
-
AutoreRisposte
-
-
16 Maggio 2019 alle 20:42 #115745::
Usa il pacchetto xparse, studiantelo bene; i suoi comandi definiscono macro robuste. Il comando principe sarebbe `\NewDocumentCommand{\indexstar{ o o o m o}{}`
dove i primi tre argomenti opzionali sono vuoti di default se non li specicifchi e ne puoi testare il contenuto con \IfValueTF{}{}{}; ognuno sta per item, sub item, subsubitem. Quello mandatory è ovviamante la voce da indicizzare, e il quarto argomento opzionale contine l’encap. Ovviamente la definzione devi trovarteal da solo a seocnda di quello che vuoi fare con il tuo comando.
-
19 Maggio 2019 alle 12:04 #115746::
Grazie Claudio,
la mia intenzione era di creare un comando con un unico argomento obbligatorio, al pari del comando originale [tt]\index[/tt].In tal senso bisognerebbe riuscire ad analizzare l’argomento ed isolare quei token riconducibili al testo dell’indice oggetto della formattazione, in modo che`\indexstar{
- !
! @ | }`corrisponda a`\index{ - !
! @\cmd{ }| }`dove `\cmd{ }` sia la macro con le istruzioni di formattazione. Leggendo la documentazione (abbastanza scarna) di [tt]xparse[/tt] posso intuire che si potrebbe arrivare a qualcosa di buono (sfruttando ovviamente gli argomenti avanzati, tipo: [tt]\SplitArgument[/tt], u-type, e-type, …), ma veramente ho competenze troppo elementari per uscirne da solo 🙁
Grazie comunque per i suggerimenti.
Matteo
- !
-
19 Maggio 2019 alle 19:55 #115747::
A me non pare difficile; la butto lì senza collaudo, tanto per indicare come fare in generale, senza garantire che funzioni:`\NewDocumentCommand\indexstar{ o o o m o}{%
\IfValueTF{#1}{%
#1\IfValueTF{#2}{%
!#2\IfValueTF{#3}{%
!#3}{@}%
}{@}%
}{\relax@}#4\IfValueTF{#5}{|#5}{\relax}%
}`Ti ripeto: non l’ho collaudata: forse c’è qualcosa da aggiustare, ma l’idea è quella.
-
20 Maggio 2019 alle 5:37 #115748::
Claudio, il tuo comando prevede di utilizzare argomenti opzionali, ma è ciò che io non voglio fare.Come ho scritto nei post precedenti (forse mi sono spiegato male e me ne scuso) vorrei creare un comando con un unico argomento obbligatorio, mantenendo la stessa sintassi di [tt]\index[/tt].
Perché non ho interesse ad utilizzare un comando nella forma [tt]{ o o o m o }[/tt]?
Semplicemente perché scrivere`\indexstar[Norvegia][comuni][Osbroon]{Øsbroon}[textbf]` non semplificherebbe nulla rispetto a `\index{Norvegia!comuni!Osbroon@\idxstar{Øsbroon}|textbf}` (in cui [tt]\idxstar[/tt] è la macro di formattazione)Il vero automatismo sarebbe creare un comando che mantenga la normale sintassi di MakeIndex, in cui `\indexstar{Norvegia!comuni!Osbroon@Øsbroon|textbf}` corrisponda a `\index{Norvegia!comuni!Osbroon@\idxstar{Øsbroon}|textbf}`
Matteo
PS: esiste il pacchetto [tt]\xstring[/tt] per analizzare e manipolare stringhe di testo. Potrebbe essere la soluzione. Vedrò se avrò tempo e modo di proseguire nell’intento.
-
20 Maggio 2019 alle 5:52 #115749
-
20 Maggio 2019 alle 7:38 #115750::
Grazie Claudio per la perseveranza.Avevo già provato a ragionare sui delimited parameter di TeX (concetto inesistente in LaTeX).
Il problema è che la presenza dei caratteri che fungerebbero da delimitatori (sia [tt]@[/tt] che [tt]|[/tt]) è puramente facoltativa. Pertanto, un banale [tt]\indexstar{pippo}[/tt] andrebbe in errore.
Inoltre anche la sintassi del comando (nell’utilizzo delle graffe) cambia.Penso che la soluzione debba rimanere in un contesto LateX, con l’aiuto di un pacchetto che possa analizzare e manipolare l’argomento del comando. [tt]xstring[/tt]? [tt]l3regex[/tt]? Ma come ho già scritto: vedrò se avrò tempo e modo di proseguire nell’intento.
Matteo
-
20 Maggio 2019 alle 11:59 #115751::
Ma vedi che ti contraddici? O non ti esprimi in modo chiaro. O io non capisco quello che dici.Non voglio essere perseverante, ma se vuoi usare \indexstar come \indexstar{pippo}, sbagli la sintassi: devi scrivere \indexstar@{pippo}.
Invece se l’encap è facoltativo allora le cose cambiano e bisogna ricorrere ai grandi mezzi con un parser della stringa che passi a \indexstar. Posso pensare ad un’altra cosa:`% nel preambolo
\usepackage{etoolbox}
%
\def\indexstar#1@#2|#3?{\bgroup
\edef\x{\egroup\noexpand\index{#1@\idxstar{#2}\ifstrempty{#3}{}{|#3}}}\x}`Controlla che ci siano tutte el graffe aperte e chiuse.Il gichetto di definirre una macro \x che espande il suo argomento dentro un gruppo che si chiude da solo quando la macro va in secuzione è un trucco noto che si trova a piene mani nel nucleo di LaTeX; Usare etoolbox per sfruttare il suo comando \ifstrempty permette di avere un test robusto risparmiando alcune definizioni intermedie; la sintassi richede oppligatoriamente la chiocciola anche quando non vuoi usare i livelli di subordinazione’ quindi puoi usare il comando co oa qualunqu delle seguenti sintassi`\indexstar@pippo|?
\indexstar primo@pippo|?
\indexstar primo!secondo@pippo|?
\indexstar primo!secondo!terzo@pippo|?
\indexstar@pippo|textbf?
\indexstar primo@pippo|textbf?
\indexstar primo!secondo@pippo|textbf?
\indexstar primo!secondo!terzo@pippo|textbf?`
Così non va bene?
-
23 Maggio 2019 alle 13:48 #115752::
Forse le incomprensioni sono nate dagli esempi che ho utilizzato nei vari post.Se rileggo la mia richiesta iniziale, avevo scritto:
MatteoF” post=116137
La mia volontà, comunque, è quella di spingermi oltre e poter utilizzare un comando ([tt]\indexstar[/tt]) che risolva la formattazione del lemma in tutte le possibili configurazioni, da quella più semplice
`\indexstar{}`
a quella più complessa
`\indexstar{- !
! @ | }`
Claudio, intanto ti ringrazio della pazienza, ma a me il tuo codice non funziona se abbinato con la mia definizione `\newcommand*\idxstar[1]{\leavevmode\llap{*\,}#1}`
In verità, nemmeno con una definizione più semplice, tipo `\newcommand*\idxstar[1]{\emph{#1}}`.Di seguito il emc
`
% !TEX encoding = UTF-8 Unicode
% !TEX TS-program = lualatex\documentclass{book}
\usepackage{makeidx}
\usepackage{etoolbox}\newcommand*\idxstar[1]{\leavevmode\llap{*\,}#1}
\def\indexstar#1@#2|#3?{\bgroup
\edef\x{\egroup\noexpand\index{#1@\idxstar{#2}\ifstrempty{#3}{}{|#3}}}\x}\makeindex
\begin{document}pippo\indexstar@pippo|?
pippo\indexstar primo@pippo|?
pippo\indexstar primo!secondo@pippo|?
pippo\indexstar primo!secondo!terzo@pippo|?
pippo\indexstar@pippo|textbf?
pippo\indexstar primo@pippo|textbf?
pippo\indexstar primo!secondo@pippo|textbf?
pippo\indexstar primo!secondo!terzo@pippo|textbf?
\printindex
\end{document}
`Il documento viene compilato, ma il file .ind rimane vuoto.
- !
-
23 Maggio 2019 alle 22:01 #115753::
Ho visto.
ci sono argomenti fragili e macro che non possono essere usate al momento spagliato del loro sviluppo.
Ho trovato come fare per eliminare certi esrrori, ma ne appaiono degli altri.
Ora è tardi e vado a nanna. ma la strada è quella giusta; ci vuoe un parser un po’ più intelligente che non ciò che si ottiene con gli argomenti delimitati.
A domani
-
24 Maggio 2019 alle 5:43 #115754::
A mente fresca, dopo un buon sonno ristoratore, le cose vengono meglio. Questo codice a me funziona:`\documentclass{book}
\usepackage{imakeidx}
\usepackage{xparse,etoolbox}\NewDocumentCommand\idxstar{ m }{\makebox[0pt][r]{$\star$\kern0.166666em}#1}
\NewDocumentCommand\indexstar{ o m o }{%
\IfValueTF{#1}{\IfNoValueTF{#3}{\index{#1!#2@\idxstar{#2}}}{\index{#1!#2@\idxstar{#2}|#3}}}%
{\IfNoValueTF{#3}{\index{#2@\idxstar{#2}}}{\index{#2@\idxstar{#2}|#3}}}}\makeindex
\begin{document}pippo\indexstar{pippo}
pippo\indexstar[primo]{pippo}
pluto\indexstar[primo]{pluto}
pippo\indexstar[primo!secondo]{pippo}
pippo\indexstar{pippo}[textbf]
pippo\indexstar[primo]{pippo}[textbf]
pippo\indexstar[primo!secondo]{pippo}[textbf]
paperino\indexstar{paperino}
ciccio\indexstar{ciccio}
nonna papera\indexstar{nonna papera}
\printindex
\end{document}`Come vedi ho trovato comodo usare xparse, come era stato nel mio primo messaggio.La sintassi ora è simile a quella che hai segnalato di voler usare, solo che le parti opzionali, i livelli e l’encap sono fra parentesi quadre. Non ci sono da usare nè punti escalmantivi dopo l’ultimo livello, né chiocciole. Ci pensano le macro a mettere quei segni dove ci vogliono. Ho definito anche \idxstar con i comandi di xparse, perché così facendo il comando è robusto; infatti se apri il file .idx vedi che nulla è stato sviluppato. Il file elaborato da makeindex (attraverso gli automatismi di imakeidx) è pulito e contiene solo quello che serve. Nessuna segno particolare che potrebbe confondere makeindex e poi eventualmente anche i programma di composizione.
Hai ragione, non è banale scrivere questo codice e forse lo si potrebbe scrivere meglio; ma se te lo studi con la documentazione di xparse sotto gli occhi, ne capisci la logica e vedi che usare xparse e i suoi meravigliosi comandi non è poi così difficile.
-
25 Maggio 2019 alle 15:01 #115755
-
-
AutoreRisposte
- Devi essere connesso per rispondere a questo topic.