Line wrap og word wrap - Line wrap and word wrap
Linjeskift , også kjent som ordinnpakning , bryter en tekstdel inn i linjer slik at den passer inn i den tilgjengelige bredden på en side, et vindu eller et annet visningsområde. I tekstvisning, linje wrap fortsetter på en ny linje når en linje er full, slik at hver linje passer inn i det synlige vinduet, slik at tekst som skal leses fra topp til bunn uten noen horisontal rulling . Word wrap er tilleggsfunksjonen til de fleste tekstredigerere , tekstbehandlere og nettlesere , for å bryte linjer mellom ord i stedet for i ord, der det er mulig. Word wrap gjør det unødvendig å hardkode nye linjeavgrensere i avsnitt, og lar visning av tekst tilpasse seg fleksibelt og dynamisk til skjermer i forskjellige størrelser.
Myke og harde avkastninger
En myk retur eller myk omslag er bruddet som følge av linjeomslag eller ordomslag (enten automatisk eller manuell), mens en hard retur eller hard omslag er en forsettlig pause, og skaper et nytt avsnitt. Med hard retur kan (og bør) avsnittsbruddformatering brukes (enten innrykk eller vertikal mellomrom). Myk innpakning lar linjelengder justeres automatisk med justeringer av bredden på brukerens vindu eller marginnstillinger, og er en standardfunksjon for alle moderne tekstredigerere, tekstbehandlere og e -postklienter . Manuelle myke pauser er unødvendige når ordbryting utføres automatisk, så det er vanligvis vanskelig å trykke "Enter" -tasten.
Alternativt kan "myk retur" bety et forsettlig, lagret linjeskift som ikke er et avsnittsbrudd. For eksempel er det vanlig å skrive ut postadresser i et flerlinjesformat, men flere linjer er forstått som et enkelt avsnitt. Linjeskift er nødvendig for å dele ordene i adressen i linjer med passende lengde.
I de moderne grafiske tekstbehandlerne Microsoft Word og OpenOffice.org forventes det at brukerne skriver en vognretur ( ) mellom hvert avsnitt. Formateringsinnstillinger, for eksempel innrykk på første linje eller mellomrom mellom avsnitt, trer i kraft der vognreturen markerer bruddet. Et linjeskift uten avsnitt, som er en myk retur, settes inn med + eller via menyene, og er gitt for tilfeller der teksten skal starte på en ny linje, men ingen av de andre bivirkningene ved å starte et nytt avsnitt er ønsket . ↵ Enter⇧ Shift↵ Enter
I tekstorienterte markeringsspråk tilbys vanligvis en myk retur som en merkelapp. For eksempel, i HTML er det en <br> -tag som har samme formål som den myke returen i tekstbehandlere beskrevet ovenfor.
Unicode
Den Unicode Linje Breaking algoritme bestemmer et sett av posisjoner, kjent som break muligheter , som er egnede steder der du kan starte en ny linje. De faktiske linjeskiftposisjonene velges blant pausemulighetene av programvaren på høyere nivå som kaller algoritmen, ikke av algoritmen selv, fordi bare programvaren på høyere nivå vet om bredden på displayet teksten vises på og bredden på tegnene som utgjør den viste teksten.
Unicode -tegnsettet gir et linjeseparatortegn samt et avsnittsseparator for å representere semantikken i myk retur og hard retur.
- 0x2028 LINJESeparator
- * kan brukes til å representere denne semantikken utvetydig
- 0x2029 AVSNITT SEPARATOR
- * kan brukes til å representere denne semantikken utvetydig
Ordgrenser, bindestrek og harde mellomrom
De myke avkastningene plasseres vanligvis etter slutten av fullstendige ord, eller etter skilletegn som følger fullstendige ord. Imidlertid kan ordomslag også forekomme etter en bindestrek inne i et ord. Dette er noen ganger ikke ønsket, og kan blokkeres ved å bruke en bindestrek eller hard bindestrek i stedet for en vanlig bindestrek.
Et ord uten bindestreker kan pakkes inn ved å ha myke bindestreker i det. Når ordet ikke er pakket inn (dvs. ikke er brutt på tvers av linjer), er ikke den myke bindestrek synlig. Men hvis ordet er viklet på tvers av linjer, gjøres dette ved den myke bindestrek, på hvilket tidspunkt det vises som en synlig bindestrek på den øverste linjen der ordet er brutt. (I det sjeldne tilfellet av et ord som er ment å kunne pakkes inn ved å bryte det på tvers av linjer, men uten å få et bindestrek til å vises, settes et mellomrom med null bredde til de tillatte brytpunktene i ordet.)
Noen ganger er ordomslag uønsket mellom tilgrensende ord. I slike tilfeller kan ordomslag vanligvis blokkeres ved å bruke et hardt mellomrom eller et ikke-brytende mellomrom mellom ordene, i stedet for vanlige mellomrom.
Ordinnpakning i tekst som inneholder kinesisk, japansk og koreansk
På kinesisk , japansk og koreansk kan ordinnpakning vanligvis forekomme før og etter et Han -tegn , men visse skilletegn kan ikke starte en ny linje. Japansk kana , bokstaver i det japanske alfabetet, behandles på samme måte som Han -tegn ( Kanji ) i forlengelse, noe som betyr at ord kan og har en tendens til å bli brutt uten bindestrek eller annen indikasjon på at dette har skjedd.
Under visse omstendigheter er det imidlertid ikke ønskelig med ordinnpakning. For eksempel,
- ordinnpakning er kanskje ikke ønsket i personnavn, og
- ordinnpakning er kanskje ikke ønsket i sammensatte ord (når teksten er i flukt til venstre, men bare i noen stiler).
De fleste eksisterende tekstbehandlere og sats programvare kan ikke håndtere noen av de ovennevnte scenarier.
CJK- tegnsetting kan eventuelt følge regler som ligner på de ovennevnte spesielle omstendighetene. Det er opp til linjebrytende regler i CJK .
Et spesielt tilfelle av linjebrytende regler i CJK gjelder imidlertid alltid: Linjeomslag må aldri forekomme inne i CJK -bindestrek og ellips. Selv om hvert av disse skilletegnene må være representert med to tegn på grunn av en begrensning av alle eksisterende tegnkodinger , er hvert av disse iboende et enkelt skilletegn som er to ems bredt, ikke to skilletegn på ett em.
Algoritme
Ordinnpakning er et optimaliseringsproblem . Avhengig av hva som må optimaliseres for, brukes forskjellige algoritmer.
Minimum antall linjer
En enkel måte å gjøre ordinnpakning på er å bruke en grådig algoritme som setter så mange ord på en linje som mulig, for deretter å gå videre til neste linje for å gjøre det samme til det ikke er flere ord igjen å plassere. Denne metoden brukes av mange moderne tekstbehandlere, for eksempel OpenOffice.org Writer og Microsoft Word. Denne algoritmen bruker alltid det minste mulige antallet linjer, men kan føre til linjer med vidt forskjellige lengder. Følgende pseudokode implementerer denne algoritmen:
SpaceLeft := LineWidth
for each Word in Text
if (Width(Word) + SpaceWidth) > SpaceLeft
insert line break before Word in Text
SpaceLeft := LineWidth - Width(Word)
else
SpaceLeft := SpaceLeft - (Width(Word) + SpaceWidth)
Hvor LineWidther bredden på en linje, SpaceLefter den gjenværende bredden på plassen på linjen som skal fylles, SpaceWidther bredden på et enkelt mellomromstegn, Texter inndatateksten som skal gjentas og Worder et ord i denne teksten.
Minimum raggedness
En annen algoritme, brukt i TeX , minimerer summen av kvadratene til lengden på mellomrommene på slutten av linjene for å gi et mer estetisk tiltalende resultat. Følgende eksempel sammenligner denne metoden med den grådige algoritmen, som ikke alltid minimerer kvadratplass.
For inndatateksten
AAA BB CC DDDDD
med linjebredde 6 ville den grådige algoritmen produsere:
------ Line width: 6 AAA BB Remaining space: 0 CC Remaining space: 4 DDDDD Remaining space: 1
Summen av kvadratrommet igjen av denne metoden er . Imidlertid oppnår den optimale løsningen den mindre summen :
------ Line width: 6 AAA Remaining space: 3 BB CC Remaining space: 1 DDDDD Remaining space: 1
Forskjellen her er at den første linjen er brutt før i BBstedet for etter den, noe som gir en bedre høyremargin og en lavere kostnad 11.
Ved å bruke en dynamisk programmeringsalgoritme til å velge posisjonene som linjen skal brytes ved, i stedet for å velge pauser grådig, kan løsningen med minst mulig raggedness bli funnet i tide , hvor er antallet ord i inndatateksten. Vanligvis bør kostnadsfunksjonen for denne teknikken endres slik at den ikke teller plassen som er igjen på den siste linjen i et avsnitt; denne endringen tillater et avsnitt å ende midt på en linje uten straff. Det er også mulig å bruke den samme dynamiske programmeringsteknikken for å minimere mer komplekse kostnadsfunksjoner som kombinerer andre faktorer, for eksempel antall linjer eller kostnader for bindestrek for lange ord. Raskere, men mer kompliserte, lineære tidsalgoritmer basert på SMAWK -algoritmen er også kjent for problemet med minimalt raggedness, og for noen andre kostnadsfunksjoner som har lignende egenskaper.
Historie
En primitiv linjebrytende funksjon ble brukt i 1955 i en "sideskriverstyringsenhet" utviklet av Western Union . Dette systemet brukte reléer i stedet for programmerbare digitale datamaskiner, og trengte derfor en enkel algoritme som kunne implementeres uten databuffere . I Western Union -systemet ble hver linje brutt ved det første mellomromstegnet som dukket opp etter det 58. tegnet, eller med det 70. tegnet hvis det ikke ble funnet et mellomromstegn.
Den grådige algoritmen for linjeskifting går foran den dynamiske programmeringsmetoden som Donald Knuth skisserte i et ikke-publisert notat fra 1977 som beskriver TeX-settesystemet og senere utgitt mer detaljert av Knuth & Plass (1981) .
Se også
Referanser
Eksterne linker
Knuths algoritme
- "Knuth & Plass line-breaking Revisited"
- "tex_wrap": "Implementerer TeXs algoritme for å dele avsnitt i linjer." Referanse: "Breaking Paragraphs into Lines", DE Knuth og MF Plass, kapittel 3 i _Digital Typography_, CSLI Forelesningsnotater #78.
- Tekst :: Reflow - Perl -modul for tilbakespyling av tekstfiler ved bruk av Knuths paragraferingsalgoritme. "Reflow -algoritmen prøver å holde linjene i samme lengde, men prøver også å bryte ved tegnsetting, og unngå å bryte innenfor et eget navn eller etter visse tilkoblinger (" a "," the ", etc.). Resultatet er en fil med en mer "fillete" høyre margin enn det som produseres av fmt eller Text :: Wrap, men det er lettere å lese siden færre setninger brytes på tvers av linjeskift. "
- justere Knuth -algoritmen for å gjenkjenne den "myke bindestrek" .
- Knuths brytende algoritme. "Den detaljerte beskrivelsen av modellen og algoritmen finnes på papiret" Breaking Paragraphs into Lines "av Donald E. Knuth, utgitt i boken" Digital Typography "(Stanford, California: Center for the Study of Language and Information, 1999), (CSLI Forelesningsnotater, nr. 78.) "; del av Google Summer Of Code 2006
- "Bridging the Algorithm Gap: A Linear-time Functional Program for Paragraph Formatting" av Oege de Moor, Jeremy Gibbons, 1999
Andre lenker for ordomslag
- det omvendte problemet - å velge kolonner akkurat så bredt at de kan passe (innpakket) tekst ( arkivert versjon )
- KWordWrap Class Reference brukt i KDE GUI
- "Knuth linebreaking elements for Formatting Objects" av Simon Pepping 2006. Utvider Knuth -modellen til å håndtere noen få forbedringer.
- "Sidebrytende strategier" Utvider Knuth -modellen til å håndtere noen få forbedringer.
- "en Knuth-Plass-lignende linjebrytende algoritme ... Den * virkelig * interessante tingen er hvordan Adobes algoritme skiller seg fra Knuth-Plass-algoritmen. Den må være forskjellig, siden Adobe har klart å patentere sin algoritme (6.510.441)." [1]
- "Murray Sargent: Math in Office"
- "Linjeskift" sammenligner algoritmene til forskjellige tidskomplekser.