>> wybierz styl >> es :: ns :: bs

Weblog Tomasza Przechlewskiego [Zdjęcie T. Przechlewskiego] [[Ikona]]


scrum
random image [Photo gallery]
Zestawienie tagów
1-wire | 18b20 | 1wire | 2140 | 3rz | alsamixer | amazon | anniversary | antypis | apache | api | arm | astronomy | asus | atom.xml | awk | aws | balcerowicz | balta | bash | berlin | bibtex | bieszczady | biznes | blogger | blogging | blosxom | borne-sulinowo | breugel | bt747 | canon | cedewu | chello | chown | chujowetaśmy | cmentarz | contour | cron | css | csv | curl | d54250wykh | debian | dejavu | dhcp | dht22 | dia | docbook | dom | ds18b20 | dyndns | dynia | ebay | economy | ekonomia | elka | elm | emacs | emacs23 | english | ess | eu | excel | exif | exiftool | f11 | fc | fc11 | fc15 | fc5 | fc8 | fedora | fedora21 | fenix | ffmpeg | finepix | firefox | flickr | fontforge | fontspec | fonty | fop | foto | france | francja | fripp | fuczki | fuji | fuse | gammu | garmin | gawk | gazwyb | gdynia | geo | georgia | gft | git | github | gmail | gnokii | gnus | google | googlecl | googleearth | googlemaps | gphoto | gphoto2 | gps | gpsbabel | gpsphoto | gpx | gpx-viewer | greasemonkey | gruzja | grzyby | haldaemon | handbrake | historia | history | hitler | holocaust | holokaust | hpmini | humour | iblue747 | ical | iiyama | ikea | imap | inkscape | inne | internet | j10i2 | javascript | jhead | k800i | kamera | kleinertest | kml | kmobiletools | knuth | kod | kolibki | komorowski | konwersja | krutynia | kuchnia | kurski | latex | latex2rtf | latex3 | lcd | legend | lenny | lesund | lewactwo | liberation | linux | lisp | lisrel | litwa | logika | ltr | lwp | m2wś | mapsource | marvell | math | mathjax | mazury | mbank | mediolan | mencoder | mh17 | michalak | microsoft | monitor | mp4box | mplayer | ms | msc | msw | mtkbabel | museum | muzyka | mymaps | mysql | nanopi | natbib | navin | neo | neopi | netbook | niemcy | niemieckie zbrodnie | nikon | nowazelandia | nuc | nxml | oauth | oauth2 | obituary | okular | olympus | ooffice | ooxml | opera | otf | otftotfm | other | overclocking | panoramio | pdf | pdfpages | pdftex | pdftk | perl | photo | photography | picasa | picasaweb | pim | pine | pit | plotly | pls | plugin | po | politics | polityka | polsat | postęp | powerpoint | prelink | problem | propaganda | pstoedit | putin | python | r | radio | random | raspberry pi | refugees | relaxng | ridley | router | rower | rowery | rpi | rsync | rtf | ruby | rugby | russia | rwc | rwc2007 | rwc2011 | rzym | samba | sem | sheevaplug | sienkiewicz | signature | sks | skype | skytraq | smoleńsk | sqlite | srtm | ssl | statistics | stats | statystyka | stix | svg | svn | swornegacie | szwajcaria | terrorism | tex | texgyre | texlive | thunderbird | tomato | tourism | tramp | trang | truetype | ttf | turystyka | tusk | tv | tv5monde | twitter | typetools | ubuntu | uchodźcy | udev | umap | unix | upc | updmap | ups | utf8 | varia | video | vienna | virb edit | vostro | wammu | wdc | wdfs | webcam | webdav | wh2080 | wiedeń | wikicommons | wilno | windows | windows8 | wine | wioślarstwo | word | wordpress | wrt54gl | ws1080 | wtyczka | ww2 | www | wybory | wybory2015 | włochy | xemex | xetex | xft | xhtml | xine | xml | xmllint | xsd | xslt | xvidtune | youtube | yum | zakopane | zakupy | zdf | łeba | świdnica
Pobrania via google: [[Ikona]]
Archiwum
Inne blogi
N. Walsh | Morten H. Frederiksen | B. Clementson | prawo.vagla.pl | F. Hecker | M. Olson | J. Tennison | J. Clark | M. Nottingham | M. Shuttleworth | T. Isakowicz-Zalewski | J. Anglim | José A. Ortega Ruiz Modern Perl
Inne tematyczne
Ashwin Amanna | wiesia.nets.pl | Wojt | rwm.org.pl | DataBlog | Revolutions | Learning R | A. Gelman | C. Nel | J. Vogelgesang | ubl.xml.org/ | J.D. Long |
O stronie
wykorzystywany jest blosxom plus następujące wtyczki: tagging, flatarchives, rss10, lastbuilddatexhtmlmime. Niektóre musiałem dopasować nieco do swoich potrzeb. Więcej o blosxom jest tutaj
Subskrypcja
RSS 1.0
Perl encoding problem

