2016-05-31 6 views
0

Ich bin auf der Suche nach einem schnellen Bash-Skript, um Britisch/Neuseeland Schreibweisen in American in einem TeX-Dokument konvertieren (für die Arbeit mit US-amerikanischen Wissenschaftlern und Journal Einreichung)). Dies ist ein formales mathematisches Biologiepapier mit sehr wenig regionaler Terminologie oder Grammatik: Vorarbeiten werden als Formeln und nicht als Anführungszeichen angegeben.Bash-Skript/Dienstprogramm, um UK Englisch zu konvertieren in TeX Dokument

zB

Generalise ->Generalize

Colour ->Color

Centre ->Centre

Abbildung muss sed oder awk basiertes Skript sein die meisten der gemeinsamen Rechtschreibung ersetzen Unterschiede.

Weitere Informationen finden Sie in der entsprechenden TeX-Forum-Frage.

https://tex.stackexchange.com/questions/312138/converting-uk-to-us-spellings

N. B. Ich kompiliere derzeit PDFLaTeX mit kile auf Ubuntu 16.04 oder Elementary OS 0.3 Freya, aber ich kann einen anderen TeX-Compiler/Paket verwenden, wenn es eine eingebaute Reparatur woanders gibt.

Danke für Ihre Hilfe.

+0

"Ersetzen" nicht den Job für Sie tun? –

+0

Das Skript ist trivial. Die Daten jedoch ... Können Sie eine geeignete Liste von Substitutionen bereitstellen? –

+0

Nun, ich könnte 'sed' oder' awk' verwenden, um jeden Fall separat zu ersetzen. Ich hatte gehofft, jemand hätte bereits eine Schleife oder ein Skript für häufige Fälle vorbereitet. In der Tat ist es eine andere Herausforderung, eine Liste gängiger Substitutionen zu finden. Wenn ich es selbst tun würde, würde ich es auf github einrichten, um es zu aktualisieren, wenn ich auf neue Fälle stoße. –

Antwort

0

Ich denke, Sie müssen eine Liste der Substitution bei sich haben und rufen Sie für die Übersetzung. Sie müssten Ihre Wörterbuchdatei anreichern, um Textdateien effizient zu übersetzen.

sourceFile=$1 
dict=$2 

while read line 
    do 
    word=$(echo $line |awk '{print $1}') 
    updatedWord=$(grep -i $word $dict|awk '{print $2}') 

    sed -i "s/$word/$updatedWord/g" $sourceFile 2 > /dev/null 

    done < $dict 

Führen Sie das obige Skript wie:

./scriptName source.txt dictionary.txt 

Hier ein Beispielwörterbuch, das ich verwendet:

>cat dict 
characterize characterise 
prioritize prioritise 
specialize specialise 
analyze analyse 
catalyze catalyse 
size size 
exercise exercise 
behavior behaviour 
color colour 
favor favour 
contour contour 
center centre 
fiber fibre 
liter litre 
parameter parameter 
ameba amoeba 
anesthesia anaesthesia 
diarrhea diarrhoea 
esophagus oesophagus 
leukemia leukaemia 
cesium caesium 
defense defence 
practice practice 
license licence 
defensive defensive 
advice advice 
aging ageing 
acknowledgment acknowledgement 
judgment judgement 
analog analogue 
dialog dialogue 
fulfill fulfil 
enroll enrol 
skill, skillful skill, skilful 
labeled labelled 
signaling signalling 
propelled propelled 
revealing revealing 

Execution Ergebnis:

cat source 
color of this fiber is great and we should analyze it. 

./ScriptName source.txt dict.txt 

cat source 
colour of this fibre is great and we should analyse it. 
+0

