Extension:PGFTikZ

The PGFTikZ extension generates images from PGF/TikZ input. See pgf project on SourceForge.

Usage

 * Enter PGF/TikZ code between  ...  tags.
 * The first line must be an image link line (see Help:Images) e.g. SampleImage.png . Currently 'Image'/'Media' cannot be used instead of 'File' in the image link line.  Once the image is uploaded, it will be rendered as if only the image link line was passed.
 * Within the  ...  block, the preamble necessary to compile the LateX file should be added between  ...  tags.
 * After the preamble, the PGF/TikZ input can be entered as it would be after the \begin{document} entry of a LaTeX document (note that the \begin{document} and \end{document} markups should not be added in the PGFTikZ block).
 * Example (based on wikipedia:File:Neighbourhood_definition2.svg):



\usepackage{tikz} \usetikzlibrary{arrows} \usetikzlibrary{intersections} \usetikzlibrary{calc}

 \begin{tikzpicture}[scale=.8,every node/.style={minimum size=1cm}] %  \begin{scope}[ yshift=-83,every node/.append style={ yslant=0.5,xslant=-1},yslant=0.5,xslant=-1 ]      \draw[step=4mm, black] (0,0) grid (5,5); \draw[black,thick] (0,0) rectangle (5,5);%borders \fill[green] (2.05,2.05) rectangle (2.35,2.35); % center pixel \fill[green] (1.65,2.05) rectangle (1.95,2.35); %left \fill[green] (2.45,2.05) rectangle (2.75,2.35); %right \fill[green] (2.05,2.45) rectangle (2.35,2.75); %top \fill[green] (2.05,1.95) rectangle (2.35,1.65); %bottom

\end{scope} % % draw annotations %  \draw[-latex,thick,green](-3,-2)node[left]{1 patch} to[out=0,in=200] (-1,-.9); \end{tikzpicture} 
 * DO NOT modify the content of the [[File:SampleImage.png]] wikipage directly. The image is regenerated when a wikipage requires it.
 * Parameters can be added to the tag line :
 *  sets the resolution to 250 dots per inch.
 *  forces an update of the image and its page (should rarely be used).

How it works
The extension works as follows:


 * The filename of the image to upload is extracted from the first line of the block ( [[File:SomeImageFile.png]] ).


 * If an image with the desired filename exists and was generated by this extension, the current input source is compared to the existing file's. If they are identical, no compilation is required and the image is rendered.  If the file exists but differs (or if it does not exist), a new image is uploaded.  Note that if the desired image filename already exists and was not generated by this extension, upload will be cancelled.

\documentclass{article} \def\pgfsysdriver{pgfsys-dvips.def} \usepackage[usenames]{color}
 * The PGF/TikZ code (preamble and body) is extracted from the block, and stored in a temporary LaTeX file similar to the following one:

[... Content of PGFTikZPreamble block...]

\begin{document} \thispagestyle{empty}

[... Main content of PGFTikZ block...]

\end{document}
 * The generated LaTeX file is compiled and an image (with extension passed in the image link) is generated using the following sequence of commands:
 * 1) Ghostsript way: default (and recommended for portability) from v0.3
 * 2) * latex (generates a .dvi file from the input .tex)
 * 3) * dvips (.dvi to .ps)
 * 4) * ghostscript (converts the .ps file to the final image file)
 * 5) Old way: (pre v0.3) using epstool
 * 6) * latex (generates a .dvi file from the input .tex)
 * 7) * dvips (.dvi to .eps)
 * 8) * epstool (to extract a minimal bounding box from the .eps file)
 * 9) * convert (converts the .eps file to the final image file)


 * The compiled image file is uploaded to the wiki, and the source used to generate it is stored in the file description.
 * Note that starting from v0.3, the LaTeX compilation uses the standalone package to produce a minimal page. This can be disabled (reverting to the pre v0.3 behavior) by setting   to   in LocalSettings.php (see the  Configuration parameter section).

Configuration parameters
The following parameters can be set in the LocalSettings.php page after loading the extension (the values given here are the default values):

Programs

 * latex with the PGF/TikZ package.
 * dvips
 * ghostscript if  is set to   (default from v0.3)
 * epstool if  is set to   or if using a pre v0.3 version
 * Enable file uploads (see Manual:Image administration)
 * ImageMagick must be installed and enabled if using the epstool+convert way (see ). The  variable should point to the convert executable.

Troubleshooting

 * You may have to increase the amount of memory available for shell programs by modifying the variable in.


 * If experiencing problems compiling with LaTeX see the Manual:$wgUseTeX and Manual:Enable_TeX pages.

Security
Since the extension internally compiles LaTeX documents from user input, security must be considered before deploying the extension on public wikis.


 * Some of the possible attacks that must be considered when deploying a web-based LaTeX compilation system are described in the TUG article: "A web-based TeX previewer: The ecstasy and the agony" ([]):
 * Execution of the system commands via wfShellExec offers control on resource limits given to the system call using and  variables.
 * The source stored in the LaTeX file can also compromise security. The texmf.cnf file can be used to block access to files from within the generated LaTeX file.  See [] for a discussion on the matter.

Download
Please download the code found below and place it in. Note: stands for the root directory of your MediaWiki installation, the same directory that holds .

Note that the bitbucket links will be closed once the latest version is merged in the mediawiki repository.

version 0.3.0
The latest version (with fixes to work on Windows hosted wikis) (v0.3.0, waiting for mediawiki review) is available at: https://bitbucket.org/thibaultmarin/pgftikz_public/get/v0.3.0.zip

Known problems
This is an early stage, expect rough edges. Known bugs/limitations include:
 * When using preview and save repeatedly, edit conflicts might occur in some cases. The edit conflict redirects to a resolution page where the input PGF/TikZ code is mixed up with the image automatically generated description page.  Cancelling the conflict (maybe even deleting the image) and regenerating the page should fix the problem.
 * If two pages link to the same file with different content, the image will be re-compiled each time either page is displayed.
 * Probably many more, please report them.