piątek, 7 marca 2008

Xetex: nowa wersja TeXa

Dopisane 1 listopada 2010: Ten wpis jest myląco-przestarzały. Aktualne informacje na temat XeTeXa są w dokumencie: Używanie XeTeXa w systemie Linux (dystrybucja TEXLive). Przykładowe pliki są natomiast tutaj.

Xetex to nowy wariant TeXa. Cytując wpis z Wikipedii, który przed chwilą sam utworzyłem:-) Umożliwia korzystanie ze standardu Unicode oraz fontów komputerowych we współczesnych formatach, takich jak OpenType oraz AAT. Twórcą XeTeXa jest Jonathan Kew. Wstępne wersje XeTeXa były dostępne tylko na platformie Mac OS X. Wersje programu na platformę Linux i Windows pojawiły się w 2006 r. Ponieważ tak było, to traktowałem XeTeXa z rezerwą--ot jakiś wariant TeXa na Maca. Wprawdzie dostępny w Linuksie, ale pewnie z wieloma ograniczeniami. Absolutnie niesłusznie. Jest to już w tej chwili program production stable, w 99% kompatybilny z klasycznym TeXem.

Dalej cytując Wikipedię: XeTeX jest dołączany do współczesnych dystrybucji TeXa, takich jak: TeXLive, MikTeX (od wersji 2.7), MacTeX. Ja mam TeXLive 2007. Potrafi wykorzystać fonty dostępne w systemie TeX oraz te dostępne w systemie. Polecenie xetex plik.tex jest równoważne uruchomieniu plain TeXa, co m.in. oznacza skład fontami CM. Czegoś takiego jak xemex zaś nie ma. Najpierw chciałem wypróbować jak działa xetex z jakimś egzotycznym fontem systemowy, np. takim jak Cyklop, dostępne w formacie OpenType. Żeby to sprawdzić musiałem najpierw doczytać jak instalować fonty w Linuksie.

Fonty są standardowo umieszczone w katalogu /usr/share/fonts. To mi nie za bardzo pasowało. Jak zmieniam system, to jest kłopot, które fonty są natywne, tj. zainstalowane z archiwów .rpm, a które nie. Wolałbym Cyklopa umieścić w /usr/local/share/fonts. Plikiem konfigurującym fonty systemowe jest /etc/fonts/fonts.conf, ale modyfikacje należy wpisywać w /etc/fonts/local.conf:


<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<!-- /etc/fonts/local.conf file for local customizations -->
<fontconfig>
<!-- Font directory list -->
<dir>/usr/local/share/fonts</dir>
</fontconfig>

Teraz zrobiłem restart a następnie (jako root):


mkdir /usr/local/share/fonts
cd /usr/local/share/fonts
mkfontscale && mkfontdir # na wszelki wypadek, być może niepotrzebne
fc-cache

Teraz wpisanie fc-list | grep Cyk, powoduje wypisanie na ekran:


Cyklop:style=Italic
Cyklop:style=Regular

Teraz już z górki. Zredagowałem w Emacsie następujący plik:


%% -*- coding: utf-8 -*-
\font\titrm="Cyklop" at 15pt
\font\titit="Cyklop/I" at 12pt
\font\rm="Iwona" at 12pt
\rm
\parindent0pt
\obeylines
\nopagenumbers
%% http://galaxy.uci.agh.edu.pl/~szymon/raven.shtml
\leftline{\titrm Kruk}
\leftline{\titit {(tł. Stanisław Barańczak)}}
\medskip

W głuchą północ, w snów tumanie, gdy znużyło mnie dumanie
Nad księgami zapomnianej magii, znanej w dawnych dniach,
Chyląc głowę nad foliałem, niespodzianie usłyszałem
Chrobot, jakby ktoś nieśmiałym palcem skrobał znak na drzwiach.
,,Gość'', mruknąłem, ,,tym sygnałem daje znać, że stanie w drzwiach:
Skąd ten zimny pot i strach?''

\bye

Zwracam uwagę na sposób deklarowania fontów. Cyklop to nazwa fontu a nie pliku. Xetex nie potrzebuje plików .tfm dlatego możliwa jest taka deklaracja. Do tego zapis Cyklop/I oznacza kursywę. Podobnie /B to odmiana gruba a /BI to gruba kursywa. Bardziej finezyjne odmiany (cienkie, wąskie itp...) trzeba deklarować tradycyjnie (podając nazwę pliku). Nazwa może zawierać odstępy--po to są cudzysłowy.

Kompiluję plik wydając polecenie:

xetex test-cyklop.tex


Na dysku powstaje plik
PDF
zwierający co trzeba. Plik źródłowy jest
tutaj.



OK, teraz co dalej? W szczególności jak jest z: przenoszeniem wyrazów w języku
polskim, dołączaniem rysunków, matematyką, ładnymi plikami PDF
z odsyłaczami itp.? Okazuje się, że to wszystko jest wystarczy
przełączyć się na LaTeXa. Oto test nr 2:




