- Questo topic ha 20 risposte, 3 partecipanti ed è stato aggiornato l'ultima volta 14 anni, 6 mesi fa da
antonio.macrì.
-
CreatoreTopic
-
21 Febbraio 2012 alle 14:30 #70195::
Un altro titolo per questa discussione poteva essere: “un’altra strada per espandere un comando con un unico argomento opzionale”, che sembra praticamente impossibile. 🙁Vorrei definire un comando [tt]\Monthname[/tt] che produca il nome del mese corrente con l’iniziale maiuscola. Ora, il pacchetto datetime mette a disposizione un comando [tt]\monthname[/tt] che purtroppo per l’italiano ha l’iniziale minuscola.
La mia idea sarebbe (stata) di fare qualcosa come
`\newcommand*\Monthname{%
\edef\next{\monthname[\month]}%
\expandafter\MakeTextUppercase\next
}`
ma ovviamente non va.La situazione è quella più sfortunata possibile, perché [tt]\monthname[/tt] ha un argomento opzionale e per di più non ha alcun argomento obbligatorio e quindi, per quello che ho capito, non posso usare nemmeno [tt]\FE@testopt[/tt] (fornito da etextools).
Avevo pensato a un’altra soluzione: togliere giorno, anno e tutti i comandi e tutti gli spazi contenuti in [tt]\today[/tt], espandendolo, ma non è affatto immediata (e come se non bastasse datetime ridefinisce [tt]\today[/tt] inserendovi anche [tt]\monthname[/tt]). 👿
Esiste un modo per fare quello che voglio? Ovviamente potrei crearmi il classico [tt]\ifcase\month[/tt], ma sto cercando una soluzione che sia localizzabile in più lingue (penso di inserirla in anthosthesis).
Riporto un codice compilabile:
`\documentclass[12pt,a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[italian]{babel}
\usepackage{lipsum,textcase}\title{Espandere un comando con un argomento opzionale}
\author{}\makeatletter
\usepackage{datetime}
\ifcase1
\newcommand*\Monthname{%
\edef\next{\monthname[\month]}%
\expandafter\MakeTextUppercase\next
}
\else
\newcommand*\Monthname{%
\begingroup
\let\the\@gobble
\let\number\@gobble
\let\ =\relax
\edef\next{\endgroup\today}%
\show\next
\expandafter\MakeTextUppercase\next
}
\fi
\makeatother\begin{document}
\maketitle
\section{È possibile?}
(\Monthname).
\lipsum[1]
\end{document}`Ciao e grazie,
Antonio
-
CreatoreTopic
-
AutoreRisposte
-
-
21 Febbraio 2012 alle 15:00 #70196::
I nomi dei mesi in italiano vanno minuscoli.Visto come datetime esegue tutta la faccenda, è del tutto impossibile fare quello che desideri: l’espansione di \monthname è, se la lingua corrente è l’italiano, \monthnameitalian che, a sua volta è un comando con argomento opzionale, la cui espansione comincia con un’assegnazione e non è il nome del mese.
Ciao
Enrico
-
21 Febbraio 2012 alle 15:33 #70197::
egreg9″ post=69394I nomi dei mesi in italiano vanno minuscoli.
Mi serviva usarli non in espressioni del tipo “21 febbraio 2012”, ma in “Febbraio 2012”.
Visto come datetime esegue tutta la faccenda, è del tutto impossibile fare quello che desideri […]
Brutta notizia. 🙁
Mi lascia perplesso il fatto che per ottenere il nome del mese non ci sia un comando semplice e definito una sola volta. Voglio dire: già i moduli di babel ridefiniscono [tt]\today[/tt] incorporandoci i nomi dei mesi. Il pacchetto datetime deve ridefinirseli a sua volta, con i comandi [tt]\monthname…[/tt] e magari lo stesso faranno altri pacchetti. Mi stupisco di come non si sia pensato di definire un semplicissimo [tt]\getmonthname{}[/tt] negli stessi moduli di babel, che è il luogo più adatto per farlo, usare questo comando per [tt]\today[/tt] e renderlo disponibile anche ad altri pacchetti. Boh!
Grazie mille comunque, Enrico.
-
21 Febbraio 2012 alle 16:01 #70198::
antonio.macrì” post=69396
I nomi dei mesi in italiano vanno minuscoli.
Mi serviva usarli non in espressioni del tipo “21 febbraio 2012”, ma in “Febbraio 2012”.
Visto come datetime esegue tutta la faccenda, è del tutto impossibile fare quello che desideri […]
Brutta notizia. 🙁
Mi lascia perplesso il fatto che per ottenere il nome del mese non ci sia un comando semplice e definito una sola volta. Voglio dire: già i moduli di babel ridefiniscono [tt]\today[/tt] incorporandoci i nomi dei mesi. Il pacchetto datetime deve ridefinirseli a sua volta, con i comandi [tt]\monthname…[/tt] e magari lo stesso faranno altri pacchetti. Mi stupisco di come non si sia pensato di definire un semplicissimo [tt]\getmonthname{}[/tt] negli stessi moduli di babel, che è il luogo più adatto per farlo, usare questo comando per [tt]\today[/tt] e renderlo disponibile anche ad altri pacchetti. Boh!
Grazie mille comunque, Enrico.
Va minuscolo anche là, perché la data di pubblicazione non è preceduta da un punto; non so che contesto tu abbia in mente.
Purtroppo è come dici: Braams a suo tempo non ha pensato a questo modo di fare, sarebbe stato semplicissimo definire
`\def\monthitalian{%
\ifcase\month\or
gennaio\or
…
dicembre\or
primavera\or
estate\or
autunno\or
inverno\fi}`
(in molti casi si usano i numeri da 13 a 16 per indicare le stagioni) e poi usare [tt]\monthitalian[/tt] per definire [tt]\dateitalian[/tt] e, indirettamente, [tt]\today[/tt].Ciao
Enrico
-
21 Febbraio 2012 alle 18:03 #70199::
Capisco che il modello che ha creato Braams per scrivere i file ldf per le varie lingue avrebbe potuto contenere il codice di Enrico; maa la descrizione dell’italiano l’ho fatta io e curata io negli ultimi diciamo 20 anni; prima era stata fatta da Maurizio Codogno, un ricercatore dell’allora CSELT, credo. ma sempre di Torino. Credo che in pratica Braams non abbia mai messo le mani su italian.ldf, se non indirettamante con il suo template minimo per creare questi file.Avrei potuto pensarci anche da solo, ma quello era proprio l’ultimo problema che mi sfiorava la mente, visto che un periodo (uno vero) non può con il nome di un mese facente parte di una data (certo si può scrivere “bla bla. Febbraio è un messe abbastanza freddo.” ma in questo caso il nome del mese non fa parte di una data; altro esempio bla bla bla. Settembre 2001 fu un mese teribile per gli avvenimenti luttuosi che vi accaddero; ma anche in questo caso non vedo “settembre” come cosa da scrivere per messo di \today o di datetime.). E questo credo che valga per ogni lingua in cui i mesi sono nomi comuni.
-
21 Febbraio 2012 alle 19:43 #70200::
OldClaudio” post=69402Capisco che il modello che ha creato Braams per scrivere i file ldf per le varie lingue avrebbe potuto contenere il codice di Enrico; maa la descrizione dell’italiano l’ho fatta io e curata io negli ultimi diciamo 20 anni; prima era stata fatta da Maurizio Codogno, un ricercatore dell’allora CSELT, credo. ma sempre di Torino. Credo che in pratica Braams non abbia mai messo le mani su italian.ldf, se non indirettamante con il suo template minimo per creare questi file.
Avrei potuto pensarci anche da solo, ma quello era proprio l’ultimo problema che mi sfiorava la mente, visto che un periodo (uno vero) non può con il nome di un mese facente parte di una data (certo si può scrivere “bla bla. Febbraio è un messe abbastanza freddo.” ma in questo caso il nome del mese non fa parte di una data; altro esempio bla bla bla. Settembre 2001 fu un mese teribile per gli avvenimenti luttuosi che vi accaddero; ma anche in questo caso non vedo “settembre” come cosa da scrivere per messo di \today o di datetime.). E questo credo che valga per ogni lingua in cui i mesi sono nomi comuni.
Ciao Claudio,
non era affatto mia intenzione sminuire il tuo lavoro: ti chiedo scusa se così è sembrato.
Piuttosto, penso che quella fosse una scelta “progettuale” che doveva prendere l’autore di babel a livello globale, non i singoli curatori dei moduli.
Il contesto a cui mi riferisco è l’uso di mese e anno per identificare l’edizione di un documento. Se possono essere rilasciate più edizioni in un anno, oppure se non c’è una netta distinzione tra I, II o III edizione e così via, trovo preferibile identificare le diverse “uscite” con il mese e l’anno (aggiungerci anche il giorno mi sembra esagerato). Il mese e l’anno andrebbero stampati nel frontespizio o in qualcosa di analogo, quindi “Febbraio 2012” sarebbe l’ideale.
Del resto, è esattamente quello che avviene con l’Arte.Ciao,
Antonio
-
21 Febbraio 2012 alle 19:47 #70201::
OldClaudio” post=69402Capisco che il modello che ha creato Braams per scrivere i file ldf per le varie lingue avrebbe potuto contenere il codice di Enrico; maa la descrizione dell’italiano l’ho fatta io e curata io negli ultimi diciamo 20 anni; prima era stata fatta da Maurizio Codogno, un ricercatore dell’allora CSELT, credo. ma sempre di Torino. Credo che in pratica Braams non abbia mai messo le mani su italian.ldf, se non indirettamante con il suo template minimo per creare questi file.
Avrei potuto pensarci anche da solo, ma quello era proprio l’ultimo problema che mi sfiorava la mente, visto che un periodo (uno vero) non può con il nome di un mese facente parte di una data (certo si può scrivere “bla bla. Febbraio è un messe abbastanza freddo.” ma in questo caso il nome del mese non fa parte di una data; altro esempio bla bla bla. Settembre 2001 fu un mese teribile per gli avvenimenti luttuosi che vi accaddero; ma anche in questo caso non vedo “settembre” come cosa da scrivere per messo di \today o di datetime.). E questo credo che valga per ogni lingua in cui i mesi sono nomi comuni.
La mia obiezione non è certo per l’applicazione chiesta da Antonio. Non è difficile immaginare un contesto in cui si possa voler cambiare i nomi dei mesi: è il caso di tedesco e austriaco! Il modo più pulito sarebbe addirittura un pochino più complicato:
`\def\januaryitalian{gennaio} % in italian.ldf, parte di \captionsitalian
…
\def\decemberitalian{dicembre}\def\monthname{\ifcase\month\or % in babel.def
\@nameuse{january\languagename}\or
…
\@nameuse{december\languagename}\fi}`
che potrebbe essere anche migliorato o esteso per lingue che hanno le declinazioni.Ciao
Enrico
-
21 Febbraio 2012 alle 23:17 #70202::
Antonio, Enrico sono d’accordo con voi, a se invio una aggiornamento a Braams con questo codice, prima di prenderlo in considerazione ci mette almeno due anni; poi è possibile che lo bocci, perché se si fa così per l’italiano deve farsi così per tutte le lingue. Purtrpoo babel è in crisi; se volgiamo farlo per polyglossia non ci sono problemi di sorta.Ciao
Claudio
-
22 Febbraio 2012 alle 18:30 #70203::
Antonio, credo che per te questa definizione logorroica (che Enrico troverà certamente il modo di ridurre a mezza riga 😉 ) ti possa servire per il tuo scopo particolare di mettere Febbraio 2011 in modo automatico ad ogni nuova edizione nel frontespizio del documento dove volevi metterlo:
`
\AtBeginDocument{{%% In italiano
\let~\space
\edef\Oggi{\today}
\def\GetOggiAnno#1 #2 #3!{#3}
\edef\OggiAnno{\expandafter\GetOggiAnno\Oggi!}
\def\GetOggiMese#1 #2 #3!{#2}
\edef\OggiMese{\expandafter\GetOggiMese\Oggi!}
\def\SplitOggi#1#2!{\uppercase{#1}#2\ \OggiAnno}
\xdef\myDocDate{\expandafter\SplitOggi\OggiMese!}}}
`Nel tuo frontespizio, nel punto che vuoi tu, scrivi semplicemente \myDocDate e non ci pensi più.
Spero che tu non voglia farlo con datetime, perché se ometti il giorno allora devi omettere anche le frazioni di giorno: ore, minuti, secondi, time zone e compagnia.
-
22 Febbraio 2012 alle 19:59 #70204::
OldClaudio” post=69442Antonio, credo che per te questa definizione logorroica (che Enrico troverà certamente il modo di ridurre a mezza riga 😉 ) ti possa servire per il tuo scopo particolare di mettere Febbraio 2011 in modo automatico ad ogni nuova edizione nel frontespizio del documento dove volevi metterlo:
`
\AtBeginDocument{{%% In italiano
\let~\space
\edef\Oggi{\today}
\def\GetOggiAnno#1 #2 #3!{#3}
\edef\OggiAnno{\expandafter\GetOggiAnno\Oggi!}
\def\GetOggiMese#1 #2 #3!{#2}
\edef\OggiMese{\expandafter\GetOggiMese\Oggi!}
\def\SplitOggi#1#2!{\uppercase{#1}#2\ \OggiAnno}
\xdef\myDocDate{\expandafter\SplitOggi\OggiMese!}}}
`Nel tuo frontespizio, nel punto che vuoi tu, scrivi semplicemente \myDocDate e non ci pensi più.
Spero che tu non voglia farlo con datetime, perché se ometti il giorno allora devi omettere anche le frazioni di giorno: ore, minuti, secondi, time zone e compagnia.
Non è tanto più breve, ma almeno ha il vantaggio che l’espansione di [tt]\MonthYear[/tt] è proprio “[tt]Febbraio 2012[/tt]” e non “[tt]\uppercase{f}ebbraio\ 2012[/tt]”.
`\AtBeginDocument{\begingroup
\def\extractMonthYear#1 #2#3\relax{\uppercase{\def\x{#2}}%
\edef\x{\endgroup\def\noexpand\MonthYear{\x#3}}\x}
\begingroup\let~\space\edef\x{\endgroup\noexpand\extractMonthYear\today\relax}\x}`
L’idea è la stessa di Claudio: espandere \today fino in fondo ed estrarre l’informazione che ci interessa, sapendo che l’espansione di \today è del tipo “22 febbraio 2012” (il metodo funziona solo per l’italiano, altre lingue vanno trattate in modo diverso). C’è il problema che fra giorno e mese viene messo ~ la cui espansione è una schifezza; perciò lo neutralizziamo dicendo [tt]\let~\space[/tt] prima di eseguire l’espansione completa. La definizione di [tt]\x[/tt] è, perciò
`\endgroup\extractMonthYear 22 febbraio 2012\relax`
e l’esecuzione di [tt]\x[/tt] chiude il gruppo iniziato prima di [tt]\let~\space[/tt].Abbiamo prima definito [tt]\extractMonthYear[/tt] (nel gruppo, così sparirà) in modo che il primo argomento sia tutto ciò che va fino al primo spazio, il secondo sia il token successivo e il terzo tutto ciò che va fino a [tt]\relax[/tt]. Perciò il primo argomento è “22”, il secondo è “f”, il terzo è “ebbraio 2012”. Il lavoro di [tt]\extractMonthYear[/tt] è
1. definire [tt]\x[/tt] come il primo argomento, ma all’interno di [tt]\uppercase[/tt], così l’espansione di [tt]\x[/tt] è, oggi, “F”;
2. definire [tt]\x[/tt] in modo che la sua espansione sia [tt]\endgroup\def\MonthYear{Febbraio 2012}[/tt] (si noti che la [tt]\x[/tt] “dentro” viene espansa prima che sia assegnato il nuovo significato a [tt]\x[/tt] tramite [tt]\edef[/tt]);
3. eseguire [tt]\x[/tt], che quindi chiude il gruppo cominciato alla prima riga e a sua volta esegue [tt]\def\MonthYear{Febbraio 2012}[/tt].Esercizio: contare quanti significati prende [tt]\x[/tt] durante tutta la faccenda. 🙂
Ciao
Enrico
-
22 Febbraio 2012 alle 21:16 #70205::
Grazie mille, Claudio e Enrico!Tentiamo lo sforzo ermeneutico sul codice di Enrico: 🙂
`\AtBeginDocument{%
\begingroup
% giorno / spazio / prima lettera del mese / tutto fino a \relax
\def\extractMonthYear#1 #2#3\relax{%`
Con la [tt]\def[/tt]inizione dentro [tt]\uppercase[/tt], [tt]\x[/tt] contiene solo la prima lettera del mese in maiuscolo
` \uppercase{\def\x{#2}}%`
L'[tt]\edef[/tt] esterno prepara la definizione di [tt]\MonthYear[/tt] come “Febbraio 2012”: con [tt]\x#3[/tt] unisce la prima lettera del mese in maiuscolo e il resto fino a [tt]\relax[/tt]. L'[tt]\endgroup[/tt] farà sparire [tt]\extractYearMonth[/tt] ([tt]\endgroup[/tt] ed [tt]\edef[/tt] non sono espandibili).
` \edef\x{\endgroup\edef\noexpand\MonthYear{\x#3}}%
\x`
A questo punto finalmente [tt]\MonthYear[/tt] vale “Febbraio 2012”.
` }
\begingroup`
Siccome [tt]\today[/tt] separa giorno e mese con ~, lo rendiamo equivalente a uno spazio:
` \let~\space`
L'[tt]\edef[/tt] seguente espande [tt]\today[/tt] e prepara la “chiamata” a [tt]\extractMonthYear[/tt]…
` \edef\x{\endgroup\noexpand\extractMonthYear\today\relax}%
\x % …che avviene qui!
}`Mi resta una (forte) domanda: perché non posso avere ~ a delimitare #1 e #2 nella definizione di [tt]\extractMonthYear[/tt]?
Edit:
Mi hai già risposto nel messaggio precedente (che ho visto solo ora :)):egreg9″ post=69444…C’è il problema che fra giorno e mese viene messo ~ la cui espansione è una schifezza; perciò lo neutralizziamo dicendo [tt]\let~\space[/tt] prima di eseguire l’espansione completa.
Grazie!
Ciao,
Antonio
-
22 Febbraio 2012 alle 22:01 #70206::
antonio.macrì” post=69451Mi resta una (forte) domanda: perché non posso avere ~ a delimitare #1 e #2 nella definizione di [tt]\extractMonthYear[/tt]?
Puoi farlo sostituendo [tt]\let~\relax[/tt] a [tt]\let~\space[/tt] e definendo
`\def\extractMonthYear#1~#2#3\relax{…% il resto esattamente come prima`
Non trovi che sia carina? Domanda: perché quel [tt]\let~\relax[/tt] non rovina tutta la faccenda?Ciao
Enrico
-
23 Febbraio 2012 alle 10:10 #70207::
egreg9″ post=69456
Mi resta una (forte) domanda: perché non posso avere ~ a delimitare #1 e #2 nella definizione di [tt]\extractMonthYear[/tt]?
Puoi farlo sostituendo [tt]\let~\relax[/tt] a [tt]\let~\space[/tt] e definendo
`\def\extractMonthYear#1~#2#3\relax{…% il resto esattamente come prima`
Non trovi che sia carina? Domanda: perché quel [tt]\let~\relax[/tt] non rovina tutta la faccenda?Ciao
EnricoInteressante: dato che [tt]\relax[/tt] non è espandibile, può essere usato con un [tt]\let[/tt] per rendere non espandibile un altro token!
Se dico giusto, la faccenda continua a funzionare perché in quel modo rendo ~ non espandibile. Dunque, sopravvive all’espansione di [tt]\today[/tt] e il [tt]\def[/tt] se lo ritrova tal quale come delimitatore tra gli argomenti (nemmeno [tt]\def[/tt] espande i token che incontra come delimitatori). Sarebbe del tutto equivalente ad avere
`\providecommand*% o simile
\today{23\noexpand~febbraio 2012}
…
\def\extractMonthYear#1~#2#3\relax{…% il resto esattamente come prima`La mia domanda nascondeva anche un altro problema: perché non posso avere ~ a delimitare #1 e #2 nella definizione di [tt]\extractMonthYear[/tt] dopo aver cambiato a 11 il codice di categoria di ~?
La risposta naturalmente è che, oltre a dover mettere `\catcode`\~=11` al di fuori anche di [tt]\AtBeginDocument[/tt], [tt]\today[/tt] è già stato digerito da un bel pezzo, con ~ come carattere attivo, ed è impossibile cambiarglielo ora.
Anche se si applica solo (principalmente) all’italiano, bellina questa discussione. 🙂
-
23 Febbraio 2012 alle 10:32 #70208::
Una questione storica. Il problema della non espandibilità di [tt]\monthname[/tt] deriva dall’uso di [tt]\futurelet[/tt] (che non può essere espanso, ma va eseguito) per trovare gli argomenti opzionali. È sempre stato così, oppure in versioni precedenti di LaTeX per cercare gli argomenti opzionali [tt]\newcommand[/tt] usava qualche altro meccanismo senza problemi di espansione?Grazie,
Antonio
-
23 Febbraio 2012 alle 11:52 #70209::
antonio.macrì” post=69465Una questione storica. Il problema della non espandibilità di [tt]\monthname[/tt] deriva dall’uso di [tt]\futurelet[/tt] (che non può essere espanso, ma va eseguito) per trovare gli argomenti opzionali. È sempre stato così, oppure in versioni precedenti di LaTeX per cercare gli argomenti opzionali [tt]\newcommand[/tt] usava qualche altro meccanismo senza problemi di espansione?
Fino alla comparsa di LaTeX2e l’unico modo di definire comandi con argomento opzionale era di usare esplicitamente [tt]\@ifnextchar[/tt] che ovviamente rendeva tali comandi fragili. Non c’è (quasi) alcun modo di avere comandi con argomenti opzionali che siano espandibili (nel senso che possono passare attraverso [tt]\edef[/tt] senza problemi). Qualcosa si può fare con xparse:
`\DeclareExpandableDocumentCommand{\mycmd}{O{pippo} m}{…}`
ma ci deve essere almeno un argomento “normale” dopo quello opzionale.Ciao
Enrico
-
23 Febbraio 2012 alle 23:33 #70210::
Ho studiato meglio la faccenda.Lasciando perdere gli argomenti opzionali, sono riuscito a trovare una possibile soluzione. L’ora comincia a farsi tarda, quindi potrei aver preso un abbaglio. In sostanza, oltre a usare [tt]\string\monthname…[/tt], faccio un po’ di patching. I comandi [tt]\monthname…[/tt] hanno la stessa struttura per tutte le lingue, quindi le patch dovrebbero applicarsi a tutte con una certa tranquillità.
`\documentclass[11pt,a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[french,italian,spanish,english]{babel}
\usepackage{lipsum,textcase}\title{Nomi dei mesi in maiuscolo}
\author{}\usepackage{datetime}
\usepackage{etoolbox}\makeatletter
\newcommand*\patchmonthname[1]{%
\if@dt@multilingual
\begingroup
\expandafter\ifx\csname monthname\languagename\endcsname\relax
\typeout{No original \string\monthname\languagename}%
\endgroup
\else
\expandafter\ifx\csname p@monthname\languagename\endcsname\relax
\endgroup
\typeout{Patching \string\monthname\languagename}%
\@patchmonthname
\typeout{Patched \string\monthname\languagename}%
\else
\typeout{Already patched \string\monthname\languagename}%
\endgroup
\fi
\fi
\fi}\def\@patchmonthname{%
% Uso \x per fare prima a scrivere
\expandafter\let\expandafter\x\csname\string\monthname\languagename\endcsname
\@@patchmonthname
\expandafter\let\csname p@monthname\languagename\endcsname\x}\begingroup
\@makeother\#%
\gdef\@@patchmonthname{%
% Senza bisogno di generare errore se il patching fallisce:
% se il problema esiste si ripresenterà durante l'espansione
\patchcmd\x{\the\@orgargctr}{#1}\relax\relax
\patchcmd\x{\the\@orgargctr}{#1}\relax\relax
\patchcmd\x{\@orgargctr=#1\relax}{}\relax\relax
\patchcmd\x{\@orgargctr}{#1\relax}\relax\relax}
\endgroup\newcommand*\Monthname[1]{%
\edef\xx{\noexpand\MakeTextUppercase
% Dovrei generare un errore se non è definito?
\csname p@monthname\languagename\endcsname[#1]}\xx
}\patchmonthname{english}
\let\p@monthnameenglish\x\apptocmd\select@language{\patchmonthname{#1}}{}{\errmessage{failure}}
\makeatother\begin{document}
\maketitle
\section{È possibile?}
\Monthname{\month} 2012. \lipsum[2]
\begin{otherlanguage}{french}
\Monthname{\month} 2012. \lipsum[2]
\end{otherlanguage}
\begin{otherlanguage}{italian}
\Monthname{\month} 2012. \lipsum[2]
\end{otherlanguage}
\begin{otherlanguage}{spanish}
\Monthname{\month} 2012. \lipsum[2]
\end{otherlanguage}
\begin{otherlanguage}{french}
\Monthname{\month} 2012. \lipsum[2]
\end{otherlanguage}
\begin{otherlanguage}{italian}
\Monthname{\month} 2012. \lipsum[2]
\end{otherlanguage}
\begin{otherlanguage}{spanish}
\Monthname{\month} 2012. \lipsum[2]
\end{otherlanguage}
\end{document}`Ripeto, può essere che il codice sia un po’ una schifezza, devo ragionarci meglio. Inoltre ha qualche problema, per esempio se l’inglese non è la lingua predefinita (cioè l’ultima caricata in babel). Comunque può essere una base.
Domani si vedrà! 🙂
Antonio
PS: mi sembrava che qualcuno si stesse divertendo coi link del forum… finalmente sono in blu! 😎 😉
-
24 Febbraio 2012 alle 22:31 #70211::
Alla fine l’errore era dovuto a un’incompatibilità già nota tra lipsum e babel quando si specifica spanish come ultima opzione. (Scrivo qui come promemoria per me stesso che spanish ridefinisce [tt]\@roman[/tt] per forzare i numeri romani in maiuscolo: si può ovviare con [tt]\def\@roman{\romannumeral}[/tt].)`\documentclass[11pt,a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[spanish,french,english,german,italian]{babel}
\usepackage{lipsum,textcase}\title{Nomi dei mesi in maiuscolo}
\author{}\usepackage{datetime}
\usepackage{etoolbox}\makeatletter
\DeclareRobustCommand*\patchmonthname[1]{%
\if@dt@multilingual
\begingroup
\expandafter\ifx\csname monthname\languagename\endcsname\relax
\typeout{No original \string\monthname\languagename}%
\endgroup
\else
\expandafter\ifx\csname p@monthname\languagename\endcsname\relax
\endgroup
\typeout{Patching \string\monthname\languagename}%
\@patchmonthname
\typeout{Patched \string\monthname\languagename}%
\else
\typeout{Already patched \string\monthname\languagename}%
\endgroup
\fi
\fi
\fi}\def\@patchmonthname{%
% Uso \x per fare prima a scrivere
\expandafter\let\expandafter\x\csname\string\monthname\languagename\endcsname
\@@patchmonthname
\expandafter\let\csname p@monthname\languagename\endcsname\x}\begingroup
\@makeother\#
\gdef\@@patchmonthname{%
% Senza bisogno di generare errore se il patching fallisce:
% se il problema esiste si ripresenterà durante l'espansione
\patchcmd\x{\the\@orgargctr}{#1}\relax\relax
\patchcmd\x{\the\@orgargctr}{#1}\relax\relax
\patchcmd\x{\@orgargctr=#1\relax}{}\relax\relax
\patchcmd\x{\@orgargctr}{#1\relax}\relax\relax}
\endgroup\DeclareRobustCommand*\Monthname[1]{%
\edef\x{%
% Non dovrebbero esserci problemi
\csname p@monthname\languagename\endcsname[#1]}%
\expandafter\MakeTextUppercase\x}\patchmonthname{english}
\apptocmd\select@language{\patchmonthname{#1}}{}{%
\errmessage{Cannot patch \string\select@language}}
\makeatother\setlipsumdefault{66}
\begin{document}
\maketitle
\section{È possibile?}
\Monthname{1} 2012. \lipsum
\begin{otherlanguage}{french}
\Monthname{2} 2012. \lipsum
\end{otherlanguage}
\begin{otherlanguage}{italian}
\Monthname{3} 2012. \lipsum
\end{otherlanguage}
\begin{otherlanguage}{spanish}
\Monthname{4} 2012. \lipsum
\end{otherlanguage}
\begin{otherlanguage}{german}
\Monthname{5} 2012. \lipsum
\end{otherlanguage}
\begin{otherlanguage}{english}
\Monthname{6} 2012. \lipsum
\end{otherlanguage}
\begin{otherlanguage}{spanish}
\Monthname{7} 2012. \lipsum
\end{otherlanguage}
\end{document}`Chiedo:
- C’è qualche grave falla in questo codice?
- Non sono riuscito a incorporare [tt]\@@patchmonthname[/tt] dentro [tt]\@patchmonthname[/tt]: ho dovuto definirlo a parte dopo aver posto [tt]\@makeother\#[/tt]. Perché? Se provo a incorporarlo, scrivendo “#1” nel secondo o terzo argomento di [tt]\patchcmd[/tt], il compilatore giustamente si lamenta che [tt]\@patchmonthname[/tt] non ha argomenti (cioè non può risolvere quel “#1”); se invece scrivo “##1”, rimangono entrambi i ##, anziché venire dimezzati. Mi sfugge qualcosa? Per essere più precisi, non funziona questo:
`\def\@patchmonthname{%
% Uso \x per fare prima a scrivere
\expandafter\let\expandafter\x\csname\string\monthname\languagename\endcsname
\patchcmd\x{\the\@orgargctr}{##1}\relax\relax
\patchcmd\x{\the\@orgargctr}{##1}\relax\relax
\patchcmd\x{\@orgargctr=##1\relax}{}\relax\relax
\patchcmd\x{\@orgargctr}{##1\relax}\relax\relax}
\expandafter\let\csname p@monthname\languagename\endcsname\x}`
A [tt]\patchcmd[/tt] viene passato “##1”, invece di “#1”. Perché?
Grazie,
Antonio
-
25 Febbraio 2012 alle 9:11 #70212::
antonio.macrì” post=69539Alla fine l’errore era dovuto a un’incompatibilità già nota tra lipsum e babel quando si specifica spanish come ultima opzione. (Scrivo qui come promemoria per me stesso che spanish ridefinisce [tt]\@roman[/tt] per forzare i numeri romani in maiuscolo: si può ovviare con [tt]\def\@roman{\romannumeral}[/tt].)
`\documentclass[11pt,a4paper]{article}
\usepackage[T1]{fontenc}
\usepackage[utf8]{inputenc}
\usepackage[spanish,french,english,german,italian]{babel}
\usepackage{lipsum,textcase}\title{Nomi dei mesi in maiuscolo}
\author{}\usepackage{datetime}
\usepackage{etoolbox}\makeatletter
\DeclareRobustCommand*\patchmonthname[1]{%
\if@dt@multilingual
\begingroup
\expandafter\ifx\csname monthname\languagename\endcsname\relax
\typeout{No original \string\monthname\languagename}%
\endgroup
\else
\expandafter\ifx\csname p@monthname\languagename\endcsname\relax
\endgroup
\typeout{Patching \string\monthname\languagename}%
\@patchmonthname
\typeout{Patched \string\monthname\languagename}%
\else
\typeout{Already patched \string\monthname\languagename}%
\endgroup
\fi
\fi
\fi}\def\@patchmonthname{%
% Uso \x per fare prima a scrivere
\expandafter\let\expandafter\x\csname\string\monthname\languagename\endcsname
\@@patchmonthname
\expandafter\let\csname p@monthname\languagename\endcsname\x}\begingroup
\@makeother\#
\gdef\@@patchmonthname{%
% Senza bisogno di generare errore se il patching fallisce:
% se il problema esiste si ripresenterà durante l'espansione
\patchcmd\x{\the\@orgargctr}{#1}\relax\relax
\patchcmd\x{\the\@orgargctr}{#1}\relax\relax
\patchcmd\x{\@orgargctr=#1\relax}{}\relax\relax
\patchcmd\x{\@orgargctr}{#1\relax}\relax\relax}
\endgroup\DeclareRobustCommand*\Monthname[1]{%
\edef\x{%
% Non dovrebbero esserci problemi
\csname p@monthname\languagename\endcsname[#1]}%
\expandafter\MakeTextUppercase\x}\patchmonthname{english}
\apptocmd\select@language{\patchmonthname{#1}}{}{%
\errmessage{Cannot patch \string\select@language}}
\makeatother\setlipsumdefault{66}
\begin{document}
\maketitle
\section{È possibile?}
\Monthname{1} 2012. \lipsum
\begin{otherlanguage}{french}
\Monthname{2} 2012. \lipsum
\end{otherlanguage}
\begin{otherlanguage}{italian}
\Monthname{3} 2012. \lipsum
\end{otherlanguage}
\begin{otherlanguage}{spanish}
\Monthname{4} 2012. \lipsum
\end{otherlanguage}
\begin{otherlanguage}{german}
\Monthname{5} 2012. \lipsum
\end{otherlanguage}
\begin{otherlanguage}{english}
\Monthname{6} 2012. \lipsum
\end{otherlanguage}
\begin{otherlanguage}{spanish}
\Monthname{7} 2012. \lipsum
\end{otherlanguage}
\end{document}`Chiedo:
- C’è qualche grave falla in questo codice?
- Non sono riuscito a incorporare [tt]\@@patchmonthname[/tt] dentro [tt]\@patchmonthname[/tt]: ho dovuto definirlo a parte dopo aver posto [tt]\@makeother\#[/tt]. Perché? Se provo a incorporarlo, scrivendo “#1” nel secondo o terzo argomento di [tt]\patchcmd[/tt], il compilatore giustamente si lamenta che [tt]\@patchmonthname[/tt] non ha argomenti (cioè non può risolvere quel “#1”); se invece scrivo “##1”, rimangono entrambi i ##, anziché venire dimezzati. Mi sfugge qualcosa? Per essere più precisi, non funziona questo:
`\def\@patchmonthname{%
% Uso \x per fare prima a scrivere
\expandafter\let\expandafter\x\csname\string\monthname\languagename\endcsname
\patchcmd\x{\the\@orgargctr}{##1}\relax\relax
\patchcmd\x{\the\@orgargctr}{##1}\relax\relax
\patchcmd\x{\@orgargctr=##1\relax}{}\relax\relax
\patchcmd\x{\@orgargctr}{##1\relax}\relax\relax}
\expandafter\let\csname p@monthname\languagename\endcsname\x}`
A [tt]\patchcmd[/tt] viene passato “##1”, invece di “#1”. Perché?
Grazie,
AntonioNon è possibile usare [tt]\patchcmd[/tt] e [tt]#[/tt] in un testo di sostituzione senza biechi trucchi. L’errore è, come avrai capito, alla fonte: quell’assegnazione [tt]\@orgctr=#1[/tt] è perfettamente inutile. Prova a chiederlo a Nicola Talbot. Una definizione come
`\providecommand{\monthnameitalian}[1][\month]{%
\ifcase#1\relax\@dt@invalid@month{#1}%
\or gennaio%
\or febbraio%
\or marzo%
\or aprile%
\or maggio%
\or giugno%
\or luglio%
\or agosto%
\or settembre%
\or ottobre%
\or novembre%
\or dicembre%
\else\@dt@invalid@month{#1}
\fi}`
insieme a quella generica
`\def\@dt@invalid@month#1{\PackageError{datetime}{Invalid Month number #1}{Month numbers should go from 1 to 12}}`
sarebbe davvero meglio.Ciao
Enrico
-
25 Febbraio 2012 alle 14:29 #70213::
Sono perfettamente d’accordo.Ho creato un pacchettino ucmonthname che mi tengo nella cartella corrente (sembra funzionare sia con babel che con polyglossia). Purtroppo l’idea di inserirlo in anthosthesis per ora decade: non mi piace mettere patch.
`%% ucmonthname.sty
\ProvidesPackage{ucmonthname}
\RequirePackage{datetime}
\RequirePackage{etoolbox}\DeclareRobustCommand*\patchmonthname[1]{%
\if@dt@multilingual
\ifcsname monthname\languagename\endcsname
\ifcsname p@monthname\languagename\endcsname\else
\begingroup
\letcs{\x}{\string\monthname\languagename}%
\@patchmonthname
\global\cslet{p@monthname\languagename}{\x}%
\endgroup
\fi
\fi
\fi}\begingroup
\@makeother\#
\gdef\@patchmonthname{%
\patchcmd\x{\the\@orgargctr}{#1}\relax\relax
\patchcmd\x{\the\@orgargctr}{#1}\relax\relax
\patchcmd\x{\@orgargctr=#1\relax}{}\relax\relax
\patchcmd\x{\@orgargctr}{#1\relax}\relax\relax}
\endgroup\DeclareRobustCommand*\Monthname[1]{%
\begingroup
\edef\x{\endgroup\noexpand\MakeTextUppercase
\csname p@monthname\languagename\endcsname[#1]}%
\x}\apptocmd\select@language{\patchmonthname{#1}}{}{%
\errmessage{Cannot patch \string\select@language}}`Approfondirò la questione di [tt]\patchcmd[/tt] e #.
Grazie mille Enrico!
-
25 Febbraio 2012 alle 22:35 #70214::
Qualche miglioramento al codice:`\usepackage{datetime}
\usepackage{etoolbox}\makeatletter
\newcommand\patchmonthname{%
\ifcsname p@monthname\languagename\endcsname % already patched
\else
\ifcsname monthname\languagename\endcsname
\typeout{Patching \string\monthname\languagename}%
\@patchmonthname
\typeout{Patched \string\monthname\languagename}%
\else
\typeout{No original \string\monthname\languagename}%
\fi
\fi}\begingroup
\@makeother\#
\gdef\@patchmonthname{%
\letcs\@tempa{\string\monthname\languagename}%
\patchcmd\@tempa{\the\@orgargctr}{#1}{}{}%
\patchcmd\@tempa{\the\@orgargctr}{#1}{}{}%
\patchcmd\@tempa{\@orgargctr=#1\relax}{}{}{}%
\patchcmd\@tempa{\@orgargctr}{#1\relax}{}{}%
\global\expandafter\let\csname p@monthname\languagename\endcsname\@tempa}
\endgroup\@ifpackageloaded{babel}{}{\patchmonthname}
\newcommand*\Monthname[1]{%
\begingroup\edef\x{\endgroup\noexpand\MakeTextUppercase
% Dovrei generare un errore se non è definito?
\csname p@monthname\languagename\endcsname[#1]}\x
}\apptocmd\select@language{\patchmonthname}{}{}
\makeatother`
1. Non ho ben capito perché definivi [tt]\patchmonthname[/tt] con un argomento che poi non usavi. Il controllo su “multilingual” è ridondante e ti impedisce di usare la macro se non carichi babel.2. I controlli sono in ordine diverso: non facciamo niente se [tt]\p@monthname
[/tt] è già definito (caso forse più frequente). 3. Usiamo [tt]\ifcsname…\endcsname[/tt] che è più efficiente.
4. Eliminiamo [tt]\@@patchmonthname[/tt]
5. La riassegnazione finale del significato di [tt]\@tempa[/tt] a [tt]\p@monthname
[/tt] è globale, così se la macro è stata definita in un ambiente [tt]otherlanguage[/tt] non c’è bisogno di eseguire di nuovo [tt]\patchmonthname[/tt] 6. Com’è definito ora [tt]\Monthname[/tt] è meglio, perché il significato di [tt]\x[/tt] sparisce da sé
7. Se babel non è caricato, si esegue [tt]\patchmonthname[/tt] una volta per tutte con l’inglese.
Ciao
Enrico
-
26 Febbraio 2012 alle 9:06 #70215
-
-
AutoreRisposte
- Devi essere connesso per rispondere a questo topic.