Archive for Sierpień, 2010

Dostępne formaty prezentacji w LaTeX

Podczas tworzenia prezentacji w LaTeXu przy użyciu rozszerzenia Beamer prędzej czy później trzeba będzie wybrać jej odpowiedni wygląd. W przypadku Beamera do dyspozycji mamy:

  • zestawy tematów – 29
  • zestawy kolorów – 17
  • zestawy czcionek – 6

Istnieje strona Beamer Theme Matrix, gdzie można obejrzeć jak wygląda każdy z tych tematów, ale najlepiej sprawdzić to na własnej prezentacji. Można to zrobić ręcznie, modyfikując odpowiednie parametry w prezentacji, ale roboty z tym trochę jest. Druga możliwość to utworzenie skryptu, który wygeneruje dla nas prezentację w wybranych formatach.

Utworzenie prezentacji przy użyciu zdefiniowanych styli

Jestem z natury leniwym człowiekiem, więc prościej było napisać krótki skrypt, który w razie potrzeby zapisze mi prezentację w każdym dostępnym formacie, a ja będę mógł wybrać sobie ten, który mi najbardziej pasuje. Skrypt generujący prezentację we wszystkich dostępnych tematach:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash

# theme list
#THEMES="AnnArbor Antibes Bergen Berkeley Berlin Boadilla boxes CambridgeUS Copenhagen Darmstadt default Dresden Frankfurt Goettingen Hannover Ilmenau JuanLesPins Luebeck Madrid Malmoe Marburg Montpellier PaloAlto Pittsburgh Rochester Singapore Szeged Warsaw"

THEMES=`ls /usr/share/texmf/tex/latex/beamer/themes/theme/ | grep "^beam" | cut -d . -f 1  | sed "s/beamertheme//" | tr '\n' ' '`

TEX_FILE="subversion-jak_dziala-prezentacja"
OUTPUT_DIR="out"

for THEME in $THEMES
do
        INPUT_FILE="$TEX_FILE.tex"
        OUTPUT_FILE="$TEX_FILE-theme-$THEME.tex"

        cp $INPUT_FILE $OUTPUT_FILE
        sed -i "s/^\\\usetheme.*/\\\usetheme{$THEME}/" $OUTPUT_FILE

        pdflatex -output-directory=out $OUTPUT_FILE
        pdflatex -output-directory=out $OUTPUT_FILE

        rm $OUTPUT_FILE
done;

