\documentclass[12pt,titlepage]{article} \usepackage{amsmath} \usepackage{mathrsfs} \usepackage{amsfonts} \usepackage{amssymb} \usepackage{amsthm} \usepackage{mathtools} \usepackage{graphicx} \usepackage{color} \usepackage{ucs} \usepackage[utf8x]{inputenc} \usepackage{xparse} \usepackage{hyperref} %----Macros---------- % % Unresolved issues: % % \righttoleftarrow % \lefttorightarrow % % \color{} with HTML colorspec % \bgcolor % \array with options (without options, it's equivalent to the matrix environment) % Of the standard HTML named colors, white, black, red, green, blue and yellow % are predefined in the color package. Here are the rest. \definecolor{aqua}{rgb}{0, 1.0, 1.0} \definecolor{fuschia}{rgb}{1.0, 0, 1.0} \definecolor{gray}{rgb}{0.502, 0.502, 0.502} \definecolor{lime}{rgb}{0, 1.0, 0} \definecolor{maroon}{rgb}{0.502, 0, 0} \definecolor{navy}{rgb}{0, 0, 0.502} \definecolor{olive}{rgb}{0.502, 0.502, 0} \definecolor{purple}{rgb}{0.502, 0, 0.502} \definecolor{silver}{rgb}{0.753, 0.753, 0.753} \definecolor{teal}{rgb}{0, 0.502, 0.502} % Because of conflicts, \space and \mathop are converted to % \itexspace and \operatorname during preprocessing. % itex: \space{ht}{dp}{wd} % % Height and baseline depth measurements are in units of tenths of an ex while % the width is measured in tenths of an em. \makeatletter \newdimen\itex@wd% \newdimen\itex@dp% \newdimen\itex@thd% \def\itexspace#1#2#3{\itex@wd=#3em% \itex@wd=0.1\itex@wd% \itex@dp=#2ex% \itex@dp=0.1\itex@dp% \itex@thd=#1ex% \itex@thd=0.1\itex@thd% \advance\itex@thd\the\itex@dp% \makebox[\the\itex@wd]{\rule[-\the\itex@dp]{0cm}{\the\itex@thd}}} \makeatother % \tensor and \multiscript \makeatletter \newif\if@sup \newtoks\@sups \def\append@sup#1{\edef\act{\noexpand\@sups={\the\@sups #1}}\act}% \def\reset@sup{\@supfalse\@sups={}}% \def\mk@scripts#1#2{\if #2/ \if@sup ^{\the\@sups}\fi \else% \ifx #1_ \if@sup ^{\the\@sups}\reset@sup \fi {}_{#2}% \else \append@sup#2 \@suptrue \fi% \expandafter\mk@scripts\fi} \def\tensor#1#2{\reset@sup#1\mk@scripts#2_/} \def\multiscripts#1#2#3{\reset@sup{}\mk@scripts#1_/#2% \reset@sup\mk@scripts#3_/} \makeatother % \slash \makeatletter \newbox\slashbox \setbox\slashbox=\hbox{$/$} \def\itex@pslash#1{\setbox\@tempboxa=\hbox{$#1$} \@tempdima=0.5\wd\slashbox \advance\@tempdima 0.5\wd\@tempboxa \copy\slashbox \kern-\@tempdima \box\@tempboxa} \def\slash{\protect\itex@pslash} \makeatother % math-mode versions of \rlap, etc % from Alexander Perlis, "A complement to \smash, \llap, and lap" % http://math.arizona.edu/~aprl/publications/mathclap/ \def\clap#1{\hbox to 0pt{\hss#1\hss}} \def\mathllap{\mathpalette\mathllapinternal} \def\mathrlap{\mathpalette\mathrlapinternal} \def\mathclap{\mathpalette\mathclapinternal} \def\mathllapinternal#1#2{\llap{$\mathsurround=0pt#1{#2}$}} \def\mathrlapinternal#1#2{\rlap{$\mathsurround=0pt#1{#2}$}} \def\mathclapinternal#1#2{\clap{$\mathsurround=0pt#1{#2}$}} % Renames \sqrt as \oldsqrt and redefine root to result in \sqrt[#1]{#2} \let\oldroot\root \def\root#1#2{\oldroot #1 \of{#2}} \renewcommand{\sqrt}[2][]{\oldroot #1 \of{#2}} % Manually declare the txfonts symbolsC font \DeclareSymbolFont{symbolsC}{U}{txsyc}{m}{n} \SetSymbolFont{symbolsC}{bold}{U}{txsyc}{bx}{n} \DeclareFontSubstitution{U}{txsyc}{m}{n} % Manually declare the stmaryrd font \DeclareSymbolFont{stmry}{U}{stmry}{m}{n} \SetSymbolFont{stmry}{bold}{U}{stmry}{b}{n} % Manually declare the MnSymbolE font \DeclareFontFamily{OMX}{MnSymbolE}{} \DeclareSymbolFont{mnomx}{OMX}{MnSymbolE}{m}{n} \SetSymbolFont{mnomx}{bold}{OMX}{MnSymbolE}{b}{n} \DeclareFontShape{OMX}{MnSymbolE}{m}{n}{ <-6> MnSymbolE5 <6-7> MnSymbolE6 <7-8> MnSymbolE7 <8-9> MnSymbolE8 <9-10> MnSymbolE9 <10-12> MnSymbolE10 <12-> MnSymbolE12}{} % Declare specific arrows from txfonts without loading the full package \makeatletter \def\re@DeclareMathSymbol#1#2#3#4{% \let#1=\undefined \DeclareMathSymbol{#1}{#2}{#3}{#4}} \re@DeclareMathSymbol{\neArrow}{\mathrel}{symbolsC}{116} \re@DeclareMathSymbol{\neArr}{\mathrel}{symbolsC}{116} \re@DeclareMathSymbol{\seArrow}{\mathrel}{symbolsC}{117} \re@DeclareMathSymbol{\seArr}{\mathrel}{symbolsC}{117} \re@DeclareMathSymbol{\nwArrow}{\mathrel}{symbolsC}{118} \re@DeclareMathSymbol{\nwArr}{\mathrel}{symbolsC}{118} \re@DeclareMathSymbol{\swArrow}{\mathrel}{symbolsC}{119} \re@DeclareMathSymbol{\swArr}{\mathrel}{symbolsC}{119} \re@DeclareMathSymbol{\nequiv}{\mathrel}{symbolsC}{46} \re@DeclareMathSymbol{\Perp}{\mathrel}{symbolsC}{121} \re@DeclareMathSymbol{\Vbar}{\mathrel}{symbolsC}{121} \re@DeclareMathSymbol{\sslash}{\mathrel}{stmry}{12} \re@DeclareMathSymbol{\bigsqcap}{\mathop}{stmry}{"64} \re@DeclareMathSymbol{\biginterleave}{\mathop}{stmry}{"6} \re@DeclareMathSymbol{\invamp}{\mathrel}{symbolsC}{77} \re@DeclareMathSymbol{\parr}{\mathrel}{symbolsC}{77} \makeatother % \llangle, \rrangle, \lmoustache and \rmoustache from MnSymbolE \makeatletter \def\Decl@Mn@Delim#1#2#3#4{% \if\relax\noexpand#1% \let#1\undefined \fi \DeclareMathDelimiter{#1}{#2}{#3}{#4}{#3}{#4}} \def\Decl@Mn@Open#1#2#3{\Decl@Mn@Delim{#1}{\mathopen}{#2}{#3}} \def\Decl@Mn@Close#1#2#3{\Decl@Mn@Delim{#1}{\mathclose}{#2}{#3}} \Decl@Mn@Open{\llangle}{mnomx}{'164} \Decl@Mn@Close{\rrangle}{mnomx}{'171} \Decl@Mn@Open{\lmoustache}{mnomx}{'245} \Decl@Mn@Close{\rmoustache}{mnomx}{'244} \makeatother % Widecheck \makeatletter \DeclareRobustCommand\widecheck[1]{{\mathpalette\@widecheck{#1}}} \def\@widecheck#1#2{% \setbox\z@\hbox{\m@th$#1#2$}% \setbox\tw@\hbox{\m@th$#1% \widehat{% \vrule\@width\z@\@height\ht\z@ \vrule\@height\z@\@width\wd\z@}$}% \dp\tw@-\ht\z@ \@tempdima\ht\z@ \advance\@tempdima2\ht\tw@ \divide\@tempdima\thr@@ \setbox\tw@\hbox{% \raise\@tempdima\hbox{\scalebox{1}[-1]{\lower\@tempdima\box \tw@}}}% {\ooalign{\box\tw@ \cr \box\z@}}} \makeatother % \mathraisebox{voffset}[height][depth]{something} \makeatletter \NewDocumentCommand\mathraisebox{moom}{% \IfNoValueTF{#2}{\def\@temp##1##2{\raisebox{#1}{$\m@th##1##2$}}}{% \IfNoValueTF{#3}{\def\@temp##1##2{\raisebox{#1}[#2]{$\m@th##1##2$}}% }{\def\@temp##1##2{\raisebox{#1}[#2][#3]{$\m@th##1##2$}}}}% \mathpalette\@temp{#4}} \makeatletter % udots (taken from yhmath) \makeatletter \def\udots{\mathinner{\mkern2mu\raise\p@\hbox{.} \mkern2mu\raise4\p@\hbox{.}\mkern1mu \raise7\p@\vbox{\kern7\p@\hbox{.}}\mkern1mu}} \makeatother %% Fix array \newcommand{\itexarray}[1]{\begin{matrix}#1\end{matrix}} %% \itexnum is a noop \newcommand{\itexnum}[1]{#1} %% Renaming existing commands \newcommand{\underoverset}[3]{\underset{#1}{\overset{#2}{#3}}} \newcommand{\widevec}{\overrightarrow} \newcommand{\darr}{\downarrow} \newcommand{\nearr}{\nearrow} \newcommand{\nwarr}{\nwarrow} \newcommand{\searr}{\searrow} \newcommand{\swarr}{\swarrow} \newcommand{\curvearrowbotright}{\curvearrowright} \newcommand{\uparr}{\uparrow} \newcommand{\downuparrow}{\updownarrow} \newcommand{\duparr}{\updownarrow} \newcommand{\updarr}{\updownarrow} \newcommand{\gt}{>} \newcommand{\lt}{<} \newcommand{\map}{\mapsto} \newcommand{\embedsin}{\hookrightarrow} \newcommand{\Alpha}{A} \newcommand{\Beta}{B} \newcommand{\Zeta}{Z} \newcommand{\Eta}{H} \newcommand{\Iota}{I} \newcommand{\Kappa}{K} \newcommand{\Mu}{M} \newcommand{\Nu}{N} \newcommand{\Rho}{P} \newcommand{\Tau}{T} \newcommand{\Upsi}{\Upsilon} \newcommand{\omicron}{o} \newcommand{\lang}{\langle} \newcommand{\rang}{\rangle} \newcommand{\Union}{\bigcup} \newcommand{\Intersection}{\bigcap} \newcommand{\Oplus}{\bigoplus} \newcommand{\Otimes}{\bigotimes} \newcommand{\Wedge}{\bigwedge} \newcommand{\Vee}{\bigvee} \newcommand{\coproduct}{\coprod} \newcommand{\product}{\prod} \newcommand{\closure}{\overline} \newcommand{\integral}{\int} \newcommand{\doubleintegral}{\iint} \newcommand{\tripleintegral}{\iiint} \newcommand{\quadrupleintegral}{\iiiint} \newcommand{\conint}{\oint} \newcommand{\contourintegral}{\oint} \newcommand{\infinity}{\infty} \newcommand{\bottom}{\bot} \newcommand{\minusb}{\boxminus} \newcommand{\plusb}{\boxplus} \newcommand{\timesb}{\boxtimes} \newcommand{\intersection}{\cap} \newcommand{\union}{\cup} \newcommand{\Del}{\nabla} \newcommand{\odash}{\circleddash} \newcommand{\negspace}{\!} \newcommand{\widebar}{\overline} \newcommand{\textsize}{\normalsize} \renewcommand{\scriptsize}{\scriptstyle} \newcommand{\scriptscriptsize}{\scriptscriptstyle} \newcommand{\mathfr}{\mathfrak} \newcommand{\statusline}[2]{#2} \newcommand{\tooltip}[2]{#2} \newcommand{\toggle}[2]{#2} % Theorem Environments \theoremstyle{plain} \newtheorem{theorem}{Theorem} \newtheorem{lemma}{Lemma} \newtheorem{prop}{Proposition} \newtheorem{cor}{Corollary} \newtheorem*{utheorem}{Theorem} \newtheorem*{ulemma}{Lemma} \newtheorem*{uprop}{Proposition} \newtheorem*{ucor}{Corollary} \theoremstyle{definition} \newtheorem{defn}{Definition} \newtheorem{example}{Example} \newtheorem*{udefn}{Definition} \newtheorem*{uexample}{Example} \theoremstyle{remark} \newtheorem{remark}{Remark} \newtheorem{note}{Note} \newtheorem*{uremark}{Remark} \newtheorem*{unote}{Note} %------------------------------------------------------------------- \begin{document} %------------------------------------------------------------------- \section*{Sandbox > SVG} \hypertarget{what_this_page_is_for}{}\subsubsection*{{What this page is for}}\label{what_this_page_is_for} This Sandbox is specifically for mucking about with SVGs. The point is that these pictures can get rather large (particularly if automatically generated - does anyone write their own?). A Sandbox, such as [[Sandbox|this one]] is for trying things out. Usually those are little things, such as getting the correct syntax for something, so if the Sandbox gets really big and takes ages to load and resubmit, it gets difficult to try out lots of little changes. One SVG, such as my original one, can easily swamp the `box. However, as I've found out, getting SVGs to work in Instiki can take a little tweaking so this `box is for that. One shouldn't leave an SVG here for long. I don't think that there's much to be learnt from looking through someone else's SVG code (unlike in the original [[Sandbox]] where it can be useful to scan through and see how something is done). Rather, you should muck about with your SVG, get it right, and then transfer it across to the requisite page. A reasonable rule would be that the author should delete it when they are finished with it, and that the maximum lifespan of a picture here is, say, 1 week. To make this easier to police, please timestamp your SVGs. Obviously as we play with these then we'll learn various strategies. These should be added to the [[FAQ]] or [[HowTo]] pages as appropriate. Maybe we should have a list of SVGs in the n-Lab so that people can find examples of what can be done and how to do it, this could be commented with what has had to be done to get it to work in Instiki. If someone has a particularly nice example, or one they're particularly proud of, but doesn't really fit into an ``honest'' page on the n-Lab then may I suggest they put it on their userpage (I'll probably do that with the ``map of manifolds'' one since it doesn't really fit anywhere else). \hypertarget{original_import_from_the_sandbox}{}\paragraph*{{Original import from the [[Sandbox]]}}\label{original_import_from_the_sandbox} Testing tikzpicture to svg capability. \hypertarget{timestamp_20090508}{}\paragraph*{{Timestamp: 2009-05-08}}\label{timestamp_20090508} (removed; see \href{http://ncatlab.org/nlab/revision/Sandbox+>+SVG/10}{revision 10}) Not bad! Thanks to Jacques, the sphere is fine now. This picture is probably a little too big to leave in the sandbox so I'll remove it soon - just want to show off a little first! For the original, see \href{http://www.math.ntnu.no/~stacey/Seminars/ottawa.html}{Comparative Smootheology at Ottawa}. Been a while since I thought about getting a good graphics engine here in inStiki, but these pictures have got me excited again. Right now I am thinking that the following procedure could work well: \begin{itemize}% \item You draw a picture using your favourite method (TikZ, Inkscape, etc.) \item You export it as an svg file. \item You copy and paste this svg text into the nLab page you are editing. \item Now you click ``Submit'' as usual. \item Here's the trick: the next time someone clicks ``Edit page'' in the nLab, the Instiki software is intelligent and displays the SVG text as a javascript ``expand box''. In other words, there's a little command in the text ``Expand SVG code (+)'' and if you click the (+), it expands all the code out. If you click ``(-)'', the code collapses again. This way we don't get large swathes of SVG code cluttering up the text area. \item Perhaps the software can be more advanced and remember if someone has altered any of the SVG segments of code. If not, it shouldn't be resubmitted when someone clicks ``Submit'', otherwise it will make for slow uploads. \end{itemize} [[Bruce Bartlett]] One method that would solve a lot of that would be to have the SVGs as external files that are then included at the appropriate point. I don't know whether or not that is possible, though. Another thing is that exported files can often contain a lot of ``junk'' (cafeful examination of my picture will reveal that it uses 5 decimal places; perhaps slightly over-accurate). Some way of automatically trimming this down would be helpful. I think it's okay to add another step into your scheme, between the export and copying into Instiki, but it needs to be an easy one, say a script that modifies things a little to be acceptable to Instiki. However, what that needs to do will only become apparent with a little experimentation. [[Andrew Stacey]] Well, you can certainly upload files here in Instiki, and I think that method would be possible. But then we're back to the Fundamental Conundrum: \emph{If we're going to start including files, you might as well export your graphic as a png file and include it the old-fashioned way.} It's the old problem: SVG and MathML have not been built so that one can use them both simultaneously (I think). [[Bruce Bartlett]] Doing a quick \LaTeX\xspace -{\tt \symbol{62}} Inkscape -{\tt \symbol{62}} SVG -{\tt \symbol{62}} nLab test [[Bruce Bartlett]]: \hypertarget{timestamp_20090508_2}{}\paragraph*{{Timestamp: 2009-05-08}}\label{timestamp_20090508_2} (removed; see \href{http://ncatlab.org/nlab/revision/Sandbox+>+SVG/10}{revision 10}) As you can see, the trouble with this method is that Inkscape is exporting the text as spline primitives\ldots{} which takes up way too much space. I guess that just returns to the old problem: you can't mix MathML and SVG. Now I remember (I \emph{knew} there was some kind of nasty problem with this MathML, SVG and Instiki thing\ldots{} and now I remember). [[Bruce Bartlett]] Ok, I'm giving it another go. Now I'm trying Andrew's method --- you do a diagram: (removed; see \href{http://ncatlab.org/nlab/revision/Sandbox+>+SVG/10}{revision 10}) \emph{Mike}: Here is a little diagram produced from the following TikZ code: \begin{verbatim}\begin{tikzpicture}[auto,scale=2] \node (A) at (0,0) {$A^2$}; \node (B) at (2,0) {$\int B$}; \node (C) at (1,1) {$\sum_0^\infty C$}; \draw[->] (A) to node[swap] {$\phi$} (B); \draw[->] (A) to node {$\psi$} (C); \draw[->] (C) to node {$\theta$} (B); \draw[->] (1,0.5) to node {$\mu$} (1,0.3); \end{tikzpicture}\end{verbatim} run through htlatex, and with the {\colorbox[rgb]{1.00,0.93,1.00}{\tt \char60tspan\char62}}s then manually replaced by the appropriate foreignObject tags: (removed; see \href{http://ncatlab.org/nlab/revision/Sandbox+>+SVG/10}{revision 10}) \emph{Bruce} : Hey, this is great Mike! For anyone reading this thread, who wants to contribute, don't forget about the \href{http://www.math.ntnu.no/~stacey/Mathforge/nForum/comments.php?DiscussionID=20&page=1#Comment_95}{nForum} page where we are discussing this stuff. \emph{Toby}: Here's the diagram again, but \emph{without} the SVG code in the edit box, thanks to the magic of inclusions! [[!include Inclusion Sandbox]] (This is included from the new [[Inclusion Sandbox]].) \emph{Bruce}: The files I received from Olivier Binda, which includes a nice comprehensive test suite of how his patch to htlatex (which changes ordinary text in SVG into foreignobject tags) performs, are available here: [[LD\_Svg\_Tests\_files.zip|LD@Svg@Tests\_files:file]] These three diagrams are testing re-use of SVG code. The arrowheads are reused from diagram to diagram. The first picture defines the arrowhead once and then reuses it for each of the arrows. The second picture does not define the arrowhead so must get it from the first picture. The third picture also does not define the arrowhead but refers to the arrowhead from the picture in the [[Inclusion Sandbox]]. As can be seen, it works. One thing to test would be to have different arrowheads here and in the [[Inclusion Sandbox]] but with the same name and see which one gets used (my guess would be the definition closest above where it is used). (removed; see \href{http://ncatlab.org/nlab/revision/Sandbox+>+SVG/12}{revision 12}) Given that inclusions and references seem to work fine, it seems a reasonable idea to have a list of ``standard'' arrowheads. Here's one such, loosely based on the types of arrowhead that the xy package considers as standard. \hypertarget{date_stamp_5th_june_2009}{}\paragraph*{{Date stamp: 5th June 2009}}\label{date_stamp_5th_june_2009} What do people think? Are there others that ought to be considered as ``standard''? Are these okay, or do they need tweaking? Discussion on the \href{http://www.math.ntnu.no/~stacey/Mathforge/nForum/comments.php?DiscussionID=31}{n-Forum}. And just for Toby and Mike: \begin{displaymath} \mathfrak{A} \mathfrak{B} \end{displaymath} \vspace{.5em} \hrule \vspace{.5em} \vspace{.5em} \hrule \vspace{.5em} Here's an SVG from Inkscape: Now here's the same, saved with ``Optimised SVG'': Now here's the same, but with the latest version of the plugin from \href{http://codedread.com/scour}{scour} installed: Finally, here's the same but run through the command-line version of scour: category: meta [[!redirects Sandbox {\tt \symbol{62}} SVG]] [[!redirects SVG Sandbox]] \end{document}