Add beginnings of a LaTeX writer. This is in no way usable code yet.

This commit is contained in:
Georg Brandl committed 2007-12-05 21:11:36 +00:00
1 parent 302aedb1d0
commit 3d74adea25
10 files changed
+3206 -88

No files matched your search

+78 -23
View File
@@ -20,7 +20,7 @@ import cPickle as pickle
import cStringIO as StringIO
from os import path
from docutils.io import StringOutput, DocTreeInput
from docutils.io import StringOutput, FileOutput, DocTreeInput
from docutils.core import publish_parts
from docutils.utils import new_document
from docutils.readers import doctree
@@ -32,11 +32,12 @@ from .util import (get_matching_files, attrdict, status_iterator,
from .htmlhelp import build_hhx
from .patchlevel import get_version_info, get_sys_version_info
from .htmlwriter import HTMLWriter
#from .latexwriter import LaTeXWriter
from .environment import BuildEnvironment
from .latexwriter import LaTeXWriter
from .environment import BuildEnvironment, NoUri
from .highlighting import pygments, get_stylesheet
from .util.console import bold, purple, green
from . import addnodes
# side effect: registers roles and directives
from . import roles
from . import directives
@@ -225,6 +226,16 @@ class Builder(object):
self.msg('creating index...')
self.env.create_index(self)
# another indirection to support methods which don't build files
# individually
self.write(filenames)
# finish (write style files etc.)
self.msg('finishing...')
self.finish()
self.msg('done!')
def write(self, filenames):
if filenames:
# add all TOC files that may have changed
filenames_set = set(filenames)
@@ -246,11 +257,6 @@ class Builder(object):
doctree = self.env.get_and_resolve_doctree(filename, self)
self.write_file(filename, doctree)
# finish (write style files etc.)
self.msg('finishing...')
self.finish()
self.msg('done!')
def prepare_writing(self, filenames):
raise NotImplementedError
@@ -641,36 +647,85 @@ class LaTeXBuilder(Builder):
name = 'latex'
def init(self):
pass
self.filenames = []
def get_outdated_files(self):
# always rebuild everything for now
return self.env.all_files
def get_target_uri(self, source_filename):
# XXX: returns nothing for now
return ''
if source_filename not in self.filenames:
raise NoUri
else:
return ''
def prepare_writing(self, filenames):
self.docwriter = LaTeXWriter(self.config, self.name)
self.docsettings = OptionParser(
def write(self, filenames):
# "filenames" is ignored here...
# 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)
docwriter = LaTeXWriter(self.config, self.name)
docsettings = OptionParser(
defaults=self.env.settings,
components=(self.docwriter,)).get_default_values()
components=(docwriter,)).get_default_values()
def write_file(self, filename, doctree):
destination = StringOutput(encoding='utf-8')
doctree.settings = self.docsettings
output = self.docwriter.write(doctree, destination)
print output
# XXX get names of toplevels automatically?
for docname in ["c-api"]:#, "distutils", "documenting", "extending",
#"howto", "install", "library", "reference",
#"tutorial", "using"]:
# XXX whatsnew missing
destination = FileOutput(
destination_path=path.join(self.outdir, docname+".tex"),
encoding='utf-8')
doctree = self.assemble_doctree(path.join(docname, "index.rst"))
doctree.extend(specials)
print "Writing..."
doctree.settings = docsettings
doctree.settings.filename = docname
output = docwriter.write(doctree, destination)
print "Done!"
def assemble_doctree(self, indexfile):
self.filenames = [indexfile]
print "Processing", indexfile
def process_tree(tree):
tree = tree.deepcopy()
for toctreenode in tree.traverse(addnodes.toctree):
index = toctreenode.parent.index(toctreenode)
includefiles = map(str, toctreenode['includefiles'])
for includefile in includefiles:
try:
print "Including", 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)
return tree
largetree = process_tree(self.env.get_doctree(indexfile))
print "Resolving references..."
self.env.resolve_references(largetree, indexfile, self)
#print largetree
return largetree
def finish(self):
pass
self.msg('copying TeX support files...')
styledirname = path.join(path.dirname(__file__), 'texinputs')
for filename in os.listdir(styledirname):
if not filename.startswith('.'):
shutil.copyfile(path.join(styledirname, filename),
path.join(self.outdir, filename))
builders = {
'html': StandaloneHTMLBuilder,
'web': WebHTMLBuilder,
'htmlhelp': HTMLHelpBuilder,
# 'latex': LaTeXBuilder,
'latex': LaTeXBuilder,
}
+75 -65
View File
@@ -74,6 +74,11 @@ default_substitutions = set([
])
class NoUri(Exception):
"""Raised by get_relative_uri if there is no URI available."""
pass
class DefaultSubstitutions(Transform):
"""
Replace some substitutions if they aren't defined in the document.
@@ -582,73 +587,75 @@ class BuildEnvironment:
typ = node['reftype']
target = node['reftarget']
if typ == 'ref':
filename, labelid, sectname = self.labels.get(target, ('','',''))
if not filename:
newnode = doctree.reporter.system_message(
2, 'undefined label: %s' % target)
print >>self.warning_stream, \
'%s: undefined label: %s' % (docfilename, target)
else:
newnode = nodes.reference('', '')
if filename == docfilename:
newnode['refid'] = labelid
else:
newnode['refuri'] = builder.get_relative_uri(
docfilename, filename) + '#' + labelid
newnode.append(nodes.emphasis(sectname, sectname))
elif typ in ('token', 'term', 'envvar', 'option'):
filename, labelid = self.reftargets.get((typ, target), ('', ''))
if not filename:
if typ == 'term':
try:
if typ == 'ref':
filename, labelid, sectname = self.labels.get(target, ('','',''))
if not filename:
newnode = doctree.reporter.system_message(
2, 'undefined label: %s' % target)
print >>self.warning_stream, \
'%s: term not in glossary: %s' % (docfilename, target)
newnode = contnode
else:
newnode = nodes.reference('', '')
if filename == docfilename:
newnode['refid'] = labelid
'%s: undefined label: %s' % (docfilename, target)
else:
newnode['refuri'] = builder.get_relative_uri(
docfilename, filename) + '#' + labelid
newnode.append(contnode)
elif typ == 'mod':
filename, synopsis, platform, deprecated = \
self.modules.get(target, ('','','', ''))
# just link to an anchor if there are multiple modules in one file
# because the anchor is generally below the heading which is ugly
# but can't be helped easily
anchor = ''
if not filename or filename == docfilename:
# don't link to self
newnode = contnode
else:
if len(self.filemodules[filename]) > 1:
anchor = '#' + 'module-' + target
newnode = nodes.reference('', '')
newnode['refuri'] = (
builder.get_relative_uri(docfilename, filename) + anchor)
newnode['reftitle'] = '%s%s%s' % (
('(%s) ' % platform if platform else ''),
synopsis, (' (deprecated)' if deprecated else ''))
newnode.append(contnode)
else:
modname = node['modname']
clsname = node['classname']
searchorder = 1 if node.hasattr('refspecific') else 0
name, desc = self.find_desc(modname, clsname, target, typ, searchorder)
if not desc:
newnode = contnode
else:
newnode = nodes.reference('', '')
if desc[0] == docfilename:
newnode['refid'] = name
newnode = nodes.reference('', '')
if filename == docfilename:
newnode['refid'] = labelid
else:
newnode['refuri'] = builder.get_relative_uri(
docfilename, filename) + '#' + labelid
newnode.append(nodes.emphasis(sectname, sectname))
elif typ in ('token', 'term', 'envvar', 'option'):
filename, labelid = self.reftargets.get((typ, target), ('', ''))
if not filename:
if typ == 'term':
print >>self.warning_stream, \
'%s: term not in glossary: %s' % (docfilename, target)
newnode = contnode
else:
newnode = nodes.reference('', '')
if filename == docfilename:
newnode['refid'] = labelid
else:
newnode['refuri'] = builder.get_relative_uri(
docfilename, filename) + '#' + labelid
newnode.append(contnode)
elif typ == 'mod':
filename, synopsis, platform, deprecated = \
self.modules.get(target, ('','','', ''))
# just link to an anchor if there are multiple modules in one file
# because the anchor is generally below the heading which is ugly
# but can't be helped easily
anchor = ''
if not filename or filename == docfilename:
# don't link to self
newnode = contnode
else:
if len(self.filemodules[filename]) > 1:
anchor = '#' + 'module-' + target
newnode = nodes.reference('', '')
newnode['refuri'] = (
builder.get_relative_uri(docfilename, desc[0])
+ '#' + name)
newnode.append(contnode)
builder.get_relative_uri(docfilename, filename) + anchor)
newnode['reftitle'] = '%s%s%s' % (
('(%s) ' % platform if platform else ''),
synopsis, (' (deprecated)' if deprecated else ''))
newnode.append(contnode)
else:
modname = node['modname']
clsname = node['classname']
searchorder = 1 if node.hasattr('refspecific') else 0
name, desc = self.find_desc(modname, clsname, target, typ, searchorder)
if not desc:
newnode = contnode
else:
newnode = nodes.reference('', '')
if desc[0] == docfilename:
newnode['refid'] = name
else:
newnode['refuri'] = (
builder.get_relative_uri(docfilename, desc[0])
+ '#' + name)
newnode.append(contnode)
except NoUri:
newnode = contnode
if newnode:
node.replace_self(newnode)
@@ -663,8 +670,11 @@ class BuildEnvironment:
if subword:
add_entry(subword, '', dic=entry[1])
else:
entry[0].append(builder.get_relative_uri('genindex.rst', fn)
+ '#' + tid)
try:
entry[0].append(builder.get_relative_uri('genindex.rst', fn)
+ '#' + tid)
except NoUri:
pass
for fn, entries in self.indexentries.iteritems():
# new entry types must be listed in directives.py!
+448
View File
@@ -0,0 +1,448 @@
# -*- coding: utf-8 -*-
"""
sphinx.latexwriter
~~~~~~~~~~~~~~~~~~
Custom docutils writer for LaTeX.
Much of this code is adapted from Dave Kuhlman's "docpy" writer from his
docutils sandbox.
:copyright: 2007 by Georg Brandl, Dave Kuhlman.
:license: Python license.
"""
import re
import time
from docutils import frontend, nodes, languages, writers, utils
HEADER = r'''%% Generated by Sphinx.
\documentclass[%(papersize)s,%(pointsize)s]{manual}
\usepackage{hyperref}
\title{%(title)s}
\date{%(date)s}
\release{%(release)s}
\author{Guido van Rossum\\
Fred L. Drake, Jr., editor}
\authoraddress{
\strong{Python Software Foundation}\\
Email: \email{docs@python.org}
}
\makeindex
'''
FOOTER = r''''
\printindex
\end{document}
'''
class LaTeXWriter(writers.Writer):
supported = ('sphinxlatex',)
settings_spec = ('No options here.', '', ())
settings_defaults = {}
output = None
def __init__(self, config, buildername):
writers.Writer.__init__(self)
self.config = config
def translate(self):
try:
visitor = LaTeXTranslator(self.document, self.config)
self.document.walkabout(visitor)
self.output = visitor.astext()
except:
import pdb, sys, traceback
traceback.print_exc()
tb = sys.exc_info()[2]
pdb.post_mortem(tb)
TABLE_MODE_NONE = 0
TABLE_MODE_HEAD = 1
TABLE_MODE_BODY = 2
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
class LaTeXTranslator(nodes.NodeVisitor):
sectionnames = ["chapter", "chapter", "section", "subsection",
"subsubsection", "paragraph", "subparagraph"]
def __init__(self, document, config):
nodes.NodeVisitor.__init__(self, document)
self.body = []
self.options = {'papersize': 'a4paper', # XXX
'pointsize': '12pt',
'filename': document.settings.filename,
'title': '',
'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.highlightlang = 'python'
def astext(self):
return (HEADER % self.options) + \
u''.join(self.body) + \
(FOOTER % self.options)
def visit_document(self, node):
self.body.append('\\begin{document}\n\\maketitle\n')
def depart_document(self, node):
pass
def visit_highlightlang(self, node):
self.highlightlang = node['lang']
raise nodes.SkipNode
def visit_comment(self, node):
raise nodes.SkipNode
def visit_section(self, node):
if not self.this_is_the_title:
self.sectionlevel += 1
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 depart_transition(self, node):
pass
def visit_title(self, node):
if 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")
def depart_title(self, node):
self.body.append(self.context.pop())
def visit_field_list(self, node):
raise nodes.SkipNode # XXX
def visit_desc(self, node):
raise nodes.SkipNode # XXX
def visit_seealso(self, node):
raise nodes.SkipNode # XXX
def visit_rubric(self, node):
raise nodes.SkipNode # XXX
def visit_footnote(self, node):
raise nodes.SkipNode # XXX
def visit_table(self, node):
self.tableSpec = TableSpec()
def depart_table(self, node):
self.tableSpec = None
def visit_colspec(self, node):
pass
def depart_colspec(self, node):
pass
def visit_tgroup(self, node):
columnCount = int(node.get('cols', 0))
self.tableSpec.setColumnCount(columnCount)
if columnCount == 2:
self.body.append('\\begin{tableii}{l|l}{textrm}')
elif columnCount == 3:
self.body.append('\\begin{tableiii}{l|l|l}{textrm}')
elif columnCount == 4:
self.body.append('\\begin{tableiv}{l|l|l|l}{textrm}')
elif columnCount == 5:
self.body.append('\\begin{tablev}{l|l|l|l|l}{textrm}')
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')
def visit_thead(self, node):
self.tableSpec.setMode(TABLE_MODE_HEAD)
def depart_thead(self, node):
self.tableSpec.setMode(TABLE_MODE_NONE)
def visit_tbody(self, node):
self.tableSpec.setMode(TABLE_MODE_BODY)
def depart_tbody(self, node):
self.tableSpec.setMode(TABLE_MODE_NONE)
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:
self.body.append('\n\\lineii')
elif self.tableSpec.getColumnCount() == 3:
self.body.append('\n\\lineiii')
elif self.tableSpec.getColumnCount() == 4:
self.body.append('\n\\lineiv')
elif self.tableSpec.getColumnCount() == 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
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(' '))
raise nodes.SkipNode
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('}')
def visit_bullet_list(self, node):
self.body.append('\\begin{itemize}\n' )
def depart_bullet_list(self, node):
self.body.append('\\end{itemize}\n' )
def visit_enumerated_list(self, node):
self.body.append('\\begin{enumerate}\n' )
def depart_enumerated_list(self, node):
self.body.append('\\end{enumerate}\n' )
def visit_list_item(self, node):
# Append "{}" in case the next character is "[", which would break
# LaTeX's list environment (no numbering and the "[" is not printed).
self.body.append(r'\item {} ')
def depart_list_item(self, node):
self.body.append('\n')
def visit_definition_list(self, node):
self.body.append('\\begin{description}\n')
def depart_definition_list(self, node):
self.body.append('\\end{description}\n')
def visit_definition_list_item(self, node):
pass
def depart_definition_list_item(self, node):
pass
def visit_term(self, node):
self.body.append('\\item[')
def depart_term(self, node):
# definition list term.
self.body.append(':]\n')
def visit_classifier(self, node):
pass # XXX
def depart_classifier(self, node):
pass
def visit_definition(self, node):
pass
def depart_definition(self, node):
self.body.append('\n')
def visit_paragraph(self, node):
self.body.append('\n')
def depart_paragraph(self, node):
self.body.append('\n')
def visit_centered(self, node):
self.body.append('\n\\begin{centering}')
def depart_centered(self, node):
self.body.append('\n\\end{centering}')
def visit_note(self, node):
self.body.append('\n\\note{')
def depart_note(self, node):
self.body.append('}\n')
def visit_warning(self, node):
self.body.append('\n\\warning{')
def depart_warning(self, node):
self.body.append('}\n')
def visit_versionmodified(self, node):
#self.body.append('\n\\vmod{')
pass
def depart_versionmodified(self, node):
#self.body.append('}\n')
pass
def visit_target(self, node):
if not (node.has_key('refuri') or node.has_key('refid')
or node.has_key('refname')):
for id in node['ids']:
self.body.append(r'\hypertarget{%s}{' % id)
self.context.append('}' * len(node['ids']))
else:
self.context.append('')
def depart_target(self, node):
self.body.append(self.context.pop())
def visit_index(self, node):
raise nodes.SkipNode # XXX
def visit_reference(self, node):
pass # XXX
def depart_reference(self, node):
pass
def visit_pending_xref(self, node):
pass
def depart_pending_xref(self, node):
pass
def visit_emphasis(self, node):
self.body.append(r'\emph{')
def depart_emphasis(self, node):
self.body.append('}')
def visit_literal_emphasis(self, node):
self.body.append(r'\emph{') # XXX
def depart_literal_emphasis(self, node):
self.body.append('}')
def visit_strong(self, node):
self.body.append(r'\textbf{')
def depart_strong(self, node):
self.body.append('}')
def visit_literal(self, node):
content = self.encode(node.astext().strip())
if 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
def visit_literal_block(self, node):
self.body.append('\n\\begin{verbatim}')
self.verbatim = 1
def depart_literal_block(self, node):
self.body.append('\\end{verbatim}\n')
self.verbatim = 0
def visit_line_block(self, node):
"""line-block:
* whitespace (including linebreaks) is significant
* inline markup is supported.
* 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{')
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.body.append('\n\\end{flushleft}\n')
def visit_line(self, node):
pass
def depart_line(self, node):
pass
def visit_block_quote(self, node):
# If the block quote contains a single object and that object
# is a list, then generate a list not a block quote.
# This lets us indent lists.
done = 0
if len(node.children) == 1:
child = node.children[0]
if isinstance(child, nodes.bullet_list) or \
isinstance(child, nodes.enumerated_list):
done = 1
if not done:
self.body.append('\\begin{quote}\n')
def depart_block_quote(self, node):
done = 0
if len(node.children) == 1:
child = node.children[0]
if isinstance(child, nodes.bullet_list) or \
isinstance(child, nodes.enumerated_list):
done = 1
if not done:
self.body.append('\\end{quote}\n')
replacements = [
(u"\\", ur"\textbackslash{}"),
(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{}"),
]
def encode(self, text):
if self.verbatim:
return text
for x, y in self.replacements:
text = text.replace(x, y)
return text
def visit_Text(self, node):
self.body.append(self.encode(node.astext()))
def depart_Text(self, node):
pass
def unknown_visit(self, node):
raise NotImplementedError("Unknown node: " + node.__class__.__name__)
+329
View File
@@ -0,0 +1,329 @@
% 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}}
+433
View File
@@ -0,0 +1,433 @@
%%% 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
+113
View File
@@ -0,0 +1,113 @@
%
% howto.cls for the Python documentation
%
\NeedsTeXFormat{LaTeX2e}[1995/12/01]
\ProvidesClass{howto}
[1998/02/25 Document class (Python HOWTO)]
\RequirePackage{fancybox}
% Change the options here to get a different set of basic options, This
% is where to add things like "a4paper" or "10pt".
%
\LoadClass[twoside]{article}
\setcounter{secnumdepth}{1}
% Optional packages:
%
% If processing of these documents fails at your TeX installation,
% these may be commented out (independently) to make things work.
% These are both supplied with the current version of the teTeX
% distribution.
%
% The "fancyhdr" package makes nicer page footers reasonable to
% implement, and is used to put the chapter and section information in
% the footers.
%
\RequirePackage{fancyhdr}\typeout{Using fancier footers than usual.}
% Required package:
%
% This gives us all the Python-specific markup that we really want.
% This should come last. Do not change this.
%
\RequirePackage{python}
% This comes after python.sty because it otherwise defines its own
% "seealso" command.
\RequirePackage{makeidx}
% support for module synopsis sections:
\newcommand{\py@ModSynopsisFilename}{\jobname.syn}
% need to do one of these....
\newcommand{\py@doHorizontalRule}{\rule{\textwidth}{1pt}}
% Change the title page to look a bit better, and fit in with the
% fncychap ``Bjarne'' style a bit better.
%
\renewcommand{\maketitle}{
\py@doHorizontalRule
\ifpdf
\begingroup
% This \def is required to deal with multi-line authors; it
% changes \\ to ', ' (comma-space), making it pass muster for
% generating document info in the PDF file.
\def\\{, }
\pdfinfo{
/Author (\@author)
/Title (\@title)
}
\endgroup
\fi
\begin{flushright}
{\rm\Huge\py@HeaderFamily \@title} \par
{\em\large\py@HeaderFamily \py@release\releaseinfo} \par
\vspace{25pt}
{\Large\py@HeaderFamily \@author} \par
\vspace{25pt}
\@date \par
\py@authoraddress \par
\end{flushright}
\@thanks
\setcounter{footnote}{0}
\let\thanks\relax\let\maketitle\relax
\gdef\@thanks{}\gdef\@author{}\gdef\@title{}
}
\let\py@OldTableofcontents=\tableofcontents
\renewcommand{\tableofcontents}{
\begingroup
\parskip = 0mm
\py@OldTableofcontents
\endgroup
\py@doHorizontalRule
\vspace{12pt}
\py@doing@page@targetstrue
}
% Fix the theindex environment to add an entry to the Table of
% Contents; this is much nicer than just having to jump to the end of
% the book and flip around, especially with multiple indexes.
%
\let\py@OldTheindex=\theindex
\renewcommand{\theindex}{
\clearpage
\py@OldTheindex
\addcontentsline{toc}{section}{\indexname}
}
\@ifundefined{fancyhf}{
\pagestyle{plain}}{
\pagestyle{normal}} % start this way; change for
\pagenumbering{arabic} % ToC & chapters
\setcounter{secnumdepth}{2}
\thispagestyle{empty}
+159
View File
@@ -0,0 +1,159 @@
%
% manual.cls for the Python documentation
%
\NeedsTeXFormat{LaTeX2e}[1995/12/01]
\ProvidesClass{manual}
[1998/03/03 Document class (Python manual)]
\RequirePackage{fancybox}
% Change the options here to get a different set of basic options, but only
% if you have to.
%
\LoadClass[twoside,openright]{report}
\setcounter{secnumdepth}{2}
% Optional packages:
%
% If processing of these documents fails at your TeX installation,
% these may be commented out (independently) to make things work.
% These are both supplied with the current version of the teTeX
% distribution.
%
% The "fancyhdr" package makes nicer page footers reasonable to
% implement, and is used to put the chapter and section information in
% the footers.
%
\RequirePackage{fancyhdr}\typeout{Using fancier footers than usual.}
% Required packages:
%
% The "fncychap" package is used to get the nice chapter headers. The
% .sty file is distributed with Python, so you should not need to disable
% it. You'd also end up with a mixed page style; uglier than stock LaTeX!
%
\RequirePackage[Bjarne]{fncychap}\typeout{Using fancy chapter headings.}
% Do horizontal rules it this way to match:
\newcommand{\py@doHorizontalRule}{\mghrulefill{\RW}}
%
%
% This gives us all the Python-specific markup that we really want.
% This should come last. Do not change this.
%
\RequirePackage{python}
% This comes after python.sty because it otherwise defines its own
% "seealso" command.
\RequirePackage{makeidx}
% support for module synopsis sections:
\newcommand{\py@ModSynopsisFilename}{\jobname\thechapter.syn}
\let\py@OldChapter=\chapter
\renewcommand{\chapter}{
\py@ProcessModSynopsis
\py@closeModSynopsisFile
\py@OldChapter
}
% Change the title page to look a bit better, and fit in with the
% fncychap ``Bjarne'' style a bit better.
%
\renewcommand{\maketitle}{%
\begin{titlepage}%
\let\footnotesize\small
\let\footnoterule\relax
\py@doHorizontalRule%
\ifpdf
\begingroup
% This \def is required to deal with multi-line authors; it
% changes \\ to ', ' (comma-space), making it pass muster for
% generating document info in the PDF file.
\def\\{, }
\pdfinfo{
/Author (\@author)
/Title (\@title)
}
\endgroup
\fi
\begin{flushright}%
{\rm\Huge\py@HeaderFamily \@title \par}%
{\em\LARGE\py@HeaderFamily \py@release\releaseinfo \par}
\vfill
{\LARGE\py@HeaderFamily \@author \par}
\vfill\vfill
{\large
\@date \par
\vfill
\py@authoraddress \par
}%
\end{flushright}%\par
\@thanks
\end{titlepage}%
\setcounter{footnote}{0}%
\let\thanks\relax\let\maketitle\relax
\gdef\@thanks{}\gdef\@author{}\gdef\@title{}
}
% Catch the end of the {abstract} environment, but here make sure the
% abstract is followed by a blank page if the 'openright' option is used.
%
\let\py@OldEndAbstract=\endabstract
\renewcommand{\endabstract}{
\if@openright
\ifodd\value{page}
\typeout{Adding blank page after the abstract.}
\vfil\pagebreak
\fi
\fi
\py@OldEndAbstract
}
% This wraps the \tableofcontents macro with all the magic to get the
% spacing right and have the right number of pages if the 'openright'
% option has been used. This eliminates a fair amount of crud in the
% individual document files.
%
\let\py@OldTableofcontents=\tableofcontents
\renewcommand{\tableofcontents}{%
\setcounter{page}{1}%
\pagebreak%
\pagestyle{plain}%
{%
\parskip = 0mm%
\py@OldTableofcontents%
\if@openright%
\ifodd\value{page}%
\typeout{Adding blank page after the table of contents.}%
\pagebreak\hspace{0pt}%
\fi%
\fi%
\cleardoublepage%
}%
\pagenumbering{arabic}%
\@ifundefined{fancyhf}{}{\pagestyle{normal}}%
\py@doing@page@targetstrue%
}
% This is needed to get the width of the section # area wide enough in the
% library reference. Doing it here keeps it the same for all the manuals.
%
\renewcommand*\l@section{\@dottedtocline{1}{1.5em}{2.6em}}
\renewcommand*\l@subsection{\@dottedtocline{2}{4.1em}{3.5em}}
\setcounter{tocdepth}{1}
% Fix the theindex environment to add an entry to the Table of
% Contents; this is much nicer than just having to jump to the end of
% the book and flip around, especially with multiple indexes.
%
\let\py@OldTheindex=\theindex
\renewcommand{\theindex}{
\cleardoublepage
\py@OldTheindex
\addcontentsline{toc}{chapter}{\indexname}
}
+11
View File
@@ -0,0 +1,11 @@
line_max 100
headings_flag 1
heading_prefix " \\bigletter "
preamble "\\begin{theindex}
\\def\\bigletter#1{{\\Large\\sffamily#1}\\nopagebreak\\vspace{1mm}}
"
symhead_positive "{Symbols}"
numhead_positive "{Numbers}"
File diff suppressed because it is too large. Load diff
+232
View File
@@ -0,0 +1,232 @@
% 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{|}~