diff options
author | Karl Berry <karl@freefriends.org> | 2011-09-19 23:43:19 +0000 |
---|---|---|
committer | Karl Berry <karl@freefriends.org> | 2011-09-19 23:43:19 +0000 |
commit | 4d41d6dca62a66e63d7ec95657880e857efd4be4 (patch) | |
tree | c797e533bc8bc53f5bfd12417dce9fb87d12d867 /Master/texmf-dist/source/latex/impnattypo | |
parent | d8afb0f4b2b72dc375d1f7024702a7186f994d8c (diff) |
impnattypo 0.5 (19sep11)
git-svn-id: svn://tug.org/texlive/trunk@24019 c570f23f-e606-0410-a88d-b1316a301751
Diffstat (limited to 'Master/texmf-dist/source/latex/impnattypo')
-rw-r--r-- | Master/texmf-dist/source/latex/impnattypo/impnattypo.dtx | 283 |
1 files changed, 237 insertions, 46 deletions
diff --git a/Master/texmf-dist/source/latex/impnattypo/impnattypo.dtx b/Master/texmf-dist/source/latex/impnattypo/impnattypo.dtx index 16644e211fd..5ca9ccfe90c 100644 --- a/Master/texmf-dist/source/latex/impnattypo/impnattypo.dtx +++ b/Master/texmf-dist/source/latex/impnattypo/impnattypo.dtx @@ -26,16 +26,17 @@ %<package>\NeedsTeXFormat{LaTeX2e}[1999/12/01] %<package>\ProvidesPackage{impnattypo} %<*package> - [2011/09/13 0.3 Recommendations typographiques de l'Imprimerie Nationale Française] + [2011/09/19 0.4 Recommendations typographiques de l'Imprimerie Nationale Française] %</package> % %<*driver> \documentclass{ltxdoc} -\usepackage[hyphenation,nosingleletter,parindent,lastparline]{impnattypo}[2011/09/13] \usepackage[french]{babel} \usepackage{fontspec} +\usepackage[svgnames]{xcolor} \setmainfont{Linux Libertine O} \usepackage{metalogo} +\usepackage[draft,hyphenation,nosingleletter,parindent,lastparline,homeoarchy]{impnattypo}[2011/09/19] \usepackage[all]{nowidow} \EnableCrossrefs \CodelineIndex @@ -48,7 +49,7 @@ %</driver> % \fi % -% \CheckSum{66} +% \CheckSum{96} % % \CharacterTable % {Upper-case \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z @@ -67,6 +68,8 @@ % Right brace \} Tilde \~} % % +% \changes{0.5}{2011/09/19}{Add homeoarchy detection} +% \changes{0.4}{2011/09/15}{Add draft mode} % \changes{0.3}{2011/09/13}{Add parindent and lastparline options} % \changes{0.2}{2011/09/13}{Add nosingleletter option} % \changes{0.1}{2011/09/11}{First version} @@ -87,12 +90,14 @@ % le \emph{Lexique des règles typographiques en usage à l'Imprimerie Nationale} % est une référence incontournable. % -% Si la majorité des recommendations de cet ouvrage concerne la ponctuation, -% l'usage des petites capitales ou encore l'ordre des parties d'un livre, -% certaines autres recommendations méritent d'être automatisées pour être +% Si la majorité des recommendations de cet ouvrage est implémentée dans +% le module \textsf{frenchb} pour \textsf{babel}, +% certaines autres recommendations méritent encore d'être automatisées pour être % implémentées en \LaTeX. % -% C'est le but de ce paquet, qui implémente plusieurs règles +% C'est le but de ce paquet, initié par une question sur le site +% tex.stackexchange.com\footnote{\url{http://tex.stackexchange.com/questions/20493/french-typography-recommendations}}, +% et qui implémente plusieurs règles % édictées dans ce lexique afin de les rendre plus facilement applicables % aux textes édités avec \LaTeX. % @@ -153,6 +158,11 @@ % \usepackage[lastparline]{impnattypo} % \end{verbatim} % +% Lorsque l'option \texttt{draft} est activée et que \LuaTeX est utilisé, +% les espaces insécables insérés sont colorés en +% {\color{\impnattypolastparlinecolor}\impnattypolastparlinecolor}. +% La couleur utilisée peut être ajustée par l'option \texttt{lastparlinecolor}. +% % \DescribeMacro{nosingleletter} % Il est également recommendé d'éviter les coupures isolant une lettre. % La solution proposée par Patrick Gundlach\footnote{\url{http://tex.stackexchange.com/questions/27780/one-letter-word-at-the-end-of-line}} @@ -166,6 +176,45 @@ % Lorsque cette option est activée, seul \LuaTeX{} (via la commande |lualatex|) % pourra effectuer le rendu du document. % +% Lorsque l'option \texttt{draft} est activée, +% les espaces insécables insérés sont colorés en +% {\color{\impnattyponosinglelettercolor}\impnattyponosinglelettercolor}. +% La couleur utilisée peut être ajustée par l'option \texttt{nosinglelettercolor}. +% +% \DescribeMacro{homeoarchy} +% Lorsque deux lignes consécutives commencent par le même mot +% ou la même série de lettres, cela peut induire le lecteur +% en erreur et cela est donc à éviter. +% +% La correction automatique de ce phénomène est très complexe +% et en général non souhaitable. C'est pourquoi l'option +% \texttt{homeoarchy} de ce paquet se contente +% de les détecter et de les afficher. Leur correction +% consistera en général en l'introduction d'un +% espace insécable dans le paragraphe. +% +% \begin{verbatim} +% \usepackage[homeoarchy]{impnattypo} +% \end{verbatim} +% +% Cette option n'est effective que si l'option \texttt{draft} est activée. +% +% Les espaces insécables insérés sont colorés de deux couleurs. +% Les mots entiers sont colorés en +% {\color{\impnattypohomeoarchywordcolor}\impnattypohomeoarchywordcolor} +% et cette couleur peut être ajustée par l'option \texttt{homeoarchywordcolor}. +% Les mots partiels sont colorés en +% {\color{\impnattypohomeoarchycharcolor}\impnattypohomeoarchycharcolor} +% et cette couleur peut être ajustée par l'option \texttt{homeoarchycharcolor}. +% +% Une séquence de glyphes est considéré comme problématique si: +% +% \begin{itemize} +% \item Le nombre de mots entiers matchant est supérieur à \impnattypohomeoarchymaxwords. Ce paramètre peut être ajusté par l'option \texttt{homeoarchymaxwords}; +% \item Le nombre de caractères matchant est supérieur à \impnattypohomeoarchymaxchars. Ce paramètre peut être ajusté par l'option \texttt{homeoarchymaxchars}; +% \end{itemize} +% +% % \subsection{Numérotation des chapitres} % % \DescribeMacro{frenchchapters} @@ -202,7 +251,28 @@ % \end{verbatim} % % Voir la documentation de ce paquet pour plus d'options. -% +% +% +% \subsection{Mode brouillon} +% +% \DescribeMacro{draft} +% Le paquet \textsf{impnattypo} dispose d'un mode brouillon +% permettant de visualiser les pénalités (espaces insécables) +% ajoutés par les options \texttt{nosingleletter} et +% \texttt{lastparline}. En mode brouillon, +% les emplacements des espaces insécables insérés +% sont marqués par des rectangles de couleur. +% +% Pour activer le mode brouillon, utilisez l'option \texttt{draft}, +% par exemple: +% +% \begin{verbatim} +% \usepackage[draft,lastparline]{impnattypo} +% \end{verbatim} +% +% Cette document est générée avec l'option \texttt{draft} afin d'en +% montrer les effets. +% % % \StopEventually{} % @@ -214,24 +284,34 @@ % % \begin{macrocode} \ProvidesPackage{impnattypo} -\usepackage{ifluatex} -\newif\if@impnattypo@frenchchapters -\DeclareOption{frenchchapters}{\@impnattypo@frenchchapterstrue} -\newif\if@impnattypo@hyphenation -\DeclareOption{hyphenation}{\@impnattypo@hyphenationtrue} -\newif\if@impnattypo@nosingleletter -\DeclareOption{nosingleletter}{\@impnattypo@nosinglelettertrue} -\newif\if@impnattypo@parindent -\DeclareOption{parindent}{\@impnattypo@parindenttrue} -\newif\if@impnattypo@lastparline -\DeclareOption{lastparline}{\@impnattypo@lastparlinetrue} -\ProcessOptions -\if@impnattypo@hyphenation +\RequirePackage{ifluatex} +\RequirePackage{kvoptions} +\SetupKeyvalOptions{ + family=impnattypo, + prefix=impnattypo, +} +\DeclareBoolOption{draft} +\DeclareBoolOption{frenchchapters} +\DeclareBoolOption{hyphenation} +\DeclareBoolOption{nosingleletter} +\DeclareBoolOption{parindent} +\DeclareBoolOption{lastparline} +\DeclareBoolOption{homeoarchy} +\DeclareStringOption[red]{homeoarchywordcolor} +\DeclareStringOption[orange]{homeoarchycharcolor} +\DeclareStringOption[brown]{nosinglelettercolor} +\DeclareStringOption[teal]{lastparlinecolor} +\DeclareStringOption[1]{homeoarchymaxwords} +\DeclareStringOption[3]{homeoarchymaxchars} +\ProcessKeyvalOptions* +\RequirePackage{xcolor} +\def\usecolor#1{\csname\string\color@#1\endcsname\space} % \end{macrocode} % % \marginpar{No page finishes with an hyphenated word} % % \begin{macrocode} +\ifimpnattypohyphenation \brokenpenalty=10000 % \end{macrocode} % \marginpar{Discourage hyphenation on two lines in a row} @@ -243,7 +323,7 @@ % \marginpar{Number chapters} % % \begin{macrocode} -\if@impnattypo@frenchchapters +\ifimpnattypofrenchchapters \let\frenchchapter\Roman \renewcommand{\thechapter}{% \ifnum\value{chapter}=1 @@ -258,29 +338,30 @@ % \marginpar{No single letter} % % \begin{macrocode} -\if@impnattypo@nosingleletter +\ifimpnattyponosingleletter \ifluatex - \usepackage{luatexbase,luacode} + \RequirePackage{luatexbase,luacode} \begin{luacode} local prevent_single_letter = function (head) while head do - if head.id == 37 then -- glyph - if head.prev.id == 10 and head.next.id == 10 then -- only if we are at a one letter word - - local p = node.new("penalty") - p.penalty = 10000 - - -- Uncomment the next lines to show the position of the ~'s - -- local p = node.new("rule") - -- p.width = 2* 2^16 - -- p.height = 2^16 - -- p.depth = 2^16 - - p.next = head.next - head.next.prev = p - head.next = p + if head.id == 37 then -- glyph + if (head.char >= 65 and head.char <= 122) or (head.char >= 192 and head.char <= 255) then -- some kind of letter + if head.prev.id == 10 and head.next.id == 10 then -- only if we are at a one letter word + + local p = node.new("penalty") + p.penalty = 10000 + + \ifimpnattypodraft + local w = node.new("whatsit","pdf_literal") + w.data = "q \usecolor{\impnattyponosinglelettercolor} 0 0 m 0 5 l 2 5 l 2 0 l b Q" + node.insert_after(head,head,w) + node.insert_after(head,w,p) + \else + node.insert_after(head,head,p) + \fi + end end end head = head.next @@ -299,7 +380,7 @@ % \marginpar{Paragraph indentation} % % \begin{macrocode} -\if@impnattypo@parindent +\ifimpnattypoparindent \setlength{\parindent}{1em} \fi % \end{macrocode} @@ -307,9 +388,9 @@ % \marginpar{Last line of paragraph} % % \begin{macrocode} -\if@impnattypo@lastparline +\ifimpnattypolastparline \ifluatex - \usepackage{luatexbase,luacode} + \RequirePackage{luatexbase,luacode} \begin{luacode} last_line_twice_parindent = function (head) while head do @@ -319,10 +400,16 @@ -- we are at a glue and have less then 2*\parindent to go local p = node.new("penalty") p.penalty = 10000 - p.next = head - head.prev.next = p - p.prev = head.prev - head.prev = p + + \ifimpnattypodraft + local w = node.new("whatsit","pdf_literal") + w.data = "q \usecolor{\impnattypolastparlinecolor} 0 0 m 0 5 l 2 5 l 2 0 l b Q" + + node.insert_after(head,head.prev,w) + node.insert_after(head,w,p) + \else + node.insert_after(head,head.prev,p) + \fi end head = head.next @@ -338,6 +425,110 @@ \fi % \end{macrocode} % +% \marginpar{Detect homeoarchies} +% +% \begin{macrocode} +\ifimpnattypohomeoarchy + \ifimpnattypodraft + \ifluatex + \RequirePackage{luatexbase,luacode} + \begin{luacode} + compare_lines = function (line1,line2) + local head1 = line1.head + local head2 = line2.head + + local char_count = 0 + local word_count = 0 + + while head1 and head2 do + if (head1.id == 37 and head2.id == 37 + and head1.char == head2.char) -- identical glyph + or (head1.id == 10 and head2.id == 10) then -- glue + + if head1.id == 37 then -- glyph + char_count = char_count + 1 + elseif head1.id == 10 then -- glue + word_count = word_count + 1 + end + head1 = head1.next + head2 = head2.next + elseif (head1.id == 0 or head2.id == 0) then -- end of line + break + elseif (head1.id ~= 37 and head1.id ~= 10) then -- some other kind of node + head1 = head1.next + elseif (head2.id ~= 37 and head2.id ~= 10) then -- some other kind of node + head2 = head2.next + else -- no match, no special node + break + end + end + -- analyze last non-matching node, check for punctuation + if ((head1 and head1.id == 37 and head1.char > 49) + or (head2 and head2.id == 37 and head2.char > 49)) then + -- not a word + elseif char_count > 0 then + word_count = word_count + 1 + end + return char_count,word_count,head1,head2 + end + + highlight = function (line,nend,color) + local n = node.new("whatsit","pdf_literal") + + -- get dimensions + local w,h,d = node.dimensions(line.head,nend) + local w_pts = w/65536 -- scaled points to points + + -- set data + n.data = "q " .. color .. " 0 0 m 0 5 l " .. w_pts .. " 5 l " .. w_pts .. " 0 l b Q" + + -- insert node + n.next = line.head + line.head = n + node.slide(line.head) + end + + homeoarchy = function (head) + local cur_line = head + local prev_line -- initiate prev_head + + local max_char = tonumber(\impnattypohomeoarchymaxchars) + local max_word = tonumber(\impnattypohomeoarchymaxwords) + + while head do + if head.id == 0 then -- new line + prev_line = cur_line + cur_line = head + if prev_line.id == 0 then + char_count,word_count,prev_head,cur_head = compare_lines(prev_line,cur_line) + if char_count >= max_char or word_count >= max_word then + local color + if word_count >= max_word then + color = "q \usecolor{\impnattypohomeoarchywordcolor}" + else + color = "q \usecolor{\impnattypohomeoarchycharcolor}" + end + + -- highlight both lines + highlight(prev_line,prev_head,color) + highlight(cur_line,cur_head,color) + end + end + end + head = head.next + end + return true + end + + luatexbase.add_to_callback("post_linebreak_filter",homeoarchy,"homeoarchy") + \end{luacode} + \else + \PackageError{The homeoarchy option only works with LuaTeX} + \fi + \fi +\fi +% \end{macrocode} +% % \iffalse %</package> % \fi |