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:
Georg Brandl 2007-12-06 02:00:01 +00:00
parent 3d74adea25
commit c5580ebd91
9 changed files with 299 additions and 1115 deletions

View File

@ -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

View File

@ -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):

View File

@ -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 = []

View File

@ -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):

View File

@ -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):
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):

View File

@ -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}}

View File

@ -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

View File

@ -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%
}

View File

@ -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{|}~