ntg-context - mailing list for ConTeXt users
 help / color / mirror / Atom feed
From: Henri Menke <henrimenke@gmail.com>
To: ntg-context@ntg.nl
Subject: Re: Adjusting column width dynamically to get rid of orphans and widows
Date: Sat, 24 Jun 2017 12:19:07 +1200	[thread overview]
Message-ID: <1498263547.24166.1.camel@gmail.com> (raw)
In-Reply-To: <CADf_Gt2w0EOChJVx690+iLP3GP3w9OaR9swk=EkMpqYH3Qnz8w@mail.gmail.com>

On Fri, 2017-06-23 at 17:52 +0100, Thomas Widmann wrote:
> On 23 June 2017 at 14:21, Thomas Widmann <thomas@complexli.com> wrote:
> > 
> > On 20 June 2017 at 20:33, Hans Hagen <pragma@wxs.nl> wrote:
> > > 
> > > On 6/20/2017 11:53 AM, Thomas Widmann wrote:
> > > > 
> > > > 
> > > > On 20 June 2017 at 10:41, Henri Menke <henrimenke@gmail.com> wrote:
> > > > > 
> > > > > 
> > > > > 
> > > > > On Tue, 2017-06-20 at 09:22 +0100, Thomas Widmann wrote:
> > > > > > 
> > > > > > 
> > > > > > 
> > > > > > I recently started experimenting with using ConTeXt (mkiv) for
> > > > > > dictionary typesetting. It's a much
> > > > > > more attractive option than plain TeX or LaTeX because of the support
> > > > > > for typesetting on a grid.
> > > > > > 
> > > > > > However, grid typesetting can easily result in a large number of orphans
> > > > > > and widows, which really
> > > > > > doesn't look good in a dictionary.
> > > > > > 
> > > > > > In an ideal world, I'd want to alter the column width slightly to
> > > > > > prevent them (because most
> > > > > > dictionaries aren't justified, this wouldn't be very noticeable).
> > > > > > 
> > > > > > Would it be possible to use LuaTeX to achieve this?  I.e., could one
> > > > > > write some code that gets
> > > > > > triggered by orphans and widows and then alters the current column width
> > > > > > slightly until the
> > > > > > problem disappears?  Has somebody already done this?  Or have the
> > > > > > relevant TeX internals not been
> > > > > > Luafied yet?
> > > > > > 
> > > > > > I'd also be interested in other ways to solve this issue – for instance
> > > > > > changing the looseness
> > > > > > dynamically instead of the column width.
> > > > > 
> > > > > Have a look at \widowpenalty and \clubpenalty.  Also use margin kerning
> > > > > and font expansion.
> > > > 
> > > > \widowpenalty and \clubpenalty are almost useless in this context –
> > > > believe me, I've tried! (I'm typesetting on a grid, with a fixed
> > > > number of lines per page.) Which is why I'm looking for alternatives.
> > > > 
> > > > Margin kerning and font expansion are definitely options, but again,
> > > > my real query would be how to trigger them dynamically to avoid a
> > > > widow or an orphan.
> > > can you make a small example showing the problem
> > Sorry about the delay – here you go!
> > 
> > On my computer, the first column goes on for two lines more than the
> > following column, and it still produces a widow:
> > 
> > %%% document starts here
> > [...]
> > %%% document ends here
> > 
> > The thing is that there simply isn't a good way to break up a
> > three-line dictionary entry, and it would be much better to play
> > around with the column width, the looseness, margin kerning or other
> > tools rather than having to do so.  Doing it manually is easy enough,
> > but it would be much nicer if the one or more of these tools could get
> > triggered automatically.
> Oops, those lines didn't get wrapped very neatly.  Here's a better version:

How about putting every entry into a box, making it unbreakable?  Of course, you get unbalanced
columns this way, but I think keeping the entries together is easier for the reader.


\mainlanguage[en]

\definefontfeature
  [default][default]
  [
    protrusion=quality,
    expansion=quality,
    onum=yes,
  ]

\definestartstop [negindent] [
  before={%
    \startnarrower[left]%
    \setupindenting[-.5em,yes,first]%
    \setuphead[subject][indentnext=yes]%
  },
  after=\stopnarrower,
]

\setupbodyfont[palatino]

\setupalign[hz,hanging,tolerant]

\startsetups[grid][mypenalties]
    \setdefaultpenalties
    \setpenalties\widowpenalties{2}{10000}
    \setpenalties\clubpenalties {2}{10000}
\stopsetups

\setuplayout[grid=yes, setups=mypenalties]

\righthyphenmin=60
\lefthyphenmin=60

\def\Sblackbold#1{{\bf #1}}
\def\Sdef#1{{#1}}
\def\Sdefrf#1{{\bf #1}}
\def\ShwJNR#1{{\blue\bf #1}}
\def\Spospsmallcaps#1{{\sc #1}}
\def\Spunctuation#1{{#1}}
\def\Sxrefxrhw#1{{\bf #1}}
\def\Sgroupintro#1{{\it #1}}

