LaTeX

  • LaTeX Syntax-Highlighting mit GeSHi

    Das Problem:

    Ich beschäftige mich an meiner Hochschule als Hilfskraft mit der Erstellung eines Wikis über "LaTeX für wissenschaftliche Arbeiten". Dabei muss ich nicht selten auch LaTeX-Sources einfügen. Und diese sehen, mit pre-Tags "formatiert", leider nur sehr unscheinbar und unübersichtlich aus. Aber, so dachte ich mir: MediaWiki kann doch alles - zumindest mit Plugins...

    Doch zu meinem großen Erstaunen musste ich feststellen, dass es anscheined keine vernünftigen Syntax-Highlighter gibt, die in PHP geschrieben sind und LaTeX-Quelltexte hervorheben können. Eine einfache Integrierbarkeit eines solchen Tools in mein Wikisystem habe ich dabei noch garnicht vorausgesetzt.

    Die Lösung:

    Der Generic Syntax Highlighter (GeSHi) ist eine tolle PHP-Bibliothek mit der fast alle Sprachen "gehighlighted" werden können. Ein Mediawiki-Plugin dafür existiert auch schon. Von LaTeX hat der GeSHi allerdings (noch) keine Ahnung! Aber man kann ihm neue Sprachen beibringen. Dummerweise werden gerade jetzt bei der Weiterentwicklung von Version 1.0.x zu Version 1.1+ grundlegende Änderungen in den Sprachendateien stattfinden. Das bedeutet, dass man entweder für ein veraltetes System schreibt, oder schlecht dokumentierte neue Schnittstellen bedienen muss. Ich habe mich für "Variante 1" entschieden. Schließlich ist mein LaTeX-Highlighter ja auch eher für den "Hausgebrauch" gedacht. Und in meinem Wiki bestimme ich, was die "aktuelle" Version ist! icon_wink.gif

    Nun habe ich mit meinem neu erlangten Wissen über Regular Expressions einen ersten Entwurf zusammenprogrammiert. Das Ganze hat sich als eine ziemliche Fummmelarbeit herausgestellt, unter anderem weil viele vorgefertigte GeSHi-Elemente für die (recht seltsame und "historisch gewachsene") TeX-Syntax nicht wirklich anwendbar sind.

    Besonders toll ist, dass der Backslash sowohl in PHP als auch bei RegExes und natürlich in TeX selber ein Escape-Character ist... ==> "\\\\\\\\"

    Mein Entwurf für die Sprachdefinitionsdatei ist unten angehängt. Viel Spaß damit - vielleicht wird er ja dem ein oder anderen nützlich sein.

    Richtig zufrieden bin ich damit selbst noch nicht - immerhin gibt's jetzt LaTeX in bunt und übersichtlicher als nur "monospaced" dargestellt.

    Update (25. Juni 2007)

    Matthias Pospiech hat aufbauend auf meinem Entwurf (s. unten) zusammen mit dem Programmierer von GeSHi eine sehr vollständige Sprachdefinitionsatei für LaTeX erstellt. Diese ist jetzt Bestandteil von Geshi - und wird so auch mit MediaWiki, Wordpres, und vielen anderen großen PHP-Anwendungen mitgeliefert! icon_biggrin.gif

    <?php /*************************************************************************************  * efilatex.php  * -----  * Author: efi (mail_at_thomasefer_dot_de)  *************************************************************************************  *  *   This file is not yet part of GeSHi. (and is not compatible to the 1.1+ branch)  *  *   GeSHi is free software; you can redistribute it and/or modify  *   it under the terms of the GNU General Public License as published by  *   the Free Software Foundation; either version 2 of the License, or  *   (at your option) any later version.  *  *   GeSHi is distributed in the hope that it will be useful,  *   but WITHOUT ANY WARRANTY; without even the implied warranty of  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  *   GNU General Public License for more details.  *  *   You should have received a copy of the GNU General Public License  *   along with GeSHi; if not, write to the Free Software  *   Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA  *  ************************************************************************************/ $language_data = array (     'LANG_NAME' => 'efilatex', // quick, dirty & novice approach to highlight LaTeX     'COMMENT_SINGLE' => array(1 => '%'),     'COMMENT_MULTI' => array(),     'CASE_KEYWORDS' => GESHI_CAPS_NO_CHANGE,     'QUOTEMARKS' => array('', ""),     'ESCAPE_CHAR' => '',     'KEYWORDS' => array(         1 => array(             '\\'       ),         2 => array(             'cm'             ),         3 => array(             'begin', 'end'             ),         4 => array(             'test4'             ),         ),     'SYMBOLS' => array(         '.', ',','\\',"~", "{", "}", "[", "]", "$"         ),     'CASE_SENSITIVE' => array(         GESHI_COMMENTS => true,         1 => false,         2 => false,         3 => false,         4 => false,         ),     'STYLES' => array(         'KEYWORDS' => array(             1 => 'color: #b1b100; font-weight: bold;',             2 => 'color: #000000; font-weight: bold;',             3 => 'color: #000066; font-weight: normal;',             4 => 'color: #993333; font-weight: normal;'             ),         'COMMENTS' => array(             1 => 'color: #808080; font-style: italic;',             2 => 'color: #339933; font-weight: normal;',             'MULTI' => 'color: #808080; font-style: italic;'             ),         'ESCAPE_CHAR' => array(             0 => 'color: #000099; font-weight: bold;'             ),         'BRACKETS' => array(             0 => 'color: #FF7766; font-weight: normal;'             ),         'STRINGS' => array(             0 => 'color: #ff0000; font-weight: normal;'             ),         'NUMBERS' => array(             0 => 'color: #cc66cc; font-weight: normal;'             ),         'METHODS' => array(             1 => 'color: #202020; font-weight: normal;',             2 => 'color: #202020; font-weight: normal;'             ),         'SYMBOLS' => array(             0 => 'color: #66ccFF; font-weight: normal;'             ),         'REGEXPS' => array(           0 => 'color: #209090; font-weight: bold;',           1 => 'color: #202020; font-weight: bold;',             2 => 'color: #608020; font-weight: bold;',             3 => 'color: #F02020; font-weight: bold;',             4 => 'color: #CCF020; font-weight: bold;',             5 => 'color: #C000CC; font-weight: bold;'       ),         'SCRIPT' => array(             )         ),     'URLS' => array(         ),     'OOLANG' => false,     'OBJECT_SPLITTERS' => array(         ),     'REGEXPS' => array( 0 => array(             GESHI_SEARCH => "(\\\\\\\\|~|&|\\\\\\_|\\\\&|\\$|\|)",             GESHI_REPLACE => '\\1',             GESHI_MODIFIERS => '',             GESHI_BEFORE => '',             GESHI_AFTER => ''             ),     // \keywords 1 => array(             GESHI_SEARCH => "(\\\\)([a-zA-Z]+)",             GESHI_REPLACE => '\\1\\2',             GESHI_MODIFIERS => '',             GESHI_BEFORE => '',             GESHI_AFTER => ''             ),     // {parameters} 2 => array(             GESHI_SEARCH => "(\\{)(.+)(\\})",             GESHI_REPLACE => '\\2',             GESHI_MODIFIERS => '',             GESHI_BEFORE => '\\1',             GESHI_AFTER => '\\3'             ), 3 => array(             GESHI_SEARCH => "(\\[)(.+)(\\])",             GESHI_REPLACE => '\\2',             GESHI_MODIFIERS => '',             GESHI_BEFORE => '\\1',             GESHI_AFTER => '\\3'             ), 4 => array(             GESHI_SEARCH => "(\\$)(.+)(\\$)",             GESHI_REPLACE => '\\2',             GESHI_MODIFIERS => '',             GESHI_BEFORE => '\\1',             GESHI_AFTER => '\\3'             ), 5 => array(             GESHI_SEARCH => "([&])(.+?)([;])",             GESHI_REPLACE => '\\2\\3',             GESHI_MODIFIERS => '',             GESHI_BEFORE => '\\1',             GESHI_AFTER => ''             ),         ),     'STRICT_MODE_APPLIES' => GESHI_NEVER,     'SCRIPT_DELIMITERS' => array(         ),     'HIGHLIGHT_STRICT_BLOCK' => array(         ) ); ?>

Galerie

Picasa Web Albums DeviantART

Kategorien

Artikel-Feeds

RSS-Feed Atom-Feed

Aufrufstatistik

1
26
535292

Werbung

Das Schwarze BRett im Internet: Kostenlose Kleinanzeigen von Studenten für Studenten!

20. Oktober 2017