Hyphenation

From Wiki
Revision as of 14:14, 22 October 2022 by Ousia (talk | contribs) (\mainlanguage, language shortcuts and \startlanguage...\stoplanguage)
Jump to navigation Jump to search
For hyphens in compound words, see Compound words.

When a word extends beyond the end of a line, it can be broken in the middle and written on two lines, with a hyphen to indicate the breakoff. This is called hyphenation. ConTeXt has a great many facilities for dealing with hyphenation, both automatically and manually; they are gathered on this page.

Define the language for the whole document

\mainlanguage[nl] would be the way to set the language for the whole document to Dutch.

Change the hyphenation language

Use \language[de]. NB: this will also alter the marks used for \quotation, etc.

A shortcut for German would be \de. Italian has no shortcut in \it (which is reserved for italics) and Finnish has no shortcut for \fi is the command to end conditionals.

Another way of marking a passage would be \startlanguage[es] and \stoplanguage.

Allow breaking at existing hyphens

To allow breaking at hyphens, slashes, etc., write \setbreakpoints[compound] at the start of your document.

Specify how to break a word

Write \hyphenation{po-ly-syl-lab-ic} at the start of your document. (This will not be remembered across documents.)

Use the \- command. poly\-syllabic.

To never break a word, write \hyphenation{polysyllabic}.

Prevent hyphenation locally

There are two ways to prevent a word from being hyphenated: the traditional \hbox and the more natural command \unhyphenated.

\hbox{myfragileword}            % old-fashioned
\unhyphenated{myfragileword}   % MkIV, since 2013-04-21

Tune the auto-hyphenation algorithm

Use the \setupalign parameters concerning justification and hyphenation.

Penalize consecutive hyphens

To penalize hyphens on consecutive lines, set \doublehyphendemerits. Its default value is 10000; to double that, write \doublehyphendemerits=20000.

Mark hyphenated lines for review

See the article on reviewing hyphenation.

Hyphenate numbers and other non-words

Use \hyphenateddigits; it works in text and math mode and is available since 2021-01-28 (i.e. not yet in the wiki at the time of writing).

\pi\ = \hyphenateddigits[\unknown]{3.141592653589793238462643383279502884197169399375105}  \blank
  \pi\ = \hyphenateddigits{3.141592653589793238462643383279502884197169399375105}            \blank
x $\pi  = \hyphenateddigits[\unknown]{3.141592653589793238462643383279502884197169399375105}$ \blank
x $\pi  = \hyphenateddigits{3.141592653589793238462643383279502884197169399375105}$          \blank

Underscore Hyphenation for SHA

The following sample deals with underscore hyphenation for SHA output (works with ConTeXt versions from 2021.05.15 22:45).

 \startluacode
  function document.addfunnyhyphen(tfmdata)
      local underscore = utf.byte("_")
      local char       = tfmdata.characters[underscore]
      if not char then return end
      tfmdata.characters[0xFE000]   = {
          width    = 0,
          height   = 0,
          depth    = 0,
          commands = {
              { "right", -char.width },
              { "down", char.depth },
              { "slot", 1, underscore },
          }
      }
  end

  utilities.sequencers.appendaction("aftercopyingcharacters",
  "after","document.addfunnyhyphen")

  local shared = {
      start  = 1,
      length = 1,
      before = utf.char(0xFE000),
      after  = nil,
      left   = false,
      right  = false,
  }

  local all = table.setmetatableindex({ }, function(t,k)
      return shared
  end)

  languages.hyphenators.traditional.installmethod("sha",
      function(dictionary,word,n)
          return all
      end)
  \stopluacode

  \definehyphenationfeatures
     [sha]
     [characters=all,
      alternative=sha,
      righthyphenchar="FE000]

  \sethyphenationfeatures[sha]
  \setuphyphenation[method=traditional]

  \ctxlua{require("util-sha")}
  \def\hashfivefile#1{%
    \ctxlua{context(utilities.sha2.hash512("#1"))}}

  \starttext
  \startTEXpage[offset=1em, width=15em]
  \hashfivefile{ConTeXt}
  \stopTEXpage
  \stoptext

See also