Retour à la ligne et retour à la ligne - Line wrap and word wrap
Le saut de ligne , également appelé retour à la ligne , consiste à diviser une section de texte en lignes afin qu'elle tienne dans la largeur disponible d'une page, d'une fenêtre ou d'une autre zone d'affichage. Dans l'affichage de texte, le retour à la ligne se poursuit sur une nouvelle ligne lorsqu'une ligne est pleine, de sorte que chaque ligne s'insère dans la fenêtre visible, permettant au texte d'être lu de haut en bas sans aucun défilement horizontal . Le retour à la ligne est la fonctionnalité supplémentaire de la plupart des éditeurs de texte , des traitements de texte et des navigateurs Web , consistant à casser les lignes entre les mots plutôt qu'à l'intérieur des mots, dans la mesure du possible. Le retour à la ligne rend inutile le codage en dur des délimiteurs de nouvelle ligne dans les paragraphes et permet à l'affichage du texte de s'adapter de manière flexible et dynamique à des affichages de différentes tailles.
Retours doux et durs
Un retour progressif ou un retour à la ligne est le saut résultant d'un retour à la ligne ou d'un retour à la ligne (qu'il soit automatique ou manuel), tandis qu'un retour ou un retour à la ligne est un saut intentionnel, créant un nouveau paragraphe. Avec un retour forcé, la mise en forme des sauts de paragraphe peut (et doit) être appliquée (soit par indentation, soit par espace vertical). L'habillage souple permet aux longueurs de ligne de s'ajuster automatiquement avec des ajustements de la largeur de la fenêtre de l'utilisateur ou des paramètres de marge, et est une fonctionnalité standard de tous les éditeurs de texte, traitements de texte et clients de messagerie modernes . Les pauses logicielles manuelles sont inutiles lorsque le retour à la ligne est effectué automatiquement, donc appuyer sur la touche "Entrée" produit généralement un retour dur.
Alternativement, "retour progressif" peut signifier un saut de ligne intentionnel et stocké qui n'est pas un saut de paragraphe. Par exemple, il est courant d'imprimer des adresses postales dans un format à plusieurs lignes, mais les plusieurs lignes sont considérées comme un seul paragraphe. Des sauts de ligne sont nécessaires pour diviser les mots de l'adresse en lignes de la longueur appropriée.
Dans les traitements de texte graphiques contemporains Microsoft Word et OpenOffice.org , les utilisateurs doivent taper un retour chariot ( ) entre chaque paragraphe. Les paramètres de mise en forme, tels que le retrait de la première ligne ou l'espacement entre les paragraphes, prennent effet lorsque le retour chariot marque la rupture. Un saut de ligne sans paragraphe, qui est un retour progressif, est inséré à l'aide de + ou via les menus, et est fourni pour les cas où le texte doit commencer sur une nouvelle ligne mais aucun des autres effets secondaires du début d'un nouveau paragraphe n'est souhaité . ↵ Enter⇧ Shift↵ Enter
Dans les langages de balisage orientés texte, un retour progressif est généralement proposé sous forme de balise de balisage. Par exemple, en HTML, il existe une balise <br> qui a le même objectif que le retour progressif dans les traitements de texte décrits ci-dessus.
Unicode
L' algorithme de rupture de ligne Unicode détermine un ensemble de positions, appelées opportunités de rupture , qui sont des endroits appropriés pour commencer une nouvelle ligne. Les positions de saut de ligne réelles sont sélectionnées parmi les opportunités de saut par le logiciel de niveau supérieur qui appelle l'algorithme, et non par l'algorithme lui-même, car seul le logiciel de niveau supérieur connaît la largeur de l'écran sur lequel le texte est affiché et la largeur de les glyphes qui composent le texte affiché.
Le jeu de caractères Unicode fournit un caractère séparateur de ligne ainsi qu'un séparateur de paragraphe pour représenter la sémantique du retour progressif et du retour ferme.
- SÉPARATEUR DE LIGNE 0x2028
- * peut être utilisé pour représenter cette sémantique sans ambiguïté
- SÉPARATEUR DE PARAGRAPHES 0x2029
- * peut être utilisé pour représenter cette sémantique sans ambiguïté
Limites de mots, césure et espaces durs
Les retours progressifs sont généralement placés après la fin des mots complets ou après la ponctuation qui suit les mots complets. Cependant, le retour à la ligne peut également se produire après un trait d'union à l' intérieur d'un mot. Ceci n'est parfois pas souhaité et peut être bloqué en utilisant un trait d'union insécable , ou un trait d'union ferme , au lieu d'un trait d'union normal.
Un mot sans traits d'union peut être rendu enveloppable en y insérant des traits d'union souples . Lorsque le mot n'est pas enveloppé (c'est-à-dire qu'il n'est pas interrompu entre les lignes), le trait d'union conditionnel n'est pas visible. Mais si le mot est enroulé sur plusieurs lignes, cela se fait au niveau du trait d'union souple, auquel cas il est affiché sous la forme d'un trait d'union visible sur la ligne supérieure où le mot est rompu. (Dans le cas rare d'un mot qui est censé être enroulable en le brisant sur plusieurs lignes mais sans jamais faire apparaître de trait d'union, un espace de largeur zéro est placé au(x) point(s) de rupture autorisé(s) dans le mot.)
Parfois, le retour à la ligne n'est pas souhaitable entre des mots adjacents. Dans de tels cas, le retour à la ligne peut généralement être bloqué en utilisant un espace dur ou un espace insécable entre les mots, au lieu d'espaces normaux.
Habillage de mots dans du texte contenant du chinois, du japonais et du coréen
En chinois , japonais et coréen , le retour à la ligne peut généralement se produire avant et après n'importe quel caractère han , mais certains caractères de ponctuation ne sont pas autorisés à commencer une nouvelle ligne. Les kana japonais , lettres de l'alphabet japonais, sont traités de la même manière que les caractères Han ( Kanji ) par extension, ce qui signifie que les mots peuvent et ont tendance à être brisés sans trait d'union ou autre indication que cela s'est produit.
Dans certaines circonstances, cependant, l'habillage de mots n'est pas souhaité. Par exemple,
- l'habillage de mots peut ne pas être souhaité dans les noms de personnes, et
- l'habillage de mots peut ne pas être souhaité dans les mots composés (lorsque le texte est aligné à gauche, mais uniquement dans certains styles).
La plupart des logiciels de traitement de texte et de composition existants ne peuvent gérer aucun des scénarios ci-dessus.
La ponctuation CJK peut ou non suivre des règles similaires aux circonstances spéciales mentionnées ci-dessus. Cela dépend des règles de saut de ligne en CJK .
Cependant, un cas particulier de règles de saut de ligne en CJK s'applique toujours : le retour à la ligne ne doit jamais se produire à l'intérieur du tiret et des points de suspension CJK. Même si chacun de ces signes de ponctuation doit être représenté par deux caractères en raison d'une limitation de tous les codages de caractères existants , chacun d'eux est intrinsèquement un seul signe de ponctuation de deux ems de largeur, et non pas deux signes de ponctuation d'un em de largeur.
Algorithme
L'habillage de mots est un problème d'optimisation . Selon ce qui doit être optimisé, différents algorithmes sont utilisés.
Nombre minimum de lignes
Un moyen simple de faire un wrapping de mots est d'utiliser un algorithme glouton qui met autant de mots que possible sur une ligne, puis de passer à la ligne suivante pour faire de même jusqu'à ce qu'il n'y ait plus de mots à placer. Cette méthode est utilisée par de nombreux traitements de texte modernes, tels que OpenOffice.org Writer et Microsoft Word. Cet algorithme utilise toujours le nombre minimum de lignes possible mais peut conduire à des lignes de longueurs très variables. Le pseudocode suivant implémente cet algorithme :
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)
Où LineWidth
est la largeur d'une ligne, SpaceLeft
est la largeur de l'espace restant sur la ligne à remplir, SpaceWidth
est la largeur d'un seul caractère d'espacement, Text
est le texte d'entrée sur lequel itérer et Word
est un mot dans ce texte.
Raggedness minimum
Un algorithme différent, utilisé dans TeX , minimise la somme des carrés des longueurs des espaces à la fin des lignes pour produire un résultat plus esthétique. L'exemple suivant compare cette méthode avec l'algorithme glouton, qui ne minimise pas toujours l'espace au carré.
Pour le texte saisi
AAA BB CC DDDDD
avec une largeur de ligne de 6, l'algorithme glouton produirait :
------ Line width: 6 AAA BB Remaining space: 0 CC Remaining space: 4 DDDDD Remaining space: 1
La somme de l'espace au carré laissé par cette méthode est . Cependant, la solution optimale atteint la somme la plus petite :
------ Line width: 6 AAA Remaining space: 3 BB CC Remaining space: 1 DDDDD Remaining space: 1
La différence ici est que la première ligne est interrompue avant BB
au lieu d'après, ce qui donne une meilleure marge à droite et un coût inférieur 11.
En utilisant un algorithme de programmation dynamique pour choisir les positions auxquelles couper la ligne, au lieu de choisir des coupures avidement, la solution avec un minimum d'irrégularités peut être trouvée dans le temps , où est le nombre de mots dans le texte d'entrée. Typiquement, la fonction de coût de cette technique doit être modifiée pour qu'elle ne compte pas l'espace laissé sur la dernière ligne d'un paragraphe ; cette modification permet à un paragraphe de se terminer au milieu d'une ligne sans pénalité. Il est également possible d'appliquer la même technique de programmation dynamique pour minimiser des fonctions de coût plus complexes qui combinent d'autres facteurs tels que le nombre de lignes ou les coûts de césure de mots longs. Des algorithmes de temps linéaire plus rapides mais plus compliqués basés sur l' algorithme SMAWK sont également connus pour le problème d'irrégularité minimum et pour certaines autres fonctions de coût qui ont des propriétés similaires.
Histoire
Une fonction de saut de ligne primitive a été utilisée en 1955 dans une "unité de contrôle d'imprimante de page" développée par Western Union . Ce système utilisait des relais plutôt que des ordinateurs numériques programmables et nécessitait donc un algorithme simple pouvant être mis en œuvre sans tampons de données . Dans le système Western Union, chaque ligne était interrompue au premier caractère d'espacement à apparaître après le 58e caractère, ou au 70e caractère si aucun caractère d'espacement n'a été trouvé.
L'algorithme glouton pour le saut de ligne est antérieur à la méthode de programmation dynamique décrite par Donald Knuth dans un mémo non publié de 1977 décrivant son système de composition TeX et publié plus tard plus en détail par Knuth & Plass (1981) .
Voir également
- Espace non-cassant
- Alignement typographique
- Espace de largeur zéro
- diviseur de mot
- Menuisier de mots
Les références
Liens externes
L'algorithme de Knuth
- "Knuth & Plass révolutionnaire revisité"
- "tex_wrap": "Implémente l'algorithme de TeX pour diviser les paragraphes en lignes." Référence : "Breaking Paragraphs into Lines", DE Knuth et MF Plass, chapitre 3 de _Digital Typography_, CSLI Lecture Notes #78.
- Text::Reflow - Module Perl pour redistribuer des fichiers texte en utilisant l'algorithme de paragraphe de Knuth. "L'algorithme de refusion essaie de garder les lignes de la même longueur mais essaie également de casser à la ponctuation, et d'éviter de casser dans un nom propre ou après certains connecteurs ("a", "le", etc.). Le résultat est un fichier avec une marge de droite plus "déchiquetée" que celle produite par fmt ou Text::Wrap, mais elle est plus facile à lire car moins de phrases sont brisées entre les sauts de ligne."
- en ajustant l'algorithme de Knuth pour reconnaître le "trait d'union souple" .
- L'algorithme de rupture de Knuth. "La description détaillée du modèle et de l'algorithme se trouve dans l'article "Breaking Paragraphs into Lines" de Donald E. Knuth, publié dans le livre "Digital Typography" (Stanford, Californie : Center for the Study of Language and Information, 1999), (CSLI Notes de cours, n° 78.) » ; partie de Google Summer Of Code 2006
- "Bridging the Algorithm Gap: A Linear-time Functional Program for Paragraph Formatting" par Oege de Moor, Jeremy Gibbons, 1999
Autres liens de mots-clés
- le problème inverse - choisir des colonnes juste assez larges pour contenir du texte ( enveloppé) ( version archivée )
- Référence de classe KWordWrap utilisée dans l'interface graphique de KDE
- "Knuth linebreaking elements for Formatting Objects" par Simon Pepping 2006. Étend le modèle Knuth pour gérer quelques améliorations.
- "Stratégies de saut de page" Étend le modèle Knuth pour gérer quelques améliorations.
- "un algorithme de saut de ligne de type Knuth-Plass ... La chose *vraiment* intéressante est en quoi l'algorithme d'Adobe diffère de l'algorithme Knuth-Plass. Cela doit différer, puisqu'Adobe a réussi à breveter son algorithme (6 510 441)." [1]
- "Murray Sargent : les mathématiques au bureau"
- "Line break" compare les algorithmes de diverses complexités temporelles.