Транслятор из LaTeX в wiki

Материал из Викиучебника — открытых книг для открытого мира
Перейти к: навигация, поиск

Если вы знаете какие-нибудь существующие конверторы из TeX/LaTeX в wiki или HTML, поделитесь о них здесь.

Pandoc[править]

http://johnmacfarlane.net/pandoc/

Конвертирует из форматов LaTeX, markdown, reStructuredText, HTML в форматы MediaWiki, markdown, reStructuredText, HTML, LaTeX, ConTeXt, PDF, RTF, DocBook XML, OpenDocument XML, ODT, GNU Texinfo, groff, S5 HTML.

LaTeX2html[править]

На этом сайте есть ссылка на CVS репозиторий, где лежит последняя версия (довольно старая -- 2004 года). Пользоваться можно. По умолчанию формулы превращает в картинки. Но при желании можно написать небольшой скрипт, который заменяет <img alt="исходный код формулы на LaTeX" src="URL картинки"> на <math>исходный код формулы на LaTeX</math>.

Скрипт на Perl[править]

Предлагаю Perl скрипт, приведенный ниже. Буду его со временем дорабатывать. Этот скрипт, безусловно, иногда будет работать неправильно, так как не содержит в себе корректный парсер TeX'а. Он основан на нескольких простых правилах -- заменах на основе регулярных выражений Perl. Он позволяет автоматизировать значительную часть работы, но не 100%. Greck 12:15, 15 августа 2006 (UTC)

  • Установите Perl с сайта http://www.activestate.com (если вы под Windows)
  • Скопируйте текст, приведенный на странице, в файл tex2wiki.pl (копируйте из окна редактирования, так как некоторые моменты парсер wiki-разметки меняет).
  • В командной строчке выполните команду
   perl tex2wiki.pl < input.tex > output.wiki
  #!/usr/bin/perl
  ########################################
  #
  # Transforms file in LaTeX (http://www.tug.org/) notation 
  # to file in Wikimedia notation (http://wikimedia.org)
  #
  #########################################
  #
  use strict;
  local $/='\n';
  my $t;
  my %formules = ();
  my $formula_count = 0;
  my $task_count = 0;
  #
  $t = join ( "", <STDIN>);
  print do_the_job( $t );
    
  #########################################
  #
  sub usage {
  	print <<END_USAGE
  Transworms file in TeX (http://www.tug.org/) notation 
  to file in Wikimedia notation (http://wikimedia.org)
     Usage:
  		./tex2wiki.pl < input_file > output_file
  END_USAGE
  }
  #
  my $nop = "";
  sub do_the_job {
  	my $T = shift;
        my $nobraces = '[^{}]*';
  	my $br1 = "$nobraces(\{$nobraces\})?$nobraces";
  	my $br2 = "$br1(\{$br1\})?$br1";
  	my $br3 = "$br2(\{$br2\})?$br2";
  	my $br4 = "$br3(\{$br3\})?$br3";
  	#
    	$T =~ s/---/—/g; 
  	$T =~ s/--/–/g;
  	$T =~ s/``/«/g; 
  	$T =~ s/''/»/g;
  	$T =~ s/~/\&nbsp;/g;
  	$T =~ s/(\\sloppy|\\noindent|\\\w+penalty=?\d+|\\end\{document\}|\\begin\{document\})//g;
        #
  	$T =~ s/\$\s*\to\s*\$/\&rarr;/;
  	$T =~ s/\$(\d+)\$/$1/;
        #
  	$T =~ s/\$\$([+-\d\.,]+|[a-zA-Z]{1,10})\$\$/\n:<i>$1<\/i>/g; 
  	$T =~ s/\$([+-\d\.,]+|[a-zA-Z]{1,10})\$/<i>$1<\/i>/g; 
        #
  	$T =~ s/\$\$([^\$]+)\$\$/"\n:" . &do_formula($1) . "\n"/ge;
  	$T =~ s/\\begin\{equation\}([^\$]+)\\end\{equation\}/"\n:" . &do_formula($1) . "\n"/ge;
  	$T =~ s/\$([^\$]+)\$/&do_formula($1)/ge;
        #
  	$T =~ s/</&lt;/g;
  	$T =~ s/>/&gt;/g;
  	$T =~ s/\&lt;i\&gt;/<i>/g;
  	$T =~ s/\&lt;\/i\&gt;/<\/i>/g;
  	$T =~ s/\&lt;b\&gt;/<b>/g;
  	$T =~ s/\&lt;\/b\&gt;/<\/b>/g;
  	$T =~ s/\&lt;math\&gt;/<math>/g;
  	$T =~ s/\&lt;\/math\&gt;/<\/math>/g;
        #
  	$T =~ s/\\\%/\%/g;
        #
  	$T =~ s/([^\\])?\\\{/${1}xxxOBRACE/g;
  	$T =~ s/([^\\])?\\\}/${1}xxxCBRACE/g;
        #
  	$T =~ s/(\{\\bf\s*|\\textbf\{)($br4)\}/'''$2'''/g;
  	$T =~ s/(\{\\(it|em|sc)\s*|\\textit\{)($br4)\}/''$3''/g;
  	$T =~ s/(\{\\tt\*|\\texttt\{)($br4)\}/<tt>$2<\/tt>/g;
        #  
  	$T =~ s/\\section{\s*($br4)\s*\}\s*\n?/==$1==\n/g;
  	$T =~ s/\\subsection{\s*($br4)\s*\}\s*\n?/===$1===\n/g;
  	$T =~ s/\\subsubsection{\s*($br4)\s*\}\s*\n?/<b>$1<\/b>\n/g;
        #
    	$T =~ s/\\ldots/\&hellip;/g; 
  	$T =~ s/\\\\s*\n;/<br\/>/g;
        #
  	$T =~ s/\\begin\{center\}/\n\n<div align="center">/g;
  	$T =~ s/\\end\{center\}/<\/div>\n\n/g;
        #
  	$T =~ s/\\begin\{task\}((.|\n)+?)\\end\{task\}/&do_task($1)/ge;
  	$T =~ s/\\begin\{itemize\}((.|\n)+?)\\end\{itemize\}/&do_ilist($1)/ge;
        #
  	$T =~ s/\\begin\{enumerate\}((.|\n)+?)\\end\{enumerate\}/&do_olist($1)/ge;
  	$T =~ s/xxxOBRACE/\{/g;
  	$T =~ s/xxxCBRACE/\}/g;
        #
  	$T =~ s/\\label\{([^\}]*)\}/<b>($1)<\/b>/g;
  	$T =~ s/\\r[e]f\{([^\}]*)\}/<b>($1)<\/b>/g;
        #
  	$T =~ s/\n\s*\n\s*\n+/\n\n/g;
  	$T =~ s/\\footnote\{($br4)\}/&do_note($1)/ge;
  	$T .= &flush_notes();
        #
  	foreach my $k (keys %formules) {
  		$T =~ s/$k/$formules{$k}/;
  	}
  	return $T;
  }
  #
  my @notes = ();
  my $note_count = 0;
  #
  sub do_formula {
  	my $f = shift;
  	my $label;
  	$formula_count++;
  	my $formula_name = "__FORMULA${formula_count}__";
  
  	if($f =~ s/\\label\{([^\}]*)\}//) {
  		$label = $1;
  		$formules{$formula_name} = "<math>$f</math>  <b>($label)</b>";
  	} else {
  		$formules{$formula_name} = "<math>$f</math>";
  	}
  	warn "$formula_name = $f\n";
  	return $formula_name;
  }
  sub do_note {
  	$_ = shift;
  	$note_count++; 
  	$_ =~ s/\n/ /g;
  	my $id = "note$note_count";
  	push @notes, "# {{note|$id}} $_";
  	return "{{ref|$id}}";
  }
  sub do_ilist {
  	$_ = shift;
  	$_ =~ s/\n/ /g;
  	$_ =~ s/\s*\\item\s*/\n* /g;
  	return $_;
  }
  sub do_olist {
  	$_ = shift;
  	$_ =~ s/\n/ /g;
  	$_ =~ s/\s*\\item\s*/\n\# /g;
  	return $_;
  }
  sub do_task {
  	$_ = shift;
  	$task_count++;
  	return "\n\n<div class=\"task\"><b>Задача $task_count.</b>\n\n $_\n\n<b>Конец задачи.</b></div>\n\n";
  }
  sub flush_notes {
  	my $res =  join("\n", @notes);
  	@notes = ();
  	return $res;
  }