summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorg Brandl <georg@python.org>2007-12-06 02:00:01 +0000
committerGeorg Brandl <georg@python.org>2007-12-06 02:00:01 +0000
commitc5580ebd9115dc8dd1e76a8ac25cea95bc3db2ce (patch)
tree8faed5717da5e1fb2cb763906f57f53a603176c4
parent3d74adea2595f35994093091410bc8607bd49f74 (diff)
downloadsphinx-git-c5580ebd9115dc8dd1e76a8ac25cea95bc3db2ce.tar.gz
Continue work on the PDF builder. The documents now build and run through LaTeX.
Some elements are still missing though.
-rw-r--r--sphinx/addnodes.py11
-rw-r--r--sphinx/builder.py27
-rw-r--r--sphinx/directives.py4
-rw-r--r--sphinx/htmlwriter.py6
-rw-r--r--sphinx/latexwriter.py350
-rw-r--r--sphinx/texinputs/fancyhdr.sty329
-rw-r--r--sphinx/texinputs/fncychap.sty433
-rw-r--r--sphinx/texinputs/python.sty20
-rw-r--r--sphinx/texinputs/underscore.sty232
9 files changed, 298 insertions, 1114 deletions
diff --git a/sphinx/addnodes.py b/sphinx/addnodes.py
index eea1a9a90..d2515deab 100644
--- a/sphinx/addnodes.py
+++ b/sphinx/addnodes.py
@@ -17,10 +17,15 @@ class desc(nodes.Admonition, nodes.Element): pass
class desc_content(nodes.General, nodes.Element): pass
class desc_signature(nodes.Part, nodes.Inline, nodes.TextElement): pass
class desc_classname(nodes.Part, nodes.Inline, nodes.TextElement): pass
+class desc_type(nodes.Part, nodes.Inline, nodes.TextElement): pass
class desc_name(nodes.Part, nodes.Inline, nodes.TextElement): pass
-class desc_parameterlist(nodes.Part, nodes.Inline, nodes.TextElement): pass
+class desc_parameterlist(nodes.Part, nodes.Inline, nodes.TextElement):
+ child_text_separator = ', '
class desc_parameter(nodes.Part, nodes.Inline, nodes.TextElement): pass
-class desc_optional(nodes.Part, nodes.Inline, nodes.TextElement): pass
+class desc_optional(nodes.Part, nodes.Inline, nodes.TextElement):
+ child_text_separator = ', '
+ def astext(self):
+ return '[' + nodes.TextElement.astext(self) + ']'
# refcount annotation
class refcount(nodes.emphasis): pass
@@ -58,7 +63,7 @@ class glossary(nodes.Element): pass
# make them known to docutils. this is needed, because the HTMl writer
# will choke at some point if these are not added
-nodes._add_node_class_names("""index desc desc_content desc_signature
+nodes._add_node_class_names("""index desc desc_content desc_signature desc_type
desc_classname desc_name desc_parameterlist desc_parameter desc_optional
centered versionmodified seealso productionlist production toctree
pending_xref compact_paragraph highlightlang literal_emphasis
diff --git a/sphinx/builder.py b/sphinx/builder.py
index f420fd999..a345960b8 100644
--- a/sphinx/builder.py
+++ b/sphinx/builder.py
@@ -664,8 +664,8 @@ class LaTeXBuilder(Builder):
# first, assemble the "special" docs that are in every PDF
specials = []
- for fname in ["license", "copyright", "about", "glossary"]:
- specials.extend(self.env.get_doctree(fname+".rst").children)
+ for fname in ["glossary", "about", "license", "copyright"]:
+ specials.append(self.env.get_doctree(fname+".rst"))
docwriter = LaTeXWriter(self.config, self.name)
docsettings = OptionParser(
@@ -673,7 +673,7 @@ class LaTeXBuilder(Builder):
components=(docwriter,)).get_default_values()
# XXX get names of toplevels automatically?
- for docname in ["c-api"]:#, "distutils", "documenting", "extending",
+ for docname in ["library"]:#, "distutils", "documenting", "extending",
#"howto", "install", "library", "reference",
#"tutorial", "using"]:
# XXX whatsnew missing
@@ -682,36 +682,37 @@ class LaTeXBuilder(Builder):
encoding='utf-8')
doctree = self.assemble_doctree(path.join(docname, "index.rst"))
doctree.extend(specials)
- print "Writing..."
+ print "writing...",
doctree.settings = docsettings
doctree.settings.filename = docname
+ doctree.settings.docclass = 'manual' # XXX howto for whatsnew
output = docwriter.write(doctree, destination)
- print "Done!"
+ print "done"
def assemble_doctree(self, indexfile):
self.filenames = [indexfile]
- print "Processing", indexfile
+ print "processing", indexfile
def process_tree(tree):
- tree = tree.deepcopy()
+ #tree = tree.deepcopy()
for toctreenode in tree.traverse(addnodes.toctree):
- index = toctreenode.parent.index(toctreenode)
+ newnodes = []
includefiles = map(str, toctreenode['includefiles'])
for includefile in includefiles:
try:
- print "Including", includefile
+ print green(includefile),
subtree = process_tree(self.env.get_doctree(includefile))
self.filenames.append(includefile)
except:
print >>self.warning_stream, 'WARNING: %s: toctree contains ' \
'ref to nonexisting file %r' % (filename, includefile)
else:
- toctreenode.parent[index:index] = subtree.children
- toctreenode.parent.remove(toctreenode)
+ newnodes.extend(subtree.children)
+ toctreenode.parent.replace(toctreenode, newnodes)
return tree
largetree = process_tree(self.env.get_doctree(indexfile))
- print "Resolving references..."
+ print
+ print "resolving references..."
self.env.resolve_references(largetree, indexfile, self)
- #print largetree
return largetree
def finish(self):
diff --git a/sphinx/directives.py b/sphinx/directives.py
index 41625c377..193e096fe 100644
--- a/sphinx/directives.py
+++ b/sphinx/directives.py
@@ -217,7 +217,8 @@ def parse_c_signature(signode, sig, desctype):
raise ValueError('no match')
rettype, name, arglist = m.groups()
- parse_c_type(signode, rettype)
+ signode += addnodes.desc_type("", "")
+ parse_c_type(signode[-1], rettype)
signode += addnodes.desc_name(name, name)
if not arglist:
if desctype == 'cfunction':
@@ -293,6 +294,7 @@ def desc_directive(desctype, arguments, options, content, lineno,
node['desctype'] = desctype
noindex = ('noindex' in options)
+ node['noindex'] = noindex
# remove backslashes to support (dummy) escapes; helps Vim's highlighting
signatures = map(lambda s: s.strip().replace('\\', ''), arguments[0].split('\n'))
names = []
diff --git a/sphinx/htmlwriter.py b/sphinx/htmlwriter.py
index 73ee4e94c..7e220be11 100644
--- a/sphinx/htmlwriter.py
+++ b/sphinx/htmlwriter.py
@@ -63,6 +63,12 @@ def translator_class(config, buildername):
def depart_desc_classname(self, node):
self.body.append('</tt>')
+ def visit_desc_type(self, node):
+ # return type of C functions -- nothing to do here
+ pass
+ def depart_desc_type(self, node):
+ pass
+
def visit_desc_name(self, node):
self.body.append(self.starttag(node, 'tt', '', CLASS='descname'))
def depart_desc_name(self, node):
diff --git a/sphinx/latexwriter.py b/sphinx/latexwriter.py
index 4a6ebae3c..8aa7bdf66 100644
--- a/sphinx/latexwriter.py
+++ b/sphinx/latexwriter.py
@@ -14,18 +14,21 @@
import re
import time
+import string
from docutils import frontend, nodes, languages, writers, utils
+from . import addnodes
+
HEADER = r'''%% Generated by Sphinx.
-\documentclass[%(papersize)s,%(pointsize)s]{manual}
-\usepackage{hyperref}
+\documentclass[%(papersize)s,%(pointsize)s]{%(docclass)s}
+\usepackage[colorlinks]{hyperref}
\title{%(title)s}
\date{%(date)s}
\release{%(release)s}
-\author{Guido van Rossum\\
- Fred L. Drake, Jr., editor}
+\author{Guido van Rossum\\ %% XXX
+ Fred L. Drake, Jr., editor} %% XXX
\authoraddress{
\strong{Python Software Foundation}\\
Email: \email{docs@python.org}
@@ -34,7 +37,7 @@ HEADER = r'''%% Generated by Sphinx.
'''
-FOOTER = r''''
+FOOTER = r'''
\printindex
\end{document}
'''
@@ -65,18 +68,19 @@ class LaTeXWriter(writers.Writer):
pdb.post_mortem(tb)
-TABLE_MODE_NONE = 0
-TABLE_MODE_HEAD = 1
-TABLE_MODE_BODY = 2
+# Helper classes
class TableSpec:
def __init__(self):
self.columnCount = 0
- self.mode = TABLE_MODE_NONE
- def getColumnCount(self): return self.columnCount
- def setColumnCount(self, columnCount): self.columnCount = columnCount
- def getMode(self): return self.mode
- def setMode(self, mode): self.mode = mode
+ self.firstRow = 1
+
+class Desc:
+ def __init__(self, node):
+ self.env = LaTeXTranslator.desc_map[node['desctype']]
+ self.ni = node['noindex']
+ self.type = self.cls = self.name = self.params = ''
+ self.count = 0
class LaTeXTranslator(nodes.NodeVisitor):
@@ -86,18 +90,24 @@ class LaTeXTranslator(nodes.NodeVisitor):
def __init__(self, document, config):
nodes.NodeVisitor.__init__(self, document)
self.body = []
- self.options = {'papersize': 'a4paper', # XXX
+ self.options = {'docclass': document.settings.docclass,
+ 'papersize': 'a4paper', # XXX
'pointsize': '12pt',
'filename': document.settings.filename,
- 'title': '',
+ 'title': None, # comes later
'release': config['release'],
'date': time.strftime(config.get('today_fmt', '%B %d, %Y')),
}
self.context = []
+ self.descstack = []
+ self.highlightlang = 'python'
+ self.written_ids = set()
+ # flags
self.verbatim = 0
+ self.in_title = 0
+ self.first_document = 1
self.this_is_the_title = 1
- self.sectionlevel = 0 # XXX starts with chapter now
- self.highlightlang = 'python'
+ self.literal_whitespace = 0
def astext(self):
return (HEADER % self.options) + \
@@ -105,7 +115,13 @@ class LaTeXTranslator(nodes.NodeVisitor):
(FOOTER % self.options)
def visit_document(self, node):
- self.body.append('\\begin{document}\n\\maketitle\n')
+ if self.first_document == 1:
+ self.body.append('\\begin{document}\n\\maketitle\n\\tableofcontents\n')
+ self.first_document = 0
+ elif self.first_document == 0:
+ self.body.append('\n\\appendix\n')
+ self.first_document = -1
+ self.sectionlevel = 0
def depart_document(self, node):
pass
@@ -119,48 +135,164 @@ class LaTeXTranslator(nodes.NodeVisitor):
def visit_section(self, node):
if not self.this_is_the_title:
self.sectionlevel += 1
+ self.body.append('\n\n')
+ if node.get('ids'):
+ for id in node['ids']:
+ if id not in self.written_ids:
+ self.body.append(r'\hypertarget{%s}{}' % id)
+ self.written_ids.add(id)
def depart_section(self, node):
self.sectionlevel -= 1
def visit_glossary(self, node):
raise nodes.SkipNode # XXX
- def visit_transition(self, node):
- self.body.append('\n\n\\hrule{}\n\n')
+ def visit_productionlist(self, node):
+ raise nodes.SkipNode # XXX
+ def visit_transition(self, node):
+ self.body.append('\n\n\\bigskip\\hrule{}\\bigskip\n\n')
def depart_transition(self, node):
pass
def visit_title(self, node):
- if self.this_is_the_title:
+ if isinstance(node.parent, addnodes.seealso):
+ # the environment already handles this
+ raise nodes.SkipNode
+ elif self.this_is_the_title:
if len(node.children) != 1 and not isinstance(node.children[0], Text):
raise RuntimeError("title is not a Text node")
self.options['title'] = node.children[0].astext()
self.this_is_the_title = 0
raise nodes.SkipNode
elif isinstance(node.parent, nodes.section):
- self.body.append('\n\n')
self.body.append(r'\%s{' % self.sectionnames[self.sectionlevel])
self.context.append('}\n')
else:
raise RuntimeError("XXX title without section")
+ self.in_title = 1
def depart_title(self, node):
+ self.in_title = 0
self.body.append(self.context.pop())
def visit_field_list(self, node):
raise nodes.SkipNode # XXX
+ desc_map = {
+ 'function' : 'funcdesc',
+ 'class': 'classdesc',
+ #'classdesc*': ('class', '0'), XXX
+ 'method': 'methoddesc',
+ 'exception': 'excdesc',
+ #'excclassdesc': ('exception', '0(1)'), XXX
+ 'data': 'datadesc',
+ 'attribute': 'memberdesc',
+ 'opcode': 'opcodedesc',
+
+ 'cfunction': 'cfuncdesc',
+ 'cmember': 'cmemberdesc',
+ 'cmacro': 'csimplemacrodesc',
+ 'ctype': 'ctypedesc',
+ 'cvar': 'cvardesc',
+
+ 'describe': 'describe',
+ 'cmdoption': 'describe', # XXX?
+ 'envvar': 'describe',
+ }
+
def visit_desc(self, node):
- raise nodes.SkipNode # XXX
+ self.descstack.append(Desc(node))
+ def depart_desc(self, node):
+ d = self.descstack.pop()
+ self.body.append("\\end{%s%s}\n" % (d.env, d.ni and 'ni' or ''))
+
+ def visit_desc_signature(self, node):
+ pass
+ def depart_desc_signature(self, node):
+ d = self.descstack[-1]
+ d.cls = d.cls.rstrip('.')
+ if node.parent['desctype'] != 'describe' and node['ids']:
+ hyper = '\\hypertarget{%s}{}' % node['ids'][0]
+ else:
+ hyper = ''
+ if d.count == 0:
+ t1 = "\n\n%s\\begin{%s%s}" % (hyper, d.env, (d.ni and 'ni' or ''))
+ else:
+ t1 = "\n%s\\%sline%s" % (hyper, d.env[:-4], (d.ni and 'ni' or ''))
+ d.count += 1
+ if d.env in ('funcdesc', 'classdesc', 'excclassdesc'):
+ t2 = "{%s}{%s}" % (d.name, d.params)
+ elif d.env in ('datadesc', 'classdesc*', 'excdesc', 'csimplemacrodesc'):
+ t2 = "{%s}" % (d.name)
+ elif d.env == 'methoddesc':
+ t2 = "[%s]{%s}{%s}" % (d.cls, d.name, d.params)
+ elif d.env == 'memberdesc':
+ t2 = "[%s]{%s}" % (d.cls, d.name)
+ elif d.env == 'cfuncdesc':
+ t2 = "{%s}{%s}{%s}" % (d.type, d.name, d.params)
+ elif d.env == 'cmemberdesc':
+ try:
+ type, container = d.type.rsplit(' ', 1)
+ container = container.rstrip('.')
+ except:
+ container = ''
+ type = d.type
+ t2 = "{%s}{%s}{%s}" % (container, type, d.name)
+ elif d.env == 'cvardesc':
+ t2 = "{%s}{%s}" % (d.type, d.name)
+ elif d.env == 'ctypedesc':
+ t2 = "{%s}" % (d.name)
+ elif d.env == 'opcodedesc':
+ t2 = "{%s}{%s}" % (d.name, d.params)
+ elif d.env == 'describe':
+ t2 = "{%s}" % d.name
+ self.body.append(t1 + t2)
+
+ def visit_desc_type(self, node):
+ self.descstack[-1].type = self.encode(node.astext().strip())
+ raise nodes.SkipNode
+
+ def visit_desc_name(self, node):
+ self.descstack[-1].name = self.encode(node.astext().strip())
+ raise nodes.SkipNode
+
+ def visit_desc_classname(self, node):
+ self.descstack[-1].cls = self.encode(node.astext().strip())
+ raise nodes.SkipNode
+
+ def visit_desc_parameterlist(self, node):
+ self.descstack[-1].params = self.encode(node.astext().strip())
+ raise nodes.SkipNode
+
+ def visit_refcount(self, node):
+ self.body.append("\\emph{")
+ def depart_refcount(self, node):
+ self.body.append("}\\\\")
+
+ def visit_desc_content(self, node):
+ pass
+ def depart_desc_content(self, node):
+ pass
def visit_seealso(self, node):
- raise nodes.SkipNode # XXX
+ self.body.append("\n\n\\begin{seealso}\n")
+ def depart_seealso(self, node):
+ self.body.append("\n\\end{seealso}\n")
def visit_rubric(self, node):
- raise nodes.SkipNode # XXX
+ if len(node.children) == 1 and node.children[0].astext() == 'Footnotes':
+ raise nodes.SkipNode
+ raise RuntimeError("rubric not supported except for footnotes heading")
def visit_footnote(self, node):
- raise nodes.SkipNode # XXX
+ # XXX not optimal, footnotes are at section end
+ num = node.children[0].astext().strip()
+ self.body.append('\\footnotetext[%s]{' % num)
+ def depart_footnote(self, node):
+ self.body.append('}')
+
+ def visit_label(self, node):
+ raise nodes.SkipNode
def visit_table(self, node):
self.tableSpec = TableSpec()
@@ -174,7 +306,7 @@ class LaTeXTranslator(nodes.NodeVisitor):
def visit_tgroup(self, node):
columnCount = int(node.get('cols', 0))
- self.tableSpec.setColumnCount(columnCount)
+ self.tableSpec.columnCount = columnCount
if columnCount == 2:
self.body.append('\\begin{tableii}{l|l}{textrm}')
elif columnCount == 3:
@@ -183,59 +315,53 @@ class LaTeXTranslator(nodes.NodeVisitor):
self.body.append('\\begin{tableiv}{l|l|l|l}{textrm}')
elif columnCount == 5:
self.body.append('\\begin{tablev}{l|l|l|l|l}{textrm}')
+ else:
+ raise RuntimeError("XXX table with too many columns found")
def depart_tgroup(self, node):
- if self.tableSpec.getColumnCount() == 2:
- self.body.append('\n\\end{tableii}\n')
- elif self.tableSpec.getColumnCount() == 3:
- self.body.append('\n\\end{tableiii}\n')
- elif self.tableSpec.getColumnCount() == 4:
- self.body.append('\n\\end{tableiv}\n')
- elif self.tableSpec.getColumnCount() == 5:
- self.body.append('\n\\end{tablev}\n')
+ if self.tableSpec.columnCount == 2:
+ self.body.append('\n\\end{tableii}\n\n')
+ elif self.tableSpec.columnCount == 3:
+ self.body.append('\n\\end{tableiii}\n\n')
+ elif self.tableSpec.columnCount == 4:
+ self.body.append('\n\\end{tableiv}\n\n')
+ elif self.tableSpec.columnCount == 5:
+ self.body.append('\n\\end{tablev}\n\n')
def visit_thead(self, node):
- self.tableSpec.setMode(TABLE_MODE_HEAD)
+ pass
def depart_thead(self, node):
- self.tableSpec.setMode(TABLE_MODE_NONE)
+ pass
def visit_tbody(self, node):
- self.tableSpec.setMode(TABLE_MODE_BODY)
+ pass
def depart_tbody(self, node):
- self.tableSpec.setMode(TABLE_MODE_NONE)
+ pass
def visit_row(self, node):
- if self.tableSpec.getMode() == TABLE_MODE_HEAD:
- pass
- elif self.tableSpec.getMode() == TABLE_MODE_BODY:
- if self.tableSpec.getColumnCount() == 2:
+ if not self.tableSpec.firstRow:
+ if self.tableSpec.columnCount == 2:
self.body.append('\n\\lineii')
- elif self.tableSpec.getColumnCount() == 3:
+ elif self.tableSpec.columnCount == 3:
self.body.append('\n\\lineiii')
- elif self.tableSpec.getColumnCount() == 4:
+ elif self.tableSpec.columnCount == 4:
self.body.append('\n\\lineiv')
- elif self.tableSpec.getColumnCount() == 5:
+ elif self.tableSpec.columnCount == 5:
self.body.append('\n\\linev')
def depart_row(self, node):
- if self.tableSpec.getMode() == TABLE_MODE_HEAD:
- pass
- elif self.tableSpec.getMode() == TABLE_MODE_BODY:
- pass
+ if self.tableSpec.firstRow:
+ self.tableSpec.firstRow = 0
def visit_entry(self, node):
- if self.tableSpec.getMode() == TABLE_MODE_HEAD:
- #self.body.append('%% [(visit_entry) text: +%s+]' % node.astext())
- self.body.append('{%s}' % node.astext().strip(' '))
- raise nodes.SkipNode
- elif self.tableSpec.getMode() == TABLE_MODE_BODY:
- #self.body.append('%% [(visit_entry) text: +%s+]' % node.astext())
- self.body.append('{%s}' % node.astext().strip(' '))
+ if self.tableSpec.firstRow:
+ self.body.append('{%s}' % self.encode(node.astext().strip(' ')))
raise nodes.SkipNode
+ else:
+ self.body.append('{')
def depart_entry(self, node):
- pass
-## if self.tableSpec.getMode() == TABLE_MODE_HEAD:
-## self.body.append('}')
-## elif self.tableSpec.getMode() == TABLE_MODE_BODY:
-## self.body.append('}')
+ if self.tableSpec.firstRow:
+ pass
+ else:
+ self.body.append('}')
def visit_bullet_list(self, node):
self.body.append('\\begin{itemize}\n' )
@@ -268,12 +394,12 @@ class LaTeXTranslator(nodes.NodeVisitor):
self.body.append('\\item[')
def depart_term(self, node):
# definition list term.
- self.body.append(':]\n')
+ self.body.append(']\n')
def visit_classifier(self, node):
- pass # XXX
+ self.body.append('{[}')
def depart_classifier(self, node):
- pass
+ self.body.append('{]}')
def visit_definition(self, node):
pass
@@ -291,28 +417,45 @@ class LaTeXTranslator(nodes.NodeVisitor):
self.body.append('\n\\end{centering}')
def visit_note(self, node):
- self.body.append('\n\\note{')
+ self.body.append('\n\\begin{notice}[note]')
def depart_note(self, node):
- self.body.append('}\n')
+ self.body.append('\\end{notice}\n')
def visit_warning(self, node):
- self.body.append('\n\\warning{')
+ self.body.append('\n\\begin{notice}[warning]')
def depart_warning(self, node):
- self.body.append('}\n')
+ self.body.append('\\end{notice}\n')
def visit_versionmodified(self, node):
- #self.body.append('\n\\vmod{')
- pass
+ self.body.append('\\%s' % node['type'])
+ if node['type'] == 'deprecated':
+ self.body.append('{%s}{' % node['version'])
+ self.context.append('}')
+ else:
+ if len(node):
+ self.body.append('[')
+ self.context.append(']{%s}' % node['version'])
+ else:
+ self.body.append('{%s}' % node['version'])
+ self.context.append('')
def depart_versionmodified(self, node):
- #self.body.append('}\n')
- pass
+ self.body.append(self.context.pop())
def visit_target(self, node):
+ # XXX: no "index-" targets
if not (node.has_key('refuri') or node.has_key('refid')
or node.has_key('refname')):
+ ctx = ''
for id in node['ids']:
- self.body.append(r'\hypertarget{%s}{' % id)
- self.context.append('}' * len(node['ids']))
+ if id not in self.written_ids:
+ self.body.append(r'\hypertarget{%s}{' % id)
+ self.written_ids.add(id)
+ ctx += '}'
+ self.context.append(ctx)
+ elif node.has_key('refid') and node['refid'] not in self.written_ids:
+ self.body.append(r'\hypertarget{%s}{' % node['refid'])
+ self.written_ids.add(node['refid'])
+ self.context.append('}')
else:
self.context.append('')
def depart_target(self, node):
@@ -322,9 +465,19 @@ class LaTeXTranslator(nodes.NodeVisitor):
raise nodes.SkipNode # XXX
def visit_reference(self, node):
- pass # XXX
+ uri = node.get('refuri', '')
+ if self.in_title or not uri:
+ self.context.append('')
+ elif uri.startswith(('mailto:', 'http:', 'ftp:')):
+ self.body.append('\\href{%s}{' % self.encode(uri))
+ self.context.append('}')
+ elif uri.startswith('#'):
+ self.body.append('\\hyperlink{%s}{' % uri[1:])
+ self.context.append('}')
+ else:
+ raise RuntimeError('XXX malformed reference target %s' % uri)
def depart_reference(self, node):
- pass
+ self.body.append(self.context.pop())
def visit_pending_xref(self, node):
pass
@@ -346,25 +499,31 @@ class LaTeXTranslator(nodes.NodeVisitor):
def depart_strong(self, node):
self.body.append('}')
+ def visit_title_reference(self, node):
+ raise RuntimeError("XXX title reference node found")
+
def visit_literal(self, node):
content = self.encode(node.astext().strip())
- if re.search('[ \t\n]', content):
+ if self.in_title:
+ self.body.append(r'\texttt{%s}' % content)
+ elif re.search('[ \t\n]', content):
self.body.append(r'\samp{%s}' % content)
else:
self.body.append(r'\code{%s}' % content)
raise nodes.SkipNode
def visit_footnote_reference(self, node):
- pass #XXX
- def depart_footnote_reference(self, node):
- pass
+ self.body.append('\\footnotemark[%s]' % node.astext())
+ raise nodes.SkipNode
def visit_literal_block(self, node):
- self.body.append('\n\\begin{verbatim}')
+ self.body.append('\n\\begin{Verbatim}\n')
self.verbatim = 1
def depart_literal_block(self, node):
- self.body.append('\\end{verbatim}\n')
+ self.body.append('\n\\end{Verbatim}\n')
self.verbatim = 0
+ visit_doctest_block = visit_literal_block
+ depart_doctest_block = depart_literal_block
def visit_line_block(self, node):
"""line-block:
@@ -373,20 +532,9 @@ class LaTeXTranslator(nodes.NodeVisitor):
* serif typeface
"""
self.body.append('\\begin{flushleft}\n')
- #self.insert_none_breaking_blanks = 1
- #self.line_block_without_mbox = 1
- #if self.line_block_without_mbox:
- # self.insert_newline = 1
- #else:
- # self.mbox_newline = 1
- # self.body.append('\\mbox{')
+ self.literal_whitespace = 1
def depart_line_block(self, node):
- #if self.line_block_without_mbox:
- # self.insert_newline = 0
- #else:
- # self.body.append('}')
- # self.mbox_newline = 0
- #self.insert_none_breaking_blanks = 0
+ self.literal_whitespace = 0
self.body.append('\n\\end{flushleft}\n')
def visit_line(self, node):
@@ -417,19 +565,23 @@ class LaTeXTranslator(nodes.NodeVisitor):
self.body.append('\\end{quote}\n')
replacements = [
- (u"\\", ur"\textbackslash{}"),
+ (u"\\", u"\x00"),
(u"$", ur"\$"),
+ (r"%", ur"\%"),
(u"&", ur"\&"),
(u"#", ur"\#"),
(u"_", ur"\_"),
(u"{", ur"\{"),
(u"}", ur"\}"),
+ (u"[", ur"{[}"),
+ (u"]", ur"{]}"),
(u"¶", ur"\P{}"),
(u"§", ur"\S{}"),
(u"~", ur"\textasciitilde{}"),
(u"<", ur"\textless{}"),
(u">", ur"\textgreater{}"),
(u"^", ur"\textasciicircum{}"),
+ (u"\x00", ur"\textbackslash{}"),
]
def encode(self, text):
@@ -437,6 +589,10 @@ class LaTeXTranslator(nodes.NodeVisitor):
return text
for x, y in self.replacements:
text = text.replace(x, y)
+ if self.literal_whitespace:
+ # Insert a blank before the newline, to avoid
+ # ! LaTeX Error: There's no line here to end.
+ text = text.replace("\n", '~\\\\\n').replace(" ", "~")
return text
def visit_Text(self, node):
diff --git a/sphinx/texinputs/fancyhdr.sty b/sphinx/texinputs/fancyhdr.sty
deleted file mode 100644
index c1026e95c..000000000
--- a/sphinx/texinputs/fancyhdr.sty
+++ /dev/null
@@ -1,329 +0,0 @@
-% fancyhdr.sty version 1.99d
-% Fancy headers and footers for LaTeX.
-% Piet van Oostrum, Dept of Computer Science, University of Utrecht
-% Padualaan 14, P.O. Box 80.089, 3508 TB Utrecht, The Netherlands
-% Telephone: +31 30 2532180. Email: piet@cs.ruu.nl
-% ========================================================================
-% LICENCE: This is free software. You are allowed to use and distribute
-% this software in any way you like. You are also allowed to make modified
-% versions of it, but you can distribute a modified version only if you
-% clearly indicate that it is a modified version and the person(s) who
-% modified it. This indication should be in a prominent place, e.g. in the
-% top of the file. If possible a contact address, preferably by email,
-% should be given for these persons. If that is feasible the modifications
-% should be indicated in the source code.
-% ========================================================================
-% MODIFICATION HISTORY:
-% Sep 16, 1994
-% version 1.4: Correction for use with \reversemargin
-% Sep 29, 1994:
-% version 1.5: Added the \iftopfloat, \ifbotfloat and \iffloatpage commands
-% Oct 4, 1994:
-% version 1.6: Reset single spacing in headers/footers for use with
-% setspace.sty or doublespace.sty
-% Oct 4, 1994:
-% version 1.7: changed \let\@mkboth\markboth to
-% \def\@mkboth{\protect\markboth} to make it more robust
-% Dec 5, 1994:
-% version 1.8: corrections for amsbook/amsart: define \@chapapp and (more
-% importantly) use the \chapter/sectionmark definitions from ps@headings if
-% they exist (which should be true for all standard classes).
-% May 31, 1995:
-% version 1.9: The proposed \renewcommand{\headrulewidth}{\iffloatpage...
-% construction in the doc did not work properly with the fancyplain style.
-% June 1, 1995:
-% version 1.91: The definition of \@mkboth wasn't restored on subsequent
-% \pagestyle{fancy}'s.
-% June 1, 1995:
-% version 1.92: The sequence \pagestyle{fancyplain} \pagestyle{plain}
-% \pagestyle{fancy} would erroneously select the plain version.
-% June 1, 1995:
-% version 1.93: \fancypagestyle command added.
-% Dec 11, 1995:
-% version 1.94: suggested by Conrad Hughes <chughes@maths.tcd.ie>
-% CJCH, Dec 11, 1995: added \footruleskip to allow control over footrule
-% position (old hardcoded value of .3\normalbaselineskip is far too high
-% when used with very small footer fonts).
-% Jan 31, 1996:
-% version 1.95: call \@normalsize in the reset code if that is defined,
-% otherwise \normalsize.
-% this is to solve a problem with ucthesis.cls, as this doesn't
-% define \@currsize. Unfortunately for latex209 calling \normalsize doesn't
-% work as this is optimized to do very little, so there \@normalsize should
-% be called. Hopefully this code works for all versions of LaTeX known to
-% mankind.
-% April 25, 1996:
-% version 1.96: initialize \headwidth to a magic (negative) value to catch
-% most common cases that people change it before calling \pagestyle{fancy}.
-% Note it can't be initialized when reading in this file, because
-% \textwidth could be changed afterwards. This is quite probable.
-% We also switch to \MakeUppercase rather than \uppercase and introduce a
-% \nouppercase command for use in headers. and footers.
-% May 3, 1996:
-% version 1.97: Two changes:
-% 1. Undo the change in version 1.8 (using the pagestyle{headings} defaults
-% for the chapter and section marks. The current version of amsbook and
-% amsart classes don't seem to need them anymore. Moreover the standard
-% latex classes don't use \markboth if twoside isn't selected, and this is
-% confusing as \leftmark doesn't work as expected.
-% 2. include a call to \ps@empty in ps@@fancy. This is to solve a problem
-% in the amsbook and amsart classes, that make global changes to \topskip,
-% which are reset in \ps@empty. Hopefully this doesn't break other things.
-% May 7, 1996:
-% version 1.98:
-% Added % after the line \def\nouppercase
-% May 7, 1996:
-% version 1.99: This is the alpha version of fancyhdr 2.0
-% Introduced the new commands \fancyhead, \fancyfoot, and \fancyhf.
-% Changed \headrulewidth, \footrulewidth, \footruleskip to
-% macros rather than length parameters, In this way they can be
-% conditionalized and they don't consume length registers. There is no need
-% to have them as length registers unless you want to do calculations with
-% them, which is unlikely. Note that this may make some uses of them
-% incompatible (i.e. if you have a file that uses \setlength or \xxxx=)
-% May 10, 1996:
-% version 1.99a:
-% Added a few more % signs
-% May 10, 1996:
-% version 1.99b:
-% Changed the syntax of \f@nfor to be resistent to catcode changes of :=
-% Removed the [1] from the defs of \lhead etc. because the parameter is
-% consumed by the \@[xy]lhead etc. macros.
-% June 24, 1997:
-% version 1.99c:
-% corrected \nouppercase to also include the protected form of \MakeUppercase
-% \global added to manipulation of \headwidth.
-% \iffootnote command added.
-% Some comments added about \@fancyhead and \@fancyfoot.
-% Aug 24, 1998
-% version 1.99d
-% Changed the default \ps@empty to \ps@@empty in order to allow
-% \fancypagestyle{empty} redefinition.
-
-\let\fancy@def\gdef
-
-\def\if@mpty#1#2#3{\def\temp@ty{#1}\ifx\@empty\temp@ty #2\else#3\fi}
-
-% Usage: \@forc \var{charstring}{command to be executed for each char}
-% This is similar to LaTeX's \@tfor, but expands the charstring.
-
-\def\@forc#1#2#3{\expandafter\f@rc\expandafter#1\expandafter{#2}{#3}}
-\def\f@rc#1#2#3{\def\temp@ty{#2}\ifx\@empty\temp@ty\else
- \f@@rc#1#2\f@@rc{#3}\fi}
-\def\f@@rc#1#2#3\f@@rc#4{\def#1{#2}#4\f@rc#1{#3}{#4}}
-
-% Usage: \f@nfor\name:=list\do{body}
-% Like LaTeX's \@for but an empty list is treated as a list with an empty
-% element
-
-\newcommand{\f@nfor}[3]{\edef\@fortmp{#2}%
- \expandafter\@forloop#2,\@nil,\@nil\@@#1{#3}}
-
-% Usage: \def@ult \cs{defaults}{argument}
-% sets \cs to the characters from defaults appearing in argument
-% or defaults if it would be empty. All characters are lowercased.
-
-\newcommand\def@ult[3]{%
- \edef\temp@a{\lowercase{\edef\noexpand\temp@a{#3}}}\temp@a
- \def#1{}%
- \@forc\tmpf@ra{#2}%
- {\expandafter\if@in\tmpf@ra\temp@a{\edef#1{#1\tmpf@ra}}{}}%
- \ifx\@empty#1\def#1{#2}\fi}
-%
-% \if@in <char><set><truecase><falsecase>
-%
-\newcommand{\if@in}[4]{%
- \edef\temp@a{#2}\def\temp@b##1#1##2\temp@b{\def\temp@b{##1}}%
- \expandafter\temp@b#2#1\temp@b\ifx\temp@a\temp@b #4\else #3\fi}
-
-\newcommand{\fancyhead}{\@ifnextchar[{\f@ncyhf h}{\f@ncyhf h[]}}
-\newcommand{\fancyfoot}{\@ifnextchar[{\f@ncyhf f}{\f@ncyhf f[]}}
-\newcommand{\fancyhf}{\@ifnextchar[{\f@ncyhf {}}{\f@ncyhf {}[]}}
-
-% The header and footer fields are stored in command sequences with
-% names of the form: \f@ncy<x><y><z> with <x> for [eo], <y> form [lcr]
-% and <z> from [hf].
-
-\def\f@ncyhf#1[#2]#3{%
- \def\temp@c{}%
- \@forc\tmpf@ra{#2}%
- {\expandafter\if@in\tmpf@ra{eolcrhf,EOLCRHF}%
- {}{\edef\temp@c{\temp@c\tmpf@ra}}}%
- \ifx\@empty\temp@c\else
- \ifx\PackageError\undefined
- \errmessage{Illegal char `\temp@c' in fancyhdr argument:
- [#2]}\else
- \PackageError{Fancyhdr}{Illegal char `\temp@c' in fancyhdr argument:
- [#2]}{}\fi
- \fi
- \f@nfor\temp@c{#2}%
- {\def@ult\f@@@eo{eo}\temp@c
- \def@ult\f@@@lcr{lcr}\temp@c
- \def@ult\f@@@hf{hf}{#1\temp@c}%
- \@forc\f@@eo\f@@@eo
- {\@forc\f@@lcr\f@@@lcr
- {\@forc\f@@hf\f@@@hf
- {\expandafter\fancy@def\csname
- f@ncy\f@@eo\f@@lcr\f@@hf\endcsname
- {#3}}}}}}
-
-% Fancyheadings version 1 commands. These are more or less deprecated,
-% but they continue to work.
-
-\newcommand{\lhead}{\@ifnextchar[{\@xlhead}{\@ylhead}}
-\def\@xlhead[#1]#2{\fancy@def\f@ncyelh{#1}\fancy@def\f@ncyolh{#2}}
-\def\@ylhead#1{\fancy@def\f@ncyelh{#1}\fancy@def\f@ncyolh{#1}}
-
-\newcommand{\chead}{\@ifnextchar[{\@xchead}{\@ychead}}
-\def\@xchead[#1]#2{\fancy@def\f@ncyech{#1}\fancy@def\f@ncyoch{#2}}
-\def\@ychead#1{\fancy@def\f@ncyech{#1}\fancy@def\f@ncyoch{#1}}
-
-\newcommand{\rhead}{\@ifnextchar[{\@xrhead}{\@yrhead}}
-\def\@xrhead[#1]#2{\fancy@def\f@ncyerh{#1}\fancy@def\f@ncyorh{#2}}
-\def\@yrhead#1{\fancy@def\f@ncyerh{#1}\fancy@def\f@ncyorh{#1}}
-
-\newcommand{\lfoot}{\@ifnextchar[{\@xlfoot}{\@ylfoot}}
-\def\@xlfoot[#1]#2{\fancy@def\f@ncyelf{#1}\fancy@def\f@ncyolf{#2}}
-\def\@ylfoot#1{\fancy@def\f@ncyelf{#1}\fancy@def\f@ncyolf{#1}}
-
-\newcommand{\cfoot}{\@ifnextchar[{\@xcfoot}{\@ycfoot}}
-\def\@xcfoot[#1]#2{\fancy@def\f@ncyecf{#1}\fancy@def\f@ncyocf{#2}}
-\def\@ycfoot#1{\fancy@def\f@ncyecf{#1}\fancy@def\f@ncyocf{#1}}
-
-\newcommand{\rfoot}{\@ifnextchar[{\@xrfoot}{\@yrfoot}}
-\def\@xrfoot[#1]#2{\fancy@def\f@ncyerf{#1}\fancy@def\f@ncyorf{#2}}
-\def\@yrfoot#1{\fancy@def\f@ncyerf{#1}\fancy@def\f@ncyorf{#1}}
-
-\newdimen\headwidth
-\newcommand{\headrulewidth}{0.4pt}
-\newcommand{\footrulewidth}{\z@skip}
-\newcommand{\footruleskip}{.3\normalbaselineskip}
-
-% Fancyplain stuff shouldn't be used anymore (rather
-% \fancypagestyle{plain} should be used), but it must be present for
-% compatibility reasons.
-
-\newcommand{\plainheadrulewidth}{\z@skip}
-\newcommand{\plainfootrulewidth}{\z@skip}
-\newif\if@fancyplain \@fancyplainfalse
-\def\fancyplain#1#2{\if@fancyplain#1\else#2\fi}
-
-\headwidth=-123456789sp %magic constant
-
-% Command to reset various things in the headers:
-% a.o. single spacing (taken from setspace.sty)
-% and the catcode of ^^M (so that epsf files in the header work if a
-% verbatim crosses a page boundary)
-% It also defines a \nouppercase command that disables \uppercase and
-% \Makeuppercase. It can only be used in the headers and footers.
-\def\fancy@reset{\restorecr
- \def\baselinestretch{1}%
- \def\nouppercase##1{{\let\uppercase\relax\let\MakeUppercase\relax
- \expandafter\let\csname MakeUppercase \endcsname\relax##1}}%
- \ifx\undefined\@newbaseline% NFSS not present; 2.09 or 2e
- \ifx\@normalsize\undefined \normalsize % for ucthesis.cls
- \else \@normalsize \fi
- \else% NFSS (2.09) present
- \@newbaseline%
- \fi}
-
-% Initialization of the head and foot text.
-
-% The default values still contain \fancyplain for compatibility.
-\fancyhf{} % clear all
-% lefthead empty on ``plain'' pages, \rightmark on even, \leftmark on odd pages
-% evenhead empty on ``plain'' pages, \leftmark on even, \rightmark on odd pages
-\fancyhead[el,or]{\fancyplain{}{\sl\rightmark}}
-\fancyhead[er,ol]{\fancyplain{}{\sl\leftmark}}
-\fancyfoot[c]{\rm\thepage} % page number
-
-% Put together a header or footer given the left, center and
-% right text, fillers at left and right and a rule.
-% The \lap commands put the text into an hbox of zero size,
-% so overlapping text does not generate an errormessage.
-% These macros have 5 parameters:
-% 1. \@lodd or \@rodd % This determines at which side the header will stick
-% out.
-% 2. \f@ncyolh, \f@ncyelh, \f@ncyolf or \f@ncyelf. This is the left component.
-% 3. \f@ncyoch, \f@ncyech, \f@ncyocf or \f@ncyecf. This is the middle comp.
-% 4. \f@ncyorh, \f@ncyerh, \f@ncyorf or \f@ncyerf. This is the right component.
-% 5. \@lodd or \@rodd % This determines at which side the header will stick
-% out. This is the reverse of parameter nr. 1. One of them is always
-% \relax and the other one is \hss (after expansion).
-
-\def\@fancyhead#1#2#3#4#5{#1\hbox to\headwidth{\fancy@reset\vbox{\hbox
-{\rlap{\parbox[b]{\headwidth}{\raggedright#2\strut}}\hfill
-\parbox[b]{\headwidth}{\centering#3\strut}\hfill
-\llap{\parbox[b]{\headwidth}{\raggedleft#4\strut}}}\headrule}}#5}
-
-\def\@fancyfoot#1#2#3#4#5{#1\hbox to\headwidth{\fancy@reset\vbox{\footrule
-\hbox{\rlap{\parbox[t]{\headwidth}{\raggedright#2\strut}}\hfill
-\parbox[t]{\headwidth}{\centering#3\strut}\hfill
-\llap{\parbox[t]{\headwidth}{\raggedleft#4\strut}}}}}#5}
-
-\def\headrule{{\if@fancyplain\let\headrulewidth\plainheadrulewidth\fi
-\hrule\@height\headrulewidth\@width\headwidth \vskip-\headrulewidth}}
-
-\def\footrule{{\if@fancyplain\let\footrulewidth\plainfootrulewidth\fi
-\vskip-\footruleskip\vskip-\footrulewidth
-\hrule\@width\headwidth\@height\footrulewidth\vskip\footruleskip}}
-
-\def\ps@fancy{%
-\@ifundefined{@chapapp}{\let\@chapapp\chaptername}{}%for amsbook
-%
-% Define \MakeUppercase for old LaTeXen.
-% Note: we used \def rather than \let, so that \let\uppercase\relax (from
-% the version 1 documentation) will still work.
-%
-\@ifundefined{MakeUppercase}{\def\MakeUppercase{\uppercase}}{}%
-\@ifundefined{chapter}{\def\sectionmark##1{\markboth
-{\MakeUppercase{\ifnum \c@secnumdepth>\z@
- \thesection\hskip 1em\relax \fi ##1}}{}}%
-\def\subsectionmark##1{\markright {\ifnum \c@secnumdepth >\@ne
- \thesubsection\hskip 1em\relax \fi ##1}}}%
-{\def\chaptermark##1{\markboth {\MakeUppercase{\ifnum \c@secnumdepth>\m@ne
- \@chapapp\ \thechapter. \ \fi ##1}}{}}%
-\def\sectionmark##1{\markright{\MakeUppercase{\ifnum \c@secnumdepth >\z@
- \thesection. \ \fi ##1}}}}%
-%\csname ps@headings\endcsname % use \ps@headings defaults if they exist
-\ps@@fancy
-\gdef\ps@fancy{\@fancyplainfalse\ps@@fancy}%
-% Initialize \headwidth if the user didn't
-%
-\ifdim\headwidth<0sp
-%
-% This catches the case that \headwidth hasn't been initialized and the
-% case that the user added something to \headwidth in the expectation that
-% it was initialized to \textwidth. We compensate this now. This loses if
-% the user intended to multiply it by a factor. But that case is more
-% likely done by saying something like \headwidth=1.2\textwidth.
-% The doc says you have to change \headwidth after the first call to
-% \pagestyle{fancy}. This code is just to catch the most common cases were
-% that requirement is violated.
-%
- \global\advance\headwidth123456789sp\global\advance\headwidth\textwidth
-\fi}
-\def\ps@fancyplain{\ps@fancy \let\ps@plain\ps@plain@fancy}
-\def\ps@plain@fancy{\@fancyplaintrue\ps@@fancy}
-\let\ps@@empty\ps@empty
-\def\ps@@fancy{%
-\ps@@empty % This is for amsbook/amsart, which do strange things with \topskip
-\def\@mkboth{\protect\markboth}%
-\def\@oddhead{\@fancyhead\@lodd\f@ncyolh\f@ncyoch\f@ncyorh\@rodd}%
-\def\@oddfoot{\@fancyfoot\@lodd\f@ncyolf\f@ncyocf\f@ncyorf\@rodd}%
-\def\@evenhead{\@fancyhead\@rodd\f@ncyelh\f@ncyech\f@ncyerh\@lodd}%
-\def\@evenfoot{\@fancyfoot\@rodd\f@ncyelf\f@ncyecf\f@ncyerf\@lodd}%
-}
-\def\@lodd{\if@reversemargin\hss\else\relax\fi}
-\def\@rodd{\if@reversemargin\relax\else\hss\fi}
-
-\newif\iffootnote
-\let\latex@makecol\@makecol
-\def\@makecol{\ifvoid\footins\footnotetrue\else\footnotefalse\fi
-\let\topfloat\@toplist\let\botfloat\@botlist\latex@makecol}
-\def\iftopfloat#1#2{\ifx\topfloat\empty #2\else #1\fi}
-\def\ifbotfloat#1#2{\ifx\botfloat\empty #2\else #1\fi}
-\def\iffloatpage#1#2{\if@fcolmade #1\else #2\fi}
-
-\newcommand{\fancypagestyle}[2]{%
- \@namedef{ps@#1}{\let\fancy@def\def#2\relax\ps@fancy}}
diff --git a/sphinx/texinputs/fncychap.sty b/sphinx/texinputs/fncychap.sty
deleted file mode 100644
index b0d7b76b7..000000000
--- a/sphinx/texinputs/fncychap.sty
+++ /dev/null
@@ -1,433 +0,0 @@
-%%% Derived from the original fncychap.sty,
-%%% but changed ``TWELV'' to ``TWELVE''.
-
-%%% Copyright Ulf A. Lindgren
-%%% Department of Applied Electronics
-%%% Chalmers University of Technology
-%%% S-412 96 Gothenburg, Sweden
-%%% E-mail lindgren@ae.chalmers.se
-%%%
-%%% Note Permission is granted to modify this file under
-%%% the condition that it is saved using another
-%%% file and package name.
-%%%
-%%% Revision 1.1
-%%%
-%%% Jan. 8th Modified package name base date option
-%%% Jan. 22th Modified FmN and FmTi for error in book.cls
-%%% \MakeUppercase{#}->{\MakeUppercase#}
-%%% Apr. 6th Modified Lenny option to prevent undesired
-%%% skip of line.
-%%% Nov. 8th Fixed \@chapapp for AMS
-%%% Feb. 11th Fixed appendix problem related to Bjarne
-%%% Last modified Feb. 11th 1998
-
-\NeedsTeXFormat{LaTeX2e}[1995/12/01]
-\ProvidesPackage{fncychap}
- [1997/04/06 v1.11
- LaTeX package (Revised chapters)]
-
-%%%% DEFINITION OF Chapapp variables
-\newcommand{\CNV}{\huge\bfseries}
-\newcommand{\ChNameVar}[1]{\renewcommand{\CNV}{#1}}
-
-
-%%%% DEFINITION OF TheChapter variables
-\newcommand{\CNoV}{\huge\bfseries}
-\newcommand{\ChNumVar}[1]{\renewcommand{\CNoV}{#1}}
-
-\newif\ifUCN
-\UCNfalse
-\newif\ifLCN
-\LCNfalse
-\def\ChNameLowerCase{\LCNtrue\UCNfalse}
-\def\ChNameUpperCase{\UCNtrue\LCNfalse}
-\def\ChNameAsIs{\UCNfalse\LCNfalse}
-
-%%%%% Fix for AMSBook 971008
-
-\@ifundefined{@chapapp}{\let\@chapapp\chaptername}{}
-
-
-%%%%% Fix for Bjarne and appendix 980211
-
-\newif\ifinapp
-\inappfalse
-\renewcommand\appendix{\par
- \setcounter{chapter}{0}%
- \setcounter{section}{0}%
- \inapptrue%
- \renewcommand\@chapapp{\appendixname}%
- \renewcommand\thechapter{\@Alph\c@chapter}}
-
-%%%%%
-
-\newcommand{\FmN}[1]{%
-\ifUCN
- {\MakeUppercase#1}\LCNfalse
-\else
- \ifLCN
- {\MakeLowercase#1}\UCNfalse
- \else #1
- \fi
-\fi}
-
-
-%%%% DEFINITION OF Title variables
-\newcommand{\CTV}{\Huge\bfseries}
-\newcommand{\ChTitleVar}[1]{\renewcommand{\CTV}{#1}}
-
-%%%% DEFINITION OF the basic rule width
-\newlength{\RW}
-\setlength{\RW}{1pt}
-\newcommand{\ChRuleWidth}[1]{\setlength{\RW}{#1}}
-
-\newif\ifUCT
-\UCTfalse
-\newif\ifLCT
-\LCTfalse
-\def\ChTitleLowerCase{\LCTtrue\UCTfalse}
-\def\ChTitleUpperCase{\UCTtrue\LCTfalse}
-\def\ChTitleAsIs{\UCTfalse\LCTfalse}
-\newcommand{\FmTi}[1]{%
-\ifUCT
-
- {\MakeUppercase#1}\LCTfalse
-\else
- \ifLCT
- {\MakeLowercase#1}\UCTfalse
- \else #1
- \fi
-\fi}
-
-
-
-\newlength{\mylen}
-\newlength{\myhi}
-\newlength{\px}
-\newlength{\py}
-\newlength{\pyy}
-\newlength{\pxx}
-
-
-\def\mghrulefill#1{\leavevmode\leaders\hrule\@height #1\hfill\kern\z@}
-
-\newcommand{\DOCH}{%
- \CNV\FmN{\@chapapp}\space \CNoV\thechapter
- \par\nobreak
- \vskip 20\p@
- }
-\newcommand{\DOTI}[1]{%
- \CTV\FmTi{#1}\par\nobreak
- \vskip 40\p@
- }
-\newcommand{\DOTIS}[1]{%
- \CTV\FmTi{#1}\par\nobreak
- \vskip 40\p@
- }
-
-%%%%%% SONNY DEF
-
-\DeclareOption{Sonny}{%
- \ChNameVar{\Large\sf}
- \ChNumVar{\Huge}
- \ChTitleVar{\Large\sf}
- \ChRuleWidth{0.5pt}
- \ChNameUpperCase
- \renewcommand{\DOCH}{%
- \raggedleft
- \CNV\FmN{\@chapapp}\space \CNoV\thechapter
- \par\nobreak
- \vskip 40\p@}
- \renewcommand{\DOTI}[1]{%
- \CTV\raggedleft\mghrulefill{\RW}\par\nobreak
- \vskip 5\p@
- \CTV\FmTi{#1}\par\nobreak
- \mghrulefill{\RW}\par\nobreak
- \vskip 40\p@}
- \renewcommand{\DOTIS}[1]{%
- \CTV\raggedleft\mghrulefill{\RW}\par\nobreak
- \vskip 5\p@
- \CTV\FmTi{#1}\par\nobreak
- \mghrulefill{\RW}\par\nobreak
- \vskip 40\p@}
-}
-
-%%%%%% LENNY DEF
-
-\DeclareOption{Lenny}{%
-
- \ChNameVar{\fontsize{14}{16}\usefont{OT1}{phv}{m}{n}\selectfont}
- \ChNumVar{\fontsize{60}{62}\usefont{OT1}{ptm}{m}{n}\selectfont}
- \ChTitleVar{\Huge\bfseries\rm}
- \ChRuleWidth{1pt}
- \renewcommand{\DOCH}{%
- \settowidth{\px}{\CNV\FmN{\@chapapp}}
- \addtolength{\px}{2pt}
- \settoheight{\py}{\CNV\FmN{\@chapapp}}
- \addtolength{\py}{1pt}
-
- \settowidth{\mylen}{\CNV\FmN{\@chapapp}\space\CNoV\thechapter}
- \addtolength{\mylen}{1pt}
- \settowidth{\pxx}{\CNoV\thechapter}
- \addtolength{\pxx}{-1pt}
-
- \settoheight{\pyy}{\CNoV\thechapter}
- \addtolength{\pyy}{-2pt}
- \setlength{\myhi}{\pyy}
- \addtolength{\myhi}{-1\py}
- \par
- \parbox[b]{\textwidth}{%
- \rule[\py]{\RW}{\myhi}%
- \hskip -\RW%
- \rule[\pyy]{\px}{\RW}%
- \hskip -\px%
- \raggedright%
- \CNV\FmN{\@chapapp}\space\CNoV\thechapter%
- \hskip1pt%
- \mghrulefill{\RW}%
- \rule{\RW}{\pyy}\par\nobreak%
- \vskip -\baselineskip%
- \vskip -\pyy%
- \hskip \mylen%
- \mghrulefill{\RW}\par\nobreak%
- \vskip \pyy}%
- \vskip 20\p@}
-
-
- \renewcommand{\DOTI}[1]{%
- \raggedright
- \CTV\FmTi{#1}\par\nobreak
- \vskip 40\p@}
-
- \renewcommand{\DOTIS}[1]{%
- \raggedright
- \CTV\FmTi{#1}\par\nobreak
- \vskip 40\p@}
- }
-
-
-%%%%%%% GLENN DEF
-
-
-\DeclareOption{Glenn}{%
- \ChNameVar{\bfseries\Large\sf}
- \ChNumVar{\Huge}
- \ChTitleVar{\bfseries\Large\rm}
- \ChRuleWidth{1pt}
- \ChNameUpperCase
- \ChTitleUpperCase
- \renewcommand{\DOCH}{%
- \settoheight{\myhi}{\CTV\FmTi{Test}}
- \setlength{\py}{\baselineskip}
- \addtolength{\py}{\RW}
- \addtolength{\py}{\myhi}
- \setlength{\pyy}{\py}
- \addtolength{\pyy}{-1\RW}
-
- \raggedright
- \CNV\FmN{\@chapapp}\space\CNoV\thechapter
- \hskip 3pt\mghrulefill{\RW}\rule[-1\pyy]{2\RW}{\py}\par\nobreak}
-
- \renewcommand{\DOTI}[1]{%
- \addtolength{\pyy}{-4pt}
- \settoheight{\myhi}{\CTV\FmTi{#1}}
- \addtolength{\myhi}{\py}
- \addtolength{\myhi}{-1\RW}
- \vskip -1\pyy
- \rule{2\RW}{\myhi}\mghrulefill{\RW}\hskip 2pt
- \raggedleft\CTV\FmTi{#1}\par\nobreak
- \vskip 80\p@}
-
- \renewcommand{\DOTIS}[1]{%
- \setlength{\py}{10pt}
- \setlength{\pyy}{\py}
- \addtolength{\pyy}{\RW}
- \setlength{\myhi}{\baselineskip}
- \addtolength{\myhi}{\pyy}
- \mghrulefill{\RW}\rule[-1\py]{2\RW}{\pyy}\par\nobreak
-% \addtolength{}{}
-\vskip -1\baselineskip
- \rule{2\RW}{\myhi}\mghrulefill{\RW}\hskip 2pt
- \raggedleft\CTV\FmTi{#1}\par\nobreak
- \vskip 60\p@}
- }
-
-%%%%%%% CONNY DEF
-
-\DeclareOption{Conny}{%
- \ChNameUpperCase
- \ChTitleUpperCase
- \ChNameVar{\centering\Huge\rm\bfseries}
- \ChNumVar{\Huge}
- \ChTitleVar{\centering\Huge\rm}
- \ChRuleWidth{2pt}
-
- \renewcommand{\DOCH}{%
- \mghrulefill{3\RW}\par\nobreak
- \vskip -0.5\baselineskip
- \mghrulefill{\RW}\par\nobreak
- \CNV\FmN{\@chapapp}\space \CNoV\thechapter
- \par\nobreak
- \vskip -0.5\baselineskip
- }
- \renewcommand{\DOTI}[1]{%
- \mghrulefill{\RW}\par\nobreak
- \CTV\FmTi{#1}\par\nobreak
- \vskip 60\p@
- }
- \renewcommand{\DOTIS}[1]{%
- \mghrulefill{\RW}\par\nobreak
- \CTV\FmTi{#1}\par\nobreak
- \vskip 60\p@
- }
- }
-
-%%%%%%% REJNE DEF
-
-\DeclareOption{Rejne}{%
-
- \ChNameUpperCase
- \ChTitleUpperCase
- \ChNameVar{\centering\Large\rm}
- \ChNumVar{\Huge}
- \ChTitleVar{\centering\Huge\rm}
- \ChRuleWidth{1pt}
- \renewcommand{\DOCH}{%
- \settoheight{\py}{\CNoV\thechapter}
- \addtolength{\py}{-1pt}
- \CNV\FmN{\@chapapp}\par\nobreak
- \vskip 20\p@
- \setlength{\myhi}{2\baselineskip}
- \setlength{\px}{\myhi}
- \addtolength{\px}{-1\RW}
- \rule[-1\px]{\RW}{\myhi}\mghrulefill{\RW}\hskip
- 10pt\raisebox{-0.5\py}{\CNoV\thechapter}\hskip
-10pt\mghrulefill{\RW}\rule[-1\px]{\RW}{\myhi}\par\nobreak
- \vskip -1\p@
- }
- \renewcommand{\DOTI}[1]{%
- \setlength{\mylen}{\textwidth}
- \addtolength{\mylen}{-2\RW}
- {\vrule width\RW}\parbox{\mylen}{\CTV\FmTi{#1}}{\vrule
-width\RW}\par\nobreak
- \vskip
--1pt\rule{\RW}{2\baselineskip}\mghrulefill{\RW}\rule{\RW}{2\baselineskip}
- \vskip 60\p@
- }
- \renewcommand{\DOTIS}[1]{%
- \setlength{\py}{\fboxrule}
- \setlength{\fboxrule}{\RW}
- \setlength{\mylen}{\textwidth}
- \addtolength{\mylen}{-2\RW}
- \fbox{\parbox{\mylen}{\vskip
-2\baselineskip\CTV\FmTi{#1}\par\nobreak\vskip \baselineskip}}
- \setlength{\fboxrule}{\py}
- \vskip 60\p@
- }
- }
-
-
-%%%%%%% BJARNE DEF
-
-\DeclareOption{Bjarne}{%
- \ChNameUpperCase
- \ChTitleUpperCase
- \ChNameVar{\raggedleft\normalsize\rm}
- \ChNumVar{\raggedleft \bfseries\Large}
- \ChTitleVar{\raggedleft \Large\rm}
- \ChRuleWidth{1pt}
-
-
-%% Note thechapter -> c@chapter fix appendix bug
-
- \newcounter{AlphaCnt}
- \newcounter{AlphaDecCnt}
- \newcommand{\AlphaNo}{%
- \ifcase\number\theAlphaCnt
- \ifnum\c@chapter=0
- ZERO\else{}\fi
- \or ONE\or TWO\or THREE\or FOUR\or FIVE
- \or SIX\or SEVEN\or EIGHT\or NINE\or TEN
- \or ELEVEN\or TWELVE\or THIRTEEN\or FOURTEEN\or FIFTEEN
- \or SIXTEEN\or SEVENTEEN\or EIGHTEEN\or NINETEEN\fi
-}
-
- \newcommand{\AlphaDecNo}{%
- \setcounter{AlphaDecCnt}{0}
- \@whilenum\number\theAlphaCnt>0\do
- {\addtocounter{AlphaCnt}{-10}
- \addtocounter{AlphaDecCnt}{1}}
- \ifnum\number\theAlphaCnt=0
- \else
- \addtocounter{AlphaDecCnt}{-1}
- \addtocounter{AlphaCnt}{10}
- \fi
-
-
- \ifcase\number\theAlphaDecCnt\or TEN\or TWENTY\or THIRTY\or
- FORTY\or FIFTY\or SIXTY\or SEVENTY\or EIGHTY\or NINETY\fi
- }
- \newcommand{\TheAlphaChapter}{%
-
- \ifinapp
- \thechapter
- \else
- \setcounter{AlphaCnt}{\c@chapter}
- \ifnum\c@chapter<20
- \AlphaNo
- \else
- \AlphaDecNo\AlphaNo
- \fi
- \fi
- }
- \renewcommand{\DOCH}{%
- \mghrulefill{\RW}\par\nobreak
- \CNV\FmN{\@chapapp}\par\nobreak
- \CNoV\TheAlphaChapter\par\nobreak
- \vskip -1\baselineskip\vskip 5pt\mghrulefill{\RW}\par\nobreak
- \vskip 20\p@
- }
- \renewcommand{\DOTI}[1]{%
- \CTV\FmTi{#1}\par\nobreak
- \vskip 40\p@
- }
- \renewcommand{\DOTIS}[1]{%
- \CTV\FmTi{#1}\par\nobreak
- \vskip 40\p@
- }
-}
-
-\DeclareOption*{%
- \PackageWarning{fancychapter}{unknown style option}
- }
-
-\ProcessOptions* \relax
-
-\def\@makechapterhead#1{%
- \vspace*{50\p@}%
- {\parindent \z@ \raggedright \normalfont
- \ifnum \c@secnumdepth >\m@ne
- \DOCH
- \fi
- \interlinepenalty\@M
- \DOTI{#1}
- }}
-\def\@schapter#1{\if@twocolumn
- \@topnewpage[\@makeschapterhead{#1}]%
- \else
- \@makeschapterhead{#1}%
- \@afterheading
- \fi}
-\def\@makeschapterhead#1{%
- \vspace*{50\p@}%
- {\parindent \z@ \raggedright
- \normalfont
- \interlinepenalty\@M
- \DOTIS{#1}
- \vskip 40\p@
- }}
-
-\endinput
-
-
diff --git a/sphinx/texinputs/python.sty b/sphinx/texinputs/python.sty
index 7cf431705..e3ee51a2d 100644
--- a/sphinx/texinputs/python.sty
+++ b/sphinx/texinputs/python.sty
@@ -7,8 +7,9 @@
[1998/01/11 LaTeX package (Python markup)]
\RequirePackage{longtable}
-\RequirePackage{underscore}
\RequirePackage{times}
+\RequirePackage{fancyvrb}
+\renewcommand{\sfdefault}{cmbr}
% Uncomment these two lines to ignore the paper size and make the page
% size more like a typical published manual.
@@ -676,12 +677,14 @@
% classes ----------------------------------------------------------------
% \begin{classdesc}{name}{constructor args}
+\newcommand{\classline}[2]{
+ \py@sigline{\strong{class }\bfcode{#1}}{#2}%
+ \index{#1@{\py@idxcode{#1}} (class in \py@thismodule)}}
\newenvironment{classdesc}[2]{
% Using \renewcommand doesn't work for this, for unknown reasons:
\global\def\py@thisclass{#1}
\begin{fulllineitems}
- \py@sigline{\strong{class }\bfcode{#1}}{#2}%
- \index{#1@{\py@idxcode{#1}} (class in \py@thismodule)}
+ \classline{#1}{#2}
}{\end{fulllineitems}}
% \begin{classdesc*}{name}
@@ -800,6 +803,11 @@
\item[\bfcode{#1}\quad\var{#2}]
}{\end{fulllineitems}}
+% generic description ----------------------------------------------------
+\newenvironment{describe}[1]{
+ \begin{fulllineitems}
+ \item[\bfcode{#1}]\nopagebreak
+}{\end{fulllineitems}}
\newcommand{\nodename}[1]{\label{#1}}
@@ -990,7 +998,7 @@
\newlength{\py@noticelength}
\newcommand{\py@heavybox}{
- \setlength{\fboxrule}{2pt}
+ \setlength{\fboxrule}{1pt}
\setlength{\fboxsep}{7pt}
\setlength{\py@noticelength}{\linewidth}
\addtolength{\py@noticelength}{-2\fboxsep}
@@ -1050,14 +1058,14 @@
\ifx\@undefined#1\relax%
{ New in version #2. }%
\else%
- { New in version #2:\ #1. }%
+ { New in version #2:\ #1 }%
\fi%
}
\newcommand{\versionchanged}[2][\py@badkey]{%
\ifx\@undefined#1\relax%
{ Changed in version #2. }%
\else%
- { Changed in version #2:\ #1. }%
+ { Changed in version #2:\ #1 }%
\fi%
}
diff --git a/sphinx/texinputs/underscore.sty b/sphinx/texinputs/underscore.sty
deleted file mode 100644
index a274b39e5..000000000
--- a/sphinx/texinputs/underscore.sty
+++ /dev/null
@@ -1,232 +0,0 @@
-% underscore.sty 12-Oct-2001 Donald Arseneau asnd@triumf.ca
-% Make the "_" character print as "\textunderscore" in text.
-% Copyright 1998,2001 Donald Arseneau; Distribute freely if unchanged.
-% Instructions follow after the definitions.
-
-\ProvidesPackage{underscore}[2001/10/12]
-
-\begingroup
- \catcode`\_=\active
- \gdef_{% \relax % No relax gives a small vulnerability in alignments
- \ifx\if@safe@actives\iftrue % must be outermost test!
- \string_%
- \else
- \ifx\protect\@typeset@protect
- \ifmmode \sb \else \BreakableUnderscore \fi
- \else
- \ifx\protect\@unexpandable@protect \noexpand_%
- \else \protect_%
- \fi\fi
- \fi}
-\endgroup
-
-% At begin: set catcode; fix \long \ttdefault so I can use it in comparisons;
-\AtBeginDocument{%
- {\immediate\write\@auxout{\catcode\number\string`\_ \string\active}}%
- \catcode\string`\_\string=\active
- \edef\ttdefault{\ttdefault}%
-}
-
-\newcommand{\BreakableUnderscore}{\leavevmode\nobreak\hskip\z@skip
- \ifx\f@family\ttdefault \string_\else \textunderscore\fi
- \usc@dischyph\nobreak\hskip\z@skip}
-
-\DeclareRobustCommand{\_}{%
- \ifmmode \nfss@text{\textunderscore}\else \BreakableUnderscore \fi}
-
-\let\usc@dischyph\@dischyph
-\DeclareOption{nohyphen}{\def\usc@dischyph{\discretionary{}{}{}}}
-\DeclareOption{strings}{\catcode`\_=\active}
-
-\ProcessOptions
-\ifnum\catcode`\_=\active\else \endinput \fi
-
-%%%%%%%% Redefine commands that use character strings %%%%%%%%
-
-\@ifundefined{UnderscoreCommands}{\let\UnderscoreCommands\@empty}{}
-\expandafter\def\expandafter\UnderscoreCommands\expandafter{%
- \UnderscoreCommands
- \do\include \do\includeonly
- \do\@input \do\@iinput \do\InputIfFileExists
- \do\ref \do\pageref \do\newlabel
- \do\bibitem \do\@bibitem \do\cite \do\nocite \do\bibcite
-}
-
-% Macro to redefine a macro to pre-process its string argument
-% with \protect -> \string.
-\def\do#1{% Avoid double processing if user includes command twice!
- \@ifundefined{US\string_\expandafter\@gobble\string#1}{%
- \edef\@tempb{\meaning#1}% Check if macro is just a protection shell...
- \def\@tempc{\protect}%
- \edef\@tempc{\meaning\@tempc\string#1\space\space}%
- \ifx\@tempb\@tempc % just a shell: hook into the protected inner command
- \expandafter\do
- \csname \expandafter\@gobble\string#1 \expandafter\endcsname
- \else % Check if macro takes an optional argument
- \def\@tempc{\@ifnextchar[}%
- \edef\@tempa{\def\noexpand\@tempa####1\meaning\@tempc}%
- \@tempa##2##3\@tempa{##2\relax}%
- \edef\@tempb{\meaning#1\meaning\@tempc}%
- \edef\@tempc{\noexpand\@tempd \csname
- US\string_\expandafter\@gobble\string#1\endcsname}%
- \if \expandafter\@tempa\@tempb \relax 12\@tempa % then no optional arg
- \@tempc #1\US@prot
- \else % There is optional arg
- \@tempc #1\US@protopt
- \fi
- \fi
- }{}}
-
-\def\@tempd#1#2#3{\let#1#2\def#2{#3#1}}
-
-\def\US@prot#1#2{\let\@@protect\protect \let\protect\string
- \edef\US@temp##1{##1{#2}}\restore@protect\US@temp#1}
-\def\US@protopt#1{\@ifnextchar[{\US@protarg#1}{\US@prot#1}}
-\def\US@protarg #1[#2]{\US@prot{{#1[#2]}}}
-
-\UnderscoreCommands
-\let\do\relax \let\@tempd\relax % un-do
-
-%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
-
-\endinput
-
-underscore.sty 12-Oct-2001 Donald Arseneau
-
-Features:
-~~~~~~~~~
-\_ prints an underscore so that the hyphenation of constituent words
-is not affected and hyphenation is permitted after the underscore.
-For example, "compound\_fracture" hyphenates as com- pound_- frac- ture.
-If you prefer the underscore to break without a hyphen (but still with
-the same rules for explicit hyphen-breaks) then use the [nohyphen]
-package option.
-
-A simple _ acts just like \_ in text mode, but makes a subscript in
-math mode: activation_energy $E_a$
-
-Both forms use an underscore character if the font encoding contains
-one (e.g., "\usepackage[T1]{fontenc}" or typewriter fonts in any encoding),
-but they use a rule if the there is no proper character.
-
-Deficiencies:
-~~~~~~~~~~~~~
-The skips and penalties ruin any kerning with the underscore character
-(when a character is used). However, there doesn't seem to be much, if
-any, such kerning in the ec fonts, and there is never any kerning with
-a rule.
-
-You must avoid "_" in file names and in cite or ref tags, or you must use
-the babel package, with its active-character controls, or you must give
-the [strings] option, which attempts to redefine several commands (and
-may not work perfectly). Even without the [strings] option or babel, you
-can use occasional underscores like: "\include{file\string_name}".
-
-Option: [strings]
-~~~~~~~~~~~~~~~~~
-The default operation is quite simple and needs no customization; but
-you must avoid using "_" in any place where LaTeX uses an argument as
-a string of characters for some control function or as a name. These
-include the tags for \cite and \ref, file names for \input, \include,
-and \includegraphics, environment names, counter names, and placement
-parameters (like "[t]"). The problem with these contexts is that they
-are `moving arguments' but LaTeX does not `switch on' the \protect
-mechanism for them.
-
-If you need to use the underscore character in these places, the package
-option [strings] is provided to redefine commands taking a string argument
-so that the argument is protected (with \protect -> \string). The list
-of commands is given in "\UnderscoreCommands", with "\do" before each,
-covering \cite, \ref, \input, and their variants. Not included are many
-commands regarding font names, everything with counter names, environment
-names, page styles, and versions of \ref and \cite defined by external
-packages (e.g. \vref and \citeyear).
-
-You can add to the list of supported commands by defining \UnderscoreCommands
-before loading this package; e.g.
-
- \usepackage{chicago}
- \newcommand{\UnderscoreCommands}{% (\cite already done)
- \do\citeNP \do\citeA \do\citeANP \do\citeN \do\shortcite
- \do\shortciteNP \do\shortciteA \do\shortciteANP \do\shortciteN
- \do\citeyear \do\citeyearNP
- }
- \usepackage[strings]{underscore}
-
-Not all commands can be supported this way! Only commands that take a
-string argument *first* can be protected. One optional argument before
-the string argument is also permitted, as exemplified by \cite: both
-\cite{tags} and \cite[text]{tags} are allowed. A command like
-\@addtoreset which takes two counter names as arguments could not
-be protected by adding it to \UnderscoreCommands.
-
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-!! When you use the [strings] option, you must load this package !!
-!! last (or nearly last). !!
-!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
-
-There are two reasons: 1) The redefinitions done for protection must come
-after other packages define their customized versions of those commands.
-2) The [strings] option requires the _ character to be activated immediately
-in order for the cite and ref tags to be read properly from the .aux file
-as plain strings, and this catcode setting might disrupt other packages.
-
-The babel package implements a protection mechanism for many commands,
-and will be a complete fix for most documents without the [strings] option.
-Many add-on packages are compatible with babel, so they will get the
-strings protection also. However, there are several commands that are
-not covered by babel, but can easily be supported by the [strings] and
-\UnderscoreCommands mechanism. Beware that using both [strings] and babel
-may lead to conflicts, but does appear to work (load babel last).
-
-Implementation Notes:
-~~~~~~~~~~~~~~~~~~~~~
-The first setting of "_" to be an active character is performed in a local
-group so as to not interfere with other packages. The catcode setting
-is repeated with \AtBeginDocument so the definition is in effect for the
-text. However, the catcode setting is repeated immediately when the
-[strings] option is detected.
-
-The definition of the active "_" is essentially:
- \ifmmode \sb \else \BreakableUnderscore \fi
-where "\sb" retains the normal subscript meaning of "_" and where
-"\BreakableUnderscore" is essentially "\_". The rest of the definition
-handles the "\protect"ion without causing \relax to be inserted before
-the character.
-
-\BreakableUnderscore uses "\nobreak\hskip\z@skip" to separate the
-underscore from surrounding words, thus allowing TeX to hyphenate them,
-but preventing free breaks around the underscore. Next, it checks the
-current font family, and uses the underscore character from tt fonts or
-otherwise \textunderscore (which is a character or rule depending on
-the font encoding). After the underscore, it inserts a discretionary
-hyphenation point as "\usc@dischyph", which is usually just "\-"
-except that it still works in the tabbing environment, although it
-will give "\discretionary{}{}{}" under the [nohyphen] option. After
-that, another piece of non-breaking interword glue is inserted.
-Ordinarily, the comparison "\ifx\f@family\ttdefault" will always fail
-because \ttdefault is `long' where \f@family is not (boooo hisss), but
-\ttdefault is redefined to be non-long by "\AtBeginDocument".
-
-The "\_" command is then defined to use "\BreakableUnderscore".
-
-If the [strings] option is not given, then that is all!
-
-Under the [strings] option, the list of special commands is processed to:
-- retain the original command as \US_command (\US_ref)
-- redefine the command as \US@prot\US_command for ordinary commands
- (\ref -> \US@prot\US_ref) or as \US@protopt\US_command when an optional
- argument is possible (\bibitem -> \US@protopt\US_bibitem).
-- self-protecting commands (\cite) retain their self-protection.
-Diagnosing the state of the pre-existing command is done by painful
-contortions involving \meaning.
-
-\US@prot and \US@protopt read the argument, process it with \protect
-enabled, then invoke the saved \US_command.
-
-Modifications:
-~~~~~~~~~~~~~~
-12-Oct-2001 Babel (safe@actives) compatibility and [nohyphen] option.
-
-Test file integrity: ASCII 32-57, 58-126: !"#$%&'()*+,-./0123456789
-:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~