SW asked me to augment a Perl script that originally processes ISO-8859-2 encoded text (TeX) files only by adding UTF-8 and CP1250 (one byte MS Windows encoding for Central Europe) encodings as well.

I made up it as follows (not sure if correct):

use Getopt::Long;
my $coding = 'utf8'; my $showhelp= '' ;
GetOptions( "coding=s"  => \$coding, "help|\?" => \$showhelp,) ;
if ( $showhelp ) { print "*** $0 [-coding=[cp1250|iso88592|utf-8]] file1 file2...\n" ;
		   exit 1; }

if ( $coding =~ /cp1250/ ) { $coding='cp1250'; use open ':encoding(cp1250)'; }
elsif ( $coding =~ /iso8859\-?2/ ) { $coding='iso-8859-2'; use open ':encoding(iso-8859-2)'; }
elsif ( $coding =~ /utf\-?8/ ) { $coding='UTF-8'; use open ':encoding(UTF-8)'; } 
else { die "*** Unknown coding: $coding\n";  exit 1; }

print STDERR "*** Coding: $coding\n";
## rest of the script omitted ....

I reencoded the script from original ISO-8859-2 to UTF-8 as well with iconv, so all strings are UTF-8 encoded now.

url | Thu, 20/12/2012 20:30 | tagi: , ,
Konfigurowanie TeXlive

Pliki systemu TeXLive są umieszczone nie w jednym a w kilku katalogach. Listę tych katalogów otrzymamy wykonując polecenie:

kpsewhich -expand-var '$TEXMF'

Mówiąc bardziej precyzyjnie: $TEXMFMAIN to katalog główny (korzeń główny instalacji), którego zawartość nie powinna być modyfikowana w inny sposób niż poprzez tlmgr; $TEXMFLOCAL -- tu można instalować coś prywatnego, co będzie dostępne dla wszystkich użytkowników systemu (system-wide); $TEXMFHOME -- prywatne pliki użytkownika (user-specific files).

kpsewhich --expand-var '$TEXMFMAIN' # korzeń główny = to co dała fabryka
kpsewhich --expand-var '$TEXMFLOCAL' # korzeń lokalnych zmian dla całej instalacji 
kpsewhich --expand-var '$TEXMFHOME' # lokalne nastawy użytkownika

Kolejność wyszukiwania plików jest taka, że najpierw jest przeszukiwane drzewo katalogów o korzeniu $TEXMFHOME a potem $TEXMFLOCAL a na końcu $TEXMFMAIN.

System TeX konfiguruje się edytując plik texmf.cnf. Plik ten można odszukać w następujący sposób:

kpsewhich texmf.cnf

/usr/local/texlive/2011/texmf.cnf

Po zainstalowaniu czegokolwiek w $TEXMFHOME należy wykonać texhash $HOME/texmf. Po modyfikacji zawartości $TEXMFLOCAL też należy wykonać texhash (jako root).

url | Wed, 07/03/2012 09:09 | tagi: , ,
Eksport do pliku PDF z OpenOffice Calc z poprawnym MediaBoxem

Rysunek utworzony w OO Calc kopiuję do OO Draw następnie zapisuję jako PDF. Jest prawie dobrze -- prawie bo MediaBox, czyli najmniejszy prostokąt zawierający rysunek jest zły -- OO Draw zapisuje rysunek jak całą stronę. Są dwa rozwiązania:

  1. Rysunek zapisany w OO Draw przyciąć używając do tego pdfcrop. Ten pdfcrop to skrypt w Perlu, dostępny w TeXlive i MikTeX.

  2. Zamiast do OO Draw skopiować (poprzez kopiuj/wklej) do Inkscape. Teraz zaznaczyć obiekt (with the rubber band selector) i następnie kliknąć w Właściwości Dokumentu → Dopasuj do ramki zaznaczenia. Teraz export do PDF da w rezultacie rysunek z prawidłowo przyciętym MediaBoxem. Por. też tutaj.

