This page gives hints for how to edit nLab-pages.

An easy introduction for elementary basics is

The following provides more details. For technical help with special features of Instiki (including peculiarities with itex), HTML and XML, and assorted specifics of the nLab, see also the FAQ.



Software required to use the nnLab

The nnLab displays mathematical symbols using MathML. Displaying MathML requires support from your web browser. The browser with the best support for MathML is Firefox, especially if you install the STIX fonts. Firefox is a great browser in many other ways too, so if you aren’t using it, why not give it a try?

Recent versions of Opera also apparently support MathML, but as a blog post on Jacques Distler’s Musings points out, this may not work properly. For InternetExplorer, one needs to install the MathPlayer plugin. Download is quick and easy and free, but installation may require Administrator privileges on your computer. Other browsers such as Safari and Chrome seemingly do not support MathML at present.

How to search the nLab & nForum from firefox

(Firefox - and clones - specific)

Here are some search plugins for firefox that will let you search the nLab from the firefox search bar. EDIT: These are old and may not work with recent versions of Firefox. Instead you can use the search engine creator plugin. Someone should update these files to conform to OpenSearch; then they might work with other browsers too.

It would be nice if these had different icons. To use one or more of these, drop them in the ‘searchplugins’ directory of your firefox profile.

Alternatively, you can try the add to search bar add-on for Firefox. This will let you right-click in the search box on any page and add it to your search bar. (You can’t duplicate the “goto” and “edit” plugins this way, though.)

How to edit nLab pages in your favorite text editor

(Firefox - and clones - specific)

One way to do this is to install this firefox extension or another one like it.

If your favorite editor is Emacs with AucTeX, you may find the following snippet useful to put in your .emacs file:

