==== WikiTeX ====
=== Introduction ===
This wiki is based on DokuWiki, but modifies the standard syntax in order to
permit the same source files to be used by both the wiki and LaTeX. Our
configuration is documented below; feedback is welcome.
=== Getting Started ===
You will need:
* DokuWiki;
* The monobook template for DokuWiki (probably optional);
* jsMath;
* jsMath image fonts (optional);
* the comment plugin for DokuWiki;
* the include plugin for DokuWiki;
* the imagebox plugin for DokuWiki (optional).
=== Overview ===
We chopped up our LaTeX files into small pieces, roughly one per section, thus
removing most LaTeX formatting commands from these files. We then edited
these files to be compatible with both DokuWiki and LaTeX syntax, double-coding
where necessary (e.g. figures and some cross-references). Finally, we added
separate header files for the wiki (to call jsMath, load macros, etc.) and for
LaTeX (to load packages and macros and define some cross-references). As a
matter of policy, section headings were put in these header files, not in the
actual content files, allowing the same content to be called in multiple ways.
The header files then separately call the main content, using the include
plugin for the wiki, or the \input command in LaTeX.
For details of the necessary syntax for the content files, look
[[wiki:mathsyntax|here]].
A typical wiki header file looks like this:
{{page>..:macros:header}}
==== Topic ====
{{page>..:mathcontent:topic}}
which first loads the global header file, inserts a section title, then loads
the content file. Our global header file looks like this:
((The use of Apache rewriting ($conf['userewrite'] = 1;) together with slashes
($conf['useslash'] = 1;) appears to require the use of an absolute path in the
src argument; this appears to be a DokuWiki bug.))
$\require{HMacros}$
$\require{eqn-number}$
Similarly, a typical LaTeX header file might look like:
%% -*- latex -*-
\if\Book0
\input macros/header
% \usepackage{epsfig} % UNCOMMENT IF USING FIGURES
\setcounter{page}{1} % INSERT PAGE NUMBER HERE
\setcounter{subsection}{1} % INSERT SECTION NUMBER HERE
\addtocounter{subsection}{-1}
\begin{document}
\fi
\section{The Dot Product}
\label{dot}
\input mathcontent/dot.txt
\input macros/footer
where the header file is something like:
%**start of header
% Used as input for notes.tex if \Book=1; else set \Book=0.
%
\expandafter\ifx\csname Book\endcsname\relax\let\Book0\fi
%
\if\Book0
\documentclass[12pt]{article}
% \usepackage{fullpage}
\input macros/Macros
\renewcommand{\thesubsection}{\arabic{subsection}}
\fi
%**end of header
and the footer file similarly checks whether a single section or the entire
book is being processed, and exits accordingly.
=== Installation details ===
The following instructions assume that you have a working DokuWiki
installation, with monobook and the above plugins installed, as well as a
working LaTeX installation.
== jsMath ==
You can install jsMath anywhere, but we chose to put it in .../lib/plugins.
Convert your LaTeX math macros, if any, to jsMath syntax and put them in
.../jsMath/extensions.
== Comment syntax ==
Create new comment sequences starting with % by modifying both the comment
plugin and the parser. First, change the connectTo function in
.../lib/plugins/comment/syntax.php so that it becomes:
function connectTo($mode) {
$this->Lexer->addSpecialPattern("/\*.*?\*/", $mode, 'plugin_comment');
$this->Lexer->addSpecialPattern("%/\*.*?%\*/", $mode, 'plugin_comment');
$this->Lexer->addSpecialPattern("%\*", $mode, 'plugin_comment');
$this->Lexer->addSpecialPattern("//.*?$", $mode, 'plugin_comment');
$this->Lexer->addSpecialPattern("%%.*?$", $mode, 'plugin_comment');
}
(This adds %%%% %% %%%% as an initial comment character and
%%%% %/* %%%%, %%%% %*/ %%%% as begin/end comment characters.)
Then make the following changes to .../inc/parser/parser.php:
Replace
$this->Lexer->addSpecialPattern('\x5C{2}(?=\s)',$mode,'linebreak');
with
$this->Lexer->addSpecialPattern('\x5C{4}(?=\s)',$mode,'linebreak');
Replace
$this->Lexer->addSpecialPattern('\n[ \t]*-{4,}[ \t]*(?=\n)',$mode,'hr');
with
$this->Lexer->
addSpecialPattern('\n[ \t]*-{4,}[ \t]*(?=\n)',$mode,'hr');
$this->Lexer->
addSpecialPattern('\n%\*[ \t]*-{4,}[ \t]*(?=\n)',$mode,'hr');
Replace
'entry'=>'\x27\x27(?=.*\x27\x27)',
'exit'=>'\x27\x27',
with
'entry'=>'\x27\x27\x27\x27(?=.*\x27\x27\x27\x27)',
'exit'=>'\x27\x27\x27\x27',
Replace
$this->Lexer->addEntryPattern('\n {2,}[\-\*]',$mode,'listblock');
$this->Lexer->addEntryPattern('\n\t{1,}[\-\*]',$mode,'listblock');
$this->Lexer->addPattern('\n {2,}[\-\*]','listblock');
$this->Lexer->addPattern('\n\t{1,}[\-\*]','listblock');
with
$this->Lexer->addEntryPattern('\n {2,}[\-\*]',$mode,'listblock');
$this->Lexer->addEntryPattern('\n\t{1,}[\-\*]',$mode,'listblock');
$this->Lexer->addEntryPattern('\n%\* {2,}[\-\*]',$mode,'listblock');
$this->Lexer->addEntryPattern('\n%\*\t{1,}[\-\*]',$mode,'listblock');
$this->Lexer->addPattern('\n {2,}[\-\*]','listblock');
$this->Lexer->addPattern('\n\t{1,}[\-\*]','listblock');
$this->Lexer->addPattern('\n%\* {2,}[\-\*]','listblock');
$this->Lexer->addPattern('\n%\*\t{1,}[\-\*]','listblock');
Replace
$this->Lexer->addEntryPattern('%%(?=.*%%)',$mode,'unformattedalt');
with
$this->Lexer->addEntryPattern('%%%%(?=.*%%%%)',$mode,'unformattedalt');
Replace
$this->Lexer->addExitPattern('%%','unformattedalt');
with
$this->Lexer->addExitPattern('%%%%','unformattedalt');
Replace
$this->Lexer->addEntryPattern('\n (?![\*\-])',$mode,'preformatted');
$this->Lexer->addEntryPattern('\n\t(?![\*\-])',$mode,'preformatted');
with
$this->Lexer->addEntryPattern('\n %',$mode,'preformatted');
$this->Lexer->
addEntryPattern('\n (?![&=\$\*\-])',$mode,'preformatted');
$this->Lexer->
addEntryPattern('\n\t(?![&=\$\*\-])',$mode,'preformatted');
and in the next block replace
$this->Lexer->addPattern('\n ','preformatted');
$this->Lexer->addPattern('\n\t','preformatted');
with
$this->Lexer->addPattern('\n %','preformatted');
$this->Lexer->addPattern('\n ','preformatted');
$this->Lexer->addPattern('\n\t','preformatted');
== LaTeX syntax ==
Teach DokuWiki to parse LaTeX character commands by putting them in the file
.../conf/entities.local.conf, which you may need to create. Ours currently
looks like this:
`` “
'' ”
~
\'e é
\`e è
\"o ö
\begin{itemize}\item -
\begin{enumerate}\item
-
\end{itemize}
\end{enumerate}
\item
Teach DokuWiki to process font commands such as \textit and \textbf by
creating a file .../lib/plugins/latex/syntax.php (you can replace "latex" with
any other name), and inserting the following code:
*/
// must be run within Dokuwiki
if(!defined('DOKU_INC')) die();
if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/');
require_once(DOKU_PLUGIN.'syntax.php');
/**
* All DokuWiki plugins to extend the parser/rendering mechanism
* need to inherit from this class
*/
class syntax_plugin_latex extends DokuWiki_Syntax_Plugin {
/**
* return some info
*/
function getInfo(){
return array(
'author' => 'Tevian Dray',
'email' => 'tevian@math.oregonstate.edu',
'date' => '2009-09-15',
'name' => 'LaTeX Plugin',
'desc' => 'allows parsing of some LaTeX commands',
'url' => 'none',
);
}
function getType(){ return 'substition'; }
function getSort(){ return 500; }
function connectTo($mode) {
$this->Lexer->addEntryPattern('\\\\textit{',$mode,'emphasis');
$this->Lexer->addEntryPattern('{\\\\itshape',$mode,'emphasis');
$this->Lexer->addEntryPattern('\\\\textbf{',$mode,'strong');
$this->Lexer->addEntryPattern('{\\\\bfseries',$mode,'strong');
}
function postConnect() {
$this->Lexer->addExitPattern('}','emphasis');
$this->Lexer->addExitPattern('}','strong');
}
function handle($match, $state, $pos, &$handler){ return ''; }
function render($mode, &$renderer, $data) { return true; }
}
That's it; you're done!
----
//Tevian Dray, 29 September 2009 (revised 18 October 2009; footnote added 14
July 2011)//