Próbowałem kopiuj/wklej do Infranview ale wynikowy plik PDF jest złej jakości (fonty są zamieniane na bitmapy)... Być może można to dokonfigurować.

url | Thu, 02/09/2010 16:43 | tagi: , , ,
Manipulowanie plikami bibtexa

Konwencję sobie przyjąłem, że pole tp:keywords zawiera moje słowa kluczowe. Czemu tak? Ano temu, że moja baza bibtexa zawiera wpisy skopiowane z różnych repozytoriów; wpisy te zawierają pole keywords, tyle że nie ma żadnych reguł odnośnie tego co jest zawartością tego pola. Zawartość pola tp:keywords jest (przynajmniej w założeniu) słownikiem ustalonym (controlled vocabulary) pojęć. Podobnie pole tp:comment zawiera mój, krótki opis zawartości pozycji bibliograficznej. W szczególności pola te pomagają posortować/wyciągnąć pozycje bibliograficzne, relewantne z punktu widzenia określonej dziedziny zastosowań. Używam do tego narzędzia bibtool:

bibtool -- 'select {tp:keywords "OSS" }' tph.bib 

Powyższe oznacza: wypisz wszystkie rekordy z pliku tph.bib, które zawierają napis OSS w polu tp:keywords. Napis "OSS" jest traktowany jako wyrażenie regularne (regex 0.12):

bibtool -- 'select {tp:keywords "OSS\|UTAUT" }' tph.bib 

Powyższe oznacza: wypisz wszystkie rekordy z pliku tph.bib, które zawierają napis OSS lub napis UTAUT w polu tp:keywords. Wyrażenie regularne może zawierać inne metaznaki: ., +, *, itd. Jest znak sumy (a lub b) ale nie ma iloczynu (a i b). Jeżeli chcemy wyciągnąć rekordy zawierająca łącznie pewne napisy, to można wykorzystać mechanizm potoku:

bibtool -- 'select {tp:keywords "#Prio" }' tph.bib |\
   bibtool -- 'select {tp:keywords "OSS" }' | \
   bibtool -- 'select {tp:keywords "SEM" }'

Powyższe oznacza: wypisz wszystkie rekordy z pliku tph.bib, które zawierają napisy OSS, SEM oraz #Prio (w dowolnym porządku) w polu tp:keywords. Słowo kluczowe #Prio to moja konwencja na oznaczenie ważnych wpisów. Innymi słowy powyższe oznacza: wypisz ważne pozycje literatury dotyczące (łącznie) OSS i SEM.

Do zamiany plików bibtexa na xhtml używam narzędzia bib2xhtml. Ten pakiet jest niestandardowy -- z tego co pamiętam -- trzeba go ściągnąć i zainstalować samodzielnie...

Moja baza bibtexa zawiera kilkaset wpisów, dotyczących różnych dziedzin i o różnym stopniu ważności (od merytorycznie istotnych do słabych; słabe też trzeba gromadzić--np. jako przykłady). Stąd powyższe pomysły, żeby trochę nad tym wszystkim zapanować...

Modyfikując bib2xhtml, który jest programem napisanym w Perlu, zmarnowałem trochę czasu usiłując dodać konwersję (brakujących) polskich znaków diakrytycznych. Otóż bib2xhtml zakłada iż plik jest kodowany w notacji LaTeXa (7 bitowe ASCII), przy czym nie są zaimplementowane znaki zawierające ogonek. Proste wpisanie:

s/\\k\{a\}/ą/g;

Nie chciało zadziałać. Po bliższym obejrzeniu skryptu się okazało, że każdy wiersz pliku jest wstępnie zamieniany poprzez wykonanie następującego polecenia:

  ## fragment jest wykonywany wew. pętli, `iterującej' po wszystkich wierszach pliku:
   {  local ($c, $l, $z) = (0, 0, ());
   s/([\{\}])/join("","\001",($1 eq "\{" ? $z[$l++]=$c++ : $z[--$l]),$1)/ge; 
   ## ge oznacza, globalnie+extended mode, dzięki czemu powyższe ma charakter pętli
   ## wykonywanej dla każdego znaku { oraz }
   }

