X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=src%2Forg%2Fibex%2Futil%2FDoc.java;h=9770a993724c77e377c0a8ec5b433920c5b50d27;hb=ae0cd6164facf843cc136f52e3f78e3843191d61;hp=70ef5279ae74cb7db864a12b683fe53bb09ebd19;hpb=94d57bfab114b397f94e7b2780fbef41fdc6c3bd;p=org.ibex.core.git
diff --git a/src/org/ibex/util/Doc.java b/src/org/ibex/util/Doc.java
index 70ef527..9770a99 100644
--- a/src/org/ibex/util/Doc.java
+++ b/src/org/ibex/util/Doc.java
@@ -2,6 +2,7 @@
// FEATURE:
-- syntax highlighting
// FEATURE:
-- LaTeX moreverb package can help
// FIXME: nest TextNodes within each other for bold+italic
+// FEATURE: property tree
package org.ibex.util;
import java.util.*;
@@ -9,7 +10,8 @@ import java.io.*;
import org.ibex.util.*;
public class Doc extends XML {
-
+
+ public static boolean slides = false;
Root root = null;
int skip = 0;
Vec nodeStack = new Vec();
@@ -20,6 +22,7 @@ public class Doc extends XML {
public Doc() { }
public static void main(String[] s) throws Exception {
+ if (s.length > 0 && "slides".equals(s[0])) slides = true;
Doc d = new Doc();
Reader r = new InputStreamReader(System.in);
int len = 0;
@@ -41,6 +44,14 @@ public class Doc extends XML {
public void startElement(Element e) throws Exn {
if (preStart != -1) return;
+
+ Node target = (Node)nodeStack.lastElement();
+ if (target == null) target = (Node)victim;
+ if (target != null) {
+ if (pending.length() > 0) target.addText(pending);
+ pending = "";
+ }
+
String name = e.getLocalName();
Node newGuy = null;
if (name.equals("ibex-doc")) { newGuy = new Root(e);
@@ -52,11 +63,9 @@ public class Doc extends XML {
} else if (name.equals("pre")) { preStart = getGlobalOffset();
} else if (name.equals("definition")) { newGuy = new Definition(e);
+ } else if (name.equals("math")) { newGuy = new Math(e);
} else if (name.equals("property")) { newGuy = new Property(e);
- } else if (name.equals("b")) { newGuy = new B();
- } else if (name.equals("i")) { newGuy = new I();
- } else if (name.equals("t")) { newGuy = new T();
} else if (name.equals("link")) { newGuy = new Link(e);
} else if (name.equals("image")) { newGuy = new Image(e);
@@ -71,22 +80,33 @@ public class Doc extends XML {
}
}
+ static Object victim = null;
+
public void whitespace(char[] ch, int start, int length) throws Exn, IOException { characters(ch, start, length); }
public void endElement(Element e) throws Exn, IOException {
+
+ Node target = (Node)nodeStack.lastElement();
+ if (target == null) target = (Node)victim;
if (preStart != -1) {
if (!e.getLocalName().equals("pre")) return;
- ((Node)nodeStack.lastElement()).addChild(new PRE(preStart, getGlobalOffset()));
+ target.addChild(new PRE(preStart, getGlobalOffset()));
preStart = -1;
} else if (skip > 0) {
skip--;
return;
} else {
+ if (target != null) {
+ if (pending.length() > 0) target.addText(pending);
+ pending = "";
+ }
+ if (nodeStack.lastElement() instanceof Section) victim = nodeStack.lastElement();
nodeStack.setSize(nodeStack.size() - 1);
}
}
+
public void characters(char[] ch, int start, int length) throws Exn, IOException {
if (preStart != -1) return;
- ((Node)nodeStack.lastElement()).addText(new String(ch, start, length));
+ pending += new String(ch, start, length);
}
abstract class Node {
@@ -96,20 +116,22 @@ public class Doc extends XML {
public abstract void dumpLatex(StringBuffer sb);
final String fixLatex(String s) {
if (s == null) return "";
- s = s.replaceAll("\\$", "\\\\\\$ ");
- s = s.replaceAll("\\\\([^\\$])", "\\$\\\\backslash\\$\\1");
+ s = s.replaceAll("\\\\", "\\$\\\\backslash\\$");
+ s = s.replaceAll("\\$", "\\\\\\$");
+ s = s.replaceAll("\\\\\\$\\\\backslash\\\\\\$", "\\$\\\\backslash\\$");
+ s = s.replaceAll("\\{", "\\\\{");
+ s = s.replaceAll("\\}", "\\\\}");
+ s = s.replaceAll("\\*\\*([^\n]+?)\\*\\*", "{\\\\it{$1}}");
+ s = s.replaceAll("__([^\n]+?)__", "{\\\\textbf{$1}}");
+ s = s.replaceAll("\\[\\[([^\n]+?)\\]\\]", "{\\\\texttt{$1}}");
s = s.replaceAll("LaTeX", "\\\\LaTeX");
s = s.replaceAll("\\%", "\\\\% ");
s = s.replaceAll("#", "\\\\#");
- s = s.replaceAll("\\{", "\\\\{");
- s = s.replaceAll("\\}", "\\\\}");
s = s.replaceAll("\\&", "\\\\&");
s = s.replaceAll("\\~", "\\\\~");
s = s.replaceAll("_", "\\\\_");
- if (!(this instanceof T)) {
- s = s.replaceAll(" \"", " ``");
- s = s.replaceAll("\"", "''");
- }
+ s = s.replaceAll(" \"", " ``");
+ s = s.replaceAll("\"", "''");
return s;
}
}
@@ -126,8 +148,38 @@ public class Doc extends XML {
class Image extends EmptyNode {
public String url;
- public Image(XML.Element e) { url = e.getAttrVal("url"); }
- public void dumpLatex(StringBuffer sb) { sb.append("\\hyperimage{" + url + "}"); }
+ public String caption;
+ public String width;
+ public String align;
+ public Image(XML.Element e) {
+ url = e.getAttrVal("url"); caption = e.getAttrVal("caption"); width = e.getAttrVal("width");
+ align = e.getAttrVal("align");
+ }
+ public void dumpLatex(StringBuffer sb) {
+ if (url.endsWith(".pdf")) {
+ if (width == null) {
+ sb.append("\\begin{figure}[H]\n");
+ sb.append("\\begin{center}\n");
+ sb.append("\\epsfig{file="+url.substring(0, url.length() - 4)+",width=\\textwidth}\n");
+ if (caption != null)
+ sb.append("\\caption{"+fixLatex(caption)+"}\n");
+ sb.append("\\end{center}\n");
+ sb.append("\\end{figure}\n");
+ } else {
+ if ("left".equals(align)) {
+ sb.append("\\begin{wrapfigure}{l}{"+width+"}\n");
+ } else {
+ sb.append("\\begin{wrapfigure}{r}{"+width+"}\n");
+ }
+ sb.append("\\epsfig{file="+url.substring(0, url.length() - 4)+",width="+width+"}%\n");
+ if (caption != null)
+ sb.append("\\caption{"+fixLatex(caption)+"}\n");
+ sb.append("\\end{wrapfigure}\n");
+ }
+ } else {
+ sb.append("\\hyperimage{" + url + "}");
+ }
+ }
}
class Heading extends EmptyNode {
@@ -154,7 +206,7 @@ public class Doc extends XML {
/** Nodes which contain only text; they split themselves if anything else is added */
class TextNode extends Node implements Cloneable {
- protected String mytext = "";
+ public String mytext = "";
private boolean canAcceptMoreText = true;
public void dumpLatex(StringBuffer sb) { sb.append(fixLatex(mytext)); }
public void addChild(Node o) { canAcceptMoreText = false; parent.addChild(o); }
@@ -167,53 +219,47 @@ public class Doc extends XML {
mytext = split[0];
parent.addChild(new ParagraphBreak());
o = "";
- for(int i=1; i 13) {
+ if (name.trim().length() > 13 && name.trim().indexOf(' ') == -1) {
sb.append("\n\n{\\color{CodeBorder}\\hspace{-2cm}\\dotfill\\\\\\color{black}}");
sb.append("\\marginpar{\\raggedleft{\\texttt{\\textbf{\\footnotesize{"+fname+"}}}}\\\\"+type+" }");
sb.append("\\\\");
@@ -282,7 +339,10 @@ public class Doc extends XML {
sb.append(s.substring(s.indexOf(' ')));
}
if (default_ != null) {
- sb.append("\\\\{\\it default: }{\\texttt{" + fixLatex(default_) + "}}\n\n");
+ String fd = fixLatex(default_);
+ fd = fd.replaceAll(" ``", " \"");
+ fd = fd.replaceAll("''", "\"");
+ sb.append("\\\\{\\it default: }{\\texttt{" + fd + "}}\n\n");
} else {
sb.append("\n\n");
}
@@ -303,21 +363,52 @@ public class Doc extends XML {
}
}
+ class Math extends ParagraphNode {
+ String tex = "";
+ public Math(XML.Element e) { tex = e.getAttrVal("tex"); if (tex == null) tex = ""; }
+ public void addText(String s) { tex += s; }
+ public void dumpLatex(StringBuffer sb) { sb.append("\n\n$$\n" + tex.replaceAll("\n", " ") + "\n$$\n\n"); }
+ }
+
class Section extends ParagraphNode {
String name;
- public Section(XML.Element e) { name = e.getAttrVal("title"); }
+ public Section(XML.Element e) {
+ name = e.getAttrVal("title");
+ if (slides) super.addChild(new List());
+ }
+ public void addText(String s) {
+ if (slides) ((List)children.elementAt(0)).addText(s);
+ else super.addText(s);
+ }
+ public void addChild(Node n) {
+ /* if (slides) ((List)children.elementAt(0)).addChild(n);
+ else*/ super.addChild(n);
+ }
public void dumpLatex(StringBuffer sb) {
String secs = "";
String base = "section";
+ int count = 0;
+ String pile = "";
for(Node n = parent; n != null; n = n.parent)
if (n instanceof Section || n instanceof Appendix) {
base = "section";
secs += "sub";
+ for (int i=0; i indentation) {
+ if (spawn == null) spawn = new List();
+ spawn.addText(txt);
+ spawn.addChild(new ParagraphBreak());
+ continue;
+ }
+ if (spawn != null) {
+ spawn.dumpLatex(sb);
+ unusedItem = false;
+ spawn = null;
}
+ if (!unusedItem) { unusedItem = true; sb.append("\n\n\\item\n"); }
+ sb.append(fixLatex(txt));
+ }
+ if (spawn != null) {
+ spawn.dumpLatex(sb);
+ spawn = null;
+ }
+ if (sb.toString().replaceAll("\\[.+\\]", "").trim().length() > 0) {
+ sb0.append("\n\\begin{itemize}\n");
+ sb0.append(sb.toString());
+ sb0.append("\n\\end{itemize}\n");
}
- sb.append("\n\\end{itemize}%\n");
}
}
@@ -373,63 +507,190 @@ public class Doc extends XML {
email = e.getAttrVal("email");
subtitle = e.getAttrVal("subtitle");
}
+ public void addText(String s) {
+ if (victim != null) ((Node)victim).addText(s);
+ }
+ public void addChild(Node n) {
+ if (!(n instanceof Section))
+ ((Section)victim).addChild(n);
+ else
+ super.addChild(n);
+ }
public void dumpLatex(StringBuffer sb) {
- sb.append("\\documentclass{article}\n");
- sb.append("\\def\\ninept{\\def\\baselinestretch{.95}\\let\\normalsize\\small\\normalsize}\n");
- sb.append("\\ninept\n");
- sb.append("\\usepackage{color}\n");
- sb.append("\\definecolor{CodeBorder}{rgb}{0.6,0.6,0.6}\n");
- sb.append("\\definecolor{CodeBackground}{rgb}{0.93,0.93,0.93}\n");
- sb.append("\\usepackage{graphicx}\n");
- sb.append("\\usepackage{courier}\n");
- sb.append("\\usepackage{fancyvrb}\n");
- sb.append("\\usepackage{fvrb-ex}\n");
- sb.append("\\usepackage{bold-extra}\n");
- sb.append("\\usepackage{ulem}\n");
- sb.append("\\usepackage{appendix}\n");
- sb.append("\\usepackage{amssymb,amsmath,epsfig,alltt}\n");
- sb.append("\\sloppy\n");
- sb.append("\\usepackage{palatino}\n");
- sb.append("\\usepackage{sectsty}\n");
- sb.append("\\allsectionsfont{\\sffamily}\n");
- sb.append("\\sectionfont{\\color{black}\\leftskip=-2cm\\hrulefill\\\\\\sffamily\\bfseries\\raggedleft\\vspace{1cm}}\n");
- sb.append("\\subsectionfont{\\color{black}\\dotfill\\\\\\sffamily\\raggedright\\hspace{-4cm}}\n");
- sb.append("\\newdimen\\sectskip\n");
- sb.append("\\newdimen\\subsectskip\n");
- sb.append("\\newdimen\\saveskip\n");
- sb.append("\\saveskip=\\leftskip\n");
- sb.append("\\sectskip=-2cm\n");
- sb.append("\\subsectskip=0cm\n");
- sb.append("\\let\\oldsection\\section\n");
- sb.append("\\let\\oldsubsection\\subsection\n");
- sb.append("\\def\\subsection#1{\\leftskip=\\sectskip\\oldsubsection{#1}\\leftskip=0cm}\n");
- sb.append("\\usepackage{parskip}\n");
- sb.append("\\usepackage{tabularx}\n");
- sb.append("\\usepackage{alltt}\n");
- sb.append("\\usepackage[pdftex,colorlinks=true,urlcolor=blue,linkcolor=blue,bookmarks=true]{hyperref}\n");
- // FIXME: pdfauthor, pdftitle, pdfsubject, pdfkeywords?
- sb.append("\n");
- sb.append("\\begin{document}\n");
- sb.append("\\reversemarginpar\n");
- sb.append("\n");
- sb.append("\\title{\\textbf{\\textsf{\n");
- sb.append(title);
- if (subtitle != null) sb.append("\\\\{\\large " + subtitle + "}\n");
- sb.append("}}}\n");
- if (author != null) {
- sb.append("\\author{\n");
- sb.append(author);
- if (email != null) sb.append("\\\\{\\tt " + email + "}\n");
- sb.append("}\n");
+ if (slides) {
+ sb.append("\\documentclass[letter]{seminar}\n");
+ sb.append("\\usepackage{calc} % Simple computations with LaTeX variables\n");
+ sb.append("\\usepackage[hang]{caption2} % Improved captions\n");
+ sb.append("\\usepackage{fancybox} % To have several backgrounds\n");
+ sb.append(" % (must be loaded before `fancyvrb')\n");
+ sb.append("\\usepackage{fancyhdr} % Headers and footers definitions\n");
+ sb.append("\\usepackage{fancyvrb} % Fancy verbatim environments\n");
+ sb.append("\\usepackage{wrapfig}\n");
+ sb.append("\\usepackage{float}\n");
+ sb.append("\\usepackage{amsmath}\n");
+ sb.append("\\usepackage{amssymb}\n");
+ sb.append("\\usepackage{pdftricks}\n");
+ sb.append("\\begin{psinputs}\n");
+ sb.append(" \\usepackage{pstcol} % PSTricks with the standard color package\n");
+ sb.append(" % (before `graphicx' for the \\scalebox macro)\n");
+ sb.append(" \\usepackage{graphicx} % Standard graphics package\n");
+ sb.append(" \\usepackage{multido} % General loop macro\n");
+ sb.append(" \\usepackage{pifont} % Ding symbols (mainly for lists)\n");
+ sb.append(" \\usepackage{pst-fr3d} % PSTricks 3D framed boxes\n");
+ sb.append(" \\usepackage{pst-grad} % PSTricks gradient mode\n");
+ sb.append(" \\usepackage{pst-node} % PSTricks nodes\n");
+ sb.append(" \\usepackage{pst-slpe} % Improved PSTricks gradients\n");
+ sb.append("\\end{psinputs}\n");
+ sb.append("\\usepackage{color}\n");
+ sb.append("\\definecolor{CodeBorder}{rgb}{0.6,0.6,0.6}\n");
+ sb.append("\\definecolor{CodeBackground}{rgb}{0.93,0.93,0.93}\n");
+ sb.append("\\usepackage{graphicx}\n");
+ sb.append("\\usepackage{courier}\n");
+ sb.append("\\usepackage{fancyvrb}\n");
+ sb.append("\\usepackage{float}\n");
+ sb.append("\\usepackage{fvrb-ex}\n");
+ sb.append("\\usepackage{bold-extra}\n");
+ sb.append("\\usepackage{ulem}\n");
+ sb.append("\\usepackage{amssymb,amsmath,epsfig,alltt}\n");
+ sb.append("\\usepackage{semcolor} % Seminar colored slides\n");
+ sb.append("\\usepackage{semhelv} % Seminar helvetica fonts\n");
+ sb.append("\\usepackage{semlayer} % Seminar overlays\n");
+ sb.append("\\usepackage{slidesec} % Seminar sections and list of slides\n");
+ sb.append("\\usepackage{url} % Convenient URL typesetting\n");
+ sb.append("\\usepackage[pdftex,letterpaper,pdffitwindow=true,colorlinks=true,pdfpagemode=UseNone,\n");
+ sb.append(" bookmarks=true]{hyperref} % Hyperlinks for PDF versions\n");
+ sb.append("\\usepackage{hcolor}\n");
+ sb.append("\\slidepagestyle{fancy}\n");
+ sb.append("\n");
+ sb.append("\\slidesmag{4} % Set magnification of slide\n");
+ sb.append("\\def\\SeminarPaperWidth{\\paperwidth / 2}\n");
+ sb.append("\\def\\SeminarPaperHeight{\\paperheight / 2}\n");
+ sb.append("\\slideframe{none} % No default frame\n");
+ sb.append("\n");
+ sb.append(" \n");
+ sb.append("\n");
+ sb.append(" % General size parameters\n");
+ sb.append("\\renewcommand{\\slideparindent}{5mm}\n");
+ sb.append("\\raggedslides[0mm]\n");
+ sb.append("% \\renewcommand{\\slidetopmargin}{15.5mm}\n");
+ sb.append("% \\renewcommand{\\slidebottommargin}{13mm}\n");
+ sb.append("% \\renewcommand{\\slideleftmargin}{4mm}\n");
+ sb.append("% \\renewcommand{\\sliderightmargin}{4mm}\n");
+ sb.append(" % To adjust the frame length to the header and footer ones\n");
+ sb.append("% \\autoslidemarginstrue\n");
+ sb.append(" % We suppress the header and footer `fancyhdr' rules\n");
+ sb.append("\\fancyhf{} % Clear all fields\n");
+ sb.append("\\renewcommand{\\headrule}{}\n");
+ sb.append("\\renewcommand{\\footrule}{}\n");
+ sb.append("\n");
+ sb.append("% \\usepackage{nohyperref} % To deactivate the `hyperref' features\n");
+ sb.append("% \\overlaysfalse % To suppress overlays\n");
+ sb.append("% \\def\\special@paper{}% Needed to avoid `hyperref' to collapse with ``dvips''\n");
+ sb.append("\\newslideframe{IMAGE}{%\n");
+ sb.append(" \\boxput{\\rput(0,0){%\n");
+ sb.append(" \\includegraphics[width=\\SeminarPaperHeight,height=\\SeminarPaperWidth]{background.pdf}}}{#1}}\n");
+ sb.append("\\slideframe*{IMAGE}\n");
+ sb.append("%\\renewcommand{\\slideleftmargin}{3cm}\n");
+ sb.append("%\\addtolength{\\slidewidth}{-\\slideleftmargin}\n");
+ sb.append("\\RequirePackage[T1]{fontenc}\n");
+ sb.append("\\RequirePackage{textcomp}\n");
+ sb.append("\\renewcommand{\\rmdefault}{trebuchet}\n");
+ sb.append("\\renewcommand{\\slidefonts}{%\n");
+ sb.append(" \\renewcommand{\\rmdefault}{trebuchet}%\n");
+ sb.append(" \\renewcommand{\\ttdefault}{courier}}%\n");
+ sb.append(" \\newcommand{\\ParagraphTitle}[2][black]{%\n");
+ sb.append(" \\noindent\\psshadowbox[fillstyle=solid,fillcolor=#1]{\\large{#2}}}\n");
+ sb.append(" \\newcommand{\\CenteredParagraphTitle}[2][black]{%\n");
+ sb.append(" \\centerline{\\psshadowbox[fillstyle=solid,fillcolor=#1]{\\large{#2}}}}\n");
+ sb.append(" \\renewcommand{\\makeslideheading}[1]{%\n");
+ sb.append(" \\CenteredParagraphTitle[black]{%\n");
+ sb.append(" \\textcolor{black}{\\huge\\textbf{#1}}}}\n");
+ sb.append(" \\renewcommand{\\makeslidesubheading}[1]{%\n");
+ sb.append(" \\CenteredParagraphTitle{\\Large\\theslidesubsection{} -- #1}}\n");
+ sb.append(" \\renewenvironment{dinglist}[2][black]\n");
+ sb.append(" {\\begin{list}{\\ding{#2}}{}}{\\end{list}}\n");
+ sb.append(" \\newcommand{\\DingListSymbolA}{43}\n");
+ sb.append(" \\newcommand{\\DingListSymbolB}{243}\n");
+ sb.append(" \\newcommand{\\DingListSymbolC}{224}\n");
+ sb.append(" \\newcommand{\\DingListSymbolD}{219}\n");
+ sb.append(" \\newcommand{\\eqbox}[2][0.6]{%\n");
+ sb.append(" \\centerline{\\psshadowbox[fillstyle=solid,fillcolor=gray]{%\n");
+ sb.append(" \\parbox{#1\\hsize}{%\n");
+ sb.append(" \\[\n");
+ sb.append(" \\textcolor{black} {#2}\n");
+ sb.append(" \\]}}}}\n");
+ sb.append("\\begin{document}\n");
+ sb.append("\\begin{slide}\n");
+ sb.append("\\begin{center}\n");
+ sb.append("\\ParagraphTitle{\\bf \\Large "+title+"}\n");
+ sb.append("\\vspace{5mm} \\\n");
+ sb.append("\\textit{\\large "+subtitle+"} \\\\\n");
+ sb.append("\\vspace{5mm} \\\n");
+ sb.append("\\textit{"+author+"} \\\n");
+ sb.append("\\end{center}\n");
+ sb.append("\\end{slide}\n\n");
+ super.dumpLatex(sb);
+ sb.append("\\end{document}");
+ } else {
+ sb.append("\\documentclass{article}\n");
+ sb.append("\\def\\ninept{\\def\\baselinestretch{.95}\\let\\normalsize\\small\\normalsize}\n");
+ sb.append("\\ninept\n");
+ sb.append("\\usepackage{color}\n");
+ sb.append("\\definecolor{CodeBorder}{rgb}{0.6,0.6,0.6}\n");
+ sb.append("\\definecolor{CodeBackground}{rgb}{0.93,0.93,0.93}\n");
+ sb.append("\\usepackage{graphicx}\n");
+ sb.append("\\usepackage{courier}\n");
+ sb.append("\\usepackage{fancyvrb}\n");
+ sb.append("\\usepackage{float}\n");
+ sb.append("\\usepackage{wrapfig}\n");
+ sb.append("\\usepackage{fvrb-ex}\n");
+ sb.append("\\usepackage{bold-extra}\n");
+ sb.append("\\usepackage{ulem}\n");
+ sb.append("\\usepackage{amssymb,amsmath,epsfig,alltt}\n");
+ sb.append("\\sloppy\n");
+ sb.append("\\usepackage{palatino}\n");
+ sb.append("\\usepackage{sectsty}\n");
+ sb.append("\\allsectionsfont{\\sffamily}\n");
+ sb.append("\\sectionfont{\\color{black}\\leftskip=-2cm");
+ sb.append("\\hrulefill\\\\\\sffamily\\bfseries\\raggedleft\\vspace{1cm}}\n");
+ sb.append("\\subsectionfont{\\color{black}\\dotfill\\\\\\sffamily\\raggedright\\hspace{-4cm}}\n");
+ sb.append("\\newdimen\\sectskip\n");
+ sb.append("\\newdimen\\subsectskip\n");
+ sb.append("\\newdimen\\saveskip\n");
+ sb.append("\\saveskip=\\leftskip\n");
+ sb.append("\\sectskip=-2cm\n");
+ sb.append("\\subsectskip=0cm\n");
+ sb.append("\\let\\oldsection\\section\n");
+ sb.append("\\let\\oldsubsection\\subsection\n");
+ sb.append("\\def\\subsection#1{\\leftskip=\\sectskip\\oldsubsection{#1}\\leftskip=0cm}\n");
+ sb.append("\\usepackage{parskip}\n");
+ sb.append("\\usepackage{tabularx}\n");
+ sb.append("\\usepackage{alltt}\n");
+ sb.append("\\usepackage[pdftex,colorlinks=true,urlcolor=blue,linkcolor=blue,bookmarks=true]{hyperref}\n");
+ // FIXME: pdfauthor, pdftitle, pdfsubject, pdfkeywords?
+ sb.append("\n");
+ sb.append("\\begin{document}\n");
+ sb.append("\\reversemarginpar\n");
+ sb.append("\n");
+ sb.append("\\title{\\textbf{\\textsf{\n");
+ sb.append(title);
+ if (subtitle != null) sb.append("\\\\{\\large " + subtitle + "}\n");
+ sb.append("}}}\n");
+ if (author != null) {
+ sb.append("\\author{\n");
+ sb.append(author);
+ if (email != null) sb.append("\\\\{\\tt " + email + "}\n");
+ sb.append("}\n");
+ }
+ sb.append("\n");
+ sb.append("\\maketitle\n");
+ sb.append("\\clearpage\n");
+ sb.append("\\tableofcontents\n");
+ sb.append("\\clearpage\n");
+ sb.append("\\onecolumn\n");
+ super.dumpLatex(sb);
+ sb.append("\\end{document}");
}
- sb.append("\n");
- sb.append("\\maketitle\n");
- sb.append("\\clearpage\n");
- sb.append("\\tableofcontents\n");
- sb.append("\\clearpage\n");
- sb.append("\\onecolumn\n");
- super.dumpLatex(sb);
- sb.append("\\end{document}");
}
}
}