\def\threeentries{
  \vbox{\hsize=\textwidth
    \ShwJNR{headphones}\page[no]\par\-\hskip .5em
    \Spospsmallcaps{noun}%
    \Spunctuation{ }%
    \Sdef{a pair of small speakers that you wear over your ears}%
  }
  \vbox{\hsize=\textwidth
    \ShwJNR{heard}\page[no]\par\-\hskip.5em
    \Spospsmallcaps{verb}%
    \Spunctuation{ }%
    \Sgroupintro{the past tense and past part.\ of}%
    \Spunctuation{ }%
    \Sxrefxrhw{hear}%
  }
  \vbox{\hsize=\textwidth
    \ShwJNR{hearing}\page[no]\par\-\hskip .5em
    \Spospsmallcaps{noun}%
    \Spunctuation{ }%
    \Sblackbold{2}%
    \Spunctuation{ }%
    \Sdef{If someone gives you a }%
    \Sdefrf{hearing}%
    \Sdef{,they let you give your point of view and listen to you}%
  }
}

\def\thirtyentries{\threeentries\threeentries\threeentries\threeentries\threeentries%
\threeentries\threeentries\threeentries\threeentries\threeentries}

\startdocument

\startmixedcolumns[balance=yes]
\raggedright
\startnegindent

\thirtyentries

\stopnegindent
\stopmixedcolumns
\placefloats
\stopdocument


> 
> \mainlanguage[en]
> 
> \definefontfeature
>   [default][default]
>   [
>     protrusion=quality,
>     expansion=quality,
>     onum=yes,
>   ]
> 
> \definestartstop [negindent] [
>   before={%
>     \startnarrower[left]%
>     \setupindenting[-.5em,yes,first]%
>     \setuphead[subject][indentnext=yes]%
>   },
>   after=\stopnarrower,
> ]
> 
> \setupbodyfont[palatino]
> 
> \setupalign[hz,hanging,tolerant]
> 
> \startsetups[grid][mypenalties]
>     \setdefaultpenalties
>     \setpenalties\widowpenalties{2}{10000}
>     \setpenalties\clubpenalties {2}{10000}
> \stopsetups
> 
> \setuplayout[grid=yes, setups=mypenalties]
> 
> \righthyphenmin=60
> \lefthyphenmin=60
> 
> \def\Sblackbold#1{{\bf #1}}
> \def\Sdef#1{{#1}}
> \def\Sdefrf#1{{\bf #1}}
> \def\ShwJNR#1{{\blue\bf #1}}
> \def\Spospsmallcaps#1{{\sc #1}}
> \def\Spunctuation#1{{#1}}
> \def\Sxrefxrhw#1{{\bf #1}}
> \def\Sgroupintro#1{{\it #1}}
> 
> \def\threeentries{\ShwJNR{headphones}\page[no]\par\-\hskip .5em%
> \Spospsmallcaps{noun}\Spunctuation{ }\Sdef{a pair of small speakers
> that you wear over your ears}\par\ShwJNR{heard}\page[no]\par\-\hskip.5em%
> \Spospsmallcaps{verb}\Spunctuation{ }\Sgroupintro{the past tense and past
> part.\ of}\Spunctuation{ }\Sxrefxrhw{hear}\par\ShwJNR{hearing}\page[no]%
> \par\-\hskip .5em\Spospsmallcaps{noun}\Spunctuation{ }\Sblackbold{2}
> \Spunctuation{ }\Sdef{If someone gives you a }\Sdefrf{hearing}\Sdef{,
> they let you give your point of view and listen to you\par}}
> 
> \def\thirtyentries{\threeentries\threeentries\threeentries\threeentries\threeentries%
> \threeentries\threeentries\threeentries\threeentries\threeentries}
> 
> \startdocument
> 
> \startmixedcolumns[balance=yes]
> \raggedright
> \startnegindent
> 
> \thirtyentries
> 
> \stopnegindent
> \stopmixedcolumns
> \placefloats
> \stopdocument
> 
> Thomas
___________________________________________________________________________________
If your question is of interest to others as well, please add an entry to the Wiki!

maillist : ntg-context@ntg.nl / http://www.ntg.nl/mailman/listinfo/ntg-context
webpage  : http://www.pragma-ade.nl / http://context.aanhet.net
archive  : https://bitbucket.org/phg/context-mirror/commits/
wiki     : http://contextgarden.net
___________________________________________________________________________________

  reply	other threads:[~2017-06-24  0:19 UTC|newest]

Thread overview: 16+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-06-20  8:22 Thomas Widmann
2017-06-20  9:41 ` Henri Menke
2017-06-20  9:53   ` Thomas Widmann
2017-06-20 19:33     ` Hans Hagen
2017-06-23 13:21       ` Thomas Widmann
2017-06-23 16:52         ` Thomas Widmann
2017-06-24  0:19           ` Henri Menke [this message]
2017-06-24 14:48             ` Thomas Widmann
2017-06-25 11:16               ` Hans Hagen
2017-06-26  9:31                 ` Thomas Widmann
2017-06-28  9:16                   ` Thomas Widmann
2017-06-28 11:04                     ` Hans Hagen
2017-06-28 11:20                       ` Thomas Widmann
2017-06-28 11:57                         ` Hans Hagen
2017-06-28 12:49                           ` Thomas Widmann
2017-07-03 15:50                             ` Thomas Widmann

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1498263547.24166.1.camel@gmail.com \
    --to=henrimenke@gmail.com \
    --cc=ntg-context@ntg.nl \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).