mirror of
https://github.com/sphinx-doc/sphinx.git
synced 2025-02-25 18:55:22 -06:00
Continue work on the PDF builder. The documents now build and run through LaTeX.
Some elements are still missing though.
This commit is contained in:
parent
3d74adea25
commit
c5580ebd91
@ -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
|
||||
|
@ -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):
|
||||
|
@ -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 = []
|
||||
|
@ -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):
|
||||
|
@ -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.verbatim = 0
|
||||
self.this_is_the_title = 1
|
||||
self.sectionlevel = 0 # XXX starts with chapter now
|
||||
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.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):
|
||||
if self.tableSpec.firstRow:
|
||||
pass
|
||||
## if self.tableSpec.getMode() == TABLE_MODE_HEAD:
|
||||
## self.body.append('}')
|
||||
## elif self.tableSpec.getMode() == TABLE_MODE_BODY:
|
||||
## self.body.append('}')
|
||||
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']:
|
||||
if id not in self.written_ids:
|
||||
self.body.append(r'\hypertarget{%s}{' % id)
|
||||
self.context.append('}' * len(node['ids']))
|
||||
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):
|
||||
|
@ -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}}
|
@ -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
|
||||
|
||||
|
@ -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%
|
||||
}
|
||||
|
||||
|
@ -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{|}~
|
Loading…
Reference in New Issue
Block a user