- Questo topic ha 7 risposte, 3 partecipanti ed è stato aggiornato l'ultima volta 11 anni, 9 mesi fa da
Elrond.
-
CreatoreTopic
-
11 Dicembre 2014 alle 19:43 #99046::
Poniamo di avere il seguente testo, aperto in TeXShop
`\textgreek{Μετά} \textgreek{τα} \textgreek{φυσικά} `
È possibile, usando un’espressione regolare nella funzione Cerca e Sostituisci,
Ottenere questo
`\textgreek{Μετά τα φυσικά} `
?Naturalmente la soluzione deve prescindere dall’argomento dei vari \textgreek 😉
Cerco infatti una soluzione generale per ovviare a problemi simili, che nascono spesso quando si converte un documento .odt con writer2latex.Ringrazio in anticipo! Se ci fossero altre soluzioni, ben vengano…
Ciao
Ivan
-
CreatoreTopic
-
AutoreRisposte
-
-
11 Dicembre 2014 alle 20:54 #99047::
ivan” post=98605Poniamo di avere il seguente testo, aperto in TeXShop
`\textgreek{Μετά} \textgreek{τα} \textgreek{φυσικά} `
È possibile, usando un’espressione regolare nella funzione Cerca e Sostituisci,
Ottenere questo
`\textgreek{Μετά τα φυσικά} `
?Naturalmente la soluzione deve prescindere dall’argomento dei vari \textgreek 😉
Cerco infatti una soluzione generale per ovviare a problemi simili, che nascono spesso quando si converte un documento .odt con writer2latex.Ringrazio in anticipo! Se ci fossero altre soluzioni, ben vengano…
Ciao
IvanCiao Ivan.
Questi sono problemi tipici dell’elaborazione di file testuali.
Ti propongo uno script in Lua non molto efficiente ma che dovrebbe svolgere il seguente compito: raggruppa tutti gli argomenti di \textgreek consecutivi al più separati da spazi in un unico \textgreek.Istruzioni:
1 copia il seguente codice in un file di testo chiamandolo “degreek”
`#! /usr/bin/lua— synopsis
— degreek input_filename output_filename
— degreek input_filenamelocal infile = arg[1]
local outfile = arg[2] or infilelocal f = assert(io.open(infile, “r”))
local res = f:read(“*a”)
f:close()local pattern = “\\textgreek{(.-)}%s*\\textgreek{(.-)}”
while string.match(res, pattern) do
res = string.gsub(
res,
pattern,
function (t1, t2)
return string.format(“\\textgreek{%s %s}”, t1, t2)
end
)
end— saving file
local f = assert(io.open(outfile, “w”))
f:write(res)
f:close()
`2 assegnagli i permessi di esecuzione
3 spostalo nella cartella dove è presente il file da elaborare per esempio chiamato tesi.tex
4 dai il comando da terminale:
`$ degreek tesi.tex tesi-dk.tex`
Dovrebbe comparire il file tesi-dk.tex con il testo che desideri.
Attenzione:
Se non specifichi il nome del file di output, il file originale sarà sovrascritto.Se incontri problemi con il comando Lua allora usa:
`$ texlua degreek tesi.tex tesi-dk.tex`texlua è un interprete Lua distribuito con TeX Live, non devi quindi installare niente.
Buona serata.
R.
-
11 Dicembre 2014 alle 21:30 #99048
-
12 Dicembre 2014 alle 6:39 #99049::
ivan” post=98609Grazie Roberto!
Siamo sicuri che lo script fa solo quello? Cioè si possono escludere effetti indesiderati?
Devo convertire testi di altri autori e non vorrei trovarmi delle sorprese.Ciao
IvanFai un test di verifica su file complicati!
Il codice l’ho scritto io e sono abbastanza sicuro che non contiene virus 🙂
Ecco come fa:
1 – carica il file da degreekare tutto in memoria
2 – esegue un ciclo iterativo finché nel testo ci sono almeno due \textgreek{} consecutivi
2.1 – in ogni ciclo sostituisce tutte le occorrenze doppie in una sola
3 – salva il risultato in un file a parte se l’utente ne ha specificato un nome altrimenti sovrascrive il file originaleIl programma lavora quindi sostituendo coppie di \textgrrek con uno solo.
Se ci fossero più \textgreek consecutivi, diciamo 7, nel primo passaggio ne converte 6 in tre coppie, nel successivo converte 4 in due coppie e nel terzo passaggio ne converte due in uno solo.
Ecco perché non è molto efficiente, ma lavorando su un testo totalemente caricato in memoria appare comunque veloce.
Buona giornata.
R.
-
12 Dicembre 2014 alle 12:29 #99050::
Devo ancora provarlo, lo confesso. Ma sono sicuro che funziona 😀
Tuttavia mi rimane il chiodo fisso della funzione Cerca e Sostituisci…Find: (\\textgreek\{.)\} \\textgreek\{
Replace: \1␣
(dove ␣ in realtà è uno spazio)Funziona bene sulle coppie \textgreek{ἔ} \textgreek{ἔ} e \textgreek{ἆ} \textgreek{ἆ}
dell’esempio qui sotto.`
\textgreek{τάχος} \textgreek{γὰρ}
\textgreek{τόδ}' \textgreek{ἔσται}~|, 1114 \textgreek{ἔ ἔ}
\textgreek{παπαῖ} \textgreek{παπαῖ} |, 1125 \textgreek{ἆ} \textgreek{ἆ} \textgreek{ἰδοὺ} \textgreek{ἰδού}
`Se ci aggiungo un asterisco:
Find: (\\textgreek\{.*)\} \\textgreek\{
Replace: \1␣Evidenzia tutto il testo precedente, tuttavia esegue le sostituzioni correttamente, tranne nel caso in cui i due \textgreek siano su righe differenti.
Bisogna iterare la sostituzione, perché ad azione “sostituisci” sistema una sola coppia di \textgreek successivi separati da uno spazio.
La coppia \textgreek{τόδ}’ \textgreek{ἔσται} non viene individuata, perché ‘ non è uno spazio. Ma questo forse è un bene, visto che quei casi dovrebbero essere pochi (si spera). E quindi un correzione manuale non è un grosso problema. Sarebbe invece comodo che la sostituzione funzionasse anche nel caso di due \textgreek successivi ma su righe diverse. Trovata (mentre scrivo provo, più o meno a caso, a cambiare l’espressione regolare):Find: (\\textgreek\{.*)\} \s?\\textgreek\{
Replace: \1␣Ora, queste espressioni funzionano sui file che ho provato io. Ma la domanda è: ho scritto veramente quello che volevo? 🙄
Aggiungo che l’ultima espressione, con il comando \s?, funziona solo se seleziono “Ruby” nella finestra “Search Syntax”. Con POSIX, per esempio, niente da fare.Ciao
Ivan
-
12 Dicembre 2014 alle 13:52 #99051::
Ciao.
Non posso sperimentare con TeXShop perché non ho Mac.
Devi fare parecchi tentativi e studiarti la documentazione e gli esempi.Anche lo script andrebbe modificato se vuoi che l’assemblaggio funzioni anche su più righe.
Esso non fa uso di regex. Se vuoi qualcosa di più sofisticato occorre considerare librerie più avanzate.
R.
-
12 Dicembre 2014 alle 15:40 #99052::
robitex” post=98628Ciao.
Non posso sperimentare con TeXShop perché non ho Mac.
Devi fare parecchi tentativi e studiarti la documentazione e gli esempi.Anche lo script andrebbe modificato se vuoi che l’assemblaggio funzioni anche su più righe.
Esso non fa uso di regex. Se vuoi qualcosa di più sofisticato occorre considerare librerie più avanzate.
R.Il problema delle ricerche su più righe può essere aggirato facilmente cercando tutti in \textgreek seguiti da una riga e sostituendoli con la stessa sequenza seguita da uno spazio. Farò dei tentavi. Certo che queste benedette espressioni regolari sono una giungla. Fino a ieri non ne conoscevo le vere potenzialità. Mi viene in mente per esempio il caso delle note a piè di pagina seguite o precedute da un punto. Con le regex si può passare da un caso all’altro facilmente. Temo di aver scoperto l’acqua calda…
Ciao
Ivan
-
12 Dicembre 2014 alle 16:00 #99053::
ivan” post=98629
Ciao.
Non posso sperimentare con TeXShop perché non ho Mac.
Devi fare parecchi tentativi e studiarti la documentazione e gli esempi.Anche lo script andrebbe modificato se vuoi che l’assemblaggio funzioni anche su più righe.
Esso non fa uso di regex. Se vuoi qualcosa di più sofisticato occorre considerare librerie più avanzate.
R.Il problema delle ricerche su più righe può essere aggirato facilmente cercando tutti in \textgreek seguiti da una riga e sostituendoli con la stessa sequenza seguita da uno spazio. Farò dei tentavi. Certo che queste benedette espressioni regolari sono una giungla. Fino a ieri non ne conoscevo le vere potenzialità. Mi viene in mente per esempio il caso delle note a piè di pagina seguite o precedute da un punto. Con le regex si può passare da un caso all’altro facilmente. Temo di aver scoperto l’acqua calda…
Ciao
IvanNon so gli altri editor cosa facciano, ma tutto il parsing che compie AUCTeX sui sorgenti *TeX, e senza il quale non avrebbe particolari caratteristiche, è basato sull’estrazione di informazioni usando espressioni regolari.
Per la sostituzione della punteggiatura che dici tu, su Emacs cercherei
`\\(\\\\footnote{[^}]*}\\)\\([.,;]\\)`
e sostituirei con
`\\2\\1`
Però se l’argomento della nota contiene dei comandi con argomenti (quindi parentesi graffe) la cosa si complica leggermente: pattern di ricerca
`\\(\\\\footnote{\\([^}]*{[^}]*}[^}]*\\)*}\\)\\([.,;]\\)`
sostituzione:
`\\3\\1`
-
-
AutoreRisposte
- Devi essere connesso per rispondere a questo topic.