Krótkie wyjaśnienie tego co się w nim dzieje:

  • THEMES=`ls ....
    Utworzenie listy dostępnych tematów, należy zwrócić przede wszystkim uwagę na to, czy istnieje zdefiniowana ścieżka do ich definicji, w moim przypadku katalogu /usr/share/texmf/tex/latex/beamer/themes/theme/. Można także usunąć tę linię i odkomentować linię 4, która zawiera listę predefiniowanych tematów.
  • TEX_FILE="subversion-jak_dziala-prezentacja"
    Nazwa pliku TeX, który zawiera definicję prezentacji. Nazwa powinna być podana bez rozszerzenia.
  • OUTPUT_DIR="out"
    Katalog na dane tymczasowe i wynikowe pliki PDF.
  • cp $INPUT_FILE $OUTPUT_FILE
    Utworzenie kopii aktualnej prezentacji, po inną nazwą , która zawiera m.in. nazwę przetwarzanego tematu.
  • sed -i "s/^\\\usetheme.*/\\\usetheme{$THEME}/" $OUTPUT_FILE
    Podmiana w zawartości pliku nazwy użytego tematu. Ważne! W danej prezentacji należy określić temat przy użyciu \usetheme. Jeżeli parametr ten nie zostanie zdefiniowany to skrypt nie zadziała poprawnie.
  • pdflatex -output-directory=out $OUTPUT_FILE
    Wygenerowanie prezentacji z wybraną prezentacją. Polecenie wywołane dwukrotnie, przy pierwszym przebiegu tworzy spis treści.
  • rm $OUTPUT_FILE
    Usunięcie zbędnego już pliku tymczasowego z prezentacją.

Utworzenie prezentacji przy użyciu dostępnych kolorów

Skrypt ten przypomina bardzo poprzedni, więc omówię tylko różnice pomiędzy nimi:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash

# colors list
#COLORS="albatross beaver beetle crane default dolphin dove fly lily orchid rose seagull seahorse sidebartab structure whale wolverine"

COLORS=`ls /usr/share/texmf/tex/latex/beamer/themes/color/ | grep "^beamer" | cut -d . -f 1 | sed "s/beamercolortheme//" | tr '\n' ' '`

TEX_FILE="subversion-jak_dziala-prezentacja"
OUTPUT_DIR="out"

for COLOR in $COLORS
do
        INPUT_FILE="$TEX_FILE.tex"
        OUTPUT_FILE="$TEX_FILE-color-$COLOR.tex"

        cp $INPUT_FILE $OUTPUT_FILE
        sed -i "s/^\\\\usecolortheme.*/\\\\usecolortheme{$COLOR}/" $OUTPUT_FILE

        pdflatex -output-directory=out $OUTPUT_FILE
        pdflatex -output-directory=out $OUTPUT_FILE

        rm $OUTPUT_FILE
done;
  • COLORS=`ls ....
    Zdefiniowanie zmiennej zawierającej listę dostępnych motywów kolorystycznych. Można odkomentować linię 4 a tę usunąć, jeżeli ścieżka dostępu się nie zgadza.
  • sed -i "s/^\\\\usecolortheme.*/\\\\usecolortheme{$COLOR}/" $OUTPUT_FILE
    Podmiana polecenia \usecolortheme. Polecenie to musi istnieć w pliku z prezentacją, inaczej nic nie zadziała.

Utworzenie prezentacji przy użyciu dostępnych czcionek

Ostatnim skryptem będzie ten, który generuje prezentację dla wybranych czcionek:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#!/bin/bash

# theme list
#FONTS="default professionalfonts serif structurebold structureitalicserif structuresmallcapsserif"

FONTS=`ls /usr/share/texmf/tex/latex/beamer/themes/font/ | grep '^beamerfonttheme' | cut -d . -f 1 | sed "s/beamerfonttheme//" | tr '\n' ' '`

TEX_FILE="subversion-jak_dziala-prezentacja"
OUTPUT_DIR="out"

for FONT in $FONTS
do
        INPUT_FILE="$TEX_FILE.tex"
        OUTPUT_FILE="$TEX_FILE-font-$FONT.tex"

        cp $INPUT_FILE $OUTPUT_FILE
        sed -i "s/^\\\usefonttheme.*/\\\usefonttheme{$FONT}/" $OUTPUT_FILE

        pdflatex -output-directory=out $OUTPUT_FILE
        pdflatex -output-directory=out $OUTPUT_FILE

        rm $OUTPUT_FILE
done;

Różnice jak powyżej, w linii 6 definicja dostępnych formatów czcionek. A w linii 17 zmiana wartości na aktualnie wybraną czcionkę.

Skrypty te powinny pomóc w wyborze odpowiedniego tematu dla prezentacji, co powinno ułatwić zarówno jej tworzenie jak i późniejszy odbiór.

Źródła

Tags: , , ,

Tworzenie prezentacji przy użyciu LaTeX cz. 4: budowa konspektu

Ostatnim elementem tworzenia prezentacji będzie budowa konspektu. Będzie on składał się zarówno z prezentacji, jak i materiałów dodatkowych, mających poszerzyć wiedzę o kolejne elementy.

W poprzednich częściach został przygotowany plik main.tex, który zawiera prezentację o Subversion. Teraz trzeba będzie zrobić:

  • stworzyć plik PDF z konspektem
  • dodać dodatkowe informacje potrzebne do budowy konspektu

Utworzenie pliku PDF

Pierwszym krokiem będzie utworzenie pliku PDF formie książki a nie prezentacji. Można to zrobić bardzo prosto, modyfikując pierwszą instrukcję z pliku main.tex:

\documentclass[t]{beamer}

Wystarczy tę linie zmienić na:

\documentclass[a4paper,12pt]{article}
\usepackage{beamerarticle
}

Teraz wystarczy skompilować plik main.tex i już konspekt jest gotowy. Oczywiście, zmienianie za każdym razem nagłówka pliku aby zmienić format prezentacji nie jest najlepszym rozwiązaniem. Dużo lepiej jest przygotować dwa dodatkowe pliki tex, w których należy umieścić specyficzne rzeczy związane zarówno z prezentacją jak i konspektem, a w pliku main.tex zostawić już tylko samą treść i elementy wspólne dla obu formatów.

  1. Usunięcie formatowania z pliku main.tex.
    Pierwszym krokiem będzie usunięcie zbędnych elementów z pliku głównego, należy zakomentować lub usunąć linię z formatem prezentacji:

    1
    2
    % Rodzaj dokumentu
    %\documentclass[t]{beamer}
  2. Utworzenie pliku subversion-jak_dziala-prezentacja.tex.
    Należy utworzyć plik o nazwie subversion-jak_dziala-prezentacja.tex, w którym zostanie zdefiniowany format prezentacji oraz włączona zawartość pliku main.tex. Od tego momentu będzie trzeba kompilować plik subversion-jak_dziala-prezentacja.tex, aby otrzymać prezentację w formacie PDF:

    1
    2
    3
    \documentclass[t,ignorenonframetext]{beamer}

    \input{main.tex
    }

    Jak widać, zostaje w praktyce typ dokumentu na prezentację i załączony plik z jej treścią.

  3. Utworzenie pliku subversion-jak_dziala-konspekt.tex.
    Ostatnim krokiem będzie utworzenie pliku subversion-jak_dziala-konspekt.tex, dzięki któremu będzie można utworzyć plik PDF z konspektem:

    1
    2
    3
    4
    \documentclass[a4paper,12pt]{article}
    \usepackage{beamerarticle}
    \setjobnamebeamerversion{subversion-jak_dziala-prezentacja}
    \input{main.tex
    }

Od tego momentu kompilacja któregoś z tych plików będzie pozwala na utworzenie odpowiedniego dokumentu, czy też prezentacji czy też konspektu.

Uzupełnienie konspektu

Teraz czas na uzupełnienie prezentacji o dodatkowe elementy, które mają znaleźć się nie w prezentacji, ale tylko w konspekcie. Generalnie należy pamiętać o jednym: w prezentacji znajdą się tylko elementy pomiędzy tagami \begin{frame} oraz \end{frame}, wszystkie inne elementy będę umieszczone już na konspekcie.

Czyli najprościej mówiąc, należy dodatkowe treści umieścić po prostu po zakończeniu każdego slajdu.

Jak to wygląda w praktyce, można zobaczyć w archiwum z pełnym projektem prezentacji o Subversion, umieszczonym poniżej.

Źródła

Tags: , , ,

Masowa konwersja filmów przy użyciu ffmpeg + generowanie miniaturki

W swojej kolekcji posiadam sporo filmów nakręconych przy użyciu aparatu fotograficznego (jak pewnie prawie wszyscy :)). Filmy te łącznie ze zdjęciami udostępniam w formie albumu ze zdjęciami. I tutaj pojawia się mały kłopot: dobrze jakby filmy były zakodowane do formatu FLV, a do tego przydałaby się miniaturka zdjęcia.

W Internecie łatwo można znaleźć przepisy jak dokonać konwersji pojedynczy plik do formatu FLV przy użyciu ffmpeg, a miniaturki można stworzyć używając aplikacji ffmpegthumbnailer (więcej na ten temat w tym wpisie Generowanie miniaturek z plików wideo przy użyciu aplikacji ffmpegthumbnailer). Ja natomiast chciałem mieć rozwiązanie, które spełni takie warunki jak:

  • automatyczne skanowanie wybranego katalogu i wyszukiwanie nowych plików z filmami
  • konwersja nowych filmów do formatu FLV (ale nie należy ruszać już utworzonych plików)
  • utworzenie miniaturki konwertowanego pliku

I oto skrypt:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/bin/bash

# katalog do skanowania
IN_PATH="~/zdjecia"

# rozszerzenie z filami brane pod uwagę
EXTENSIONS=".*\.\(mp4\|mpeg\)"

(
    IFS="
    "

    for PLIK in `find "${IN_PATH}" -iregex ${EXTENSIONS}`; do
        # generowanie miniatury
        [ -f "${PLIK}.thm" ] ||
            (echo "Miniatura: ${PLIK}.thm"; ffmpegthumbnailer -i "${PLIK}" -o "${PLIK}.thm" -q10 -c jpeg -s 640)

        # jeżeli istnieje plik flv, to nic nie rób
        [ -f "${PLIK}.flv" ] && continue

        # konwersja pliku na format FLV
        echo "${PLIK}  ->  ${PLIK}.flv"
        ffmpeg -i "${PLIK}" -ar 22050 -ab 56 -r 25 -b 512k "${PLIK}.flv"

        # ustawienie takich samych czasów modyfikacji
        touch -r "${PLIK}" "${PLIK}.flv"
    done
)

Na pewno każdy będzie musiał przynajmniej częściowo dostosować skrypt do własnych potrzeb. U mnie działa i robi to czego oczekuję. A oto co się w nim dzieje:

  • IN_PATH="~/zdjecia"
    Katalog, w którym znajdują się pliki z filmami, tylko on (łącznie z podkatalogami) będzie skanowany.
  • EXTENSIONS=".*\.\(mp4\|mpeg\)"
    Definicja rozszerzeń, które będą brane pod uwagę (wielkość liter nie ma znaczenia). Jeżeli zajdzie potrzeba umieszczenia kolejnego na tej liście, należy dopisać je przed \) i rozdzielić od poprzednie przy użyciu \| (więcej na dokumentacji do polecenia find).
  • IFS="
        "

    Zmienna o nazwie Internal Field Separator, pozwala na podział parametrów wg słów. Domyślnie zawiera znaki: spacja, tabulator, nowa linia. Należy przedefiniować tę zmienną, aby można obsłużyć poprawnie występowanie spacji w wynikach zwracanych przez polecenie find. Nowa postać powinna zawierać tylko dwa znaki: znak nowej linii (czyli Enter) oraz znak tabulatora. Na pewno linię tę będzie trzeba wprowadzić ręcznie w edytorze, na stronie jest zapisana błędnie.
  • find "${IN_PATH}" -iregex ${EXTENSIONS}
    Odszukanie plików o podanych rozszerzeniach w wybranym katalogu.
  • [ -f "${PLIK}.thm" ] ||
    Sprawdzenie, czy istnieje miniatura. Jeżeli jej nie ma, to należy ją utworzyć.
  • ffmpegthumbnailer -i "${PLIK}" -o "${PLIK}.thm" -q10 -c jpeg -s 640
    Utworzenie miniatury na podstawie oryginalnego filmu.
  • [ -f "${PLIK}.flv" ] && continue
    Sprawdzenie, czy istnieje plik FLV. Jeżeli istnieje, to powrót do początku pętli i przetwarzanie kolejnego filmu (czyli nic więcej nie robimy).
  • ffmpeg -i "${PLIK}" -ar 22050 -ab 56 -r 25 -b 512k "${PLIK}.flv"
    Przetworzenie zadanego pliku do formatu FLV, przy zadanych parametrach.
  • touch -r "${PLIK}" "${PLIK}.flv"
    Ustawienie czasu modyfikacji nowo utworzonego pliki na taki sam oryginalny. Przydatne podczas przetwarzania zdjęć i filmów z więcej niż jednego aparatu (można wtedy sortować po czasie modyfikacji, niezależnie od nazwy pliku).

Tags: , , , ,

Generowanie miniaturek z plików wideo przy użyciu aplikacji ffmpegthumbnailer

Aplikacja ffmpegthumbnailer pozwala na wygenerowanie miniaturki z plików wideo obsługiwanych przez ffmpeg. Jednocześnie sposób jej użycia jest bardzo prosty, chociaż jest obsługiwana z poziomu linii poleceń.

Polecenie to wykorzystuje aplikację ffmpeg, więc obsługuje dokładnie ten sam zestaw formatów wideo.

W Ubuntu można te aplikację zainstalować przy użyciu polecenia:

sudo aptitude install ffmpegthumbnailer

W przypadku Ubuntu 10.04 zostanie zainstalowana wersja 2.0 aplikacji.

A sposób użycia:

ffmpegthumbnailer -i plik_wideo.avi -o miniaturka.thm -c jpeg -q10 -s 640 -t 5

Poszczególne opcje oznaczają:

  • -i plik_wideo.avi – plik wejściowy, z którego będzie generowana miniaturka
  • -o miniaturka.thm – wygenerowana miniaturka
  • -c jpeg – format pliku z miniaturką, nie trzeba tego podawać jeżeli zdefiniujemy rozszerzenie w nazwie pliku, dopuszczalne wartości to jepg oraz png
  • -q10 – jakość grafiki, 10 oznacza najwyższą
  • -s 640 – rozmiar miniatury, domyślnie wartość 128, wg dokumentacji od wersji 2.0.1 można używać wartości 0, co oznacza wygenerowanie miniatury o wielkości pliku wideo
  • -t 5 – miejsce, skąd pobrać miniaturę, w tym przypadku w 5 procencie długości filmu, domyślanie wartość 10%., można także podać czas w formacie hh:mm:ss

W moim przypadku polecenie to szczególnie dobrze się sprawdza w skryptach, gdzie trzeba automatycznie generować szereg miniatur.

Źródła

Tags: , , ,

Usunięcie rozszerzenia z nazwy pliku w bashu

Prosty problem do rozwiązania: w skrypcie napisanym w Bashu z nazwy pliku usunąć jego rozszerzenie, czyli zostawić sobie tylko nazwę pliku. Przez rozszerzenie rozumiem wszystko co występuje po ostatniej kropce.

Pierwszym moim pomysłem było utworzenie wyrażenia regularnego, ale to wygląda jak strzelanie z armaty do muchy. Więc trzeba zajrzeć do dokumentacji polecenia bash, i tam można znaleźć taką oto definicję:

${parameter%word}
${parameter%%word}
        Remove matching suffix pattern.

Konstrukcja ta działa następująco: w wartości podanego parametru (parameter) wyszukuje zadany ciąg znaków (word) i w przypadku znalezienie ucina jego jak najkrótszy fragment (w przypadku użycia %) lub jak najdłuższy (w przypadku użycia %%).

Tak będzie wyglądało usunięcie jakiegoś rozszerzenia z pliku:

~$ PLIK=nazwa.jeden.dwa
~$ echo ${PLIK%.dwa}
nazwa.jeden

Jak widać w efekcie ciąg znaków .dwa został usunięty. Teraz trzeba rozszerzyć to zachowanie na dowolne rozszerzenie, czyli zamiast rozszerzenia użyć znaku * (gwiazdki):

~$ PLIK=nazwa.jeden.dwa
~$ echo ${PLIK%.*}
nazwa.jeden
~$ echo ${PLIK%%.*}
nazwa

Proszę zwrócić uwagę na różnicę pomiędzy % a %%. W przypadku użycia % zostało usunięte tylko ostatnia rozszerzenie (czyli najkrótszy ciąg mogący zostać dopasowany). Natomiast przy użyciu %% zostały usunięte znaki od wystąpienia pierwszej kropki, czyli największy zakres jaki pasował do zdefiniowanego wzorca.

Istnieje także wariant tego polecenia umożliwiający usuwanie pierwszych znaków (czyli prefiksu), zamiast znaku % należy użyć #:

${parameter#word}
${parameter##word}
        Remove matching prefix pattern.

Źródła

Tags: , , , , , , ,