使用 LuaTeX 检查连字符

使用 LuaTeX 检查连字符

这个问题导致了一个新的方案的出现:
lua-check-hyphen

我写了一个问题(在 LuaTeX 中访问指针) 希望它能让我找到一种使用 LuaTeX 来检查连字符的方法,而无需使用外部程序。我受到鼓舞,写下了这个问题。

这个问题的答案是“检查文档中的所有连字符”指向外部工具。

我希望找到一个解决方案,每次将单词分成两行时将连字符写入日志文件,以便于查看。

答案1

更新:

该套餐现已上架加拿大运输安全局并居住在:
http://www.ctan.org/pkg/lua-check-hyphen


有一个新的实验包用于此目的:lua-check-hyphen您可以在此处下载:https://github.com/pgundlach/lua-check-hyphen(将.sty.lua文件复制到当前目录中)。这会将带连字符的单词列在单独的文件中(以 结尾.uhy),并能够创建包含“良好”连字符的白名单,并且您可以选择标记未知的连字符。

考虑这个输入文件:

\documentclass{article}
\usepackage{fontspec}
\usepackage[mark]{lua-check-hyphen}

\begin{document}

\hsize 1.3in
A wonderful serenity has taken possession of my entire soul, like these sweet
mornings of spring which I enjoy with my whole heart.

\end{document}

结果是

带框的图像

test.uhy以及包含以下内容的文件:

seren-ity
posses-sion
morn-ings

现在,您可以将这些行(如果您认为它们是有效的断点)添加到文本文件(例如名为)okhyph.txt并将其添加到命令中LuaCheckHyphen。让我们将第二行放入该文件并在文档中使用它:

\begin{filecontents}{okhyph.txt}
posses-sion
\end{filecontents}

\documentclass{article}
\usepackage{fontspec}
\usepackage[mark]{lua-check-hyphen}
\LuaCheckHyphen{whitelist=okhyph.txt}

\begin{document}

\hsize 1.3in
A wonderful serenity has taken possession of my entire soul, like these sweet
mornings of spring which I enjoy with my whole heart.

\end{document}

现在 lua-check-hyphen 不再抱怨这个词了。

在此处输入图片描述

现在文件test.uhy仅包含:

morn-ings
seren-ity

您可以继续,直到获得干净的文档。如果您将该选项传递final给包,则不会进行连字检查。

答案2

(我根据用户@Guest 的评论更新了这个答案,通知我该showhyphens包已经过时并且showhyphenation可以使用该包代替。)

由于你正在使用 Lua(La)TeX,你可能要考虑使用这个漂亮的显示连字包。顾名思义,这个包显示全部TeX 认为有效的连字符点,无论是否实际发生连字符。虽然这个包不能精确地完成你想要完成的任务,但我相信它的输出实际上是更有用比您所追求的更多:它不仅会告诉您连字发生的位置,还会提醒您 (i) 潜在无效的连字点和 (ii) TeX 可能完全错过的连字点。

以你的三段问题为例,使用此包的简单 MWE 可能如下所示:

% !TEX program = lualatex
\documentclass[letterpaper]{article}
\usepackage{fontspec,showhyphenation}

\begin{document}
I wrote a question (Accessing pointers in LuaTeX) hoping it would 
lead me to a way of reviewing the hyphenations with LuaTeX, and 
without external programs. I was encouraged to write this question.

The answers to the question ``Check all hyphenations within a document'' 
point to external tools.

I'm hoping for a solution which writes the hyphenation to the log file 
everytime a word is split across two lines, for easy reviewing.
\end{document}

并将产生以下输出:

在此处输入图片描述

尽管这个简短的文本只包含一个带连字符的单词,但小红色标记显示一个错误的连字符点(Lu-a-TeX)和一个遗漏的连字符点(在单词 中hyphenation以及在该单词的复数形式中)。要解决这些问题,只需插入命令

\hyphenation{Lua-TeX hy-phen-a-tion hy-phen-a-tions}

在 MWE 的序言中,产生了以下更令人满意的输出:

在此处输入图片描述

当然,TeX 的连字算法并不完美(也没有人声称它是完美的!),因此对于“实际”生产工作,您可能希望加载自定义连字例外列表,以处理您(或其他人)过去注意到的未正确连字的单词。一个针对美国英语文档的列表位于文件中ushyphex.tex可在 CTAN 上找到;它包含(截至 2022 年 12 月)约 1750 个单词。当然,使用合适的连字例外列表的建议也适用于其他语言,而不仅仅是(美国)英语。

