This question led to a new feature in a package:
impnattypo

I come from Poland and I'm writing some text in my native language. One of our typography standards is that we do not left one-letter words at the end of line. For example:

Mietek poszedl do sklepu i
kupil jabola

is illegal, and correctly it should be as follows:

Mietek poszedl do sklepu 
i kupil jabola

I don't know if there is such rule in US/English typography also, but I cannot find any latex setting that would fix such errors. The only one solution I've found so far is to add "~" character, which seems to work as whitespace, but also prevents to break connected words between lines. So I have to write:

Mietek poszedl do sklepu i~kupil jabola

Is there any other way to do so? I've tried with

\widowpenalty10000  
\clubpenalty10000 

which prevents orphans, but it seems that 'orphans' for us (Polish) is something different that for Americans ;) In US orphan is the first line of a paragraph on the last line of a page (at least I think so), but for us, 'orphan' is such single-letter word at the end of line.

link|improve this question
6  
Piotrek: I'm not aware of an existing command or macro in LaTeX that would enforce your specific typographic need. Suppressing "widows" and "orphans" (the latter are called "clubs" in TeX for some reason) is definitely not going to meet your need. I'd say that your approach -- to do a global search and replace of strings of the type " ? ??" (where ? stands for a single alpha character) to " ?~??" -- is the most straightforward one. – Mico Sep 7 '11 at 15:29
3  
There are some emacs tools that can help with inserting nonbreakable spaces in appropriate environments, e.g. see http://www.emacswiki.org/emacs/NonbreakableSpace – mas Sep 7 '11 at 15:58
3  
The encTeX extension has code to deal with such cases for Czech prepositions such as "v". Try texdoc enctex, but it's not easy. The best is to get the habit of inserting ties ~. – egreg Sep 7 '11 at 17:40
feedback

3 Answers

up vote 20 down vote accepted

This is a LuaLaTeX solution. It is a function that gets called just before TeX breaks the text into lines. It inserts ties ~ (only the penalty of 10000, the glue is already there) after the single letter word. Words will still hyphenate (see example below) - as far as I can see (after the w).

[Edit: I have added a check in the code that only letters (L* unicode character class) will be taken into account when preventing a line break after the glyph.]

\documentclass{article}
\usepackage{polski}
\usepackage[polish]{babel}
\usepackage{fontspec}
\usepackage{luatexbase}\usepackage{luacode}

\begin{luacode}

local prevent_single_letter = function (head)
  while head do
    if head.id == 37 and unicode.utf8.match(unicode.utf8.char(head.char),"%a") then -- a 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

        -- This is for debugging only, but then you have to
        -- remove the last node.insert_after line:
        -- local w = node.new("whatsit","pdf_literal")
        -- w.data = "q 1 0 1 RG 1 0 1 rg 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)

        node.insert_after(head,head,p)

      end
    end
    head = head.next
  end
  return true
end

luatexbase.add_to_callback("pre_linebreak_filter",prevent_single_letter,"active~")
\end{luacode}


\begin{document}
\hsize 2.7in

Noc była sierpniowa, ciepła i słodka, Księżyc oświecał srebrnem światłem wgłębienie, tak,
że twarze małego rycerza i Basi były skąpane w blasku.
Poniżej, na podwórzu zamkowem, widać było uśpione kupy żołnierzy, a także i ciała zabitych
podczas dziennej strzelaniny, bo nie znaleziono dotąd czasu na ich pogrzebanie.

\end{document}

example output

BTW: the small hyphenation marks are made with the package showhyphens - which will be on CTAN soon.

link|improve this answer
2  
very nice! :-) Also useful for the english language – Herbert Sep 11 '11 at 16:03
This would make a useful package on CTAN. Would you like to package it? – Raphink Sep 11 '11 at 16:49
@Raphink - I'd rather not. I have no idea how to do that and I have not tested the code yet. – Patrick Gundlach Sep 11 '11 at 16:52
@Patrick: Ok. If the packaging part is a problem, I'd be willing to do it whenever the code is ready enough. – Raphink Sep 11 '11 at 16:53
@Raphink - perhaps this should go into polski.sty? I have never done this before. I don't have a clue about dtx, ins and all that. – Patrick Gundlach Sep 11 '11 at 16:54
show 6 more comments
feedback

Since version 0.2, the impnattypo package contains a nosingleletter option which uses Patrick's algorithm:

\documentclass{article}
\usepackage{polski}
\usepackage[polish]{babel}
\usepackage{fontspec}

\usepackage[draft,nosingleletter]{impnattypo}

\begin{document}
\hsize 2.7in

Noc była sierpniowa, ciepła i słodka, Księżyc oświecał srebrnem światłem wgłębienie, tak,
że twarze małego rycerza i Basi były skąpane w blasku.
Poniżej, na podwórzu zamkowem, widać było uśpione kupy żołnierzy, a także i ciała zabitych
podczas dziennej strzelaniny, bo nie znaleziono dotąd czasu na ich pogrzebanie.


\end{document}

enter image description here

link|improve this answer
feedback

Package encxvlna does this for Czech, maybe you can have a look at it. Instructions to get it working in Ubuntu (in Czech) are here.

link|improve this answer
feedback

Your Answer

 
or
required, but never shown

Not the answer you're looking for? Browse other questions tagged or ask your own question.