Wrzesień
03
2009

Google SyntaxHighlighter dla dokumentów LaTeX

Słowa kluczowe: , , , | Kategorie: TeX i LaTeX
No Gravatar

Zacząłem już opisywać tworzenie dokumentów za pomocą LATEX-a, jednak bez kolorowania składni dłuższe fragmenty kodu stają się nieczytelne. Cały problem polega na tym, że w projekcie SyntaxHighlighter nie ma skryptów dla tego języka. Jednak po krótkiej lekturze kodu źródłowego projektu, postanowiłem dopisać do niego własny skrypt dla LATEX-a.

Najpierw należy zdefiniować nową funkcję pędzla (dp.sh.Brushes.LaTeX), która będzie ustawiać podstawową klasę CSS (CssClass) dla LATEX-a oraz definiować style różnych fragmentów kodu (Style):


dp.sh.Brushes.LaTeX = function() {
  this.CssClass = 'dp-latex';
  this.Style =
    '.dp-latex .comment { color: #008040; }' +
    '.dp-latex .command { ' +
    'color: #0040C0; font-weight: bold; }' +
    '.dp-latex .macro { color: #0040C0; }' +
    '.dp-latex .bracket { ' +
    'color: #C00000; font-weight: bold; }' +
    '.dp-latex .square-bracket { ' +
    'color: #008000; font-weight: bold; }' +
    '.dp-latex .math { ' +
    'color: #F000D0; font-weight: bold; }';
}

Następnie należy utworzyć prototyp podświetlacza składni dla nowego języka:


dp.sh.Brushes.LaTeX.prototype =
  new dp.sh.Highlighter();

Żeby kolorowanie składni zadziałało, należy utworzyć na stronie element pre, zawierający atrybuty name="code" oraz class, którego wartość będzie określała pędzel użyty dla danego fragmentu kodu. Możliwe wartości atrybutu class podajemy w formie tablicy:


dp.sh.Brushes.LaTeX.Aliases =
  ['tex', 'latex'];

Ostatnim etapem jest wyszukiwanie podświetlanych elementów języka za pomocą wyrażeń regularnych:


dp.sh.Brushes.LaTeX.prototype.ProcessRegexList =
  function() {
    this.GetMatches(
        new RegExp('%[^\\x00-\\x1F]*', 'gm'),
        'comment');

    this.GetMatches(
        new RegExp('\\$[^\\x00]*\\$', 'gm'),
        'math');

    this.GetMatches(
        new RegExp('\\\\\\\\‍', 'gm'),
        'command');
    this.GetMatches(
        new RegExp('\\\\[a-zA-Z]+', 'gm'),
        'command');
    this.GetMatches(
        new RegExp('[\\\\]?@[a-zA-Z]+', 'gm'),
        'macro');

    this.GetMatches(
        new RegExp('[\\{\\}]+', 'gm'),
        'bracket');
    this.GetMatches(
        new RegExp('[\\[\\]]+', 'gm'),
        'square-bracket');
  }

Metoda GetMatches przyjmuje dwa parametry. Pierwszym jest wyrażenie regularne, a drugim – nazwa klasy, jaka ma być użyta do pasujących fragmentów kodu.

Najpierw znajduję wszystkie komentarze (linie 3–5), które zaczynają się od znaku „%” i kończą wraz z utworzeniem nowej linii.

Kolejnym elementem są wyrażenia matematyczne, zawarte pomiędzy znakami „$” (linie 7–9).

Następnie podświetlam komendy języka, czyli znacznik nowej linii („\\” – linie 11–13) oraz wszystkie pozostałe (zaczynające się od „\” – linie 14–16). Podobnie znajdywane są makra, zaczynające się od „\@” lub „@” (linie 17–19).

Na samym końcu zmieniam wygląd nawiasów – klamrowych (linie 21–23) i kwadratowych (linie 24–26).

Przygotowałem kompletny plik shBrushLaTeX.js, gotowy do pobrania. Przypuszczam, że pominąłem jakieś elementy LATEX-a, ale w przyszłości zamierzam uaktualniać skrypt w razie potrzeb.

Poniżej znajduje się przykładowy dokument LATEX, przekształcony przy użyciu Google SyntaxHighlighter:

% Artykuł:
\documentclass{article}

% Pakiety:
\usepackage[utf8]{inputenc}
\usepackage{polski}

% Ciało dokumentu:
\begin{document}
  Tekst \\ Nowa linia % Komentarz
  \newline Wyrażenie matematyczne: $x_i = x_{i-1}^2$.
\end{document}

W przypadku złego działania skryptu albo braku jakichś ważnych elementów składni, proszę o kontakt poprzez email lub komentarz.

Napisz Komentarz

*