行末的一个字母的单词

行末的一个字母的单词

这个问题引出了包中的一个新功能:
impnattypo

我来自波兰,正在用我的母语写一些文字。我们的排版标准之一是,我们不会在行尾留下一个字母的单词。例如:

Mietek poszedl do sklepu i
kupil jabola

是非法的,正确的应该是这样的:

Mietek poszedl do sklepu 
i kupil jabola

我不知道美国/英语排版中是否也有这样的规则,但我找不到任何可以修复此类错误的乳胶设置。到目前为止,我发现的唯一解决方案是添加“~”字符,它似乎可以用作空格,但也可以防止行间断开连接的单词。所以我必须写:

Mietek poszedl do sklepu i~kupil jabola

还有其他方法吗?我试过

\widowpenalty10000  
\clubpenalty10000 

这样可以避免出现孤儿字,但对我们(波兰人)来说,“孤儿”一词似乎与美国人有所不同;)在美国,“孤儿”是指页面最后一行上段​​落的第一行(至少我这么认为),但对我们来说,“孤儿”是指行末的单字母单词。

答案1

这是一个 LuaLaTeX 解决方案。这是一个在 TeX 将文本拆分成行之前调用的函数。它~在单个字母的单词后插入连字符(仅惩罚 10000,粘合已经存在)。单词仍将使用连字符(参见下面的示例)- 据我所知(在 w 之后)。

[编辑:我在代码中添加了检查,只检查字母(L* Unicode 字符类) 将在防止字形后出现换行时予以考虑。

\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}

示例输出

顺便说一句:小连字符是用包装做成的showhyphens

答案2

从 0.2 版开始,该impnattypo包包含一个nosingleletter使用帕特里克算法

\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}

在此处输入图片描述

答案3

Babel(使用 LuaTeX)现在通过转换提供了此功能oneletter.nobreak(也适用于捷克语和斯洛伐克语):

\documentclass{article}

\usepackage[polish]{babel}
\babelprovide[transforms = oneletter.nobreak]{polish} 

\begin{document}

\hsize1pt

Mietek poszedl do sklepu i kupil jabola

\end{document}

在此处输入图片描述

答案4

包裹encxvlna是否适用于捷克语,也许你可以看看。如何在 Ubuntu(捷克语)中运行它这里

相关内容