%% -*- coding: utf-8 -*-
\documentclass[a4paper]{article}
\usepackage[EU1]{fontenc} %% \usepackage[T1]{fontenc}
%\usepackage{lmodern}
% Support for Iwona, cf. http://pinkaccordions.homelinux.org/staff/tp/prog/tex/misc/
\usepackage{iwona}
\usepackage{polski} %% wzorce przenoszenia itp...
\begin{document}

\begin{flushleft}
\begin{bf}
KRUK (\emph{The Raven\/})\\
E. A. Poe
\end{bf} \end{flushleft}

\begin{verse}
Raz w północnej, głuchej dobie, gdym znużony siedział sobie\\
Nad księgami dawnej wiedzy, którą wieków pokrył kurz -- \\
%% ...itd...

Pakiet lmodern udostępnia kroje Latin Modern i wszystko działa, jak w klasycznym LaTeXu. Pakiet fontenc deklaruje nowe kodowanie EU1. Można go używać ale można też pozostać przy klasycznym T1. Kodowanie EU1 jest niezbędne do składania tesktów w każdym innym języku za wyjątkiem angielskiego (innymi słowy ASCII działa, wszystko inne, raczej nie) Powyższy przykład działa out-of-the-box w TL2007. Pliki są tutaj.

Kolejny test dotyczył cyrylicy i rysunków. Tekst rosyjski wkleiłem po prostu z google translate, więc może być lekko bez sensu:


%% -*- coding: utf-8 -*-
\documentclass[a4paper]{article}
\usepackage[xetex]{graphicx}
\usepackage[EU1]{fontenc} %% \usepackage[T1]{fontenc}
\usepackage{tgtermes} %% \usepackage{lmodern}
%\usepackage{tgheros}
%\renewcommand{\sfdefault}{qhv} %% tgheros.sty sets qhv as main body font
%\usepackage{tgcursor}% tgcursor.sty sets qcr as main body font. Why?
%\renewcommand{\ttdefault}{qcr}
%\usepackage{url,sfheaders}
%\usepackage[russian,english]{babel}
%
\bibliographystyle{plain}
\flushbottom
\raggedright
%
\title{\textsf{Examining OSS success: information technology
acceptance by FireFox users}}
\author{*** No author ***}
%
\begin{document}
\maketitle
\section{Introduction}

%%
Open source software (OSS) is currently one of the most debated
phenomena in both academia and the software industry....

%% ... itd ...

No więc powyższe daje następujące wyniki: fonty LM nie zawierają cyrylicy więc układ T1+LM nie działa. Termes ma cyrylicę ale T1+Termes powoduje błąd:


Output file removed.
Output written on ff-4-isd06-test.pdf (1 page).

Faktycznie nie ma pliku ff-4-isd06-test.pdf. Poprawnie działa Termes z kodowaniem EU1. Nie ma w TL2007 odpowiednich plików dla kodowania EU1 dla fontów TeX-Gyre (podobnie nie ma dla Iwony), ale jest to dość proste do zrobienia . Wynikowy plik PDF jest tutaj. Plik źródłowy jest zaś tutaj. Kompletny przykład zawiera też rysunki. Xetex radzi sobie doskonale i obsługuje formaty: PNG/JPG + PDF, czyli z grubsza to samo co pdfTeX.

Uwaga: przykład zawiera zaprocentowane polecenia przełączające śródtytuły na sans-serif a font o stałej szerokości na Cursor (z zestawu fontów TeX-Gyre). Żeby to wszystko działało, to trzeba uaktualnić fonty TeX-Gyre ponieważ w TL2007 jest zainstalowana wstępna, niekompletna wersja. W przykładzie używa się też kodowania EU1. Pliki niezbędne do wykorzystywania tego kodowania z fontami TeX-Gyre są tutaj.

Ostatni przykład to matematyka składana krojem alternatywnym (Times, Palatino). Do tego służą pakiety txfonts/pxfonts (standardowo instalowane w nowych dystrybucjach LaTeXa):


%% -*- coding: utf-8 -*-
\documentclass[a4paper]{article}
\usepackage[xetex]{graphicx}
\usepackage{txfonts}
\usepackage[EU1]{fontenc}
\usepackage{tgtermes}
\usepackage{hyperref}
\usepackage{polski}
%
\title{*** No title given ***}
\author{*** No author given ***}
\begin{document}
\maketitle
\section{Analiza statystyczna zmiennych makroekonomicznych}
...

Ważna jest kolejność, najpierw \usepackage{txfonts}. Inaczej XeTeX podstawia inne fonty zamiast Times. Skład na pierwszy rzut oka wygląda OK. Pliki tradycyjnie są tutaj.

No i tyle o XeTeX. W jednym zdaniu: działa jak pdfTeX tyle, że z plikami w UTF8.

Aby wygodniej posługiwać się Unicode doinstalowałem do Emacsa pakiet xmlunicode Normana Walsha (należy pobrać xmlunicode.el oraz unichars.el). Instalacja polegała na skopiowaniu ww. plików do ~/.emacs-local (tam trzymam lokalne rozszerzenia i pakiety). Następnie należy określić wartość zmiennej unicode-character-list-file w pliku xmlunicode.el. Żeby było łatwiej dopisałem też w ~/.emacs:


