Транслятор из 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/~/\ /g; $T =~ s/(\\sloppy|\\noindent|\\\w+penalty=?\d+|\\end\{document\}|\\begin\{document\})//g; # $T =~ s/\$\s*\to\s*\$/\→/; $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/</</g; $T =~ s/>/>/g; $T =~ s/\<i\>/<i>/g; $T =~ s/\<\/i\>/<\/i>/g; $T =~ s/\<b\>/<b>/g; $T =~ s/\<\/b\>/<\/b>/g; $T =~ s/\<math\>/<math>/g; $T =~ s/\<\/math\>/<\/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/\…/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; }