[Trennmuster] Makefile
Stephan Hennig
mailing_list at arcor.de
So Jul 6 16:03:16 CEST 2014
Am 29.06.2014 23:19, schrieb Guenter Milde:
Bitte entschuldigt die späte Antwort!
> für Prüfzwecke und für die Zerlegung neuer Wörter an Fugen habe ich im
> Makefile einen Versuch gestartet, "echte" Major-Muster zu generieren (aus
> Disambiguationsgründen "fugen" genannt).
Darf ich fragen, was du genau vorhast? Möchtest du Wortlisteneinträge
mit Trennstellenkategorisierung trennmustergesteuert erstellen? Ich
habe lokal ein Lua-Skript, welches aus einer Datei mit einem Wort pro
Zeile eine Liste im Wortlistenformat erstellt. Die Trennungen werden
dabei mit den lokal installierten Trennmustern aus dem hyph-utf8-Paket
ermittelt. Das Ergebnis kann nicht 1:1 in die Wortliste übernommen
werden, da zum Beispiel Spezialtrennungen nicht markiert werden.
Trennstellenkategorisierung müssen auch noch nachträglich vorgenommen
werden. Allerdings ließe sich genau das mit entsprechenden Mustern auch
automatisieren.
Ich habe das Skript angehängt. Es benötigt die Dateien
lua-classes/cls_*.lua
aus dem Padrinoma-Repositorium, <URL:https://github.com/sh2d/padrinoma>.
(In der Datei examples/MANIFEST stehen Hinweise zur lokalen
Installation.) Das Skript liest Wörter von der Standardeingabe und
schreibt auf die Standardausgabe.
Leider finde ich momentan keine Zeit, um am Padrinoma-Paket
weiterzuarbeiten. Ich bin momentan nicht mit der API zufrieden und für
einen CTAN-Upload fehlt auch noch Dokumentation. Vielleicht sollte ich
aber dennoch einen CTAN-Upload machen, damit für Nutzer aktueller
TeX-Verteilungen die lokale Installation entfällt. Einen simples
Programm zum Trennen von Wörtern -- pardon, zum Kennzeichen von
sogenannten "Spots" in Wörtern, die ja eben auch etwas anderes als
Trennstellen anzeigen können -- mit beliebigen Mustern ist ja bereits
vorhanden.
> Für Nicht-TeX-Anwendungen (apply-pattern.pl, hyphenation.py, OpenOffice,
> ...) der generierten Muster sind die Verpackung in \patterns und die
> \message hinderlich. Gebraucht wird das nur für das TeX-Paket dehyph-exptl.
> Können wir ein Ziel einrichten, was diesen Wrapper wegläßt oder gibt es so
> etwas schon?
Gibt es bisher nicht. Wäre für Anwendungen/Tests des Padrinoma-Pakets
aber auch sinnvoll.
> Warum wird die Wandlung von "Kategorietrennzeichen" in die
> patgen-Eingabemuster eigentlich mit sed gemacht und nicht im Perl-Skript
> extract-tex.pl?
>
> Für mich sind sowohl sed als auch Perl böhmische Dörfer. Andererseits
> möchte ich ein Skript welches "intelligent" aus den Rohdaten nur wirklich
> "gute" (den Lesefluß nicht störende) Trennstellen (mit nach Wortlänge
> gewichteter Anforderung and die "Güte") für Flattersatz als Eingabe für
> patgen generiert erarbeiten.
> Ist es OK, ein Python- oder Lua-Extraktionsskript in das Makefile
> einzubinden? (Wenn ja, gibt es Vorschläge für das Vorgehen?)
>
> Apropos Extraktionsskript: Lua hat den Vorteil, daß es überall wo LuaTeX
> da ist auch läuft. Gibt es schon ein Lua-Skript oder eine Funktion,
> welche je nach Argument die Trennmuster der entsprechenden Sprache
> auswählt?
Fast. Das Lua-Modul
skripte/lua/helper-records.lua
enthält ein Funktion, die die Felder eines Datensatz als Tabelle
zurückliefert. Um weitere Muster zu erstellen, müssen die
Spaltenauswahl und die Ersetzung von beliebigen Markierungen in '-'
sowieso logisch voneinander getrennt werden. Ich habe mir noch keine
weiteren Gedanken darüber gemacht, aber ich bastele schnell man ein
kleines Extraktionsskript in Lua und stelle das dann hier zur weiteren
Diskussion.
Viele Grüße,
Stephan Hennig
-------------- nächster Teil --------------
-- -*- coding: utf-8 -*-
--[[
Copyright 2014 Stephan Hennig
This program is free software: you can redistribute it and/or modify it
under the terms of the GNU General Public License as published by the
Free Software Foundation, either version 3 of the License, or (at your
option) any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
General Public License for more details.
You should have received a copy of the GNU General Public License along
with this program. If not, see <http://www.gnu.org/licenses/>.
--]]
-- Lese Konfigurationdaten aus.
local path_dirsep, path_sep, path_subst = string.match(package.config, "(.-)\n(.-)\n(.-)\n")
-- Erweitere Modulsuchpfad.
package.path = package.path
.. path_sep .. "lua" .. path_dirsep .. path_subst .. ".lua"
.. path_sep .. "skripte" .. path_dirsep .. "lua" .. path_dirsep .. path_subst .. ".lua"
-- Lade Module aus TEXMF-Baum.
kpse.set_program_name('luatex')
local unicode = require('unicode')
local cls_spot = require('cls_pdnm_spot')
-- Short-cuts.
local Tconcat = table.concat
local Ugsub = unicode.utf8.gsub
local Ulower = unicode.utf8.lower
-- Erzeuge Spot-Objekte.
local trad = cls_spot:new()
local refo = cls_spot:new()
local swiss = cls_spot:new()
local p = cls_spot:new()
-- Lade Trennmuster und initialisiere Spot-Objekte.
do
local fin = assert(io.open(kpse.find_file('hyph-de-1901.pat.txt'), 'r'))
trad:read_patterns(fin)
fin:close()
local fin = assert(io.open(kpse.find_file('hyph-de-1996.pat.txt'), 'r'))
refo:read_patterns(fin)
fin:close()
local fin = assert(io.open(kpse.find_file('hyph-de-ch-1901.pat.txt'), 'r'))
swiss:read_patterns(fin)
fin:close()
end
trad:set_spot_mins(2,2)
refo:set_spot_mins(2,2)
-- Lese Zeilen von Standardeingabe.
for line in io.lines() do
-- Konvertiere Zeile in Wort-Datenstruktur (Sequenz von Buchstaben).
local lower_word_to_hyphenate = p:to_word(Ulower(line))
-- Trenne Wort mit traditionellen Mustern.
local trad_levels = trad:find_levels(lower_word_to_hyphenate)
-- Trenne Wort mit reformierten Mustern.
local refo_levels = refo:find_levels(lower_word_to_hyphenate)
-- PrÃ?fe Gleichheit der Trennungen.
local is_equal = true
for i,l in ipairs(trad_levels) do
if l % 2 ~= refo_levels[i] % 2 then is_equal = false end
end
for i,l in ipairs(refo_levels) do
if l % 2 ~= trad_levels[i] % 2 then is_equal = false end
end
-- Schreibe erste Spalte und Spaltentrenner.
io.write(line, ';')
-- Schreibe restliche Spalten.
local word_to_hyphenate = p:to_word(line)
if is_equal then
local word_hyphenated_2 = Tconcat(p:to_word_with_spots(word_to_hyphenate, trad_levels, '-'))
io.write(word_hyphenated_2)
else
local word_hyphenated_3 = Tconcat(p:to_word_with_spots(word_to_hyphenate, trad_levels, '-'))
local word_hyphenated_4 = Tconcat(p:to_word_with_spots(word_to_hyphenate, refo_levels, '-'))
io.write('-2-;', word_hyphenated_3, ';', word_hyphenated_4)
end
io.write('\n')
local ss,num = Ugsub(line, 'ß', 'ss')
if num > 0 then
-- Konvertiere Zeile in Wort-Datenstruktur (Sequenz von Buchstaben).
local lower_word_to_hyphenate = p:to_word(Ulower(ss))
-- Trenne Wort mit traditionellen Mustern.
local trad_levels = trad:find_levels(lower_word_to_hyphenate)
-- Trenne Wort mit reformierten Mustern.
local refo_levels = refo:find_levels(lower_word_to_hyphenate)
-- Trenne Wort mit schweizer Mustern.
local swiss_levels = swiss:find_levels(lower_word_to_hyphenate)
-- PrÃ?fe Gleichheit der Trennungen.
local is_equal = true
for i,l in ipairs(trad_levels) do
if l % 2 ~= refo_levels[i] % 2 then is_equal = false end
end
for i,l in ipairs(refo_levels) do
if l % 2 ~= trad_levels[i] % 2 then is_equal = false end
end
for i,l in ipairs(refo_levels) do
if l % 2 ~= swiss_levels[i] % 2 then is_equal = false end
end
-- Schreibe erste Spalte und Spaltentrenner.
io.write(ss, ';-2-;-3-;-4-;')
-- Schreibe restliche Spalten.
local word_to_hyphenate = p:to_word(ss)
if is_equal then
local word_hyphenated_5 = Tconcat(p:to_word_with_spots(word_to_hyphenate, trad_levels, '-'))
io.write(word_hyphenated_5)
else
local word_hyphenated_6 = Tconcat(p:to_word_with_spots(word_to_hyphenate, trad_levels, '-'))
local word_hyphenated_7 = Tconcat(p:to_word_with_spots(word_to_hyphenate, refo_levels, '-'))
local word_hyphenated_8 = Tconcat(p:to_word_with_spots(word_to_hyphenate, swiss_levels, '-'))
io.write('-5-;', word_hyphenated_6, ';', word_hyphenated_7, ';', word_hyphenated_8)
end
io.write('\n')
end
end
Mehr Informationen über die Mailingliste Trennmuster