答案3

稍微复杂一点的答案:此解决方案在将段落分成行之前收集所有可能的连字符点,在将段落分成行之后,它会再次检查这些连字符中哪些确实被使用过。这些连字符被收集在一个表中,并在文档末尾将这些单词打印到日志文件(以及 LuaTeX 运行中)。

\documentclass[ngerman]{article}
\usepackage{luaotfload}
\usepackage[EU2]{fontenc}
\usepackage{lmodern}
\usepackage{babel}
\usepackage{luacode}
\usepackage{luatexbase-attr}

\AtEndDocument{\directlua{listhyphenatedwords()}}
\begin{document}

\begin{luacode*}

local hyphenattr =  luatexbase.new_attribute("hyphenattr")
do
  local hyphenwords = {}
  local all_hyphenatedwords = {}

  function collect_discs (head)
    local word_start
    local word
    -- this is where we store all the breakpoints
    local thisbreakpoint
    local word_with_hyphen
    local c
    local hyphencounter = #hyphenwords + 1
    local sln = unicode.utf8

    while head do
      if head.id == 0 then
      elseif head.id == 7 then --disc
        word_start = head
        word_end   = head
        while word_start.prev and word_start.prev.id ~= 10 do
          word_start = word_start.prev
        end
        word = ""
        c = 0
        while word_start and word_start.id ~= 10 do
          if word_start == head then -- disc
            -- there is a breakpoint after letter c
            node.set_attribute(head,hyphenattr,hyphencounter)
            thisbreakpoint = c
          elseif word_start.id == 37 then
            c = c + 1
            if sln.match(sln.char(word_start.char),"%a") then
              word = word .. sln.char(word_start.char)
            end
          end
          word_start = word_start.next
        end
        word_with_hyphen = sln.sub(word,1,thisbreakpoint) .. "-" .. sln.sub(word,thisbreakpoint+1,-1)
        hyphenwords[hyphencounter] = word_with_hyphen
        hyphencounter = #hyphenwords + 1
      end
      head = head.next
    end
    return true
  end

  function check_discs(head)
    local c
    while head do
      if head.id < 2 then
        check_discs(head.list)
      elseif head.id == 7 and head.next and head.next.id == 10 then -- disc
        c = node.has_attribute(head,hyphenattr)
        all_hyphenatedwords[#all_hyphenatedwords + 1] = hyphenwords[c]
      end
      head = head.next
    end
    return true
  end

  function listhyphenatedwords()
    texio.write_nl("All hyphenated words follow:")
    for i in ipairs(all_hyphenatedwords) do
      texio.write_nl(all_hyphenatedwords[i])
    end
    texio.write_nl("All hyphenated words above.")
  end
end



luatexbase.add_to_callback("pre_linebreak_filter",collect_discs,"collect_discs")
luatexbase.add_to_callback("post_linebreak_filter",check_discs,"check_discs")
\end{luacode*}
\hsize 2in

Seit zwei Jahren ist meine Arbeit in Düsseldorf. Meine Familie lebt dagegen in
Hamburg. Und dazwischen ich, aber ganz cool. Vollbremskombination aus Ampel
oder Einfädeln oder beides auf einmal. Geht nur mit Tricks. Eben noch kurz auf
die A 52. Schon vielversprechend lebhaft. Hinter dem Breitscheider Kreuz geht
es richtig los. Stau auf der A 3 bis Oberhausen. Danach entspannt es sich auch
nur deshalb, weil enge Baustellen mit rüden Geschwindigkeitsbegrenzungen zum
gleichmäßigen Rollen zwingen. Es wird links überholt, es wird rechts überholt.
Es wird gar nichts mehr, alles steht und macht lange Gesichter. Ich dagegen
wechsle die Cassette.


Es geht weiter. Vor und hinter mir hektische Spurenwechsel. So zieht sich das
Stück A 2 bis zum Recklinghauser Kreuz. Der erhofften Entspannung folgt
zuverlässig der Vollfrust. Die A 43 bis Münster ist genauso voll wie das
Kamener Kreuz zur Rush-hour.

\end{document}

给出:

...
All hyphenated words follow:
Ar-beit
Fami-lie
ein-mal
rich-tig
Ober-hausen
Bau-stellen
Geschwindigkeits-begrenzungen
über-holt
hin-ter
zu-verlässig
All hyphenated words above. [1
...

这与输出文件一致:

连字符文本

相关内容