这个问题导致了一个新的方案的出现:
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
...
这与输出文件一致: