piątek, 29 października 2010

Verbatim z formatowaniem literalnych fragmentów

Do wpisywania literalnych fragmentów tekstu używam otoczenia Verbatim z pakietu fancyvrb. Otoczenie to m.in. może być wstawione do przypisu oraz jest możliwość umieszczania w tekście literalnym poleceń formatujących. To drugie przydaje się przykładowo w sytuacji gdy w opisie składni jakiegoś języka pewne fragmenty są meta, tj. nie należy przepisywać ich literalnie ale oznaczają pewne pojęcia (jak dajmy na to element replaceable wewnątrz literallayoutDocbook), przykładowo:


\begin{list}{punktor}{deklaracje} zestawienie \end{list}

Można wpisać:


\begin{Verbatim}[commandchars=@\{\}]
\begin{list}{@emph{punktor}}{@emph{deklaracje}} @emph{zestawienie} \end{list}

Jeżeli fragmenty literalne mają być mniejsze to można dopisać po przecinku fontsize=\small. Inną potencjalnie przydatną opcją jest numerowanie wierszy:


\begin{Verbatim}[commandchars=@{},fontsize=\small,numbers=left]
\begin{list}{@emph{punktor}}{@emph{deklaracje}} @emph{zestawienie} \end{list}

Numery nie muszą się zaczynać od 1. Opcja firstnumber pozwala na kontynuację. Można w szczególności wpisać firstnumber=last i numerowanie rozpocznie się od wartości o 1 większej niż ostatni wiersz w poprzednim otoczeniu Verbatim.

Można też wykorzystując polecenie \fvset zdefiniować powtarzające się opcje globalnie a nie wpisywać je za każdym razem:


\usepackage{fancyvrb}
\VerbatimFootnotes % <-- verbatim można umieszczać w przypisie
\DefineShortVerb{\"} % <-- krótka forma zapisu "foo" zamiast \verb@foo@
\fvset{commandchars=¤´˝}
\makeatactive
\newenvironment{literalexample}{\begingroup \endgraf \small \medskip \Verbatim}%
{\endVerbatim \par \medskip \endgroup \@doendpe }
\makeatother

\begin{document}
\begin{literalexample}
\@startsection{¤emph´nazwa˝}{¤emph´poziom˝}{¤emph´wcięcie˝}{¤emph´odstęp-przed˝}{¤emph´odstęp-po˝}{¤emph´styl˝}
\end{literalexample}

W powyższym przykładzie \@doendpe powoduje, że w pierwszym akapicie po otoczeniu literalexample nie będzie wcięcia. \Verbatim\endVerbatim, to otoczenie Verbatim zapisane w postaci pary poleceń (każde otoczenie LaTeXa można zapisać jako \Otoczenie\endOtoczenie.

Ponieważ w kodzie LaTeXa praktycznie występują wszystkie znaki z klawiatury jako commandchars zastosowałem znaczki z górnej połówki ASCII: ¤ (dziesiętnie 164) ´ (180) oraz ˝ (189). Można by stosować np. ¤{}, ale wolałem nie używać {} w roli ograniczników do ¤, żeby mi się nie mieszało z nawiasami klamrowymi wstawionymi literalnie.

Teraz większy przykład, jak to działa


%& --translate-file=il2-pl
\documentclass[a4page]{book}
\usepackage{fancyvrb}
\fvset{commandchars=¤´˝}
\usepackage{polski}
\begin{document}

\begin{Verbatim}
\begin{list}{¤emph´punktor˝}{¤emph´deklaracje˝} ¤emph´zestawienie˝ \end{list}
\end{Verbatim}
\end{document}

Znaczki ¤´ oraz ˝ wstawiam w Emacsie wciskając C-c [ oraz C-c ]. W tym celu w .emacs zdefiniowałem co następuje:


(defun insert-commandchars-open ()
"Insert sequence of characters character 164-180"
(interactive) (insert "¤emph´") )
(defun insert-commandchars-close ()
"Insert sequence of characters character 189"
(interactive) (insert "˝") )
(global-set-key "\C-c\C-[" 'insert-commandchars-open)
(global-set-key "\C-c\C-]" 'insert-commandchars-close)

Teraz jeżeli byśmy na-rympał chcieli to używać z opcją utf-8 albo latin2 pakietu inputenc, to no-way:


\documentclass[a4page]{book}
\usepackage[utf8]{inputenc} \usepackage{lmodern} \usepackage[T1]{fontenc}
\usepackage{fancyvrb}
\fvset{commandchars=¤´˝}
\usepackage{polski}

\begin{document}
\begin{Verbatim}
\begin{list}{¤emph´punktor˝}{¤emph´deklaracje˝} ¤emph´zestawienie˝ \end{list}
\end{Verbatim}
\end{document}

LaTeX zgłasza błąd:


! Package inputenc Error: Keyboard character used is undefined

BTW: zapewne \fvset{commandchars=@\{\}} zadziała, ale nie chce mi się sprawdzać...

Można spróbować też XeTeXa:


\documentclass[a4page]{book}
\usepackage{fontspec} %<-- włącza LM wymaga xetexa
\usepackage{fancyvrb}
\fvset{commandchars=¤´˝}
\usepackage{polski}
\begin{document}

\begin{Verbatim}
\begin{list}{¤emph´punktor˝}{¤emph´deklaracje˝} ¤emph´zestawienie˝ \end{list}
\end{Verbatim}
\end{document}

Działa...

Brak komentarzy:

Prześlij komentarz