W rezultacie każda sekwencja {...} zostanie zamieniona na \nnn{...\nnn}, gdzie \nnn jest znakiem o kodzie nnn. Przykładowo jeżeli wiersz zawiera:

{abc} {def} {ghi} jkl... => \001{abc\001} \002{def\002} \003{ghi\003} jkl...

Dzięki czemu każda para { ... } jest teraz jednoznacznie identyfikowana. Dokładnie nie wiem po co jest taka sztuczka robiona. Ale teraz zamiana przykładowo \k{a}, tj.~polskiego ą w notacji LaTeXa, wymaga zapisu:

s/\\k(\001\d+)\{a\1\}/ą/g;
url | Sat, 19/09/2009 11:18 | tagi: ,
prelim2e

Przydatny pakiet do wstawianie identyfikatora wersji dokumentu. Do tej pory stosowałem do tego makra `generyczne', ewidentnie wymyślone w okolicach f-my BOP sc.:

\newdimen\hs\hs 210mm
\newdimen\vs\vs 297mm
\def\shipmarg{\kern15mm}
\newbox\shipbox

\let\oriship\shipout

\def\DOSHIP{%
  \hoffset-1in \voffset-1in
  \oriship\vbox to\vs{
  \shipmarg\nointerlineskip
  \nointerlineskip\vss
  \hbox to\hs{\hss\box\shipbox\hss}%
  \nointerlineskip\vss
  \hbox to\hs{\shipmarg \DOCNOTE \hss}
  \shipmarg
}}
\def\doship{\aftergroup\DOSHIP}
\def\shipout{\afterassignment\doship\setbox\shipbox}

(Zaznaczone przerażające polecenia \aftergroup/\afterassignment, których w życiu nie używałem i przyznam nawet, że nie znam ich znaczenia.) Po czymś takim, umieszczonym najlepiej w osobnym pliku, należy zdefiniować tekst umieszczany na każdej stronie:

\def\DOCNOTE{ .... }

Patent ten w zmodyfikowanej wersji był wykorzystywany m.in. w klasie wzmgr. Był ale ponieważ przestał działać wymieniłem go na pakiet prelim2e. Sądząc z zawartości google -- mniej znany. Używa się go zaś bardzo prosto:

\usepackage{prelim2e}
\renewcommand{\PrelimWords}{...} %% <-- opcjonalnie, jeżeli domyślny tekst się nie podoba

Pakiet draftcopy nie działa z pdftexem więc od razu został zdyskwalifikowany. (Poza tym nie podoba mi się zwyczaj wstawiania bombastycznego napisu w tle tekstu kolumny.)

Dodanie prelim2e do wzmgr zrobiłem warunkowo. Jak ktoś doda do dokumentu opcję brudnopis, to zamieni się to na poniższe:

\DeclareOption{brudnopis}{\AtEndOfClass{\input{prelim2e.sty}%
  \renewcommand{\PrelimWords}{\ThisDocVersionId}\linespread{1.0}}}
\def\ThisDocVersionId{....} %% <-- trzeba zdefiniować --

Bez umieszczenia \input wewnątrz \AtEndOfClass, LaTeX zgłaszał błąd powtórnej definicji \PrelimWords. Mam nadzieję, że powyższe jest OK, ale tradycyjnie pewności nie ma:-)

url | Fri, 19/06/2009 16:58 | tagi: ,
Pakiet fancyvrb (LaTeX)

Pakiet pozwala na formatowanie otoczenia verbatim, przykładowo można dodać numerowanie wierszy, zmienić stopień pisma (przydatne jak zawartość się nie mieści). Można też zdefiniować znak, który będzie rozpoznawany jako polecenie wewnątrz verbatim. To ostatnie przydaje się do formatowania fragmentów tekstu, np. złożenia kursywą lub w innym kolorze (przykład niżej)

\documentclass{article}
\usepackage{fancyvrb}
\DefineVerbatimEnvironment{SVerbatim}{Verbatim}%
{commandchars=\+\[\],numbers=left,numbersep=5pt,fontsize=\footnotesize}
%%
\DefineVerbatimEnvironment{XVerbatim}%
{Verbatim}{numbers=left,numbersep=5pt,fontsize=\small}
\begin{document}

\begin{SVerbatim}
aa [ ] \[ \] %% <-- znaki [ ] znikają magicznie
  bb [ ]
     ccc +textit[cccc Hop siup!]
\end{SVerbatim}

\begin{Verbatim}[commandchars=\@\[\]]
aa [ ] \[ \]
  bb [ ]
     ccc @textit[cccc Hop siup!]
\end{Verbatim}

Magiczne commandchars definiujące znaki rozpoczynające
polecenie można definiować także `indywidualnie':

