- Questo topic ha 7 risposte, 3 partecipanti ed è stato aggiornato l'ultima volta 15 anni, 2 mesi fa da
egreg9.
-
CreatoreTopic
-
1 Luglio 2011 alle 14:59 #60844::
Salve a tutti, ho il seguente problema:
ho una sequenza di parole (separate da spazi) ;
la sequenza va stampata in corsivo
e prima parola va stampata anche in grassetto.Vorrei poter avere un comando tale che
`
\newcommand{\mytext}{\itshape This has to be tested}
\fmtfirsttoken{\bfseries}{\mytext}
`
restituisca:
This has to be testedCome si potrebbe implementare una macro come \fmtfirsttoken ?
Ciao,
Agostino
-
CreatoreTopic
-
AutoreRisposte
-
-
1 Luglio 2011 alle 18:10 #60845::
Salve a tutti, ho il seguente problema:
ho una sequenza di parole (separate da spazi) ;
la sequenza va stampata in corsivo
e prima parola va stampata anche in grassetto.Vorrei poter avere un comando tale che
`
\newcommand{\mytext}{\itshape This has to be tested}
\fmtfirsttoken{\bfseries}{\mytext}
`
restituisca:
This has to be testedCome si potrebbe implementare una macro come \fmtfirsttoken ?
Ciao,
Agostino`\documentclass[a4paper]{article}
\makeatletter
\def\fmtfirsttoken#1#2{\expandafter\@fmtfirsttoken\expandafter#1#2 \@nil}
\def\@fmtfirsttoken#1#2 #3\@nil{\itshape
{#1#2}\if\relax\detokenize{#3}\relax
\else\space#3\unskip\fi}
\makeatletter\newcommand{\mytext}{This has to be tested}
\begin{document}
\fmtfirsttoken{\bfseries}{\mytext}X\renewcommand{\mytext}{Ciao}
\fmtfirsttoken{\bfseries}{\mytext}X
\end{document}`
Ciao
Enrico
-
1 Luglio 2011 alle 20:24 #60846::
Ciao, scusate se mi intrometto ma, per esercizio, voglio provare a leggere la macro che ha fornito egreg9.Allora:
La macro \fmtfirsttoken passa due dei tre input della macro \@fmtfirsttoken e nello specifico lo stile della prima parola(#1) ed il testo della frase da cui essa viene presa(#2) in modo tale che sia espansa prima la seconda(#2) e la terza(#3).
Quindi definito \mytext come nell’esempio, scrivere
`\fmtfirsttoken{\bfseries}{\mytext}`
è come scrivere
`@fmtfirsttoken{\bfseries}{This has to be tested}{}`
giusto?Se si, non ho capito quale parte del codice che non ho ancora descritto permette di prendere la prima parola, visto che le variabili #1 e #2 stanno entrambi dentro le graffe.
Saluti
Michele
-
1 Luglio 2011 alle 21:05 #60847::
Ciao, scusate se mi intrometto ma, per esercizio, voglio provare a leggere la macro che ha fornito egreg9.
Allora:
La macro \fmtfirsttoken passa due dei tre input della macro \@fmtfirsttoken e nello specifico lo stile della prima parola(#1) ed il testo della frase da cui essa viene presa(#2) in modo tale che sia espansa prima la seconda(#2) e la terza(#3).
Quindi definito \mytext come nell’esempio, scrivere
`\fmtfirsttoken{\bfseries}{\mytext}`
è come scrivere
`@fmtfirsttoken{\bfseries}{This has to be tested}{}`
giusto?Ritenta, sarai più fortunato. 🙂
#1 è il primo argomento di \fmtfirsttoken, che nell’esempio è \bfseries.
Ciao
Enrico
-
1 Luglio 2011 alle 23:59 #60848
-
2 Luglio 2011 alle 8:58 #60849::
Ritento la fortuna. Eccome come espande la macro senza @
`\@fmtfirsttoken{\bfseries}{This}{has to be tested}`
ed a sua volta
`\itshape\bfseries{This} has to be tested`
Domanda: quando \@fmtfirsttoken “legge” #2, tutti caratteri prima della spazio sono considerati un unico token?
Assumiamo che \mytext si espanda a “This has to be tested” (senza le virgolette):
`\fmtfirsttoken{\bfseries}{\mytext}
\expandafter\@fmtfirsttoken\expandafter\bfseries\mytext*\@nil
\@fmtfirsttoken\bfseries This*has*to*be*tested*\@nil`
Siccome qui gli spazi sono significativi, mostro con * quelli “veri”; per esempio quello dopo \bfseries c’è solo per motivi “tipografici”, ma non per TeX.Il primo argomento di \@fmtfirsttoken è il primo token (o il primo gruppo tra graffe che si incontra, ma in questo caso c’è solo \bfseries); il secondo argomento è tutto ciò che segue fino al primo spazio, il terzo argomento tutto ciò che va da quello spazio fino al primo \@nil. Dunque in questo caso
#1 <- \bfseries #2 <- This #3 <- has*to*be*tested* Se l'espansione di \mytext fosse solo "This", il terzo argomento sarebbe vuoto; per questo c'è uno spazio "in più" prima di \@nil nella definizione di \fmtfirsttoken. Non confondere "token" con "argomento", se vuoi addentrarti nelle macro con argomenti delimitati. :) Ciao Enrico
-
2 Luglio 2011 alle 10:52 #60850::
Grazie Enrico per la macro e per le delucidazioni.
Nella tua soluzione ha un ruolo la macro \detokenize il cui significato
è spiegato qui: http://tex.stackexchange.com/questions/20059/what-detokenize-command-doesCiao,
Agostino
-
2 Luglio 2011 alle 11:10 #60851::
Grazie Enrico per la macro e per le delucidazioni.
Nella tua soluzione ha un ruolo la macro \detokenize il cui significato
è spiegato qui: http://tex.stackexchange.com/questions/20059/what-detokenize-command-does\detokenize è una primitiva di e-TeX; il suo uso per verificare se un argomento è vuoto l’ho imparato da H. Oberdiek. Siccome \if espande ciò che lo segue fino a quando trova due token non più espandibili per poterli confrontare, succede questo:
- 1. \relax non è espandibile, andiamo avanti
2. \detokenize è espandibile, quindi espandiamolo
3. l’espansione di \detokenize consiste nel contenuto del “general text” che lo segue come se a ogni token nel “balanced text” fosse applicato il comando \string; il risultato è una successione di caratteri di categoria 12 (o 10 per gli spazi)
4. se tra le graffe dopo \detokenize non c’è niente, cioè l’argomento è vuoto, \if trova dopo il primo \relax un altro \relax: sono uguali, perciò si segue il ramo “vero”, cioè tutto quanto va dal secondo \relax a \else (o a \fi se \else non c’è)
5. se tra le graffe c’è qualcosa, \if confronta il primo \relax con il primo carattere: non sono uguali, perciò si segue il ramo “falso”; tutto quello che segue il primo carattere fino a \else fa parte del ramo “falso”, quindi viene ignorato; se non c’è \else ma solo \fi, viene tutto buttato via“general text”: {“balanced text”}
“balanced text”: qualsiasi codice TeX che sia bilanciato rispetto alle graffe esplicite.Suppongo che non ci voglia tanta fantasia per capire di chi è la spiegazione nella pagina che indichi. 🙂
Ciao
Enrico
-
-
AutoreRisposte
- Devi essere connesso per rispondere a questo topic.