(define-key global-map (kbd "C-c u") 'unicode-character-insert-char )
(autoload 'unicode-character-insert "xmlunicode" "Unicode support for XML" t)
(autoload 'unicode-character-insert-char "xmlunicode" "Unicode support for XML" t)
(autoload 'unicode-character-menu-insert "xmlunicode" "Unicode support for XML" t)

Teraz naciskając C-c u mogę wstawić dowolny znak Unicode z minibufora (z uzupełnianiem (completion) oczywiście). Natomiast funkcję unicode-character-menu-insert, pozwalającą na wybór znaku przez wskazanie myszą, dopisałem do menu. Funkcja unicode-character-menu-insert obsługuje rzecz jasna tylko znikomą część znaków Unicode -- te najczęściej używane. Menu zawierające wszystkie znaki raczej byłoby niewygodne w użyciu. BTW, to co wyświetlane jest w menu jest zdefiniowane w zmiennej unicode-character-menu-alist. Od razu dopisałem dwa znaki: #x201E (polski cudzysłów otwierający) i #x2026 (wielokropek).

Na koniec przydatny link do opis zestawu znaków Unicode.

Dopisane 9 marca 2008: Zamiast fontenc można korzystać z pakietu fontspec (jest zainstalowany w TL2007). Pakiet ten jest alternatywą dla klasycznego mechanizmu wyboru fontów w LaTeXu znanego jako NFSS. Wadą NFSS było to, że wymagał kłopotliwych dla tzw. przeciętnego użytkownika zabiegów na etapie instalowania fontu. Jeżeli zamiast fontenc używamy fonspec, to wtedy preambuła dokumentu wygląda następująco:


%% -*- coding: utf-8 -*-
\documentclass[a4paper]{article}
\usepackage{fontspec}
\setmainfont{Iwona}
%\setsansfont{TeX Gyre Heros} % odmiana bezszerfowa
%\setmonofont{TeX Gyre Cursor} % odmiana `monospace'
\usepackage{polski} %% wzorce przenoszenia itp...
%%% ... itd ...
\begin{document}
%% ... itd ...

Jak widać do włączenia fontu używana jest jego nazwa a nie nazwa pliku z fontem. Z dokumentacji pakietu wynika, że aby powyższe zadziałało font musi być zainstalowany w systemie -- umieszczenie odpowiednich plików w systemie TeX nie wystarczy. Jest wszakże możliwość takiego skonfigurowania pakietu fontspec żeby działał z fontami zainstalowanymi w texmf. W tym celu należy dodać opcjonalny argument ExternalLocation, tj. na przykład:


\fontspec[ExternalLocation]{texgyrecursor-regular}

Pakiet fonspec czasami nie działa z pakietami fontowymi z tradycyjnego LaTeXa. W szczególności nie działał (przynajmniej u mnie) w połączeniu z fontami matematycznymi z pakietów txfonts/pxfonts.

Dopisane 19 marca 2008: Za listą GUST-l: A jak wygenerować format XeMeX? albo innymi słowy plain-format dla XeTeXa z polskimi wzorcami przenoszenia wyrazów? (to ja się zapytałem:-).

Odpowiedź jest następująca (Piotr Strzelczyk): niestety to jeszcze nie jest oczywiste. Zwłaszcza, że rozwój formatów XeTeXa poszedł zdecydowanie w stronę LaTeXa. Trzeba znaleźć wersję pliku XeTeX.ini opierającą się na eTeXu. (W archiwum na stronie twórcy, jest chyba zła wersja, za to na TeXlive jest dobra.) Ma być sygnowana:


% xetex.ini
% jonathan kew
% public domain
% updated: 15 Sept 2006

Następnie [należy] sprawdzić jakie języki są włączone w language.def (nie mylić z language.dat) i dołączyć język polski (pamiętając, że należy używać plików ,,unikodujących'' definicje przeniesień -- wraperów -- np. xu-plhyph.tex):


\addlanguage {polish}{xu-plhyph}{}{2}{2}

No i później już normalnie -- generujemy format. I możemy pisać po polsku, włączając język poleceniem \uselanguage{polish} (po szczegóły odsyłam do dokumentacji e-TeXa).

Janusz Nowacki dopisał zaś: Można też \uselanguage{polish} ustawić już w language.def i będzie to prawie XeMeX (format z domyślnym polskim dzieleniem [wyrazów]).

Dopisane 26 marca 2008: Oprócz TeXGyre można spróbować używać XeTeXa z fontami Minion/Myriad rozpowszechnianymi razem z programem AcrobatReader firmy Adobe. Są jeszcze do wypróbowania fonty Asana Math (autor: Apostolos Syropoulos). Problem z Asana Math jest wszakże taki, że autor udostępnił tylko goły font, nie bardzo wiem jak się dobrać do poszczegółnych znaków w foncie.

1 komentarz: