\ProvidesPackage{wiki}[2008/07/02 v0.2 LaTeX through Wiki markup] %% <- vorige Aenderungen gg. 2008/06/25 verworfen %% %% == Legal == %% (C) 2008 Uwe Lueck http://contact-ednotes.sty.de.vu %% License: http://www.latex-project.org/lppl/ %% -- AUTHOR-MAINTAINED, NO WARRANTY! %% %% == Features == %% %% The `wiki' package enables LaTeX users to use some of the %% markup used in editing Wikipedia pages, cf. %% %% http://en.wikipedia.org/wiki/Wikipedia:Cheatsheet %% %% or German: %% %% http://de.wikipedia.org/wiki/Hilfe:Bearbeitungshilfe %% http://de.wikipedia.org/wiki/Hilfe:Textgestaltung %% %% Advantages of such a kind of markup are: %% %% 1. easier and faster to type than LaTeX code; %% %% 2. intuitive, understandable at a glance; %% %% 3. in reading the source code of the document, %% the markup doesn't much distract from the ''text'' %% to be printed. %% %% There is a binary `easylatex' available on CTAN which is more %% powerful than the `wiki' package; the idea here is that a ''macro %% package'' doing something similar is easier to use and to customize. %% %% %% === What the Package Supports === %% %% 1. ''Italics'' are marked up by surrounding pairs of apostrophes, %% '''boldface''' needs one apostrophe more on each side. %% Boldface and italics may be nested or overlap. %% (This endangers quoting, but I have dealt with it.) %% %% 2. Surrounding ``equals'' symbols (`=') mark up section headings %% etc.: `== Section ==', `=== Subsection ===', down to %% `===== Subparagraph ====='. %% %% 3. If a line starts with `*', it becomes an item in an %% `itemize' environment. Likewise, `#' creates an `enumerate' %% environment, and `;' makes an item in a `discription' %% environment (differs from Wiki! -- since I don't understand %% what the Wiki version is good for). `:' makes a `quote' -- %% while on Wikipedia instead is used for comments on talk %% pages. But it is also used for indented math displays, %% so it may be combined with $...$ here. %% An indented line is typeset ''verbatim''. Each of these %% environments is ended by a code line without leading blank %% spaces. %% %% %% === Limitations === %% %% 1. The markup ``language'' provided here replaces a few most %% common LaTeX commands only in their most simple versions. %% (Yet I think that already this makes the code more readable; %% the more special cases are very rare.) E.g., it's not %% possible to suppress the italic correction as with %% `\textit{...\nocorr}'. However, in ``normal'' cases it %% should be possible to use the more powerful LaTeX markup %% mixed with ``Wiki'' markup. %% %% 2. The parsing algorithms employed here differ in outcome to %% those of Wikipedia in difficult cases. %% %% 3. Tables, nesting lists, links, Wiki templates and tags %% are not supported -- and I don't expect that I can afford %% improving this soon! %% %% 4. I still have encountered problems that I didn't understand ... %% %% == Package Options and User Commands == %% %% \usepackage[]{wiki}, of course. There are %% `noEnvironments', `noFonts', `noHeadings' giving up %% functionality for lists etc., for italics and boldface, %% for section headings etc., respectively. %% %% There are commands \wikimarkup, \wikiEnvironments, %% \wikiFonts, \wikiHeadings to turn respective functionality on %% (unless disabled by package option). \nowikimarkup, %% \nowikiEnvironments, \nowikiFonts, \nowikiHeadings turn them %% off. %% %% '''Vital:''' The package does ''not'' execute \wikimarkup %% because this would have strange effects, e.g., packages %% loaded later may break. The user must put activating %% commands into the `document' environment, maybe just preceding %% the first heading. %% %% Dangers to be avoided by \nowiki... are: %% * \wikiHeadings (which also is executed by \wikimarkup) %% disables TeX assignments using `='. %% * \wikiEnvironments (executed by \wikimarkup) executes macros %% at every end of a code line (containing no comment marke), %% and it tries to typeset a following line verbatim if it is %% indented. %% %% %% == Implementation and Further Remarks == %% === Commands for Category Codes === % \RequirePackage{fdcodes} %% <- TODO -- or do away ... -> \providecommand*\AssignCatCode[2]{\catcode`#1=#2\relax} \providecommand*\MakeActive[1]{\catcode`#1=\active} % \providecommand*\MakeLetter[1]{\catcode`#1=11\relax} %% <- Declaring characters usable in command strings %% Todo: print arrow indicators like ``->'' as real arrows \providecommand*\MakeOther [1]{\catcode`#1=12\relax} \AssignCatCode{\_}{11} % \MakeLetter\_ %% own macros somewhat LaTeX3-style %% Todo \newcommand <-> \def !? %% === Package Options === \DeclareOption{noFonts} {\let\wikiFonts \empty \let\nowikiFonts \relax} \DeclareOption{noHeadings} {\let\wikiHeadings \empty \let\nowikiHeadings \relax} \DeclareOption{noEnvironments}{\let\wikiEnvironments \empty \let\nowikiEnvironments\relax} \DeclareOption{noVerbatim}{% \def\W_active_return{ \futurelet\@let@token\W_on_firsttoken}} %% \[no]wikiVerbatim must wait, too complex 2008/07/01 \ProcessOptions %% === Auxiliaries for both Fonts and Headings === \@tempswafalse \ifx\wikiFonts \empty \else \@tempswatrue \fi \ifx\wikiHeadings\empty \else \@tempswatrue \fi \if@tempswa \def\W_start_samecnt{\futurelet\@let@token\W_process_samecnt} \def\W_init_samecnt#1#2#3{% \let\W_samesymb =#1%% repeated symbol \def\W_repllist {#2}% replacing strings \def\W_incase_all{#3}% final replacement \def\W_next##1{\W_start_samecnt}} \def\W_process_samecnt{% \expandafter \W_splitlist \W_repllist \@nil \W_next} \def\W_splitlist#1#2\@nil{% \def\W_repllist{#2}% \ifx\@let@token\W_samesymb \ifx\W_repllist\empty \def\W_next##1{\W_incase_all}\fi \else \def\W_next{#1}% \fi} \fi %% === Italics and Boldface === %% ==== Code ==== \ifx\wikiFonts\empty \else \def\W_toggle#1#2#3{\def#1{\W_toggle#1{#3}{#2}}#2} %% Cf. LaTeX's `\DeclareTextFontCommand': \def\W_bf_toggle{% \W_toggle\W_bf_toggle{\bfseries\W_maybe@ic}{\mdseries\W_maybe@ic}} \def\W_maybe@ic{\futurelet\@let@token\W_maybe_maybe@ic} \def\W_maybe_maybe@ic{% \ifx\@let@token\W_rq_robust \else \expandafter \maybe@ic \fi} \def\W_it_toggle{% \W_toggle\W_it_toggle{\itshape\maybe@ic}{\upshape\maybe@ic}} %% <- Doesn't support \nocorr. \def\W_rq_robust{%% will become meaning of single right quote. \ifx\protect\@typeset@protect \ifmmode \rq \else \W_init_samecnt{\W_rq_robust}% {\rq\W_it_toggle}% {\W_bf_toggle}% \expandafter\expandafter\expandafter \W_start_samecnt \fi \else \rq \fi} %% Remark: %% LaTeX's \rq expands to ``other'' apostrophe: \CheckCommand*\rq{'} %% Must be before `\catcode`\' %% \wikiFonts -- restoring `...' and ``...'' -- + \nowikiFonts: %% requiring single left quote \active as well: \CheckCommand*{\lq}{`} \MakeActive\`\MakeActive\' \def\wikiFonts{% \MakeActive\`\MakeActive\'% \def`##1'{\lq ##1\rq}% \let'\W_rq_robust} \def\nowikiFonts{\MakeOther`\MakeOther\'} \MakeOther\` \MakeOther\' \fi %% ==== Remarks ==== %% Wiki: a''b'''cd typesets `b' in italic with an apostrophe, %% a''b'''c'''d typsets all after `a' in italic with bold `b'. %% One might use make a difference depending on \lastskip. %% Wikimedia seems to read more ahead, maybe entire paragraphs. %% %% <- Todo: try here!? (Test!) %% %% Todo: Variants using \textit and \textbf (option, switching %% command) %% %% german.sty's "` and "' are not affected. %% %% Merit: ``...'' resembles ''...''; indeed Wikipedia Guidelines %% demand to think which of both is appropriate in a %% certain situation. %% A test about \ifx with active characters: %\catcode`\`=\active \let`\rq \let'\rq %\ifx`'\typeout{OHHH}\else \typeout{OCH}\fi %% OHHH %% <- how typeset code commented out!? (^!? diff. comment char.!?) %% indent %! TODO or no space after %!! TODO!! %% xEDIT: dann Alt C/D fuer Kommentar/Dok./auskomm. (!?) !! %% === Section Headings === \ifx\wikiHeadings\empty \else \providecommand*{\normalequals}{=} \MakeActive\= \def\wikiHeadings{\MakeActive\=\let=\W_eq_robust} \def\nowikiHeadings{\MakeOther\=} \def\W_eq_robust{% \ifx\protect\@typeset@protect %% in case without math mode in heading \ifmmode \normalequals \else \W_init_samecnt{\W_eq_robust}% {\normalequals\W_sec\W_subsec\W_subsubsec \W_para\W_subpara}% {\W_bf_toggle}% \expandafter\expandafter\expandafter \W_start_samecnt \fi \else \normalequals \fi} \def\W_sec #1=={\section{#1}} \def\W_subsec #1==={\subsection{#1}} \def\W_subsubsec #1===={\subsubsection{#1}} \def\W_para #1====={\paragraph{#1}} \def\W_subpara #1======{\subparagraph{#1}} \MakeOther\= \fi %% Todo: think of reimplementation by the start-line %% mechanism which is going to be used for lists. %% === Environments === %% \ifx\wikiEnvironments\empty \else %% ==== Prepare Dealing with Indents ==== \MakeActive{\^^M}% \def\wikiEnvironments{\MakeActive{\^^M}\let^^M\W_active_return}% \def\nowikiEnvironments{\AssignCatCode{\^^M}{5}}% \nowikiEnvironments%% TeX restored \MakeActive{\ }% \@ifundefined{W_active_return}{% \expandafter\def\expandafter\W_active_return\expandafter{% \space\catcode`\ \active\let \W_indent% %% <- \W_indent will start verbatim \futurelet\@let@token\W_on_firsttoken}% }{}%% end of \@ifundefined which is true without noVerbatim %% Much doubling for saving time (!??): \expandafter\def\expandafter\W_list_activereturn\expandafter{% \space\catcode`\ \active\let \W_restore_space% %% <- \W_indent will start verbatim \futurelet\@let@token\W_maybe_newitem}% % \def\W_restore_space{\catcode`\ 10\relax}% %% <- was vital for a math display in a list -> \def\W_restore_space{\catcode`\ 10\ignorespaces}% \W_restore_space%% TeX blank space restored %% ==== Start and End List-Like Environments ==== %% \W_on_firsttoken may be edited (preamble or .cfg): \def\W_on_firsttoken{% % \show\@let@token \W_restore_space \let\W_next\relax %% must be before \W_skip... works \ifx\@let@token\W_active_return \expandafter \W_par \fi %% <- found by guessing/with \show\@let@token \let\W_item\item \W_on_startenv{*}{itemize}% \W_on_startenv{\W_hash}{enumerate}% \W_on_startenv{;}{description}% \let\W_item\relax %% must precede `quote' \W_on_startenv{:}{quote}%% instead of quotation 2008/07/01 \W_next} \let\W_hash=# \def\W_par#1\W_next{\par} \def\W_skiprest_item#1\W_next#2{\W_item} \MakeActive{\^^M}% \def\W_on_startenv#1#2{% \ifx#1\@let@token% \begin{#2}% \let\W_itemsymbol#1% \let^^M\W_list_activereturn% \expandafter \W_skiprest_item% \fi}% \nowikiEnvironments% \def\W_maybe_newitem{% \W_restore_space \ifx\@let@token\W_itemsymbol \expandafter \W_gobbling_item \else \ifx\@let@token\W_restore_space \else \ifx\@let@token\W_list_activereturn \par \else \edef\W_next{\noexpand\end{\@currenvir}}% \W_next \fi \fi \fi} \def\W_gobbling_item#1{\item} %% ==== Verbatim Environment ==== \def\W_indent{\begin{W_verbatim}} \def\W_verbatim{% \let\obeylines\W_obeylines \@verbatim \frenchspacing\@vobeyspaces} \let\endW_verbatim\endverbatim \MakeActive{\^^M} \def\W_obeylines{% \catcode`\^^M\active% \def^^M{\par\futurelet\@let@token\W_check_verbcont}}% \nowikiEnvironments% \def\W_check_verbcont{% \ifx\@let@token\@xobeysp \expandafter \@gobble %% gobble one space \else \def\W_next{\end{W_verbatim}}% \expandafter \W_next \fi} %% TODO: enable user to switch between environment ``encodings'' %% or to disable some of them (edit \W_on_firsttoken) \fi %% from \ifx\wikiEnvironments \else %% === Turning Wiki Markup On and Off === \def\wikimarkup{\wikiFonts\wikiHeadings\wikiEnvironments} \def\nowikimarkup{% \MakeOther\`\MakeOther\'\MakeOther\=\AssignCatCode{\^^M}{5}} % \wikimarkup %% strange effects here, to be put into document \AssignCatCode\_{8} \endinput %% todo: tables, links, templates, (pseudo-)html-tags ... %% TODO: credits: easylatex etc. %% TODO: useful for: ... intuitive markup, ``poor man's WYSIWYG'', %% ASCII-WYSIWYG. %% Todo: improve Wiki markup: ``tab'' indents instead of `:' %% as in testing for end of list: after finding one %% leading space, test for another.