Re: Estrazione iniziale da una parola

#15024
DMW
    Up
    0
    Down
    ::

    Eliminate alcune restrizioni. I caratteri accentati possono essere usati nell’argomento di \esaltaprime e \esaltaultime, ma non al primo posto; in tal caso occorre “nascondere” l’accento in una macro, si veda l’esempio con \accento; attenzione: non con UTF8, spiacente. 🙂 L’attento lettore noterà l’uso delle primitive di e-TeX \detokenize, \scantokens e \unless. 🙂
    `\documentclass[a4paper]{article}
    \usepackage[latin1]{inputenc}

    \makeatletter
    \newcount\split@count

    \def\@split#1#2{\split@count=#1\relax
    \def\split@start{}%
    \edef\split@end{\detokenize\expandafter{#2}}%
    \loop\ifnum\split@count>0
    \edef\split@start{\split@start\expandafter\@car\split@end\@nil}%
    \edef\split@end{\expandafter\@cdr\split@end\@nil}%
    \ifx\split@end\empty
    \split@count=0
    \else
    \advance\split@count-1
    \fi
    \repeat}

    \def\@reverse#1{%
    \edef\@temp{\detokenize\expandafter{#1}}%
    \def\@esrever{}%
    \loop\unless\ifx\@temp\empty
    \edef\@esrever{\expandafter\@car\@temp\@nil\@esrever}%
    \edef\@temp{\expandafter\@cdr\@temp\@nil}%
    \repeat}

    \newcommand{\esaltaprime}[2][0]{%
    \@split{#1}{#2}%
    \textbf{\scantokens\expandafter{\split@start}\unskip}%
    \scantokens\expandafter{\split@end}\unskip}

    \newcommand{\esaltaultime}[2][0]{%
    \@reverse{#2}\@split{#1}{\@esrever}%
    \@reverse{\split@end}\scantokens\expandafter{\@esrever}\unskip%
    \@reverse{\split@start}\textbf{\scantokens\expandafter{\@esrever}\unskip}}
    \makeatother

    \newcommand\parola{Italia}
    \newcommand\accento{àncora}

    \begin{document}
    \esaltaprime[3]{\accento}

    \esaltaprime[4]{ancóra} Ciao

    \esaltaprime[3]{\parola} Ciao

    \esaltaprime[7]{\parola}

    \esaltaprime[7]{Cercopiteco}

    \esaltaprime{Italia}

    \esaltaultime[4]{Cercopiteco}

    \esaltaultime[2]{lassù}

    \end{document}`
    A parte le questioni più TeXniche, la faccenda è abbastanza semplice. La macro \@split raccoglie i primi n caratteri (n è il valore dato come primo argomento) uno alla volta e definisce le due macro \split@start e \split@end, che contengono prima e seconda parte della stringa data come secondo argomento. Se n è maggiore della lunghezza della stringa, il ciclo si interrompe e la seconda parte sarà vuota.

    Per evidenziare gli ultimi n token della stringa come si fa? Si applica \@split alla stringa rovesciata. Il funzionamento di \@reverse è facile: aggiungo, ovviamente da destra a sinistra, a \@esrever un carattere alla volta, prendendo quello iniziale e ripetendo finché la stringa diventa vuota.

    Lascio come esercizio di scrivere la stessa cosa con una macro ricorsiva. 😀

    Ciao
    Enrico

    Sei un mago. 😀 😀

    Fai una cosa, aggiungi queste ultime cinque macro, così il servizio è completo:
    `
    \estraiprime[n]{} \estraiultime[n]{}
    `
    Poi le complementari
    `
    \togliprime[n]{} \togliultime[n]{}
    `

    ed infine

    `
    \inverti{}% inverte l'ordine da parola a alorap, questa mi è venuta in mente ora.
    `

    Ciao e grazie ancora

    Andrea

    PS: sono d’accordo con Lapo, quando hai tempo potresti creare un altro utilissimo pacchetto.

    Go to top