Danke, das war es, was mir im Kopf sehr geholfen hat. Dieses Wörterbuch ist ein guter Ausgangspunkt, um Anwendungsfälle hinzuzufügen, wenn sie in einer Datei oder im Web erscheinen. Gibt es eine Möglichkeit, Wörter auszuschließen, wenn sie für Code verwendet werden, z. B. '\ color'' xcolor' 'color {' also würde das Umschalten die LaTeX-Tags nicht durcheinander bringen? Normalerweise schreibe ich in der englischen Schreibweise und muss die US-Schreibweise für Code oder Latex beibehalten. Dies zu denken wäre von Vorteil, wenn ich (oder jemand anderes) in der Zukunft die US-amerikanische Schreibweise wechseln müsste. –

+0

Die Verwendung einer Shell 'while read' zur Durchführung einer Textumwandlung in jeder Eingabezeile ist ein Antipattern. Sie sollten stattdessen Awk dafür suchen. (Eine Reihe anderer Skriptsprachen würde ebenfalls gut funktionieren.) – tripleee

0

Hier ist meine Lösung mit awk, dass ich denke, ist flexibler als sed. Dieser prg. Verlässt die LaTeX-Befehle (wenn das Wort mit "\" beginnt) und behält die ersten Großbuchstaben der Wörter bei. Die Parameter von LaTeX-Befehlen (und normalen Texten) werden durch eine Wörterbuchdatei ersetzt. Wenn [rev] der dritte Parameter des Programms aktiviert ist, wird eine umgekehrte Substitution durch die gleiche Wörterbuchdatei durchgeführt. Alle Nicht-Alpha-Beta-Zeichen fungieren als Worttrennzeichen (dies ist in der LaTeX-Quelldatei erforderlich). Das Prg schreibt seine Ausgabe auf dem Bildschirm (stdout), so dass Sie die Umleitung zu Datei verwenden müssen (> output_f). (Ich glaube, die Inputencodierung Ihrer LaTeX-Quelle ist 1 Byte/char.

)
> cat dic.sh 
#!/bin/bash 
(($#<2))&& { echo "Usage $0 dictionary_file latex_file [rev]"; exit 1; } 
((d= $#==3 ? 0:1)) 
awk -v d=$d ' 
BEGIN {cm=fx=0; fn="";} 
fn!=FILENAME {fx++; fn=FILENAME;} 
fx==1 {if(!NF)next; if(d)a[$1]=$2; else a[$2]=$1; next;} #read dict or rev dict file into an associative array 
fx==2 { for(i=1; i<=length($0); i++) 
      {c=substr($0,i,1);       #read characters from a given line of LaTeX source  
      if(cm){printf("%s",c); if(c~"[^A-Za-z0-9\\\]")cm=0;} #LaTeX command is occurred 
      else if(c~"[A-Za-z]")w=w c; else{pr(); printf("%s",c); if(c=="\\")cm=1;} #collect alpha-bets or handle them 
      } 
     pr(); printf("\n");        #handle collected last word in the line 
     } 
function pr( s){ # print collected word or its substitution by dictionary and recreates first letter case 
    if(!length(w))return; 
    s=tolower(w); 
    if(!(s in a))printf("%s",w); 
    else printf("%s", s==w ? a[s] : toupper(substr(a[s],1,1)) substr(a[s],2)); 
    w="";} 
' $1 $2   

Wörterbuch-Datei:

> cat dictionary 
apple  lemon 
raspberry cherry 
pear  banana 

Eingang LaTeX Quelle:

> cat src.txt 
Apple123pear,apple "pear". 
\Apple123pear{raspberry}{pear}[apple]. 

Raspberry12Apple,pear. 

Execution Ergebnis:

> ./dic.sh 
Usage ./dic.sh dictionary_file latex_file [rev] 

> ./dic.sh dictionary src.txt >out1.txt; cat out1.txt 
Lemon123banana,lemon "banana". 
\Apple123pear{cherry}{banana}[lemon]. 

Cherry12Lemon,banana. 

> ./dic.sh dictionary out1.txt >out2.txt rev; cat out2.txt 
Apple123pear,apple "pear". 
\Apple123pear{raspberry}{pear}[apple]. 

Raspberry12Apple,pear. 

> diff src.txt out2.txt # they are identical 
Verwandte Themen