Re: Estrazione iniziale da una parola

#15022
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

Go to top