\begin{XVerbatim}[commandchars=\@\[\]]
aa [ ] \[ \]
  bb [ ]
     ccc @textit[cccc Hop siup!]
\end{XVerbatim}

\end{document}

Polecenie zatem zaczyna się znakiem `+' a argument jest zawarty wewnątrz `[' oraz `]'. Tych znaków nie można używać wewnątrz Verbatim (por. przykład pierwszy, powyżej). W tej sytuacji ich deklaracja ,,globalna'' jest ryzykowana, bo może się zdarzyć, że będzie potrzeba wstawić ,,magiczny'' znak literalnie.

url | Thu, 07/05/2009 10:06 | tagi: ,
Drukowanie arkusza Google docs

W przykładzie poniżej Perl pobiera dane z arkusza Google Docs, i zapisuje je do pliku tymczasowego. Następnie TeX -- uruchomiony ,,z wnętrza'' skryptu -- formatuje ww. dane (układ graficzny jest zdefiniowany w stylach (por. \input brasskoncert.sty):

use Net::Google::Spreadsheets;
use Getopt::Long;
use Encode qw(encode);

my $STitle = 'Konkurs_Brass';  # nazwa arkusza do pobrania
my $pdftexprogname = 'pdfmex'; # nazwa programu uruchamiającego TeXa
my $outputname = "tmp__.tex";  # nazwa pliku tmp

my $pdfintermode = "-interaction=nonstopmode"; # lepsze niż "-interaction=batchmode";

GetOptions( 't=s'  => \$title,);

## nazwy kolumn w arkuszu:
my @Cols = ('nazwisko', 'kraj', 'instrument', 'srednia');

my $service = Net::Google::Spreadsheets->new(
   username => '???', password => '???' );

my @spreadsheets = $service->spreadsheets();

my $spr_title = $service->spreadsheet( { title => "$STitle" });
my $worksheet = $spr_title->worksheet( { title => 'sheet1' });
my @rows = $worksheet->rows;

open (OUT, ">$outputname") || die "Nie mogę otworzyć $outputname.tex!\n\n";
print OUT "\\input brasskoncert.sty\n\\HEAD{$title}\n";

for $r (@rows ) { $rc =  $r->content; print OUT "\\Row";
  for $t (@Cols ) { 
    print OUT "{", encode("iso-8859-2", ${$rc}{$t}), "}";
  }
  print OUT "\n";
}

print OUT "\\TAIL \\bye\n";

close (OUT);

my @run_pdftex = ($pdftexprogname, $pdfintermode, $outputname);
system ( @run_pdftex ) == 0 || die "Cuś nie tak\n" ;
##

Być może da się prościej, bez Net::Google::Spreadsheets a poprzez LWP...

url | Sun, 26/04/2009 17:26 | tagi: ,
Cytowanie według schematu autor-rok z użyciem Bibtexa i pakietu natbib

Przywołania bibliograficzne to odsyłacze do wykazu literatury [w odróżnieniu od przypisów bibliograficznych, czyli przypisów zawierających podstawowe elementy identyfikujące przywoływany dokument. Przypisy są ,,modne'' w tekstach humanistycznych i prawnych oraz wśród ,,akademickich moherów'' z innych branż]. W LaTeXu standardowym sposobem cytowania jest ,,poprzez numer'', pod którym dana pozycja jest umieszczona w zestawieniu literatury.

W wielu dziedzinach nauk obowiązującym zwyczajem jest oznaczanie przywołań przy pomocy umieszczonego w nawiasach okrągłych lub kwadratowych nazwiska autora/autorów oraz roku wydania, np. (Knuth 1985). Aby przestawić LaTeXa na taki sposób tworzenia przywołań bibliograficznych należy:

\usepackage{natbib}
\usepackage[breaklinks]{hyperref}
\bibliographystyle{papalike} %% spolonizywany style apalika.bst
\begin{document}  %% albo standardowy \bibliographystyle{plainnat} 

Bez breaklinks LaTeX nie złamie wiersza w obrębie przywołania, co w przypadku dużej ich liczby będzie skutkować dużą liczbą sterczących na prawym marginesie fragmentów nieprzeniesionego prawidłowo tekstu.

Polecenie \bibliographystyle{papalike} określa styl bibliograficzny. Tu jest problem, bo większość stylów nie jest spolonizowana. Wyżej podany papalike, to ,,na szybko'' spolszczony plik apalike (Dostępny tutaj). Teraz należy uruchomić poniższy wiersz (dla pewności dwa razy:-):

pdflatex plik.tex && bibtex plik 

Z rozpędu dodałem opcję definiowania przywołań bibliograficznych do wzmgr.

A jeżeli publikacja nie ma daty wydania, np. strona WWW bez daty publikacji, to zgodnie z zaleceniami APA: The initials n.d. should be listed if there is no date. Po polsku zamiast n.d. wstawiam bdw (brak daty wydania), np. (Ajzen, bdw).

Dopisane 28 Lutego 2009: Pakiet hyperref można wywołać z opcją backref, albo pagebackref co skutkuje tym, iż w spisie literatury pojawią się przy każdej tzw. pozycji literaturowej numery stron, na których owa pozycja jest przywoływana (przydatne na etapie pisania pracy oraz w przypadku dokumentu w wersji elektronicznej (przykład -- zobacz spis literatury w pliku mgr-main.pdf)).

Teraz uwaga: powyższe nastawy nie zawsze działają. Nie rozgryzłem tematu do końca ale: klasy Marcina Wolińskiego wydają się nie być kompatybilne z natbib. Kompilacja kończy się błędami `\inaccessible' na etapie przetwarzania spisu literatury. W google jest coś na rzeczy tutaj. Wprawdzie większość wątku jest mało konkretna, ale sugestia J. Kew wydaje się prawdopodobna: I think there's an incompatibility between your use of \leftmark in the header, and whatever (the bibliography style?) is supposed to be producing the \mark's.

Pakiet natbib testowany z innym tekstem spowodował też inny błąd: w przypadku podzielenia przywołania pomiędzy stronami link z strony poprzedniej nie kończy się na brzegu ostatniego wiersza ale obejmuje także ewentualne przypisy, ew. paginę dolną oraz paginę górną następnej strony (Oczywiście usunięcie breaklinks z listy opcji pakietu hyperref usunęłoby problem ale wprowadziło inny jednocześnie.)

Najśmieszniejsze, że mam dwa wydaje się identyczne dokumenty, w których w jednym taki błąd występuje a w drugim jest OK. Już nie jest śmiesznie -- dodałem więcej tekstu do dokumentu, który był OK i stał się KO (por. strona 17 w pliku mgr-main.pdf). Coś mi dzwoni, że tego typu efekt może wynikać z ograniczeń TeXa, który najpierw składa akapity a potem łamie strony. Skąd biedak ma wiedzieć, że akurat w tym wierszu skończy mu się strona... Anyway -- zadałem pytanie na GUST-l bo może się mylę.

Dopisane 2 Marca 2009: Limitation of pdfTeX napisał Heiko Oberdiek w odpowiedzi na moje pytanie na comp.text.tex. Niestety to potwierdza, że mi dobrze dzwoniło...

Dopisane 6 Kwietnia 2010: O jednej rzeczy w tym wszystkim zapomniałem. Mianowicie polecenie składające zawartość \cite{...} wygląda następująco (plik latex.ltx):

\def\@citex[#1]#2{\leavevmode
  \let\@citea\@empty
  \@cite{\@for\@citeb:=#2\do
    {\@citea\def\@citea{,\penalty\@m\ }%
     \edef\@citeb{\expandafter\@firstofone\@citeb\@empty}%
     \if@filesw\immediate\write\@auxout{\string\citation{\@citeb}}\fi
     \@ifundefined{b@\@citeb}{\hbox{\reset@font\bfseries ?}%
       \G@refundefinedtrue
       \@latex@warning
         {Citation `\@citeb' on page \thepage \space undefined}}%
       {\@cite@ofmt{\csname b@\@citeb\endcsname}}}}{#1}}

Ostatni wiersz jest istotny. Magiczne \@cite@ofmt jest zdefiniowane trochę dalej jako:

\let\@cite@ofmt\hbox

Co oznacza, że każde odesłanie bibliograficzne ,,jest brane'' w pudełko i nie ma szans, żeby się odsyłacz przełamał nawet z aktywną opcją breaklinks. Wystarcz jednak wpisać:

\let\@cite@ofmt\relax

Żeby odsyłacz nie był składany w pudełku (ze wszystkimi tego konsekwencjami, negatywnymi też). Albo mam za starego/błędnego hyperrefa, albo jest jakaś opcja, której nie znam albo jeszcze coś innego. U mnie samo wywołanie pakietu hyperref z opcją breaklinks nie przełamuje odsyłaczy, z wyżej opisanego powodu.

url | Fri, 27/02/2009 19:53 | tagi: , ,
MimeTeX

Mimetex -- coś co nie używa TeXa a potrafi zamienić wzory w składni LaTeXa na pliki .gif. Działa w 99% poprawnie, ale to i tak jest dużym wyczynem. Parsowanie wzorów w notacji LaTeXa nie jest łatwym zadaniem.

url | Thu, 08/01/2009 17:21 | tagi: ,
Wywiad z Knuthem w CACM

W numerach 7--8 Communications of the ACM jest wywiad z Knuthem (ściśle mówiąc: vol. 51 nos 7--8, 2008). Pierwsza część jest teraz nawet dostępna on-line. Fragment: Then a startup company came to me and said, [...] ``Name your price.'' I said ``Oh, okay, $100,000,'' assuming that this was [outrageous]. The guy didn't blink. He agreed. I didn't blink either. I said, ``I'm not going to do it. I just thought that was an impossible number.'' At that point I made the decision in my life that, I wasn't going to optimize my income.

url | Tue, 26/08/2008 20:03 | tagi: , ,
Wywiad z Knuthem na www.informit.com

Kol. WB podesłał informację na GUST-L nt. wywiadu z prof. Knuthem (cf. strona domowa) Tekst jest dostępny na stronach www.informit.com.

url | Sun, 27/04/2008 09:42 | tagi: , ,
Bachotek 2008

Właśnie przed chwilą skończyłem redagowanie materiałów konferencyjnych na kolejny Bachotek, który już niedługo. Udało się te materiały skompilować korzystając z TeXLive2007 [z drobnymi problemami]. Problem pierwszy to jak dołączyć font lokalnie?, tzn. Prelegent Marcin W. dostarczył egzotyczny font, którego nie chcę instalować system-wide. Na okoliczności egzotycznych, dodatków ma katalog /.texmf a w pliku web2c/texmf.cnf ustawione, przykładowo:

TEXINPUTS.tex = .;..;./texmf//;$TEXMF/tex/{plain,generic,}//

Co oznacza że mój TeX szuka plików w katalogu nadrzędnym oraz w katalogu/podkatalogach ./texmf. Ale mapy fontowe są ,,globalne'' a bez wpisów w plikach .map, program pdftex ,,nie widzi'' fontów [BTW ,,stara technologia'' z wykorzystaniem dvipsa była lepsza bo dvips ma opcję -u, co pozwala zapodać mu mapę lokalnie. Takiej opcji nie ma pdftex.] Rozwiązanie jest następujące:

updmap --enable Map bayerancki.map

Powyższe podałem jako zwykły użytkownik, bayerancki.map umieściłem w ./texmf, razem z fontami i plikami .tfm. Zadziałało. Dokładny sposób działania updmap jest dla mnie -- muszę przyznać -- pewną tajemnicą.

Problem drugi--brak jakiegoś fontu cyrylicznego. TL2007 zainstalowanemu w wariancie (kolekcji) GUST brakuje fontu latt0800--tylko gdzie go znaleźć? Google w tym przypadku okazał się mało pomocny: latt0800.tfm nie ma wcale, a latt0800 wskazuje na pliki .map fontów cm-super. Ale w pakiecie cm-super nie ma pliku latt0800.tfm? Nie ma bo jest w lh. [Naprawdę, to też go tam nie ma, ale zostanie wygenerowany.] Instalacja pakietu za pomocą skryptu install-pkg.sh też taka mało intuicyjna:

sh install-pkg.sh --help # nie ma takiej opcji--czemu?
sh install-pkg.sh --package=lh --listonly # podaje zawartość pakietu lh

sh install-pkg.sh --package=lh # instaluje pakiet lh

Nie znalazłem opcji wyświetlenia listy pakietów--oglądałem je po prostu za pomocą ls po nazwach starając się wykoncypować o co może chodzić. Jest opcja listdir ale sposób jej działania jest dla mnie wielką tajemnicą. Nie wiem czemu ten skrypt jest tak bezsensownie prymitywny -- doinstalowanie czegokolwiek z TL to całkiem traumatyczne przeżycie.

A na Bachotek znowu nie jadę, bo w tym samym czasie jedziemy do Kilonii oglądać U-boota.

url | Tue, 22/04/2008 13:29 | tagi: ,
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.

[Xetex+Emacs]
[Xetex+Emacs]
[Xetex + Emacs]

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.

url | Fri, 07/03/2008 13:02 | tagi: , , , , , ,
Zamiana plików TeX na MS Word

Jakiś czas temu Elka uaktualniła fragment swojej książki nt. akordeonów. Ma on być wydany w postaci artykułu w wydawnictwie prestiżowej Akademii Muzycznej. Oczywiście podesłanie tego w formacie .tex nie wchodziło w grę. Dokument nie jest specjalnie skomplikowany, ale zwiera kilkadziesiąt przypisów, kilkanaście rysunków i setki poleceń służących do tworzenia skorowidzów. W oryginale był to dokument plain TeXa, tyle, że łatwo (na szczęście) go było zamienić na dokument LaTeXowy:

%& --translate-file=il2-pl
\documentclass{article}
\usepackage{polski}
\usepackage{graphicx}
\newcommand\PICDIR{} %
\renewcommand\index[1]{} %% eat
\newcommand\xindex[1]{} %
\newcommand\AWindex[2][NIL]{} % 
\newcommand\Piece[2][NIL]{\emph{#2}} % eat
\renewcommand{\includegraphics}[2][NIL]{%
  \begin{center}\texttt{#2.eps}\end{center}}
\renewcommand\dywiz{-}
\setcounter{secnumdepth}{-1}

\title{Polska literatura akordeonowa...

Polecenia indeksujące \index, \xindex, \AWindex oraz \Piece zostały przedefiniowane: zjadają swoje argumenty i nie wstawiają nic do składu. Przedefiniowałem też \includegraphics, bo plik .rtf ze wstawionymi rysunkami miał ponad 40 Mb. Skoro ostateczny skład ma być w InDesign, to rysunki można wysłać osobno i w lepszym formacie.

BTW: konstrukcja \newcommand\polecenie[2][NIL] przedefiniowuje polecenie, które ma dwa argumenty, w tym jeden (pierwszy) jest opcjonalny, tzn. użycie takiego polecenia ma postać: \qq[pierwszy]{drugi} albo \qq{drugi}. Napis NIL, to domyślna wartość, tego (opcjonalnego) argumentu.

Kiedy mam potrzebę zamiany pliku LaTeXa na MS Word używam latex2rtf. Nie jest to program idealny, ale lepszego nie znam:

latex2rtf -i polish -C latin2 akordeony.ltx

Przełącznik -i polish powinien wstawiać generowane napisy w języku polskim (tj, Rysunek zamiast Figure itp.). Kłopot, bo tego nie robi (wersja 1.9.16a, beta). Próbowałem na różne sposoby a rzecz wydaje się banalna, jednak uparcie wstawiane są teksty angielskie (można to ew. poprawić edytując plik RTF, np. Perlem). Za to przełącznik -C, ustawiający stronę kodową, działa.

Po uruchomieniu latex2rtf, pojawiło się kilka ostrzeżeń:

akordeony.ltx:3 Unknown style option polski ignored
akordeony.ltx:4 Unknown style option graphicx ignored
akordeony.ltx:9 No existing definition for \index
akordeony.ltx:13 No existing definition for \includegraphics
akordeony.ltx:14 No existing definition for \dywiz

Ale konwersja została dokonana (prawie) prawidłowo. W szczególności latex2rtf prawidłowo zinterpretował moje redefinicje i pominął zwartość poleceń indeksujących a zamiast plików graficznych wstawił ich nazwy. Jedyny błąd jaki zauważyłem, to wstawianie zbędnego odstępu pomiędzy \footnote a następującym po numerze przypisu znakiem przestankowym, tj. numer-odstęp-kropka, zamiast numer-kropka.

Przy okazji konwersji z LaTeXa do MSW: dia potrafi wyeksportować dobrej jakości diagramy w formacie EMF.

url | Fri, 24/08/2007 14:11 | tagi: , , , , ,