(add-to-list 'auto-mode-alist '("/\\(www.\\)?" . latex-mode))
(add-to-list 'auto-mode-alist '("/" . latex-mode))
(defun nlab-latex-fixes ()
  (when (or (string-match "/\\(www.\\)?" buffer-file-name)
            (string-match "/" buffer-file-name))
  (longlines-mode t)
  (set (make-local-variable 'TeX-open-quote) "\"")
  (set (make-local-variable 'TeX-close-quote) "\"")))
(add-hook 'LaTeX-mode-hook 'nlab-latex-fixes)

This will tell Emacs to automatically edit nLab pages (and nCafe comments as well, for good measure) in LaTeX mode, with long lines wrapped using soft returns, and ordinary double-quotes rather than LaTeX ones.

How to print a page from the nLab

If you just print it directly, the logo will become a huge blob that takes up the entire first page. I know, we can and should fix this, but we haven't. So for now, use the ‘Print’ link at the bottom of the page. As a shortcut in most browsers on most operating systems, hit Alt-Shift-P while the focus is in the page to go to the printable page.

How to customize the nLab

(Firefox - and clones - specific)

You may wish to customize the font scheme (both for math or text) on the nLab, as well as tweak things such as the small edit box for comments. Try using the Stylish add-on if you are using Firefox; Stylish is a plug-in for firefox enabling you to customize websites; it is available here.

Currently, the following stylish themes are available:

  • nLab Stylish theme by Bruce Bartlett. This nLab theme changes the fonts on the nLab to a serif-style, and makes the edit box much bigger for an overall more pleasant experience!
  • nLab – nCafe style by Daniel Schäppi?. This is based on Bruce Bartlett’s theme but changes the overall colour scheme somewhat to something a little more like the n-Cafe.

How to Download a Local Copy of the n-Lab

The inbuilt export features of the n-Lab have been switched off. However, it is still possible to get a local version of the n-Lab. This is a static version in that you cannot edit pages, but is complete and all the links correctly point to the pages on the local version.

The following command line magic depends on the list of all pages which no longer works. Is there any other way to download a copy of the nLab?

Andrew: The “all pages” is currently reenabled, but there are alternative methods depending on exactly what you want to do with the copy. Best route would be to join us in the nForum and discuss it so that we can come up with the best method.

(For housekeeping, I’ll delete this query box in a few days.)

One way to do this on a Unix-based system (Linux, MacOSX, BSD), is to use the wget command. The command is:

wget --output-document=- \
 | perl -lne '/<div id="allPages"/ and $print = 1;
              /<div id="wantedPages"/ and exit;
              /href="([^"]*)"/ and $print and print "$1";' \
 | wget -i - -kKEpN

If you are fortunate enough to be using the Z-shell then you can type it exactly as written. Other shells may complain at the line-breaks in the perl code (they should be alright with the backslashed line-breaks). If so, simply type it all as one line.

One huge advantage of this script over the inbuilt export is that if you run it from the same place each time, it will only download modified pages. That saves a lot of bandwidth and time.

The following is an explanation of how it works. The first step is to get a list of all the pages, we do this by downloading the All pages page and extracting a list of the pages (via a perl script). We feed this back into wget as a list of pages to get (using the -i option). For each downloaded page we ensure that we have the required extras to display it correctly (-p option), we convert the links so that they work correctly: links to downloaded files point to downloaded files, links to non-downloaded files point to non-downloaded files (-k option), we use time-stamping to only get new pages (-N), but because we’re doing a little post-processing we need to keep the original files for time-stamping to work correctly (-K). Files are also converted to html extension (-E) since no matter how they were generated, they are now boring html (well, okay, xhtml+mathml+svg) files.

If anyone can post instructions for other operating systems, or other programs (such as curl) then please do so.

Getting Started

How to use a Wiki

Hit “edit page” to see how pages are coded. Use the Sandbox to warm up. They key point is that links to other pages are placed in [[double brackets]].

There is no feature to preview your edits. Instead, submit them and then edit again. Two successive submissions with the same signature and made within 30 minutes of each other count as one in the record, so don't worry about cluttering up the database with multiple submissions in a row.

How to start a new page

You do this in two steps, the first of which may have already been done:

  1. Create a preliminary link (represented by a question mark) by editing a current page and putting the name of the new page in double square brackets. (You can do this in the Sandbox if there is no better place, but probably you want to do this in context on a relevant page that should link to your new page.)

  2. Clicking on the question mark to begin editing the new page. (It will not actually be created until you hit Submit.)

Watch out: the name of a page is case sensitive, so make your link lowercase if it comes at the beginning of a sentence. ([[like this|Like this]].) We loosely agreed to try to follow that and some other naming conventions; see below.

However, this is less of an issue now that we have redirects.


When you edit a page, you can (and should) put your name (with normal capitalisation and spacing) in the box after ‘Submit as’. If you don't, then your contribution will be credited to the AnonymousCoward.

Once you edit a page for the first time, your name will appear at the bottom, grayed out with a question mark since there is no page with your name yet. You may take this as an invitation to create a user page and tell us about yourself. But if you don’t want to or don’t have the time right now, you can forget about this. If you just want to show up on category: people, then you make a page containing only ‘category: people’ (or someone else may do this for you).

To create your user page, simply click the question mark that appears next to your name at the bottom of the page after making a modification and add content to the edit box that appears. If you’d like to make a user page prior to modifying an existing page, you can do so by making some trivial modification to the Sandbox, which will put your name at the bottom of the page where you can click the question mark. (Or hack the URL.)

Naming conventions

The following naming conventions for new entries are not set in stone, but we're following them for now. Changing page titles results in unnecessary work for the lab elves, so you should try to follow these if possible (or dispute them if not). It is most important to follow these in links to pages that don't yet exist, so that the pages will be created at the correct title (and only once).

  • Page titles should contain only ASCII characters.

    • Examples: [[omega-category]] instead of [[$\omega$-category]] or [[ω-category]].
    • Tricks: To produce ‘ω\omega-category’, try $\omega$-[[omega-category|category]]. To produce ‘ω-category’, try [[omega-category|ω-category]]. (The former has proper math-mode formatting, while the latter has proper link scope.) Unfortunately, $\omega$-category does not work. You can also use redirects to make [[ω-category]] produce ‘ω-category’, but only when the page already exists.
    • Reason: It’s possible to put non-ASCII characters in a name, but not ones generated by iTeX or &…; character entities, so this can be difficult, depending on your browser. To keep things easy, therefore, use only ASCII characters in links.
  • Page titles should be singular nouns.

    • Examples: Use [[category]] instead of [[categories]], [[faithful functor]] instead of [[faithful]], and [[categorification]] instead of [[categorify]] or [[categorified]].
    • Tricks: To produce ‘categories’, try [[category|categories]]. To produce ‘faithful endofunctor’, try [[faithful functor|faithful]] [[endofunctor]]. Again, you can use redirects to make [[categories]] produce ‘categories’, if the page already exists. See also Note on Formatting.
    • Reason: We want only one page on a given concept, regardless of variations in grammar.
  • Page titles should be uncapitalized, except for word words that are always capitalized.

    • Examples: Use [[homotopy theory]] instead of [[Homotopy Theory]], but use [[Lie algebra]].
    • Tricks: To produce ‘Homotopy theory is important!’, try [[homotopy theory|Homotopy theory]] is important!. If you do this a lot, then you can again create a redirect, if the page exists.
    • Reason: We want only one page on a given concept, regardless of variations in grammar.
  • Except as contradicted above, use standard American English spelling conventions.

    • Examples: Use [[center]] instead of [[centre]] and hyphens as shown in the ASCII-only requirement.
    • Tricks: To produce ‘centre’, try [[center|centre]]. Or, again, make a redirect.
    • Reason: Most of this is written by Urs Schreiber, who use American English spelling.
  • Regardless of the above, pages named after specific categories should use the capitalised singular abbreviated form.

    • Examples: Use [[Set]] instead [[Sets]] and [[Cat]] instead of [[Category]].
    • Tricks: Although things like ‘Disc:SetCat\Disc: \Set \to \Cat‘ work best in math mode and even ‘Set\Set’ alone looks most consistent that way (with proper math-mode formatting), you have to make the link ‘Set’ outside of math mode.

How to merge pages

Suppose we have two pages, named ‘A’ and ‘B’, and you decide that they ought to be merged into a single page, say ‘A’. Of course, you need to edit ‘A’ to contain the material from ‘B’ and make a coherent whole, but there are also some technical aspects. We do not want to simply delete ‘B’, since it contains the history of the edits to that page, which might turn out to be useful. However, we do want these two things:

  1. links to ‘B’ ought to send the reader to ‘A’;
  2. the old page ‘B’ should be clearly marked as archive material.

We accomplish (1) with a redirect; we accomplish (2) with a page move?. If you do this too carelessly, then it will not work; in the worst case, links to ‘B’ will still go to the archive page, and that will look to the casual reader like a regular page. So follow these steps:

  1. Edit ‘A’ so that it looks how you want, and add the line ‘[[!redirects B]]’ to the bottom. Submit.
  2. Open ‘B’ for editing.
  3. Click the checkbox ‘Change page name.’, which will bring up a new field ‘New name:’.
  4. In that field, add ‘ > history’ to the end, so that ‘B’ becomes ‘B > history’.
  5. Click in the big edit box, which will automatically add ‘[[!redirects B]]’ to the top.
  6. Change the line ‘[[!redirects B]]’ into ‘&lt; [[B]]’ instead.
  7. Delete everything else (consisting of the material that you already merged into ‘A’).
  8. Submit.

The result is that links to ‘B’ will redirect to ‘A’ (not to ‘B > history’). And if anyone does land on ‘B > history’, all that they will see is ‘< B’ with a link to ‘B’ (properly redirected to ‘A’). But if they're really at ‘B’ on purpose to check the edit history, then that history is there for them.

How to remove a page

To remove a page, look at category: empty and see which number should be used next, then rename the page to empty ### using that number. Replace the content (including the automatically added redirect with category: empty.

(To remove the backlog of empty pages, one should also create pages by reversing this process, although it's easy to forget to do that.)

How to organize and write content

Page organization

We encourage authors to structure pages by sections and subsections as indicated in the

Every page starts out tiny and may not seem to need a structure by subsections. But it will grow and eventually the information it provides may be hard to recognize without some global structure guiding the reader’s attention. After all, the natural evolution of articles makes the nnLab function more like an encyclopedia than a novel. Moreover, even with little material there in the beginning, a structure by subsections helps the collaborative process, as it makes it easer to decide for new authors where to add what.

Definition-, Theorem-, Proof environments

You should include actual mathematics in appropriate environements, as familiar from textbooks and research articles in mathematics.

The syntax for this is given at Instiki theorem environments:

A definition should be enclosed in

 +-- {: .num_defn}
 ###### Definition

  (Definition goes here)


A proposition or theorem should be enclosed in

 +-- {: .num_prop}
 ###### Proposition

  (Proposition goes here)



 +-- {: .num_theorem}
 ###### Theorem

  (Theorem goes here)


and their proof in

 +-- {: .proof}
 ###### Proof

   (Proof goes here.)


A corollary in

 +-- {: .num_cor}
 ###### Corollary

  (Corollary goes here)


and a remark in

 +-- {: .num_remark}
 ###### Remark

  (Remark goes here)


Apart from ensuring that it is clear to the reader at each stage what your text is meaning to accomplish, this will make the software format your text appropriately (for instance propositions and theorems will be set in italics) and automatically add a numbering.

Beware that you do need to use the labels exactly as given above. It needs to be defn, thm, and cor; neither definition nor theorem nor corollary (nor other abbreviations such as def) will be recognized by the software.

A central point of the nnLab is that information is linked. Little value is added to the world when information is added to an nnLab page if it is not interlinked there with other nnLab entries such as to make sure that users who might look for it will actually eventually find it by following some links.

Therefore you should hyperlink the central keywords in what you write, by enclosing them in square brackets. Ideally, each and every keyword would be hyperlinked, certainly when it occurs first. Don’t assume that the reader has the same background as you have. If you explain something by invoking other technical terms, at least provide links to nnLab entries where these other terms are defined.

Analogously, when you create a new page, make sure that it is linked to from at least one relevant other page. An entry on a new kind of manifold deserves to be linked to from a list of “related entries” at manifold, for instance.

Apart from guiding users to your entry this way, notably this will also help search engines to index the nnLab and make your new entry appear listed when people search for something related.

Mathematical conventions

There is really no such thing as a “global convention on the nnLab” for ambiguous meaning of mathematical terms and symbols. Unlike in a text book by a single or a handful of authors, there is just no way that we can even try to enforce global conventions. Typically each author decides on his or her own.

Therefore the general rule is: whatever you write in some entry, try to make sure that you provide enough context that the relevant conventions are clear. If you find yourself using some notation for the first time on a page and are worrying if readers will read it as intended, be sure to add a parenthetical remark (where we use here the convention that…) or similar.

If you feel that you need to refer to a specific convention repeatedly over several nnLab pages, just create another page that states the convention, and then simply point to that page.

One example of this that we have is the implicit infinity-category theory convention-page.

Special Typesetting Features

How to leave comments and questions

First of all, you should probably put comments and questions on the n-Forum. (Some discussions from the very early days may also be found on the General Discussion page and on an entry at the n-Cafe.) Important answers are being migrated to this How To and the FAQ; as this is a Wiki, if you find an answer to your question and feel it should be added to one of those, then do so.

If you still want to make a comment or question on the page itself and have it appear as an aside, then you may edit the page and put your comment or question in a query block as shown in this example:

+-- {: .query}
How do I ask a question?

which produces

How do I ask a question?

Note that a query block should be less permanent than the rest of the page; once your comment is addressed or your question is answered, you can probably remove your query block.

But if you just put up a query block and don't post anything to the Forum, you're not very likely to get a quick answer. Query blocks are really only useful when Forum discussion has been unsatisfactory and some kind of reminder needs to remain on the page. (There are also a lot of query boxes left from before the Forum, but these are being slowly removed or migrated.)

How to make a standout box

If you want to make some text stand out (an important theorem, or slogan), you can do it using a standout box:

+-- {: .standout}
First quantization is a mystery, but second quantization is a functor. 

which produces

First quantization is a mystery, but second quantization is a functor.

How to fiddle with the CSS (i.e. create query boxes, etc.) on your personal ncatlab web

As changes even to personal webs require the system password, to make such changes you need to ask a lab elf with sufficient priveleges to do this for you. The best method of doing this is to post a request at the n-forum.

However, you do not need any password to see the stylesheet tweaks on the various webs, so if you see a feature that you would like on one of the other webs (including the main one), then go to the “Edit Web” link at the bottom of that web's HomePage to view the ‘Stylesheet tweaks >>’.

How to include one page within another

If you have some material at a page called foo that you want to include directly in pages called bar and baz, then type [[!include foo]] in bar and baz. For an example, see how contents is included at the tope of this page. Also see how contents itself has been formatted so that it will appear as a sidebar when included.

Besides such sidebars that appear in many pages, you can also use inclusion to put in something that contains a bunch of ugly code (such as raw SVG, see here) without mucking up the rest of the page. That is, you put your messy code in bar/foo and then put [[!include bar/foo]] in bar. Note that this is for something that, logically, should appear within bar itself, which is why bar appears in the name of the included page.

Note that the included page goes directly in where it is called with no surrounding whitespace. This can mean that formatting rules are broken on the include. For example, if the included file starts and ends with a div tag and is included with no surrounding blank lines then this breaks the rules and will generate an error.

How to include SVG figures

To include an SVG figures within a page, proceed as following:

  1. The nnLab has a built-in SVG editor (see below). Click on the “Create SVG graphic” button to open it. Choose “Save Image” from the SVG-Edit menu when you’re done. This will close the SVG editor and paste the resulting SVG code back into the Editing window.

  2. If you produce the SVG with a standard SVG editor, save it using, if possible, the two options

    1. save as plain SVG
    2. save as optimes SVG
  • You need to include the resulting source code . Uploading the SVG as a file to the nnLab won’t work. So

    1. Go to the page where you want to include the SVG, say titled “SomePage”, and at the point where the figure is to appear insert the code

    +--{: style="text-align:center"} [[!include SomePage > figureN]] =--

    1. Then type > figureN

      into your browser’s address line. The software will ask you to create a page with the title “SomePage > figureN”. Paste the source code of your SVG into this page and hit Submit .

      Go back to SomePage . The SVG figure should now be displayed there.

See for instance the entry comma object for an example.

How to use redirects

See redirects.

Since the mechanism for inserting links uses parentheses to delimit the link, it’s not obvious how to put parentheses actually in the link itself. Since Wikipedia uses them a fair bit, it’s worth knowing how to put them in. The trick is to use the URL codes rather than the actual characters. URL codes are generally used to send “unsafe” characters in URLs (safe characters are a-zA-Z0-9$-_.+!\*'(),). Although parentheses are actually “safe”, due to their special meaning for the markdown filter, to put them in URLs here they need to be treated as “unsafe”. URL codes have the syntax %hex where hex is the index of the character in the ASCII character set represented as a 2-digit hexadecimal. Wikipedia (among other places) has a table of the character set from which one can read off the required hexadecimal. In particular, we see that ( is %28 and ) is %29. Thus

[Monad (category theory)#Monads and adjunctions](

Monad (category theory)#Monads and adjunctions

When you create a section header, you can add an HTML anchor tag to it with the following syntax:

 ## Heading {#anchorname}

Then you can make a link to it, from that page or from another one, with the syntax:

 [a link](/nlab/show/some+page#anchorname)

Of course, you can link to it from outside the nLab by adding at the beginning of the link.

Note that if you skip the first step, it is still possible to create a link to a subsection, since (at least if the page has a table of contents) every section on the page is automatically assigned an HTML anchor by Instiki. However, using such links is not encouraged, since the automatically generated anchor names will change whenever the page is rearranged and go away if a manual anchor name is added, which will cause such links to break.

The same type of syntax enables one to link to a bibliographic reference, first by creating an anchor:

 * Reference {#xyz}

which can then be linked to from within the same page by writing

 [some link](#xyz). 


When you write a numbered definition or proposition or theorem, you can also simultaneously create an anchor by writing:

 +-- {: .num_defn #definitionname}
 ###### Definition

 +-- {: .num_prop #propname}
 ###### Proposition

 +-- {: .num_theorem #theoremname}
 ###### Theorem

And then you can link to it in the same way:

 [see this theorem](/nlab/show/some+page#theoremname)

When you link to a theorem on the same page, however, it’s better to use the syntax:

 see Theorem \ref{theoremname}

(which inserts the number, as well as creates a hyperlink) since that will also work properly when the page is exported to LaTeX.

Equation numbering

To make an equation be automatically numbered use angular brackets instead of dollar signs

   \exp(\pi i) + 1 = 0 

To refer to this numbered equation, add a label

   \exp(\pi i) + 1 = 0 

and then refer to it later in the text by typing

 see equation (eq:SomeEquation) .

Automatic table of contents

Insert the symbols

 * table of contents 
 {: toc}

(including the line break!) at the position where the table of contents is to appear. You may want to label the table of contents by writing

 # Contents #
 * table of contents 
 {: toc}

or (at the top of the page)

 # [page title] #
 * table of contents 
 {: toc}

(which also gives the opportunity to use a more nicely formatted page title if special characters or mathematical formatting are wanted).

The items in the table of contents will be the section headlines marked by

 ## top level headline ##

 ### second level headline ###


Instead of “table of contents” after the asterisk, you can write anything you like: this line will not be displayed but is still required to kick in the CSS that makes this possible.

It is important that the section headings not contain anything that shouldn’t go in the table of contents. Whilst formatting is allowed, wiki-links are not (since then the entry in the table of contents would have a link inside of a link).

How to add a floating table of contents

Many pages include a “floating table of contents” at the top right-hand side with links to other pages on similar topics. The lists of related pages are separate pages with names such as category theory - contents; if you want to create a new one, look at the syntax of existing ones.

To add a floating TOC to a new page, in such a way that it will be automatically collapsed until moused over, use code such as the following at the top of the page:

+-- {: .rightHandSide}
+-- {: .toc .clickDown tabindex="0"}
### Context
#### Category Theory
+-- {: .hide}
[[!include category theory - contents]]

If you want to include multiple contents pages, you can repeat the four lines from the one starting with #### through the first =-- line.

How to draw commutative diagrams and pictures

The itex syntax accepted by the nlab doesn’t understand the syntax of any diagram-drawing package akin to xypic or tikz. (Many of us would love to improve matters; see the forum, and chime in if you have any suggestions.) At present there are basically three ways to make diagrams: hack it together with arrays, include an image file, or include SVG.

  1. Use arrays or matrices. For example,

      (f/g)& \to & A \\
      \downarrow&\underset{\alpha}{\swarr}&\, \downarrow f\\
      B &\underset{g}{\to} & C


    (f/g) A α f B g C \begin{matrix} (f/g)& \to & A \\ \downarrow&\underset{\alpha}{\swarr}&\, \downarrow f\\ B &\underset{g}{\to} & C \end{matrix}

    In many cases, you want to tweak the alignments (say, of vertical arrows), using \mathrlap{} or \mathllap{}:

    B A 1 A σ A t A P(B) A χ σ A P(1) A \begin{matrix} B^{\mathrlap{A}} & \longrightarrow & 1^{\mathrlap{A}} \\ \mathllap{\scriptsize{\sigma^A}}\downarrow & & \downarrow \mathrlap{\scriptsize{t^A}} \\ P(B)^{\mathrlap{A}} & \underset{\chi_\sigma^A}{\longrightarrow} & P(1)^{\mathrlap{A}} \end{matrix}

    is produced by

     B^{\mathrlap{A}} & \longrightarrow & 1^{\mathrlap{A}} \\
     \mathllap{\scriptsize{\sigma^A}}\downarrow & & \downarrow               \mathrlap{\scriptsize{t^\alpha}} \\
     P(B)^{\mathrlap{A}} & \underset{\chi_\sigma^A}{\longrightarrow} & P(1)^{\mathrlap{A}}

    Matrix and array environments also accept certain options. Here is an example using a “\rowlines{solid}” option to hack a sequent derivation (much more nicely than by resorting to \frac commands):

    X×BPAinS X×BAinRel(S) XA×BinRel(S) XP(A×B)inS \array{\arrayopts{\rowlines{solid}} X \times B \to P A\;\;\; in\; \mathbf{S} \\ X \times B \nrightarrow A\;\;\; in\; Rel(\mathbf{S}) \\ X \nrightarrow A \times B\;\;\; in\; Rel(\mathbf{S}) \\ X \to P(A \times B)\;\;\; in \; \mathbf{S} }

    is produced by

    X \times B \to P A\;\;\; in\; \mathbf{S} \\
    X \times B \nrightarrow A\;\;\; in\; Rel(\mathbf{S}) \\
    X \nrightarrow A \times B\;\;\; in\; Rel(\mathbf{S}) \\
    X \to P(A \times B)\;\;\; in \; \mathbf{S}
  2. Include an image file: This is the quick-and-dirty method. To create the image file, either use a program like textogif to create the image from a TeX file locally, or use a web service like codecogs (warning, codecogs xy-support seems to be broken now) or QuickLatex or Then follow the instructions here for putting it on the lab.

  3. Include SVG: See here for the general procedure. This is arguably a “better” method, since unlike an image (and like MathML) SVG can be scaled with the text, and (in theory) edited by other users without recreating the entire diagram. There are various methods for producing SVG. You can use a vector graphics program that produces SVG output (anyone have a good one to suggest?). You can also just copy the SVG from another page and modify it by hand; some pages currently containing SVG diagrams are monoidal category, oriental and comma object. Once you have some SVG, you can modify it by hand to put in the itex math; use the SVG <foreignObject> tag with a $...$ inside it. You need to put markdown="1" on the <foreignObject> tag, or else on a <g> tag containing it.

    Once you have the SVG, you can include it on a page as described here. Since raw SVG is a bit ugly, you may want to put the SVG on a “subpage” by itself (with a name like pagename > imagename) which is included from the main page (see above for the syntax to include other pages).

    You can also use the SVG-editor to create and edit SVGs right here in the lab. For more details see this entry below.

  4. Use the CodeCogs-server to produce xypic-coded diagrams (WARNING: this seems to be broken now, try a similar service such as

    For that, code a diagram in xypic as usual. Then write the code all in one line without any spaces and in addition replace all appearances of the symbol “&” with “%26”.

    Then add the line

     <img src="" />

    in the nnLab page where the diagram should appear. This will make some server somewhere on this planet produce an image displaying the desired diagram.

    For instance

     <img src="\xymatrix{(f/g)\ar[r]\ar[d]%26A\ar[d]^f\ar[dl]^\alpha\\B\ar[r]_g%26C}" />


How to use the SVG editor

There is now a WYSIWYG SVG-editor embedded within Instiki (the software running the nLab). The homepage for this editor is here.

Quick Start

  1. Click “Edit page” on a page in which you wish to insert an SVG diagram.
  2. Click in the edit box where you want the diagram to go.
  3. In the list on the right-hand side above the links to the formatting tips is a button labelled “Create SVG graphic”. Click on this. Note: if you forget to do step 2, you won’t be able to click on this button.
  4. The SVG-editor will now launch in a new window. Create your SVG.
  5. When you are done, select “Save SVG” from the file menu. The SVG code will now appear in the edit box of the page.
  6. To edit an existing SVG, select the text between (and including) the <svg> and </svg> tags (but don’t include any whitespace before or afterwards). The “Create SVG” button changes to “Edit existing SVG graphic”.
<!-- Created with SVG-edit - --> Layer 1 Y × Z Y\, \times\, Z Z Z Y Y X X

Hints and Tips

  1. The editor does not present all options straight away. For example, to get an arrow, you first need to draw a straight line. Then select that straight line (using the selection tool (denoted by an arrow) at the top of the left-hand menu) and a new list of options will appear. One of them is the choice of arrow type.

  2. To get a curved arrow, you use another of the options — the one to turn the line into a ‘path’. After turning the line into a path, double-click on it. This brings up the path options, which include whether the path should be ‘straight’ or ‘curved’. Curved paths are cubic Bézier curves and can also have arrowheads.

  3. You can clone an existing element (an arrow, say), using the rubber-stamp tool.

  4. To get rid of any extraneous whitespace around the picture, go to the “Main Menu” (the funny looking button top left) and select “Document Properties”. There you can set the size of the SVG, including “fit to content”. Only do this once the SVG is finished.

Other Sources of Information

Instiki HowTo

For general information and help with Instiki, see the Instiki wiki.

Here are some useful specifics:

survey of available math typesetting commands

This is worth perusing carefully; for example, iTeX does not provide a command such as \prescript to generate left subscripts. Instead it contains the more general \multiscripts command to typeset subscripts and superscripts both to the left and right of an expression. For instance, the math mode text \multiscripts{_0^2_1}{R}{_i^j_k} produces

Ri j k 0 2 1 \multiscripts{_0^2_1}{R}{_i^j_k}

category: meta

Revised on January 16, 2017 02:03:01 by Mike Shulman (