summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--etc/todo/scanners/yaml.rb105
-rw-r--r--lib/coderay/encoders/html/output.rb2
-rw-r--r--lib/coderay/helpers/file_type.rb5
-rw-r--r--lib/coderay/scanners/_map.rb3
-rw-r--r--lib/coderay/scanners/css.rb1
-rw-r--r--lib/coderay/scanners/html.rb2
-rw-r--r--lib/coderay/scanners/yaml.rb114
-rw-r--r--lib/coderay/styles/cycnus.rb8
-rw-r--r--test/scanners/coderay_suite.rb4
-rw-r--r--test/scanners/yaml/basic.expected.raydebug871
-rw-r--r--test/scanners/yaml/basic.in.yml871
-rw-r--r--test/scanners/yaml/faq.expected.raydebug492
-rw-r--r--test/scanners/yaml/faq.in.yml492
-rw-r--r--test/scanners/yaml/gemspec.expected.raydebug111
-rw-r--r--test/scanners/yaml/gemspec.in.yml111
-rw-r--r--test/scanners/yaml/latex_entities.expected.raydebug2414
-rw-r--r--test/scanners/yaml/latex_entities.in.yml2414
-rw-r--r--test/scanners/yaml/suite.rb2
-rw-r--r--test/scanners/yaml/threshold.expected.raydebug772
-rw-r--r--test/scanners/yaml/threshold.in.yml772
20 files changed, 9557 insertions, 9 deletions
diff --git a/etc/todo/scanners/yaml.rb b/etc/todo/scanners/yaml.rb
new file mode 100644
index 0000000..53b052d
--- /dev/null
+++ b/etc/todo/scanners/yaml.rb
@@ -0,0 +1,105 @@
+require 'syntax'
+
+module Syntax
+
+ # A simple implementation of an YAML lexer. It handles most cases. It is
+ # not a validating lexer.
+ class YAML < Tokenizer
+
+ # Step through a single iteration of the tokenization process. This will
+ # yield (potentially) many tokens, and possibly zero tokens.
+ def step
+ if bol?
+ case
+ when scan(/---(\s*.+)?$/)
+ start_group :document, matched
+ when scan(/(\s*)([a-zA-Z][-\w]*)(\s*):/)
+ start_group :normal, subgroup(1)
+ start_group :key, subgroup(2)
+ start_group :normal, subgroup(3)
+ start_group :punct, ":"
+ when scan(/(\s*)-/)
+ start_group :normal, subgroup(1)
+ start_group :punct, "-"
+ when scan(/\s*$/)
+ start_group :normal, matched
+ when scan(/#.*$/)
+ start_group :comment, matched
+ else
+ append getch
+ end
+ else
+ case
+ when scan(/[\n\r]+/)
+ start_group :normal, matched
+ when scan(/[ \t]+/)
+ start_group :normal, matched
+ when scan(/!+(.*?^)?\S+/)
+ start_group :type, matched
+ when scan(/&\S+/)
+ start_group :anchor, matched
+ when scan(/\*\S+/)
+ start_group :ref, matched
+ when scan(/\d\d:\d\d:\d\d/)
+ start_group :time, matched
+ when scan(/\d\d\d\d-\d\d-\d\d\s\d\d:\d\d:\d\d(\.\d+)? [-+]\d\d:\d\d/)
+ start_group :date, matched
+ when scan(/['"]/)
+ start_group :punct, matched
+ scan_string matched
+ when scan(/:\w+/)
+ start_group :symbol, matched
+ when scan(/[:]/)
+ start_group :punct, matched
+ when scan(/#.*$/)
+ start_group :comment, matched
+ when scan(/>-?/)
+ start_group :punct, matched
+ start_group :normal, scan(/.*$/)
+ append getch until eos? || bol?
+ return if eos?
+ indent = check(/ */)
+ start_group :string
+ loop do
+ line = check_until(/[\n\r]|\Z/)
+ break if line.nil?
+ if line.chomp.length > 0
+ this_indent = line.chomp.match( /^\s*/ )[0]
+ break if this_indent.length < indent.length
+ end
+ append scan_until(/[\n\r]|\Z/)
+ end
+ else
+ start_group :normal, scan_until(/(?=$|#)/)
+ end
+ end
+ end
+
+ private
+
+ def scan_string( delim )
+ regex = /(?=[#{delim=="'" ? "" : "\\\\"}#{delim}])/
+ loop do
+ text = scan_until( regex )
+ if text.nil?
+ start_group :string, scan_until( /\Z/ )
+ break
+ else
+ start_group :string, text unless text.empty?
+ end
+
+ case peek(1)
+ when "\\"
+ start_group :expr, scan(/../)
+ else
+ start_group :punct, getch
+ break
+ end
+ end
+ end
+
+ end
+
+ SYNTAX["yaml"] = YAML
+
+end
diff --git a/lib/coderay/encoders/html/output.rb b/lib/coderay/encoders/html/output.rb
index 8def95e..32ee5be 100644
--- a/lib/coderay/encoders/html/output.rb
+++ b/lib/coderay/encoders/html/output.rb
@@ -177,7 +177,7 @@ module Encoders
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="de">
<head>
<meta http-equiv="content-type" content="text/html; charset=utf-8" />
- <title>CodeRay HTML Encoder Example</title>
+ <title>CodeRay Output</title>
<style type="text/css">
<%CSS%>
</style>
diff --git a/lib/coderay/helpers/file_type.rb b/lib/coderay/helpers/file_type.rb
index e955b9d..fbc95ec 100644
--- a/lib/coderay/helpers/file_type.rb
+++ b/lib/coderay/helpers/file_type.rb
@@ -88,7 +88,12 @@ module FileType
'cpp' => :c,
'c' => :c,
'h' => :c,
+ 'java' => :java,
'js' => :java_script,
+ 'json' => :json,
+ 'diff' => :diff,
+ 'patch' => :diff,
+ 'css' => :css,
'xml' => :xml,
'htm' => :html,
'html' => :html,
diff --git a/lib/coderay/scanners/_map.rb b/lib/coderay/scanners/_map.rb
index e8dfa07..60d57ae 100644
--- a/lib/coderay/scanners/_map.rb
+++ b/lib/coderay/scanners/_map.rb
@@ -7,7 +7,8 @@ module Scanners
:irb => :ruby,
:xhtml => :nitro_xhtml,
:javascript => :java_script,
- :nitro => :nitro_xhtml
+ :nitro => :nitro_xhtml,
+ :yml => :yaml
default :plain
diff --git a/lib/coderay/scanners/css.rb b/lib/coderay/scanners/css.rb
index 897e27a..848f136 100644
--- a/lib/coderay/scanners/css.rb
+++ b/lib/coderay/scanners/css.rb
@@ -168,7 +168,6 @@ module Scanners
raise_inspect 'Empty token', tokens unless match
tokens << [match, kind]
- # tokens << [states.inspect, :error]
end
diff --git a/lib/coderay/scanners/html.rb b/lib/coderay/scanners/html.rb
index 5f647d3..bb7ad3a 100644
--- a/lib/coderay/scanners/html.rb
+++ b/lib/coderay/scanners/html.rb
@@ -2,8 +2,6 @@ module CodeRay
module Scanners
# HTML Scanner
- #
- # $Id$
class HTML < Scanner
include Streamable
diff --git a/lib/coderay/scanners/yaml.rb b/lib/coderay/scanners/yaml.rb
new file mode 100644
index 0000000..06da907
--- /dev/null
+++ b/lib/coderay/scanners/yaml.rb
@@ -0,0 +1,114 @@
+module CodeRay
+module Scanners
+
+ # YAML Scanner
+ #
+ # Based on the YAML scanner from Syntax by Jamis Buck.
+ class XML < Scanner
+
+ register_for :yaml
+ file_extension 'yml'
+
+ def scan_tokens tokens, options
+
+ value_expected = nil
+ states = :initial
+
+ until eos?
+
+ kind = nil
+ match = nil
+
+ if match = scan(/\s+/)
+ kind = :space
+ state = :initial if match.index(?\n)
+
+ elsif match = scan(/#.*/)
+ kind = :comment
+
+ elsif bol? and case
+ when scan(/---/)
+ kind = :tag
+ end
+
+ elsif state == :value and case
+ when scan(/(?![!*&]).+(?=$|\s+#)/)
+ kind = :string
+ end
+
+ elsif case
+ when match = scan(/[-:](?= )/)
+ state = :value if state == :colon && (match == ':' || match == '-')
+ kind = :operator
+ when match = scan(/[,{}\[\]]/)
+ kind = :operator
+ when state == :initial && scan(/\w+(?=:)/)
+ kind = :key
+ state = :colon
+ when state == :initial && match = scan(/(?:"[^"]*"|'[^']*')(?=:)/)
+ tokens << [:open, :key]
+ tokens << [match[0,1], :delimiter]
+ tokens << [match[1..-2], :content]
+ tokens << [match[-1,1], :delimiter]
+ tokens << [:close, :key]
+ state = :colon
+ next
+ when scan(/(![\w\/]+)(:([\w:]+))?/)
+ tokens << [self[1], :type]
+ if self[2]
+ tokens << [':', :operator]
+ tokens << [self[3], :class]
+ end
+ next
+ when scan(/&\S+/)
+ kind = :variable
+ when scan(/\*\w+/)
+ kind = :global_variable
+ when scan(/\d\d:\d\d:\d\d/)
+ kind = :oct
+ when scan(/\d\d\d\d-\d\d-\d\d\s\d\d:\d\d:\d\d(\.\d+)? [-+]\d\d:\d\d/)
+ kind = :oct
+ when scan(/:\w+/)
+ kind = :symbol
+ when scan(/[^:\s]+/)
+ kind = :string
+ # when scan(/>-?/)
+ # kind = :punct
+ # kind = :normal, scan(/.*$/)
+ # append getch until eos? || bol?
+ # return if eos?
+ # indent = check(/ */)
+ # kind = :string
+ # loop do
+ # line = check_until(/[\n\r]|\Z/)
+ # break if line.nil?
+ # if line.chomp.length > 0
+ # this_indent = line.chomp.match( /^\s*/ )[0]
+ # break if this_indent.length < indent.length
+ # end
+ # append scan_until(/[\n\r]|\Z/)
+ # end
+ end
+
+ else
+ getch
+ kind = :error
+
+ end
+
+ match ||= matched
+
+ raise_inspect 'Error token %p in line %d' % [[match, kind], line], tokens if $DEBUG && !kind
+ raise_inspect 'Empty token', tokens unless match
+
+ tokens << [match, kind]
+
+ end
+
+ tokens
+ end
+
+ end
+
+end
+end
diff --git a/lib/coderay/styles/cycnus.rb b/lib/coderay/styles/cycnus.rb
index c0dab99..0a1c6f8 100644
--- a/lib/coderay/styles/cycnus.rb
+++ b/lib/coderay/styles/cycnus.rb
@@ -107,15 +107,15 @@ ol.CodeRay li { white-space: pre }
.rx .mod { color:#C2C }
.rx .fu { color:#404; font-weight: bold }
-.s { background-color:#fff0f0 }
+.s { background-color:#fff0f0; color: #D20; }
.s .s { background-color:#ffe0e0 }
.s .s .s { background-color:#ffd0d0 }
-.s .k { color: #D20; }
+.s .k { }
.s .ch { color: #b0b; }
.s .dl { color: #710; }
-.sh { background-color:#f0fff0 }
-.sh .k { color:#2B2 }
+.sh { background-color:#f0fff0; color:#2B2 }
+.sh .k { }
.sh .dl { color:#161 }
.sy { color:#A60 }
diff --git a/test/scanners/coderay_suite.rb b/test/scanners/coderay_suite.rb
index 321ee62..e434d97 100644
--- a/test/scanners/coderay_suite.rb
+++ b/test/scanners/coderay_suite.rb
@@ -98,6 +98,10 @@ module CodeRay
MAX_CODE_SIZE_TO_HIGHLIGHT = 500_000_000
MAX_CODE_SIZE_TO_TEST = 500_000_000
DEFAULT_MAX = 1024
+ elsif ENV['fast']
+ MAX_CODE_SIZE_TO_HIGHLIGHT = 5_000_000
+ MAX_CODE_SIZE_TO_TEST = 1_000_000
+ DEFAULT_MAX = 16
else
MAX_CODE_SIZE_TO_HIGHLIGHT = 5_000_000
MAX_CODE_SIZE_TO_TEST = 5_000_000
diff --git a/test/scanners/yaml/basic.expected.raydebug b/test/scanners/yaml/basic.expected.raydebug
new file mode 100644
index 0000000..b4f776b
--- /dev/null
+++ b/test/scanners/yaml/basic.expected.raydebug
@@ -0,0 +1,871 @@
+tag(---)
+key(name)operator(:) string(paragraphs)
+key(desc)operator(:) string(Textile looks for paragraphs in your text. Paragraphs are separated by one blank line. Every paragraph is translated as an HTML paragraph.)
+key(in)operator(:) string(|-)
+ string(A) string(single) string(paragraph.)
+
+ string(Followed) string(by) string(another.)
+key(html)operator(:) string(|-)
+ string(<p>A) string(single) string(paragraph.</p>)
+ string(<p>Followed) string(by) string(another.</p>)
+tag(---)
+key(name)operator(:) string(block containing block start)
+key(in)operator(:) string(|-)
+ string(I) string(saw) string(a) string(ship.) string(It) string(ate) string(my) string(elephant.)
+key(html)operator(:) string(|-)
+ string(<p>I) string(saw) string(a) string(ship.) string(It) string(ate) string(my) string(elephant.</p>)
+tag(---)
+key(name)operator(:) string(extended block containing block start)
+key(in)operator(:) string(|-)
+ string(p..) string(I) string(saw) string(a) string(ship.) string(It) string(ate) string(my) string(elephant.)
+
+ string(When) string(the) string(elephant) string(comes) string(to) string(take) string(a) string(p.) string(you...)
+key(html)operator(:) string(|-)
+ string(<p>I) string(saw) string(a) string(ship.) string(It) string(ate) string(my) string(elephant.</p>)
+ string(<p>When) string(the) string(elephant) string(comes) string(to) string(take) string(a) string(p.) string(you&#8230;</p>)
+tag(---)
+key(name)operator(:) string(blockquote containing block start)
+key(in)operator(:) string(|-)
+ string(bq.) string(I) string(saw) string(a) string(ship.) string(It) string(ate) string(my) string(elephant.)
+key(html)operator(:) string(|-)
+ string(<blockquote>)
+ string(<p>I) string(saw) string(a) string(ship.) string(It) string(ate) string(my) string(elephant.</p>)
+ string(</blockquote>)
+tag(---)
+key(name)operator(:) string(extended blockquote containing block start)
+key(in)operator(:) string(|-)
+ string(bq..) string(I) string(saw) string(a) string(ship.) string(It) string(ate) string(my) string(elephant.)
+
+ string(When) string(the) string(elephant) string(comes) string(to) string(take) string(a) string(p.) string(you...)
+key(html)operator(:) string(|-)
+ string(<blockquote>)
+ string(<p>I) string(saw) string(a) string(ship.) string(It) string(ate) string(my) string(elephant.</p>)
+ string(<p>When) string(the) string(elephant) string(comes) string(to) string(take) string(a) string(p.) string(you&#8230;</p>)
+ string(</blockquote>)
+tag(---)
+key(name)operator(:) string(notextile block containing block start)
+key(in)operator(:) string(|-)
+ string(notextile.) string(I) string(saw) string(a) string(ship.) string(It) string(ate) string(my) string(elephant.)
+key(html)operator(:) string(|-)
+ string(I) string(saw) string(a) string(ship.) string(It) string(ate) string(my) string(elephant.)
+key(valid_html)operator(:) string(false)
+tag(---)
+key(name)operator(:) string(extended notextile block containing block start)
+key(in)operator(:) string(|-)
+ string(notextile..) string(I) string(saw) string(a) string(ship.) string(It) string(ate) string(my) string(elephant.)
+
+ string(When) string(the) string(elephant) string(comes) string(to) string(take) string(a) string(p.) string(you...)
+key(html)operator(:) string(|-)
+ string(I) string(saw) string(a) string(ship.) string(It) string(ate) string(my) string(elephant.)
+
+ string(When) string(the) string(elephant) string(comes) string(to) string(take) string(a) string(p.) string(you...)
+key(valid_html)operator(:) string(false)
+tag(---)
+key(name)operator(:) string(pre block containing block start)
+key(in)operator(:) string(|-)
+ string(pre.) string(I) string(saw) string(a) string(ship.) string(It) string(ate) string(my) string(elephant.)
+key(html)operator(:) string(|-)
+ string(<pre>I) string(saw) string(a) string(ship.) string(It) string(ate) string(my) string(elephant.</pre>)
+tag(---)
+key(name)operator(:) string(extended pre block containing block start)
+key(in)operator(:) string(|-)
+ string(pre..) string(I) string(saw) string(a) string(ship.) string(It) string(ate) string(my) string(elephant.)
+
+ string(When) string(the) string(elephant) string(comes) string(to) string(take) string(a) string(p.) string(you...)
+key(html)operator(:) string(|-)
+ string(<pre>I) string(saw) string(a) string(ship.) string(It) string(ate) string(my) string(elephant.</pre>)
+
+ string(<pre>When) string(the) string(elephant) string(comes) string(to) string(take) string(a) string(p.) string(you&#8230;</pre>)
+ string(---)
+key(name)operator(:) string(html tags)
+key(desc)operator(:) string(You can certainly use HTML tags inside your Textile documents. HTML will only be escaped if it&#8217;s found in a <code>pre</code> or <code>code</code> block.)
+key(in)operator(:) string(|-)
+ string(I) string(am) string(<b>very</b>) string(serious.)
+
+ string(<pre>)
+ string(I) string(am) string(<b>very</b>) string(serious.)
+ string(</pre>)
+key(html)operator(:) string(|-)
+ string(<p>I) string(am) string(<b>very</b>) string(serious.</p>)
+ string(<pre>)
+ string(I) string(am) variable(&lt;b&gt;very&lt;/b&gt;) string(serious.)
+ string(</pre>)
+tag(---)
+key(name)operator(:) string(line breaks)
+key(desc)operator(:) string(Line breaks are converted to HTML breaks.)
+key(in)operator(:) string(|-)
+ string(I) string(spoke.)
+ string(And) string(none) string(replied.)
+key(html)operator(:) string(|-)
+ string(<p>I) string(spoke.<br) string(/>)
+ string(And) string(none) string(replied.</p>)
+key(html_no_breaks)operator(:) string(|-)
+ string(<p>I) string(spoke.)
+ string(And) string(none) string(replied.</p>)
+key(lite_mode_html)operator(:) string(|-)
+ string(I) string(spoke.<br) string(/>)
+ string(And) string(none) string(replied.)
+tag(---)
+key(name)operator(:) string(curly quotes)
+key(desc)operator(:) string(Single- and double-quotes around words or phrases are converted to curly quotations, much easier on the eye.)
+key(in)operator(:) string("\\"Observe!\\"")
+key(html)operator(:) string(<p>&#8220;Observe!&#8221;</p>)
+tag(---)
+key(name)operator(:) string(quotes contained in multi-paragraph quotes)
+key(in)operator(:) string(|-)
+ string("I) string(first) string(learned) string(about) string(this) string(thing) string(called) string("Redcloth") string(several) string(years) string(ago.)
+
+ string("It's) string(wonderful.")
+key(html)operator(:) string(|-)
+ string(<p>&#8220;I) string(first) string(learned) string(about) string(this) string(thing) string(called) variable(&#8220;Redcloth&#8221;) string(several) string(years) string(ago.</p>)
+ string(<p>&#8220;It&#8217;s) string(wonderful.&#8221;</p>)
+tag(---)
+key(name)operator(:) string(double hyphens)
+key(desc)operator(:) string(Double hyphens are replaced with an em-dash.)
+key(in)operator(:) string(Observe--very nice!)
+key(html)operator(:) string(<p>Observe&#8212;very nice!</p>)
+key(latex)operator(:) string("Observe---very nice!\\n\\n")
+tag(---)
+key(name)operator(:) string(double hyphens with spaces)
+key(desc)operator(:) string(Double hyphens are replaced with an em-dash and surrounding spaces are preserved.)
+key(in)operator(:) string(Observe -- very nice!)
+key(html)operator(:) string(<p>Observe &#8212; very nice!</p>)
+key(latex)operator(:) string("Observe --- very nice!\\n\\n")
+tag(---)
+key(name)operator(:) string(parenthetical phrase set off with em dashes)
+key(desc)operator(:) string(Sentences with two em dashes should not turn them into strikethroughs)
+key(in)operator(:) string(An emdash indicates a parenthetical thought--like this one--which is set apart from the rest of a sentence.)
+key(html)operator(:) string("<p>An emdash indicates a parenthetical thought&#8212;like this one&#8212;which is set apart from the rest of a sentence.</p>")
+key(latex)operator(:) string("An emdash indicates a parenthetical thought---like this one---which is set apart from the rest of a sentence.\\n\\n")
+tag(---)
+key(name)operator(:) string(parenthetical phrase set off with em dashes surrounded by spaces)
+key(desc)operator(:) string(Sentences with two em dashes should not turn them into strikethroughs)
+key(in)operator(:) string(An emdash indicates a parenthetical thought -- like this one -- which is set apart from the rest of a sentence.)
+key(html)operator(:) string("<p>An emdash indicates a parenthetical thought &#8212; like this one &#8212; which is set apart from the rest of a sentence.</p>")
+key(latex)operator(:) string("An emdash indicates a parenthetical thought --- like this one --- which is set apart from the rest of a sentence.\\n\\n")
+tag(---)
+key(name)operator(:) string(single hyphens with spaces)
+key(desc)operator(:) string(Single hyphens are replaced with en-dashes if they are surrounded by spaces.)
+key(in)operator(:) string(Observe - tiny and brief.)
+key(html)operator(:) string(<p>Observe &#8211; tiny and brief.</p>)
+key(latex)operator(:) string("Observe--tiny and brief.\\n\\n")
+tag(---)
+key(name)operator(:) string(midword hyphens )
+key(desc)operator(:) string(Single hyphens are left alone if not surrounded by spaces.)
+key(in)operator(:) string(Observe the nicely-done hyphen.)
+key(html)operator(:) string(<p>Observe the nicely-done hyphen.</p>)
+tag(---)
+key(name)operator(:) string(ellipses)
+key(desc)operator(:) string(Triplets of periods become an ellipsis.)
+key(in)operator(:) string(Observe...)
+key(html)operator(:) string(<p>Observe&#8230;</p>)
+key(lite_mode_html)operator(:) string(Observe&#8230;)
+tag(---)
+key(name)operator(:) string(dimension sign)
+key(desc)operator(:) string(The letter 'x' becomes a dimension sign when used between digits.)
+key(in)operator(:) string("Observe: 2x3.")
+key(html)operator(:) string("<p>Observe: 2&#215;3.</p>")
+tag(---)
+key(name)operator(:) string(dimension sign with space after)
+key(in)operator(:) string("The room is 2x3 inches big.")
+key(html)operator(:) string("<p>The room is 2&#215;3 inches big.</p>")
+tag(---)
+key(name)operator(:) string(dimension sign with spaces)
+key(in)operator(:) string("Observe: 2 x 4.")
+key(html)operator(:) string("<p>Observe: 2 &#215; 4.</p>")
+tag(---)
+key(name)operator(:) string(dimension signs chained)
+key(in)operator(:) string("Observe: 2x3x4.")
+key(html)operator(:) string("<p>Observe: 2&#215;3&#215;4.</p>")
+key(lite_mode_html)operator(:) string("Observe: 2&#215;3&#215;4.")
+tag(---)
+key(name)operator(:) string(dimension signs with double primes)
+key(in)operator(:) string('My mouse: 2.5" x 4".')
+key(html)operator(:) string('<p>My mouse: 2.5&#8243; &#215; 4&#8243;.</p>')
+tag(---)
+key(name)operator(:) string(dimension signs with single primes)
+key(in)operator(:) string("My office: 5' x 4.5'.")
+key(html)operator(:) string("<p>My office: 5&#8242; &#215; 4.5&#8242;.</p>")
+tag(---)
+key(name)operator(:) string(trademark and copyright)
+key(desc)operator(:) string(Conversion of trademark and copyright symbols.)
+key(in)operator(:) string(one(TM\), two(R\), three(C\).)
+key(html)operator(:) string(<p>one&#8482;, two&#174;, three&#169;.</p>)
+key(lite_mode_html)operator(:) string(one&#8482;, two&#174;, three&#169;.)
+tag(---)
+key(name)operator(:) string(headers)
+key(desc)operator(:) string(To make an entire paragraph into a Header, place “h<em>n</em>.” at its beginning, where <em>n</em> is a number from 1-6.)
+key(in)operator(:) string(h3. Header 3)
+key(html)operator(:) string(<h3>Header 3</h3>)
+tag(---)
+key(name)operator(:) string(blockquote)
+key(desc)operator(:) string(To make an entire paragraph into a block quotation, place “bq.” before it.)
+key(in)operator(:) string(|-)
+ string(Any) string(old) string(text)
+
+ string(bq.) string(A) string(block) string(quotation.)
+
+ string(Any) string(old) string(text)
+key(html)operator(:) string(|-)
+ string(<p>Any) string(old) string(text</p>)
+ string(<blockquote>)
+ string(<p>A) string(block) string(quotation.</p>)
+ string(</blockquote>)
+ string(<p>Any) string(old) string(text</p>)
+tag(---)
+key(name)operator(:) string(footnote reference)
+key(desc)operator(:) string(Numeric references within text to footnotes appear between square brackets.)
+key(in)operator(:) string(This is covered elsewhere[1].)
+key(html)operator(:) string(<p>This is covered elsewhere<sup class="footnote"><a href="#fn1">1</a></sup>.</p>)
+tag(---)
+key(name)operator(:) string(footnote)
+key(desc)operator(:) string(To create the footnote that corresponds to its reference within the text, begin a new paragraph with fn and the footnote&#8217;s number, followed by a dot and a space.)
+key(in)operator(:) string(fn1. Down here, in fact.)
+key(html)operator(:) string(<p class="footnote" id="fn1"><sup>1</sup> Down here, in fact.</p>)
+tag(---)
+key(name)operator(:) string(em)
+key(desc)operator(:) string(Emphasis to text is added by surrounding a phrase with underscores. In HTML, this often appears as <em>italics</em>.)
+key(in)operator(:) string(I _believe_ every word.)
+key(html)operator(:) string(<p>I <em>believe</em> every word.</p>)
+key(lite_mode_html)operator(:) string("I <em>believe</em> every word.")
+tag(---)
+key(name)operator(:) string(strong)
+key(desc)operator(:) string(Strength can be give to text by surrounding with asterisks. In HTML, this strength appears as <strong>bold</strong>.)
+key(in)operator(:) string(And then? She *fell*!)
+key(html)operator(:) string(<p>And then? She <strong>fell</strong>!</p>)
+key(lite_mode_html)operator(:) string("And then? She <strong>fell</strong>!")
+tag(---)
+key(name)operator(:) string(strong phrase beginning with a number)
+key(desc)operator(:) string(A strong phrase at the beginning of a line that begins with a number should not be recognized as a ul with a start value (no such thing\))
+key(in)operator(:) string("*10 times as many*")
+key(html)operator(:) string("<p><strong>10 times as many</strong></p>")
+tag(---)
+key(name)operator(:) string(force bold italics)
+key(desc)operator(:) string(Both italics and bold can be forced by doubling the underscores or asterisks.)
+key(in)operator(:) string(|-)
+ string(I) string(__know__.)
+ string(I) string(**really**) string(__know__.)
+key(html)operator(:) string(|-)
+ string(<p>I) string(<i>know</i>.<br) string(/>)
+ string(I) string(<b>really</b>) string(<i>know</i>.</p>)
+tag(---)
+key(name)operator(:) string(citation)
+key(desc)operator(:) string(Use double question marks to indicate <em>citation</em>. The title of a book, for instance.)
+key(in)operator(:) string(??Cat's Cradle?? by Vonnegut)
+key(html)operator(:) string(<p><cite>Cat&#8217;s Cradle</cite> by Vonnegut</p>)
+tag(---)
+key(name)operator(:) string(code phrases)
+key(desc)operator(:) string(Code phrases can be surrounded by at-symbols.)
+key(in)operator(:) string(Convert with @r.to_html@)
+key(html)operator(:) string(<p>Convert with <code>r.to_html</code></p>)
+key(lite_mode_html)operator(:) string(Convert with <code>r.to_html</code>)
+tag(---)
+key(name)operator(:) string(code phrases not created with multiple email addresses)
+key(in)operator(:) string(Please email why@domain.com or jason@domain.com.)
+key(html)operator(:) string(<p>Please email why@domain.com or jason@domain.com.</p>)
+tag(---)
+key(name)operator(:) string(del)
+key(desc)operator(:) string(To indicate a passage which has been deleted, surround the passage with hypens.)
+key(in)operator(:) string(I'm -sure- not sure.)
+key(html)operator(:) string(<p>I&#8217;m <del>sure</del> not sure.</p>)
+tag(---)
+key(name)operator(:) string(ins)
+key(desc)operator(:) string(Pluses around a passage indicate its insertion.)
+key(in)operator(:) string(You are a +pleasant+ child.)
+key(html)operator(:) string(<p>You are a <ins>pleasant</ins> child.</p>)
+tag(---)
+key(name)operator(:) string(superscript)
+key(desc)operator(:) string(To superscript a phrase, surround with carets.)
+key(in)operator(:) string(a ^2^ + b ^2^ = c ^2^)
+key(html)operator(:) string(<p>a <sup>2</sup> + b <sup>2</sup> = c <sup>2</sup></p>)
+tag(---)
+key(name)operator(:) string(parenthetical superscript phrase)
+key(in)operator(:) string('^(image courtesy NASA\)^')
+key(html)operator(:) string('<p><sup>(image courtesy <span class="caps">NASA</span>\)</sup></p>')
+tag(---)
+key(name)operator(:) string(subscript)
+key(desc)operator(:) string(To subscript, surround with tildes.)
+key(in)operator(:) string(log ~2~ x)
+key(html)operator(:) string(<p>log <sub>2</sub> x</p>)
+tag(---)
+key(name)operator(:) string(parenthetical subscript phrase)
+key(in)operator(:) string('~(image courtesy NASA\)~')
+key(html)operator(:) string('<p><sub>(image courtesy <span class="caps">NASA</span>\)</sub></p>')
+tag(---)
+key(name)operator(:) string(tight superscript and subscript)
+key(desc)operator(:) string(if you want your superscript or subscript to not be surrounded by spaces, you must use square brackets)
+key(in)operator(:) string(f(x, n\) = log[~4~]x[^n^])
+key(html)operator(:) string('<p>f(x, n\) = log<sub>4</sub>x<sup>n</sup></p>')
+tag(---)
+key(name)operator(:) string(span)
+key(desc)operator(:) string(Lastly, if you find yourself needing to customize the style of a passage, use percent symbols to translate the passage as an HTML span.)
+key(in)operator(:) string(I'm %unaware% of most soft drinks.)
+key(html)operator(:) string(<p>I&#8217;m <span>unaware</span> of most soft drinks.</p>)
+tag(---)
+key(name)operator(:) string(style span)
+key(desc)operator(:) string(This way, you can apply style settings, as described in the next section to arbitrary phrases.)
+key(in)operator(:) string(|-)
+ string(I'm) string(%{color)symbol(:red)operator(})string(unaware%)
+ string(of) string(most) string(soft) string(drinks.)
+key(html)operator(:) string(|-)
+ string(<p>I&#8217;m) string(<span) string(style="color)symbol(:red)string(;">unaware</span><br) string(/>)
+ string(of) string(most) string(soft) string(drinks.</p>)
+key(lite_mode_html)operator(:) string(|-)
+ string(I&#8217;m) string(<span) string(style="color)symbol(:red)string(;">unaware</span><br) string(/>)
+ string(of) string(most) string(soft) string(drinks.)
+tag(---)
+key(name)operator(:) string(percent sign)
+key(desc)operator(:) string(though percent signs indicate a span, they shouldn't be overly greedy.)
+key(in)operator(:) string(|-)
+ key(http)error(:)string(//blah.com/one%20two%20three)
+ string((min\)5%-95%(max\))
+key(html)operator(:) string(|-)
+ string(<p>http)error(:)string(//blah.com/one%20two%20three<br) string(/>)
+ string((min\)5%-95%(max\)</p>)
+tag(---)
+key(name)operator(:) string(css class)
+key(desc)operator(:) string(A block can be tagged with a CSS class by circling the class in parentheses and placing it just before the period which marks the block.)
+key(in)operator(:) string(p(example1\). An example)
+key(html)operator(:) string(<p class="example1">An example</p>)
+tag(---)
+key(name)operator(:) string(css id)
+key(desc)operator(:) string(An element ID can be given by prefixing the ID with a pound symbol and using it in place of the class.)
+key(in)operator(:) string(p(#big-red\). Red here)
+key(html)operator(:) string(<p id="big-red">Red here</p>)
+tag(---)
+key(name)operator(:) string(class and id combined)
+key(desc)operator(:) string(Class and ID can be combined by placing the class first.)
+key(in)operator(:) string(p(example1#big-red2\). Red here)
+key(html)operator(:) string(<p class="example1" id="big-red2">Red here</p>)
+tag(---)
+key(name)operator(:) string(css style)
+key(desc)operator(:) string(Style settings can be provided directly by surrounding them in curly braces.)
+key(in)operator(:) string(p{color:blue;margin:30px}. Spacey blue)
+key(html)operator(:) string(<p style="color:blue;margin:30px;">Spacey blue</p>)
+tag(---)
+key(name)operator(:) string(language designations)
+key(desc)operator(:) string(Language designations can be given between angel brackets.)
+key(in)operator(:) string(p[fr]. rouge)
+key(html)operator(:) string(<p lang="fr">rouge</p>)
+tag(---)
+key(name)operator(:) string(block attributes on phrase modifiers)
+key(desc)operator(:) string(All block attributes can be applied to phrases as well by placing them just inside the opening modifier.)
+key(in)operator(:) string(|-)
+ string(I) string(seriously) string(*{color)symbol(:red)operator(})string(blushed*)
+ string(when) string(I) string(_(big\)sprouted_) string(that)
+ string(corn) string(stalk) string(from) string(my)
+ string(%[es]cabeza%.)
+key(html)operator(:) string(|-)
+ string(<p>I) string(seriously) string(<strong) string(style="color)symbol(:red)string(;">blushed</strong><br) string(/>)
+ string(when) string(I) string(<em) string(class="big">sprouted</em>) string(that<br) string(/>)
+ string(corn) string(stalk) string(from) string(my<br) string(/>)
+ string(<span) string(lang="es">cabeza</span>.</p>)
+tag(---)
+key(name)operator(:) string(inline attributes preceded by text are treated as literal)
+key(desc)operator(:) string(modifiers must come first, without anything before them)
+key(in)operator(:) string(|-)
+ string(I) global_variable(*seriously) operator({)key(color)symbol(:red)operator(})string(blushed*)
+ string(when) string(I) string(_first) string((big\)sprouted_) string(that)
+ string(corn) string(stalk) string(from) string(my)
+ string(%grande) operator([)string(es]cabeza%.)
+key(html)operator(:) string(|-)
+ string(<p>I) string(<strong>seriously) operator({)key(color)symbol(:red)operator(})string(blushed</strong><br) string(/>)
+ string(when) string(I) string(<em>first) string((big\)sprouted</em>) string(that<br) string(/>)
+ string(corn) string(stalk) string(from) string(my<br) string(/>)
+ string(<span>grande) operator([)string(es]cabeza</span>.</p>)
+tag(---)
+key(name)operator(:) string(align justified)
+key(desc)operator(:) string(Text inside blocks can be aligned in four basic ways.)
+key(in)operator(:) string(p<>. justified)
+key(html)operator(:) string(<p style="text-align:justify;">justified</p>)
+tag(---)
+key(name)operator(:) string(indentation)
+key(desc)operator(:) string(Indentation can also be specified by provide a single left paren for every 1em to the left. A single right paren for every 1em to the right.)
+key(in)operator(:) string(p\)\)\). right ident 3em)
+key(html)operator(:) string(<p style="padding-right:3em;">right ident 3em</p>)
+tag(---)
+key(name)operator(:) string(indentation and alignment)
+key(desc)operator(:) string(Identation may be coupled with alignment.)
+key(in)operator(:) string(h2(\)>. Bingo.)
+key(html)operator(:) string(<h2 style="padding-left:1em;padding-right:1em;text-align:right;">Bingo.</h2>)
+tag(---)
+key(name)operator(:) string(many modifiers combined)
+key(desc)operator(:) string(And, furthermore, coupled with language settings and CSS styles.)
+key(in)operator(:) string(h3(\)>[no]{color:red}. Bingo)
+key(html)operator(:) string(<h3 style="padding-left:1em;padding-right:1em;text-align:right;color:red;" lang="no">Bingo</h3>)
+tag(---)
+key(name)operator(:) string(code blocks)
+key(desc)operator(:) string(For example, long code blocks belong between <code>pre</code> and <code>code</code> tags. Please also indent your code inside the tags to be sure that all Textile processors out there will ignore the contents.)
+key(in)operator(:) string(|)
+ string(<pre>)
+ string(<code>)
+ string(a.gsub!() string(/</,) string('') string(\))
+ string(</code>)
+ string(</pre>)
+key(html)operator(:) string(|-)
+ string(<pre>)
+ string(<code>)
+ string(a.gsub!() string(/&lt;/,) string('') string(\))
+ string(</code>)
+ string(</pre>)
+tag(---)
+key(name)operator(:) string(div tags)
+key(desc)operator(:) string(You may also choose to surround sections with <code>div</code> tags to separate your document into sections. <a href="http://www.instiki.org/">Instiki</a> uses this technique to float a sidebar to the right.)
+key(in)operator(:) string(|)
+ string(<div) string(style="float)symbol(:right)string(;">)
+
+ string(h3.) string(Sidebar)
+
+ key<delimiter(")content(Hobix)delimiter(")>symbol(:http)error(:)string(//hobix.com/)
+ key<delimiter(")content(Ruby)delimiter(")>symbol(:http)error(:)string(//ruby-lang.org/)
+
+ string(</div>)
+
+ string(The) string(main) string(text) string(of) string(the) string(page) string(goes) string(here) string(and) string(will) string(stay) string(to) string(the) string(left) string(of) string(the) string(sidebar.)
+key(html)operator(:) string(|-)
+ string(<div) string(style="float)symbol(:right)string(;">)
+ string(<h3>Sidebar</h3>)
+ string(<p><a) string(href="http)error(:)string(//hobix.com/">Hobix</a><br) string(/>)
+ string(<a) string(href="http)error(:)string(//ruby-lang.org/">Ruby</a></p>)
+ string(</div>)
+ string(<p>The) string(main) string(text) string(of) string(the) string(page) string(goes) string(here) string(and) string(will) string(stay) string(to) string(the) string(left) string(of) string(the) string(sidebar.</p>)
+tag(---)
+key(name)operator(:) string(numbered list)
+key(desc)operator(:) string(To make a numbered list, place each item in its own paragraph, preceded by &#8221;#&#8221;.)
+key(in)operator(:) string(|-)
+ comment(# A first item)
+ comment(# A second item)
+ comment(# A third)
+key(html)operator(:) string(|-)
+ string(<ol>)
+ string(<li>A) string(first) string(item</li>)
+ string(<li>A) string(second) string(item</li>)
+ string(<li>A) string(third</li>)
+ string(</ol>)
+tag(---)
+key(name)operator(:) string(nested numbered lists)
+key(desc)operator(:) string(These lists may be nested by increasing the number of pound symbols preceding child entries.)
+key(in)operator(:) string(|-)
+ comment(# Fuel could be:)
+ comment(## Coal)
+ comment(## Gasoline)
+ comment(## Electricity)
+ comment(# Humans need only:)
+ comment(## Water)
+ comment(## Protein)
+key(html)operator(:) string(|-)
+ string(<ol>)
+ string(<li>Fuel) string(could) key(be)error(:)
+ string(<ol>)
+ string(<li>Coal</li>)
+ string(<li>Gasoline</li>)
+ string(<li>Electricity</li>)
+ string(</ol></li>)
+ string(<li>Humans) string(need) key(only)error(:)
+ string(<ol>)
+ string(<li>Water</li>)
+ string(<li>Protein</li>)
+ string(</ol></li>)
+ string(</ol>)
+tag(---)
+key(name)operator(:) string(bulleted list)
+key(desc)operator(:) string(Bulleted lists use an asterisk in place of the pound.)
+key(in)operator(:) string(|-)
+ string(*) string(A) string(first) string(item)
+ string(*) string(A) string(second) string(item)
+ string(*) string(A) string(third)
+key(html)operator(:) string(|-)
+ string(<ul>)
+ string(<li>A) string(first) string(item</li>)
+ string(<li>A) string(second) string(item</li>)
+ string(<li>A) string(third</li>)
+ string(</ul>)
+tag(---)
+key(name)operator(:) string(nested bulleted lists)
+key(desc)operator(:) string(These lists may be nested in like manner.)
+key(in)operator(:) string(|-)
+ string(*) string(Fuel) string(could) key(be)error(:)
+ string(**) string(Coal)
+ string(**) string(Gasoline)
+ string(**) string(Electricity)
+ string(*) string(Humans) string(need) key(only)error(:)
+ string(**) string(Water)
+ string(**) string(Protein)
+key(html)operator(:) string(|-)
+ string(<ul>)
+ string(<li>Fuel) string(could) key(be)error(:)
+ string(<ul>)
+ string(<li>Coal</li>)
+ string(<li>Gasoline</li>)
+ string(<li>Electricity</li>)
+ string(</ul></li>)
+ string(<li>Humans) string(need) key(only)error(:)
+ string(<ul>)
+ string(<li>Water</li>)
+ string(<li>Protein</li>)
+ string(</ul></li>)
+ string(</ul>)
+tag(---)
+key(name)operator(:) string(links)
+key(desc)operator(:) string(Basic links are comprised of a phrase which is linked to a <acronym title="Universal Resource Locator">URL</acronym>. Place the descriptive phrase in quotation marks. Follow it immediately by a colon and the URL.)
+key(in)operator(:) string(I searched "Google":http://google.com.)
+key(html)operator(:) string(<p>I searched <a href="http://google.com">Google</a>.</p>)
+key(lite_mode_html)operator(:) string(I searched <a href="http://google.com">Google</a>.)
+tag(---)
+key(name)operator(:) string(link aliases)
+key(desc)operator(:) string(If you are using the same link several times in your document, or you’d just like to be a tad more organized, you can use a link alias. Place the URL anywhere in your document, beginning with its alias in square brackets. Then, use the alias in place of the URL, using the link format above.)
+key(in)operator(:) string(|-)
+ string(I) string(am) string(crazy) string(about) key<delimiter(")content(Hobix)delimiter(")>symbol(:hobix)
+ string(and) key<delimiter(")content(it's)delimiter(")>symbol(:hobix) string("all")symbol(:hobix) string(I) string(ever)
+ key<delimiter(")content(link to)delimiter(")>symbol(:hobix)string(!)
+
+ operator([)string(hobix]http)error(:)string(//hobix.com)
+key(html)operator(:) string(|-)
+ string(<p>I) string(am) string(crazy) string(about) string(<a) string(href="http)error(:)string(//hobix.com">Hobix</a><br) string(/>)
+ string(and) string(<a) string(href="http)error(:)string(//hobix.com">it&#8217;s</a>) string(<a) string(href="http)error(:)string(//hobix.com">all</a>) string(I) string(ever<br) string(/>)
+ string(<a) string(href="http)error(:)string(//hobix.com">link) string(to</a>!</p>)
+tag(---)
+key(name)operator(:) string(image)
+key(desc)operator(:) string(You can embed an image in your Textile document by surrounding its URL with exclamation marks.)
+key(in)operator(:) string("!http://hobix.com/sample.jpg!")
+key(html)operator(:) string(<p><img src="http://hobix.com/sample.jpg" alt="" /></p>)
+key(lite_mode_html)operator(:) string(<img src="http://hobix.com/sample.jpg" alt="" />)
+tag(---)
+key(name)operator(:) string(image title)
+key(desc)operator(:) string(A title for the image can also be provided in parens, just before the closing exclamation.)
+key(in)operator(:) string("!openwindow1.gif(Bunny.\)!")
+key(html)operator(:) string(<p><img src="openwindow1.gif" title="Bunny." alt="Bunny." /></p>)
+tag(---)
+key(name)operator(:) string(image links)
+key(desc)operator(:) string(Links can be attached to images with a colon.)
+key(in)operator(:) string("!openwindow1.gif!:http://hobix.com/")
+key(html)operator(:) string(<p><a href="http://hobix.com/"><img src="openwindow1.gif" alt="" /></a></p>)
+tag(---)
+key(name)operator(:) string(image alignments)
+key(desc)operator(:) string(Alignments can be applied as well to images.)
+key(in)operator(:) string(|-)
+ string(!>obake.gif!)
+
+ string(And) string(others) string(sat) string(all) string(round) string(the) string(small)
+ string(machine) string(and) string(paid) string(it) string(to) string(sing) string(to) string(them.)
+key(html)operator(:) string(|-)
+ string(<p) string(style="float)symbol(:right)string(;"><img) string(src="obake.gif") string(alt="") string(/></p>)
+ string(<p>And) string(others) string(sat) string(all) string(round) string(the) string(small<br) string(/>)
+ string(machine) string(and) string(paid) string(it) string(to) string(sing) string(to) string(them.</p>)
+tag(---)
+key(name)operator(:) string(acronym definitions)
+key(desc)operator(:) string(Definitions for acronyms can be provided by following an acronym with its definition in parens.)
+key(in)operator(:) string(We use CSS(Cascading Style Sheets\).)
+key(html)operator(:) string(<p>We use <acronym title="Cascading Style Sheets"><span class="caps">CSS</span></acronym>.</p>)
+key(lite_mode_html)operator(:) string(We use <acronym title="Cascading Style Sheets"><span class="caps">CSS</span></acronym>.)
+key(no_span_caps_html)operator(:) string(<p>We use <acronym title="Cascading Style Sheets">CSS</acronym>.</p>)
+tag(---)
+key(name)operator(:) string(tables)
+key(desc)operator(:) string(Simple tables can be built by separating fields with pipe characters)
+key(in)operator(:) string(|-)
+ string(|) string(name) string(|) string(age) string(|) string(sex) string(|)
+ string(|) string(joan) string(|) string(24) string(|) string(f) string(|)
+ string(|) string(archie) string(|) string(29) string(|) string(m) string(|)
+ string(|) string(bella) string(|) string(45) string(|) string(f) string(|)
+key(html)operator(:) string(|-)
+ string(<table>)
+ string(<tr>)
+ string(<td>) string(name) string(</td>)
+ string(<td>) string(age) string(</td>)
+ string(<td>) string(sex) string(</td>)
+ string(</tr>)
+ string(<tr>)
+ string(<td>) string(joan) string(</td>)
+ string(<td>) string(24) string(</td>)
+ string(<td>) string(f) string(</td>)
+ string(</tr>)
+ string(<tr>)
+ string(<td>) string(archie) string(</td>)
+ string(<td>) string(29) string(</td>)
+ string(<td>) string(m) string(</td>)
+ string(</tr>)
+ string(<tr>)
+ string(<td>) string(bella) string(</td>)
+ string(<td>) string(45) string(</td>)
+ string(<td>) string(f) string(</td>)
+ string(</tr>)
+ string(</table>)
+tag(---)
+key(name)operator(:) string(table headers)
+key(desc)operator(:) string(Specify header cells by marking them with an underscore and period.)
+key(in)operator(:) string(|-)
+ string(|_.) string(name) string(|_.) string(age) string(|_.) string(sex) string(|)
+ string(|) string(joan) string(|) string(24) string(|) string(f) string(|)
+ string(|) string(archie) string(|) string(29) string(|) string(m) string(|)
+ string(|) string(bella) string(|) string(45) string(|) string(f) string(|)
+key(html)operator(:) string(|-)
+ string(<table>)
+ string(<tr>)
+ string(<th>name) string(</th>)
+ string(<th>age) string(</th>)
+ string(<th>sex) string(</th>)
+ string(</tr>)
+ string(<tr>)
+ string(<td>) string(joan) string(</td>)
+ string(<td>) string(24) string(</td>)
+ string(<td>) string(f) string(</td>)
+ string(</tr>)
+ string(<tr>)
+ string(<td>) string(archie) string(</td>)
+ string(<td>) string(29) string(</td>)
+ string(<td>) string(m) string(</td>)
+ string(</tr>)
+ string(<tr>)
+ string(<td>) string(bella) string(</td>)
+ string(<td>) string(45) string(</td>)
+ string(<td>) string(f) string(</td>)
+ string(</tr>)
+ string(</table>)
+tag(---)
+key(name)operator(:) string(table cell attributes)
+key(desc)operator(:) string(The period used above marks the end of a cell’s attributes. Other attributes can be applied as well.)
+key(in)operator(:) string(|-)
+ string(|_.) string(attribute) string(list) string(|)
+ string(|<.) string(align) string(left) string(|)
+ string(|>.) string(align) string(right|)
+ string(|=.) string(center) string(|)
+ string(|<>.) string(justify) string(|)
+ string(|^.) string(valign) string(top) string(|)
+ string(|~.) string(bottom) string(|)
+key(html)operator(:) string(|-)
+ string(<table>)
+ string(<tr>)
+ string(<th>attribute) string(list) string(</th>)
+ string(</tr>)
+ string(<tr>)
+ string(<td) string(style="text-align)symbol(:left)string(;">align) string(left) string(</td>)
+ string(</tr>)
+ string(<tr>)
+ string(<td) string(style="text-align)symbol(:right)string(;">align) string(right</td>)
+ string(</tr>)
+ string(<tr>)
+ string(<td) string(style="text-align)symbol(:center)string(;">center) string(</td>)
+ string(</tr>)
+ string(<tr>)
+ string(<td) string(style="text-align)symbol(:justify)string(;">justify) string(</td>)
+ string(</tr>)
+ string(<tr>)
+ string(<td) string(style="vertical-align)symbol(:top)string(;">valign) string(top) string(</td>)
+ string(</tr>)
+ string(<tr>)
+ string(<td) string(style="vertical-align)symbol(:bottom)string(;">bottom) string(</td>)
+ string(</tr>)
+ string(</table>)
+tag(---)
+key(name)operator(:) string(table colspan)
+key(desc)operator(:) string(You can also specify colspans with a backslash, followed by the cell width.)
+key(in)operator(:) string(|-)
+ string(|\\2.) string(spans) string(two) string(cols) string(|)
+ string(|) string(col) string(1) string(|) string(col) string(2) string(|)
+key(html)operator(:) string(|-)
+ string(<table>)
+ string(<tr>)
+ string(<td) string(colspan="2">spans) string(two) string(cols) string(</td>)
+ string(</tr>)
+ string(<tr>)
+ string(<td>) string(col) string(1) string(</td>)
+ string(<td>) string(col) string(2) string(</td>)
+ string(</tr>)
+ string(</table>)
+tag(---)
+key(name)operator(:) string(table rowspan)
+key(desc)operator(:) string(Rowspan is specified by a forward slash, followed by the row height.)
+key(in)operator(:) string(|-)
+ string(|/3.) string(spans) string(3) string(rows) string(|) string(a) string(|)
+ string(|) string(b) string(|)
+ string(|) string(c) string(|)
+key(html)operator(:) string(|-)
+ string(<table>)
+ string(<tr>)
+ string(<td) string(rowspan="3">spans) string(3) string(rows) string(</td>)
+ string(<td>) string(a) string(</td>)
+ string(</tr>)
+ string(<tr>)
+ string(<td>) string(b) string(</td>)
+ string(</tr>)
+ string(<tr>)
+ string(<td>) string(c) string(</td>)
+ string(</tr>)
+ string(</table>)
+tag(---)
+key(name)operator(:) string(block attributes applied to table cells)
+key(desc)operator(:) string(All block attributes can be applied to table cells as well.)
+key(in)operator(:) string("|{background:#ddd}. Grey cell|")
+key(html)operator(:) string(|-)
+ string(<table>)
+ string(<tr>)
+ string(<td) string(style="background)error(:)comment(#ddd;">Grey cell</td>)
+ string(</tr>)
+ string(</table>)
+tag(---)
+key(name)operator(:) string(black attributes applied to a table)
+key(desc)operator(:) string(Table-wide attributes can be applied before the first row of the table. On its own line, followed by a period.)
+key(in)operator(:) string(|-)
+ string(table{border)symbol(:1px) string(solid) string(black}.)
+ string(|This|is|a|row|)
+ string(|This|is|a|row|)
+key(html)operator(:) string(|-)
+ string(<table) string(style="border)symbol(:1px) string(solid) string(black;">)
+ string(<tr>)
+ string(<td>This</td>)
+ string(<td>is</td>)
+ string(<td>a</td>)
+ string(<td>row</td>)
+ string(</tr>)
+ string(<tr>)
+ string(<td>This</td>)
+ string(<td>is</td>)
+ string(<td>a</td>)
+ string(<td>row</td>)
+ string(</tr>)
+ string(</table>)
+tag(---)
+key(name)operator(:) string(black attributes applied to a table row)
+key(desc)operator(:) string(Attributes can be applied to a single row by supplying the attribute before the row starts, using a <code>table</code> modifier and following it by a period.)
+key(in)operator(:) string(|-)
+ string(|This|is|a|row|)
+ operator({)key(background)error(:)comment(#ddd}. |This|is|grey|row|)
+key(html)operator(:) string(|-)
+ string(<table>)
+ string(<tr>)
+ string(<td>This</td>)
+ string(<td>is</td>)
+ string(<td>a</td>)
+ string(<td>row</td>)
+ string(</tr>)
+ string(<tr) string(style="background)error(:)comment(#ddd;">)
+ string(<td>This</td>)
+ string(<td>is</td>)
+ string(<td>grey</td>)
+ string(<td>row</td>)
+ string(</tr>)
+ string(</table>)
+tag(---)
+key(name)operator(:) string(extended block followed by pre block)
+key(in)operator(:) string(|-)
+ string(div..) string(Just) string(a) string(test.)
+
+ string(Second) string(div.)
+
+ string(pre.) string(A) string(pre) string(block) string(ends) string(it.)
+key(html)operator(:) string(|-)
+ string(<div>Just) string(a) string(test.</div>)
+ string(<div>Second) string(div.</div>)
+ string(<pre>A) string(pre) string(block) string(ends) string(it.</pre>)
+tag(---)
+key(name)operator(:) string(extended block followed by blockquote)
+key(in)operator(:) string(|-)
+ string(div..) string(Just) string(a) string(test.)
+
+ string(Second) string(div.)
+
+ string(bq.) string(A) string(blockquote) string(ends) string(it.)
+key(html)operator(:) string(|-)
+ string(<div>Just) string(a) string(test.</div>)
+ string(<div>Second) string(div.</div>)
+ string(<blockquote>)
+ string(<p>A) string(blockquote) string(ends) string(it.</p>)
+ string(</blockquote>)
+tag(---)
+key(name)operator(:) string(extended block followed by block code)
+key(in)operator(:) string(|-)
+ string(div..) string(Just) string(a) string(test.)
+
+ string(Second) string(div.)
+
+ string(bc.) string(A) string(blockcode) string(ends) string(it.)
+key(html)operator(:) string(|-)
+ string(<div>Just) string(a) string(test.</div>)
+ string(<div>Second) string(div.</div>)
+ string(<pre><code>A) string(blockcode) string(ends) string(it.</code></pre>)
+tag(---)
+key(name)operator(:) string(extended block followed by notextile block)
+key(in)operator(:) string(|-)
+ string(div..) string(Just) string(a) string(test.)
+
+ string(Second) string(div.)
+
+ string(notextile.) string(A) string(notextile) string(block) string(ends) string(it.)
+key(html)operator(:) string(|-)
+ string(<div>Just) string(a) string(test.</div>)
+ string(<div>Second) string(div.</div>)
+ string(A) string(notextile) string(block) string(ends) string(it.)
+key(valid_html)operator(:) string(false)
+tag(---)
+key(name)operator(:) string(simple parentheses)
+key(in)operator(:) string(|-)
+ string(before) string((in) string(parens\)) string(after)
+key(html)operator(:) string(|-)
+ string(<p>before) string((in) string(parens\)) string(after</p>)
+tag(---)
+key(name)operator(:) string(parentheses in underscores)
+key(in)operator(:) string(|-)
+ string(before) string(_(in) string(parens\)_) string(after)
+key(html)operator(:) string(|-)
+ string(<p>before) string(<em>(in) string(parens\)</em>) string(after</p>)
+tag(---)
+key(name)operator(:) string(parentheses in asterisks)
+key(in)operator(:) string(|-)
+ string(before) string(*(in) string(parens\)*) string(after)
+key(html)operator(:) string(|-)
+ string(<p>before) string(<strong>(in) string(parens\)</strong>) string(after</p>)
+tag(---)
+key(name)operator(:) string(parentheses in underscores in quotes)
+key(in)operator(:) string(|-)
+ string("before) string(_(in) string(parens\)_) string(after")
+key(html)operator(:) string(|-)
+ string(<p>&#8220;before) string(<em>(in) string(parens\)</em>) string(after&#8221;</p>)
+tag(---)
+key(name)operator(:) string(underscores in parentheses)
+key(in)operator(:) string(|-)
+ string(one) string(_two) string(three_) string((four) string(_five) string(six_\)) string(seven)
+key(html)operator(:) string(|-)
+ string(<p>one) string(<em>two) string(three</em>) string((four) string(<em>five) string(six</em>\)) string(seven</p>)
+tag(---)
+key(name)operator(:) string(underscores in parentheses in quotes)
+key(in)operator(:) string(|-)
+ string("one) string(_two) string(three_) string((four) string(_five) string(six_\)) string(seven")
+key(html)operator(:) string(|-)
+ string(<p>&#8220;one) string(<em>two) string(three</em>) string((four) string(<em>five) string(six</em>\)) string(seven&#8221;</p>)
+tag(---)
+key(name)operator(:) string(underscores in parentheses 2)
+key(in)operator(:) string(|-)
+ string(one) string((two) string(_three) string(four_\)) string(five)
+key(html)operator(:) string(|-)
+ string(<p>one) string((two) string(<em>three) string(four</em>\)) string(five</p>)
+tag(---)
+key(name)operator(:) string(underscores in parentheses in quotes 2)
+key(in)operator(:) string(|-)
+ string("one) string((two) string(_three) string(four_\)) string(five")
+key(html)operator(:) string(|-)
+ string(<p>&#8220;one) string((two) string(<em>three) string(four</em>\)) string(five&#8221;</p>)
+tag(---)
+key(name)operator(:) string(caps in parentheses)
+key(desc)operator(:) string(Uppercase words of three or more characters that are in parentheses should be recognized as well as those not in parentheses.)
+key(in)operator(:) string(IBM or (HAL\))
+key(html)operator(:) string(<p><span class="caps">IBM</span> or (<span class="caps">HAL</span>\)</p>)
+key(no_span_caps_html)operator(:) string(<p>IBM or (HAL\)</p>)
+tag(---)
+key(name)operator(:) string(phrase modifiers in parentheses)
+key(desc)operator(:) string(Inline modifiers are expected to work in parentheses as well.)
+key(in)operator(:) string(|-)
+ string(__Amanita__s) string(are) string(mushrooms.)
+ string(Lungworts) string((__Lobaria__\)) string(are) string(lichens.)
+ string(Blah) string(blah) string((normal) string(text) string(**bold**\)) string(blah.)
+key(html)operator(:) string(|-)
+ string(<p>__Amanita__s) string(are) string(mushrooms.<br) string(/>)
+ string(Lungworts) string((<i>Lobaria</i>\)) string(are) string(lichens.<br) string(/>)
+ string(Blah) string(blah) string((normal) string(text) string(<b>bold</b>\)) string(blah.</p>)
+tag(---)
+key(name)operator(:) string(square brackets are preserved)
+key(in)operator(:) string(|-)
+ string(citation) operator([)string("(Berk.\)) string(Hilton"],) string(see)
+ operator([)string(Papers) string("blah) string(blah."])
+key(html)operator(:) string(|-)
+ string(<p>citation) operator([)variable(&#8220;(Berk.\)) string(Hilton&#8221;],) string(see<br) string(/>)
+ operator([)string(Papers) variable(&#8220;blah) string(blah.&#8221;]</p>) \ No newline at end of file
diff --git a/test/scanners/yaml/basic.in.yml b/test/scanners/yaml/basic.in.yml
new file mode 100644
index 0000000..4fed208
--- /dev/null
+++ b/test/scanners/yaml/basic.in.yml
@@ -0,0 +1,871 @@
+---
+name: paragraphs
+desc: Textile looks for paragraphs in your text. Paragraphs are separated by one blank line. Every paragraph is translated as an HTML paragraph.
+in: |-
+ A single paragraph.
+
+ Followed by another.
+html: |-
+ <p>A single paragraph.</p>
+ <p>Followed by another.</p>
+---
+name: block containing block start
+in: |-
+ I saw a ship. It ate my elephant.
+html: |-
+ <p>I saw a ship. It ate my elephant.</p>
+---
+name: extended block containing block start
+in: |-
+ p.. I saw a ship. It ate my elephant.
+
+ When the elephant comes to take a p. you...
+html: |-
+ <p>I saw a ship. It ate my elephant.</p>
+ <p>When the elephant comes to take a p. you&#8230;</p>
+---
+name: blockquote containing block start
+in: |-
+ bq. I saw a ship. It ate my elephant.
+html: |-
+ <blockquote>
+ <p>I saw a ship. It ate my elephant.</p>
+ </blockquote>
+---
+name: extended blockquote containing block start
+in: |-
+ bq.. I saw a ship. It ate my elephant.
+
+ When the elephant comes to take a p. you...
+html: |-
+ <blockquote>
+ <p>I saw a ship. It ate my elephant.</p>
+ <p>When the elephant comes to take a p. you&#8230;</p>
+ </blockquote>
+---
+name: notextile block containing block start
+in: |-
+ notextile. I saw a ship. It ate my elephant.
+html: |-
+ I saw a ship. It ate my elephant.
+valid_html: false
+---
+name: extended notextile block containing block start
+in: |-
+ notextile.. I saw a ship. It ate my elephant.
+
+ When the elephant comes to take a p. you...
+html: |-
+ I saw a ship. It ate my elephant.
+
+ When the elephant comes to take a p. you...
+valid_html: false
+---
+name: pre block containing block start
+in: |-
+ pre. I saw a ship. It ate my elephant.
+html: |-
+ <pre>I saw a ship. It ate my elephant.</pre>
+---
+name: extended pre block containing block start
+in: |-
+ pre.. I saw a ship. It ate my elephant.
+
+ When the elephant comes to take a p. you...
+html: |-
+ <pre>I saw a ship. It ate my elephant.</pre>
+
+ <pre>When the elephant comes to take a p. you&#8230;</pre>
+ ---
+name: html tags
+desc: You can certainly use HTML tags inside your Textile documents. HTML will only be escaped if it&#8217;s found in a <code>pre</code> or <code>code</code> block.
+in: |-
+ I am <b>very</b> serious.
+
+ <pre>
+ I am <b>very</b> serious.
+ </pre>
+html: |-
+ <p>I am <b>very</b> serious.</p>
+ <pre>
+ I am &lt;b&gt;very&lt;/b&gt; serious.
+ </pre>
+---
+name: line breaks
+desc: Line breaks are converted to HTML breaks.
+in: |-
+ I spoke.
+ And none replied.
+html: |-
+ <p>I spoke.<br />
+ And none replied.</p>
+html_no_breaks: |-
+ <p>I spoke.
+ And none replied.</p>
+lite_mode_html: |-
+ I spoke.<br />
+ And none replied.
+---
+name: curly quotes
+desc: Single- and double-quotes around words or phrases are converted to curly quotations, much easier on the eye.
+in: "\"Observe!\""
+html: <p>&#8220;Observe!&#8221;</p>
+---
+name: quotes contained in multi-paragraph quotes
+in: |-
+ "I first learned about this thing called "Redcloth" several years ago.
+
+ "It's wonderful."
+html: |-
+ <p>&#8220;I first learned about this thing called &#8220;Redcloth&#8221; several years ago.</p>
+ <p>&#8220;It&#8217;s wonderful.&#8221;</p>
+---
+name: double hyphens
+desc: Double hyphens are replaced with an em-dash.
+in: Observe--very nice!
+html: <p>Observe&#8212;very nice!</p>
+latex: "Observe---very nice!\n\n"
+---
+name: double hyphens with spaces
+desc: Double hyphens are replaced with an em-dash and surrounding spaces are preserved.
+in: Observe -- very nice!
+html: <p>Observe &#8212; very nice!</p>
+latex: "Observe --- very nice!\n\n"
+---
+name: parenthetical phrase set off with em dashes
+desc: Sentences with two em dashes should not turn them into strikethroughs
+in: An emdash indicates a parenthetical thought--like this one--which is set apart from the rest of a sentence.
+html: "<p>An emdash indicates a parenthetical thought&#8212;like this one&#8212;which is set apart from the rest of a sentence.</p>"
+latex: "An emdash indicates a parenthetical thought---like this one---which is set apart from the rest of a sentence.\n\n"
+---
+name: parenthetical phrase set off with em dashes surrounded by spaces
+desc: Sentences with two em dashes should not turn them into strikethroughs
+in: An emdash indicates a parenthetical thought -- like this one -- which is set apart from the rest of a sentence.
+html: "<p>An emdash indicates a parenthetical thought &#8212; like this one &#8212; which is set apart from the rest of a sentence.</p>"
+latex: "An emdash indicates a parenthetical thought --- like this one --- which is set apart from the rest of a sentence.\n\n"
+---
+name: single hyphens with spaces
+desc: Single hyphens are replaced with en-dashes if they are surrounded by spaces.
+in: Observe - tiny and brief.
+html: <p>Observe &#8211; tiny and brief.</p>
+latex: "Observe--tiny and brief.\n\n"
+---
+name: midword hyphens
+desc: Single hyphens are left alone if not surrounded by spaces.
+in: Observe the nicely-done hyphen.
+html: <p>Observe the nicely-done hyphen.</p>
+---
+name: ellipses
+desc: Triplets of periods become an ellipsis.
+in: Observe...
+html: <p>Observe&#8230;</p>
+lite_mode_html: Observe&#8230;
+---
+name: dimension sign
+desc: The letter 'x' becomes a dimension sign when used between digits.
+in: "Observe: 2x3."
+html: "<p>Observe: 2&#215;3.</p>"
+---
+name: dimension sign with space after
+in: "The room is 2x3 inches big."
+html: "<p>The room is 2&#215;3 inches big.</p>"
+---
+name: dimension sign with spaces
+in: "Observe: 2 x 4."
+html: "<p>Observe: 2 &#215; 4.</p>"
+---
+name: dimension signs chained
+in: "Observe: 2x3x4."
+html: "<p>Observe: 2&#215;3&#215;4.</p>"
+lite_mode_html: "Observe: 2&#215;3&#215;4."
+---
+name: dimension signs with double primes
+in: 'My mouse: 2.5" x 4".'
+html: '<p>My mouse: 2.5&#8243; &#215; 4&#8243;.</p>'
+---
+name: dimension signs with single primes
+in: "My office: 5' x 4.5'."
+html: "<p>My office: 5&#8242; &#215; 4.5&#8242;.</p>"
+---
+name: trademark and copyright
+desc: Conversion of trademark and copyright symbols.
+in: one(TM), two(R), three(C).
+html: <p>one&#8482;, two&#174;, three&#169;.</p>
+lite_mode_html: one&#8482;, two&#174;, three&#169;.
+---
+name: headers
+desc: To make an entire paragraph into a Header, place “h<em>n</em>.” at its beginning, where <em>n</em> is a number from 1-6.
+in: h3. Header 3
+html: <h3>Header 3</h3>
+---
+name: blockquote
+desc: To make an entire paragraph into a block quotation, place “bq.” before it.
+in: |-
+ Any old text
+
+ bq. A block quotation.
+
+ Any old text
+html: |-
+ <p>Any old text</p>
+ <blockquote>
+ <p>A block quotation.</p>
+ </blockquote>
+ <p>Any old text</p>
+---
+name: footnote reference
+desc: Numeric references within text to footnotes appear between square brackets.
+in: This is covered elsewhere[1].
+html: <p>This is covered elsewhere<sup class="footnote"><a href="#fn1">1</a></sup>.</p>
+---
+name: footnote
+desc: To create the footnote that corresponds to its reference within the text, begin a new paragraph with fn and the footnote&#8217;s number, followed by a dot and a space.
+in: fn1. Down here, in fact.
+html: <p class="footnote" id="fn1"><sup>1</sup> Down here, in fact.</p>
+---
+name: em
+desc: Emphasis to text is added by surrounding a phrase with underscores. In HTML, this often appears as <em>italics</em>.
+in: I _believe_ every word.
+html: <p>I <em>believe</em> every word.</p>
+lite_mode_html: "I <em>believe</em> every word."
+---
+name: strong
+desc: Strength can be give to text by surrounding with asterisks. In HTML, this strength appears as <strong>bold</strong>.
+in: And then? She *fell*!
+html: <p>And then? She <strong>fell</strong>!</p>
+lite_mode_html: "And then? She <strong>fell</strong>!"
+---
+name: strong phrase beginning with a number
+desc: A strong phrase at the beginning of a line that begins with a number should not be recognized as a ul with a start value (no such thing)
+in: "*10 times as many*"
+html: "<p><strong>10 times as many</strong></p>"
+---
+name: force bold italics
+desc: Both italics and bold can be forced by doubling the underscores or asterisks.
+in: |-
+ I __know__.
+ I **really** __know__.
+html: |-
+ <p>I <i>know</i>.<br />
+ I <b>really</b> <i>know</i>.</p>
+---
+name: citation
+desc: Use double question marks to indicate <em>citation</em>. The title of a book, for instance.
+in: ??Cat's Cradle?? by Vonnegut
+html: <p><cite>Cat&#8217;s Cradle</cite> by Vonnegut</p>
+---
+name: code phrases
+desc: Code phrases can be surrounded by at-symbols.
+in: Convert with @r.to_html@
+html: <p>Convert with <code>r.to_html</code></p>
+lite_mode_html: Convert with <code>r.to_html</code>
+---
+name: code phrases not created with multiple email addresses
+in: Please email why@domain.com or jason@domain.com.
+html: <p>Please email why@domain.com or jason@domain.com.</p>
+---
+name: del
+desc: To indicate a passage which has been deleted, surround the passage with hypens.
+in: I'm -sure- not sure.
+html: <p>I&#8217;m <del>sure</del> not sure.</p>
+---
+name: ins
+desc: Pluses around a passage indicate its insertion.
+in: You are a +pleasant+ child.
+html: <p>You are a <ins>pleasant</ins> child.</p>
+---
+name: superscript
+desc: To superscript a phrase, surround with carets.
+in: a ^2^ + b ^2^ = c ^2^
+html: <p>a <sup>2</sup> + b <sup>2</sup> = c <sup>2</sup></p>
+---
+name: parenthetical superscript phrase
+in: '^(image courtesy NASA)^'
+html: '<p><sup>(image courtesy <span class="caps">NASA</span>)</sup></p>'
+---
+name: subscript
+desc: To subscript, surround with tildes.
+in: log ~2~ x
+html: <p>log <sub>2</sub> x</p>
+---
+name: parenthetical subscript phrase
+in: '~(image courtesy NASA)~'
+html: '<p><sub>(image courtesy <span class="caps">NASA</span>)</sub></p>'
+---
+name: tight superscript and subscript
+desc: if you want your superscript or subscript to not be surrounded by spaces, you must use square brackets
+in: f(x, n) = log[~4~]x[^n^]
+html: '<p>f(x, n) = log<sub>4</sub>x<sup>n</sup></p>'
+---
+name: span
+desc: Lastly, if you find yourself needing to customize the style of a passage, use percent symbols to translate the passage as an HTML span.
+in: I'm %unaware% of most soft drinks.
+html: <p>I&#8217;m <span>unaware</span> of most soft drinks.</p>
+---
+name: style span
+desc: This way, you can apply style settings, as described in the next section to arbitrary phrases.
+in: |-
+ I'm %{color:red}unaware%
+ of most soft drinks.
+html: |-
+ <p>I&#8217;m <span style="color:red;">unaware</span><br />
+ of most soft drinks.</p>
+lite_mode_html: |-
+ I&#8217;m <span style="color:red;">unaware</span><br />
+ of most soft drinks.
+---
+name: percent sign
+desc: though percent signs indicate a span, they shouldn't be overly greedy.
+in: |-
+ http://blah.com/one%20two%20three
+ (min)5%-95%(max)
+html: |-
+ <p>http://blah.com/one%20two%20three<br />
+ (min)5%-95%(max)</p>
+---
+name: css class
+desc: A block can be tagged with a CSS class by circling the class in parentheses and placing it just before the period which marks the block.
+in: p(example1). An example
+html: <p class="example1">An example</p>
+---
+name: css id
+desc: An element ID can be given by prefixing the ID with a pound symbol and using it in place of the class.
+in: p(#big-red). Red here
+html: <p id="big-red">Red here</p>
+---
+name: class and id combined
+desc: Class and ID can be combined by placing the class first.
+in: p(example1#big-red2). Red here
+html: <p class="example1" id="big-red2">Red here</p>
+---
+name: css style
+desc: Style settings can be provided directly by surrounding them in curly braces.
+in: p{color:blue;margin:30px}. Spacey blue
+html: <p style="color:blue;margin:30px;">Spacey blue</p>
+---
+name: language designations
+desc: Language designations can be given between angel brackets.
+in: p[fr]. rouge
+html: <p lang="fr">rouge</p>
+---
+name: block attributes on phrase modifiers
+desc: All block attributes can be applied to phrases as well by placing them just inside the opening modifier.
+in: |-
+ I seriously *{color:red}blushed*
+ when I _(big)sprouted_ that
+ corn stalk from my
+ %[es]cabeza%.
+html: |-
+ <p>I seriously <strong style="color:red;">blushed</strong><br />
+ when I <em class="big">sprouted</em> that<br />
+ corn stalk from my<br />
+ <span lang="es">cabeza</span>.</p>
+---
+name: inline attributes preceded by text are treated as literal
+desc: modifiers must come first, without anything before them
+in: |-
+ I *seriously {color:red}blushed*
+ when I _first (big)sprouted_ that
+ corn stalk from my
+ %grande [es]cabeza%.
+html: |-
+ <p>I <strong>seriously {color:red}blushed</strong><br />
+ when I <em>first (big)sprouted</em> that<br />
+ corn stalk from my<br />
+ <span>grande [es]cabeza</span>.</p>
+---
+name: align justified
+desc: Text inside blocks can be aligned in four basic ways.
+in: p<>. justified
+html: <p style="text-align:justify;">justified</p>
+---
+name: indentation
+desc: Indentation can also be specified by provide a single left paren for every 1em to the left. A single right paren for every 1em to the right.
+in: p))). right ident 3em
+html: <p style="padding-right:3em;">right ident 3em</p>
+---
+name: indentation and alignment
+desc: Identation may be coupled with alignment.
+in: h2()>. Bingo.
+html: <h2 style="padding-left:1em;padding-right:1em;text-align:right;">Bingo.</h2>
+---
+name: many modifiers combined
+desc: And, furthermore, coupled with language settings and CSS styles.
+in: h3()>[no]{color:red}. Bingo
+html: <h3 style="padding-left:1em;padding-right:1em;text-align:right;color:red;" lang="no">Bingo</h3>
+---
+name: code blocks
+desc: For example, long code blocks belong between <code>pre</code> and <code>code</code> tags. Please also indent your code inside the tags to be sure that all Textile processors out there will ignore the contents.
+in: |
+ <pre>
+ <code>
+ a.gsub!( /</, '' )
+ </code>
+ </pre>
+html: |-
+ <pre>
+ <code>
+ a.gsub!( /&lt;/, '' )
+ </code>
+ </pre>
+---
+name: div tags
+desc: You may also choose to surround sections with <code>div</code> tags to separate your document into sections. <a href="http://www.instiki.org/">Instiki</a> uses this technique to float a sidebar to the right.
+in: |
+ <div style="float:right;">
+
+ h3. Sidebar
+
+ "Hobix":http://hobix.com/
+ "Ruby":http://ruby-lang.org/
+
+ </div>
+
+ The main text of the page goes here and will stay to the left of the sidebar.
+html: |-
+ <div style="float:right;">
+ <h3>Sidebar</h3>
+ <p><a href="http://hobix.com/">Hobix</a><br />
+ <a href="http://ruby-lang.org/">Ruby</a></p>
+ </div>
+ <p>The main text of the page goes here and will stay to the left of the sidebar.</p>
+---
+name: numbered list
+desc: To make a numbered list, place each item in its own paragraph, preceded by &#8221;#&#8221;.
+in: |-
+ # A first item
+ # A second item
+ # A third
+html: |-
+ <ol>
+ <li>A first item</li>
+ <li>A second item</li>
+ <li>A third</li>
+ </ol>
+---
+name: nested numbered lists
+desc: These lists may be nested by increasing the number of pound symbols preceding child entries.
+in: |-
+ # Fuel could be:
+ ## Coal
+ ## Gasoline
+ ## Electricity
+ # Humans need only:
+ ## Water
+ ## Protein
+html: |-
+ <ol>
+ <li>Fuel could be:
+ <ol>
+ <li>Coal</li>
+ <li>Gasoline</li>
+ <li>Electricity</li>
+ </ol></li>
+ <li>Humans need only:
+ <ol>
+ <li>Water</li>
+ <li>Protein</li>
+ </ol></li>
+ </ol>
+---
+name: bulleted list
+desc: Bulleted lists use an asterisk in place of the pound.
+in: |-
+ * A first item
+ * A second item
+ * A third
+html: |-
+ <ul>
+ <li>A first item</li>
+ <li>A second item</li>
+ <li>A third</li>
+ </ul>
+---
+name: nested bulleted lists
+desc: These lists may be nested in like manner.
+in: |-
+ * Fuel could be:
+ ** Coal
+ ** Gasoline
+ ** Electricity
+ * Humans need only:
+ ** Water
+ ** Protein
+html: |-
+ <ul>
+ <li>Fuel could be:
+ <ul>
+ <li>Coal</li>
+ <li>Gasoline</li>
+ <li>Electricity</li>
+ </ul></li>
+ <li>Humans need only:
+ <ul>
+ <li>Water</li>
+ <li>Protein</li>
+ </ul></li>
+ </ul>
+---
+name: links
+desc: Basic links are comprised of a phrase which is linked to a <acronym title="Universal Resource Locator">URL</acronym>. Place the descriptive phrase in quotation marks. Follow it immediately by a colon and the URL.
+in: I searched "Google":http://google.com.
+html: <p>I searched <a href="http://google.com">Google</a>.</p>
+lite_mode_html: I searched <a href="http://google.com">Google</a>.
+---
+name: link aliases
+desc: If you are using the same link several times in your document, or you’d just like to be a tad more organized, you can use a link alias. Place the URL anywhere in your document, beginning with its alias in square brackets. Then, use the alias in place of the URL, using the link format above.
+in: |-
+ I am crazy about "Hobix":hobix
+ and "it's":hobix "all":hobix I ever
+ "link to":hobix!
+
+ [hobix]http://hobix.com
+html: |-
+ <p>I am crazy about <a href="http://hobix.com">Hobix</a><br />
+ and <a href="http://hobix.com">it&#8217;s</a> <a href="http://hobix.com">all</a> I ever<br />
+ <a href="http://hobix.com">link to</a>!</p>
+---
+name: image
+desc: You can embed an image in your Textile document by surrounding its URL with exclamation marks.
+in: "!http://hobix.com/sample.jpg!"
+html: <p><img src="http://hobix.com/sample.jpg" alt="" /></p>
+lite_mode_html: <img src="http://hobix.com/sample.jpg" alt="" />
+---
+name: image title
+desc: A title for the image can also be provided in parens, just before the closing exclamation.
+in: "!openwindow1.gif(Bunny.)!"
+html: <p><img src="openwindow1.gif" title="Bunny." alt="Bunny." /></p>
+---
+name: image links
+desc: Links can be attached to images with a colon.
+in: "!openwindow1.gif!:http://hobix.com/"
+html: <p><a href="http://hobix.com/"><img src="openwindow1.gif" alt="" /></a></p>
+---
+name: image alignments
+desc: Alignments can be applied as well to images.
+in: |-
+ !>obake.gif!
+
+ And others sat all round the small
+ machine and paid it to sing to them.
+html: |-
+ <p style="float:right;"><img src="obake.gif" alt="" /></p>
+ <p>And others sat all round the small<br />
+ machine and paid it to sing to them.</p>
+---
+name: acronym definitions
+desc: Definitions for acronyms can be provided by following an acronym with its definition in parens.
+in: We use CSS(Cascading Style Sheets).
+html: <p>We use <acronym title="Cascading Style Sheets"><span class="caps">CSS</span></acronym>.</p>
+lite_mode_html: We use <acronym title="Cascading Style Sheets"><span class="caps">CSS</span></acronym>.
+no_span_caps_html: <p>We use <acronym title="Cascading Style Sheets">CSS</acronym>.</p>
+---
+name: tables
+desc: Simple tables can be built by separating fields with pipe characters
+in: |-
+ | name | age | sex |
+ | joan | 24 | f |
+ | archie | 29 | m |
+ | bella | 45 | f |
+html: |-
+ <table>
+ <tr>
+ <td> name </td>
+ <td> age </td>
+ <td> sex </td>
+ </tr>
+ <tr>
+ <td> joan </td>
+ <td> 24 </td>
+ <td> f </td>
+ </tr>
+ <tr>
+ <td> archie </td>
+ <td> 29 </td>
+ <td> m </td>
+ </tr>
+ <tr>
+ <td> bella </td>
+ <td> 45 </td>
+ <td> f </td>
+ </tr>
+ </table>
+---
+name: table headers
+desc: Specify header cells by marking them with an underscore and period.
+in: |-
+ |_. name |_. age |_. sex |
+ | joan | 24 | f |
+ | archie | 29 | m |
+ | bella | 45 | f |
+html: |-
+ <table>
+ <tr>
+ <th>name </th>
+ <th>age </th>
+ <th>sex </th>
+ </tr>
+ <tr>
+ <td> joan </td>
+ <td> 24 </td>
+ <td> f </td>
+ </tr>
+ <tr>
+ <td> archie </td>
+ <td> 29 </td>
+ <td> m </td>
+ </tr>
+ <tr>
+ <td> bella </td>
+ <td> 45 </td>
+ <td> f </td>
+ </tr>
+ </table>
+---
+name: table cell attributes
+desc: The period used above marks the end of a cell’s attributes. Other attributes can be applied as well.
+in: |-
+ |_. attribute list |
+ |<. align left |
+ |>. align right|
+ |=. center |
+ |<>. justify |
+ |^. valign top |
+ |~. bottom |
+html: |-
+ <table>
+ <tr>
+ <th>attribute list </th>
+ </tr>
+ <tr>
+ <td style="text-align:left;">align left </td>
+ </tr>
+ <tr>
+ <td style="text-align:right;">align right</td>
+ </tr>
+ <tr>
+ <td style="text-align:center;">center </td>
+ </tr>
+ <tr>
+ <td style="text-align:justify;">justify </td>
+ </tr>
+ <tr>
+ <td style="vertical-align:top;">valign top </td>
+ </tr>
+ <tr>
+ <td style="vertical-align:bottom;">bottom </td>
+ </tr>
+ </table>
+---
+name: table colspan
+desc: You can also specify colspans with a backslash, followed by the cell width.
+in: |-
+ |\2. spans two cols |
+ | col 1 | col 2 |
+html: |-
+ <table>
+ <tr>
+ <td colspan="2">spans two cols </td>
+ </tr>
+ <tr>
+ <td> col 1 </td>
+ <td> col 2 </td>
+ </tr>
+ </table>
+---
+name: table rowspan
+desc: Rowspan is specified by a forward slash, followed by the row height.
+in: |-
+ |/3. spans 3 rows | a |
+ | b |
+ | c |
+html: |-
+ <table>
+ <tr>
+ <td rowspan="3">spans 3 rows </td>
+ <td> a </td>
+ </tr>
+ <tr>
+ <td> b </td>
+ </tr>
+ <tr>
+ <td> c </td>
+ </tr>
+ </table>
+---
+name: block attributes applied to table cells
+desc: All block attributes can be applied to table cells as well.
+in: "|{background:#ddd}. Grey cell|"
+html: |-
+ <table>
+ <tr>
+ <td style="background:#ddd;">Grey cell</td>
+ </tr>
+ </table>
+---
+name: black attributes applied to a table
+desc: Table-wide attributes can be applied before the first row of the table. On its own line, followed by a period.
+in: |-
+ table{border:1px solid black}.
+ |This|is|a|row|
+ |This|is|a|row|
+html: |-
+ <table style="border:1px solid black;">
+ <tr>
+ <td>This</td>
+ <td>is</td>
+ <td>a</td>
+ <td>row</td>
+ </tr>
+ <tr>
+ <td>This</td>
+ <td>is</td>
+ <td>a</td>
+ <td>row</td>
+ </tr>
+ </table>
+---
+name: black attributes applied to a table row
+desc: Attributes can be applied to a single row by supplying the attribute before the row starts, using a <code>table</code> modifier and following it by a period.
+in: |-
+ |This|is|a|row|
+ {background:#ddd}. |This|is|grey|row|
+html: |-
+ <table>
+ <tr>
+ <td>This</td>
+ <td>is</td>
+ <td>a</td>
+ <td>row</td>
+ </tr>
+ <tr style="background:#ddd;">
+ <td>This</td>
+ <td>is</td>
+ <td>grey</td>
+ <td>row</td>
+ </tr>
+ </table>
+---
+name: extended block followed by pre block
+in: |-
+ div.. Just a test.
+
+ Second div.
+
+ pre. A pre block ends it.
+html: |-
+ <div>Just a test.</div>
+ <div>Second div.</div>
+ <pre>A pre block ends it.</pre>
+---
+name: extended block followed by blockquote
+in: |-
+ div.. Just a test.
+
+ Second div.
+
+ bq. A blockquote ends it.
+html: |-
+ <div>Just a test.</div>
+ <div>Second div.</div>
+ <blockquote>
+ <p>A blockquote ends it.</p>
+ </blockquote>
+---
+name: extended block followed by block code
+in: |-
+ div.. Just a test.
+
+ Second div.
+
+ bc. A blockcode ends it.
+html: |-
+ <div>Just a test.</div>
+ <div>Second div.</div>
+ <pre><code>A blockcode ends it.</code></pre>
+---
+name: extended block followed by notextile block
+in: |-
+ div.. Just a test.
+
+ Second div.
+
+ notextile. A notextile block ends it.
+html: |-
+ <div>Just a test.</div>
+ <div>Second div.</div>
+ A notextile block ends it.
+valid_html: false
+---
+name: simple parentheses
+in: |-
+ before (in parens) after
+html: |-
+ <p>before (in parens) after</p>
+---
+name: parentheses in underscores
+in: |-
+ before _(in parens)_ after
+html: |-
+ <p>before <em>(in parens)</em> after</p>
+---
+name: parentheses in asterisks
+in: |-
+ before *(in parens)* after
+html: |-
+ <p>before <strong>(in parens)</strong> after</p>
+---
+name: parentheses in underscores in quotes
+in: |-
+ "before _(in parens)_ after"
+html: |-
+ <p>&#8220;before <em>(in parens)</em> after&#8221;</p>
+---
+name: underscores in parentheses
+in: |-
+ one _two three_ (four _five six_) seven
+html: |-
+ <p>one <em>two three</em> (four <em>five six</em>) seven</p>
+---
+name: underscores in parentheses in quotes
+in: |-
+ "one _two three_ (four _five six_) seven"
+html: |-
+ <p>&#8220;one <em>two three</em> (four <em>five six</em>) seven&#8221;</p>
+---
+name: underscores in parentheses 2
+in: |-
+ one (two _three four_) five
+html: |-
+ <p>one (two <em>three four</em>) five</p>
+---
+name: underscores in parentheses in quotes 2
+in: |-
+ "one (two _three four_) five"
+html: |-
+ <p>&#8220;one (two <em>three four</em>) five&#8221;</p>
+---
+name: caps in parentheses
+desc: Uppercase words of three or more characters that are in parentheses should be recognized as well as those not in parentheses.
+in: IBM or (HAL)
+html: <p><span class="caps">IBM</span> or (<span class="caps">HAL</span>)</p>
+no_span_caps_html: <p>IBM or (HAL)</p>
+---
+name: phrase modifiers in parentheses
+desc: Inline modifiers are expected to work in parentheses as well.
+in: |-
+ __Amanita__s are mushrooms.
+ Lungworts (__Lobaria__) are lichens.
+ Blah blah (normal text **bold**) blah.
+html: |-
+ <p>__Amanita__s are mushrooms.<br />
+ Lungworts (<i>Lobaria</i>) are lichens.<br />
+ Blah blah (normal text <b>bold</b>) blah.</p>
+---
+name: square brackets are preserved
+in: |-
+ citation ["(Berk.) Hilton"], see
+ [Papers "blah blah."]
+html: |-
+ <p>citation [&#8220;(Berk.) Hilton&#8221;], see<br />
+ [Papers &#8220;blah blah.&#8221;]</p> \ No newline at end of file
diff --git a/test/scanners/yaml/faq.expected.raydebug b/test/scanners/yaml/faq.expected.raydebug
new file mode 100644
index 0000000..491f335
--- /dev/null
+++ b/test/scanners/yaml/faq.expected.raydebug
@@ -0,0 +1,492 @@
+tag(---)
+operator(-) key<delimiter(")content(What is a...)delimiter(")>error(:)
+ operator(-) key<delimiter(")content(container?)delimiter(")>operator(:) string(>-)
+ string(A) string(_container_) string(is) string(collection) string(of) string(service) string(points) string(and) string(other) string(containers.) string(It)
+ string(is) string(used) string(to) string(organize) string(services.) string(Each) string(container) string(has) string(access) string(to) string(all) string(of) string(the)
+ string(service) string(points) string(in) string(its) string(ancestor) string(containers.)
+
+ operator(-) key<delimiter(")content(registry?)delimiter(")>operator(:) string(>-)
+ string(A) string(_registry_) string(is) string(a) string(special) string(kind) string(of) string(container) string(that) string(has) string(no) string(parent) string(container.)
+ string(It) string(also) string(defines) string(a) string(few) string(services) string((such) string(as) string(the) string(LoggingInterceptor,) string(and)
+ string(the) string(various) string(service) string(models) string(and) string(pipeline) string(elements\),) string(so) string(that) string(they) string(are)
+ string(available) string(by) string(default) string(to) string(all) string(of) string(the) string(services) string(it) string(contains.)
+
+ operator(-) key<delimiter(")content(service point?)delimiter(")>operator(:) string(>-)
+ string(A) string(_service) string(point_) string(is) string(the) string(definition) string(of) string(a) string(service.) string(Just) string(as) string(a) string(class) string(is) string(the)
+ string(definition) string(of) string(an) string(object,) string(and) string(you) string(instantiate) string(an) string(object) string(from) string(a) string(class,) string(so)
+ string(do) string(you) string(instantiate) string(services) string(from) string(service) string(points.)
+
+ operator(-) key<delimiter(")content(service?)delimiter(")>operator(:) string(>-)
+ string(A) string(_service_) string(is) string(the) string(instantiation) string(of) string(a) string(service) string(point.)
+
+ operator(-) key<delimiter(")content(parameterized service?)delimiter(")>operator(:) string(>-)
+ string(A) string(_parameterized_) string(service) string(is) string(a) string(service) string(that) string(allows) string(contextual) string(parameters)
+ string(to) string(be) string(passed) string(to) string(the) string(service) string(when) string(it) string(is) string(created.) string(Such) string(services) string(are)
+ string(typically) string(used) string(in) string(conjunction) string(with) string(the) string(@multiton@) string(service) string(model,) string(but)
+ string(the) string(only) string(real) string(requirement) string(is) string(that) string(they) string(_not_) string(be) string(used) string(with) string(a) string(service) string(model)
+ string(that) string(does) string(not) string(support) string(multiple) string(parameters) string((like) string(@singleton@) string(or)
+ string(@threaded@\).)
+
+ operator(-) key<delimiter(")content(service model?)delimiter(")>operator(:) string(>-)
+ string(A) string(_service) string(model_) string(is) string(a) string(description) string(of) string(the) string(lifecycle) string(of) string(a) string(service.) string(By)
+ string(default,) string(all) string(services) string(are) string(_singletons_,) string(meaning) string(that) string(every) string(time) string(you) string(ask)
+ string(a) string(container) string(for) string(a) string(particular) string(service,) string(you'll) string(get) string(the) string(same) string(object)
+ string(instance) string(back.)
+
+
+ string(There) string(are) string(other) string(service) string(models) string(available,) string(though,) string(including) string("prototype")
+ string((which) string(returns) string(a) string(new) string(instance) string(for) string(each) string(request) string(of) string(a) string(service\)) string(and)
+ string("deferred") string((which) string(returns) string(a) string(proxy,) string(deferring) string(the) string(instatiation) string(of) string(the)
+ string(service) string(itself) string(until) string(a) string(method) string(is) string(invoked) string(on) string(the) string(service\).)
+
+ operator(-) key<delimiter(")content(interceptor?)delimiter(")>operator(:) string(>-)
+ string(An) string(_interceptor_) string(is) string(an) string(object) string(that) string(may) string(be) string(placed) string(between) string(the) string(client) string(and)
+ string(a) string(service.) string(Every) string(request) string(to) string(the) string(service) string(is) string(thus) string(_intercepted_) string(by) string(that)
+ string(object,) string(which) string(can) string(do) string(operations) string(on) string(the) string(request) string((such) string(as) string(logging\)) string(and) string(may)
+ string(even) string(reroute) string(or) string(ignore) string(the) string(request) string(altogether.) string(This) string(provides) string(a) string(kind) string(of)
+ string("poor) string(man's) string(AOP",) string(since) string(you) string(can) string(do) string("before",) string("after",) string(and) string("around") string(advice)
+ string(on) string(the) string(methods) string(of) string(a) string(service.)
+
+
+ string(Needle) string(comes) string(with) string(one) string(standard) string(interceptor,) string(the) string(LoggingInterceptor.) string(It)
+ string(will) string(log) string(a) string(message) string(on) string(method) string(entry) string(and) string(exit,) string(and) string(also) string(when) string(an) string(exception)
+ string(is) string(raised.)
+
+ operator(-) key<delimiter(")content(pipeline?)delimiter(")>operator(:) string(>-)
+ string(In) string(Needle,) string(the) string(_instantiation) string(pipeline_) string(is) string(used) string(to) string(control) string(how) string(and) string(when)
+ string(services) string(are) string(instantiated.) string(The) string(_service) string(models_) string(are) string(implemented) string(as)
+ string(pipelines.)
+
+
+ string(Just) string(as) string(the) string(_interceptors_) string(are) string(for) string(hooking) string(into) string(method) string(invocations,) string(the)
+ string(pipelines) string(are) string(for) string(hooking) string(into) string(service) string(instantiations.) string(Every) string(time) string(a)
+ string(service) string(is) string(requested,) string(it's) string(instantiation) string(pipeline) string(is) string(executed.) string(By)
+ string(choosing) string(the) string(appropriate) string(kinds) string(of) string(pipeline) string(elements,) string(all) string(of) string(the) string(available)
+ string(service) string(models) string(can) string(be) string(implemented) string((prototype,) string(prototype_deferred,)
+ string(singleton,) string(singleton_deferred,) string(etc.\).)
+
+operator(-) key<delimiter(")content(How do I...)delimiter(")>error(:)
+ operator(-) key<delimiter(")content(create a new registry?)delimiter(")>operator(:) string(>-)
+ string(There) string(are) string(several) string(ways) string(to) string(create) string(a) string(new) string(registry.) string(The) string(simplist) string(is) string(just) string(to)
+ string(invoke) string(Registry#new.)
+
+
+ string(<pre>)
+ string(reg) string(=) key(Needle)error(:)symbol(:Registry)string(.new)
+ string(</pre>)
+
+
+ string(This) string(will) string(create) string(a) string(new) string(Registry) string(instance.) string(You) string(can) string(also) string(send) string(a) string(block) string(to)
+ comment(#new, in which case the new registry will be yielded to it:)
+
+
+ string(<pre>)
+ string(reg) string(=) key(Needle)error(:)symbol(:Registry)string(.new) string(do) string(|r|)
+ string(...)
+ string(end)
+ string(</pre>)
+
+
+ string(There) string(are) string(two) string(other) string(factory) string(methods) string(you) string(can) string(use) string(for) string(creating) string(a) string(Registry)
+ string(instance.) string(Both) string(require) string(a) string(block.)
+
+
+ string(<pre>)
+ string(r1) string(=) key(Needle)error(:)symbol(:Registry)string(.define) string(do) string(|builder|)
+ string(...)
+ string(end)
+
+ string(r2) string(=) key(Needle)error(:)symbol(:Registry)string(.define!) string(do)
+ string(...)
+ string(end)
+ string(</pre>)
+
+
+ string(Registry#define) string(creates) string(a) string("builder") string(object) string(that) string(you) string(can) string(use) string(define)
+ string(services) string(more) string(conveniently.) string(Register#define!) string((with) string(a) string(bang\)) string(does) string(the) string(same)
+ string(thing,) string(but) string(evaluates) string(the) string(block) string(within) string(the) string(context) string(of) string(the) string(builder.)
+
+ operator(-) key<delimiter(")content(register a service?)delimiter(")>operator(:) string(>-)
+ string(The) string(first) string(way) string(to) string(register) string(a) string(service) string(is) string(by) string(calling) comment(#register on the)
+ string(registry) string((or) string(a) string(namespace\))error(:)
+
+
+ string(<pre>)
+ string(reg.register() symbol(:foo) string(\)) operator({) string(Foo.new) operator(})
+ string(</pre>)
+
+
+ string(The) string((first\)) string(parameter) string(to) comment(#register is the name of the service, and the)
+ string(block) string(should) string(return) string(the) string(implementation) string(of) string(the) string(service.) string(If) string(needed,) string(the)
+ string(block) string(can) string(accept) string(two) string(parameters--the) string(container) string(that) string(the) string(service) string(is) string(being)
+ string(registered) string(with,) string(and) string(an) string(object) string(that) string(represents) string(the) string(service) string(being) string(defined)
+ string((called) string(a) string("service) string(point"\))error(:)
+
+
+ string(<pre>)
+ string(reg.register() symbol(:foo) string(\)) string(do) string(|container,point|)
+ string(Foo.new() string(container[)symbol(:bar)operator(])operator(,) string(point.fullname) string(\))
+ string(end)
+ string(</pre>)
+
+
+ string(You) string(can) string(also) string(use) string(Container#define) string(and) string(Container#define!) string(to) string(register)
+ string(services.) string(These) string(approaches) string(are) string(friendlier) string(if) string(you) string(are) string(needing) string(to) string(register)
+ string(several) string(services) string(at) string(once.)
+
+
+ string(<pre>)
+ string(reg.define) string(do) string(|builder|)
+ string(builder.foo) operator({) string(Foo.new) operator(})
+ string(builder.bar) operator({) string(|c,p|) string(Bar.new() string(c[)symbol(:foo)operator(])operator(,) string(p.name) string(\)) operator(})
+ string(end)
+
+ string(reg.define!) string(do)
+ string(baz) operator({) string(|c,p|) string(Baz.new() string(c[)symbol(:bar)operator(])operator(,) string(p.name) string(\)) operator(})
+ string(zoom) operator({) string(Buggy.new) operator(})
+ string(end)
+ string(</pre>)
+
+
+ string(Container#define) string(yields) string(a) string(new) string("builder") string(object) string(to) string(the) string(block.) string(Messages)
+ string(sent) string(to) string(the) string(builder) string(are) string(interpreted) string(as) string(service) string(names,) string(and) string(if) string(a) string(block) string(is)
+ string(sent) string(with) string(the) string(message,) string(a) string(new) string(service) string(is) string(registered) string(under) string(that) string(name.)
+
+
+ string(Container#define!) string(does) string(likewise,) string(except) string(it) string(evaluates) string(the) string(block) string(within) string(the)
+ string(context) string(of) string(the) string(builder) string(object.)
+
+
+ string(If) string(you) string(do) string(not) string(pass) string(a) string(block) string(to) comment(#define, it will return the builder object,)
+ string(so) string(you) string(could) string(do) string(something) string(like) string(the) string(following) string(if) string(you) string(only) string(need) string(to) string(define)
+ string(one) string(or) string(two) key(services)error(:)
+
+
+ string(<pre>)
+ string(reg.define.foo) operator({) string(...) operator(})
+ string(</pre>)
+
+
+ string(Lastly,) string(you) string(can) string(get) string(the) string(builder) string(directly) string(and) string(add) string(services) string(using) key(it)error(:)
+
+
+ string(<pre>)
+ string(builder) string(=) string(reg.builder)
+ string(builder.baz) operator({) string(...) operator(})
+ string(builder.bar) operator({) string(...) operator(})
+ string(</pre>)
+
+
+ string((This) string(last) string(is) string(the) string(same) string(as) string(calling) comment(#define without arguments, but is more)
+ string(readable) string(if) string(you) string(intend) string(to) string(use) string(the) string(builder) string(object) string(multiple) string(times.\))
+
+ operator(-) key<delimiter(")content(reference a service?)delimiter(")>operator(:) string(>-)
+ string(Referencing) string(a) string(service) string(can) string(be) string(done) string(in) string(either) string(of) string(two) string(ways.) string(The) string(first) string(is) string(to)
+ string(treat) string(the) string(container) string((i.e.,) string(registry\)) string(as) string(a) string(hash,) string(passing) string(the) string(name) string(of) string(the)
+ string(service) string(as) string(an) string(argument) string(to) string(Container#[])error(:)
+
+
+ string(<pre>)
+ string(svc) string(=) string(registry[)symbol(:foo)operator(])
+ string(svc.do_something_interesting)
+ string(</pre>)
+
+
+ string(A) string(more) string(convenient) string((but) string(slightly) string(more) string(peril-fraught\)) string(approach) string(is) string(to) string(send)
+ string(the) string(name) string(of) string(the) string(method) string(to) string(the) string(registry) string(as) string(a) key(message)error(:)
+
+
+ string(<pre>)
+ string(svc) string(=) string(registry.foo)
+ string(</pre>)
+
+
+ string(Be) string(aware) string(that) string(this) string(latter) string(approach) string(will) string(only) string(work) string(when) string(the) string(service) string(name)
+ string(does) string(not) string(conflict) string(with) string(the) string(name) string(of) string(an) string(existing) string(method) string(on) string(the) string(container.)
+ string(For) string(example,) string(if) string(you) string(were) string(to) key(do)error(:)
+
+
+ string(<pre>)
+ string(registry.register() symbol(:hash) string(\)) operator({) string("hello,) string(world") operator(})
+ string(p) string(registry.hash)
+ string(</pre>)
+
+
+ string(You) string(would) string(get) string(the) string(hash) string(value) string(of) string(the) string(registry) string(object,) string(instead) string(of) string(the) string(value)
+ string(value) string(of) string(the) string(service) string((which) string(would) string(be) string("hello,) string(world"\).)
+
+ operator(-) key<delimiter(")content(select a service model for a service (i.e., change the default model of lifecycle management\)?)delimiter(")>operator(:) string(>-)
+ string(By) string(default,) string(a) string(service) string(will) string(be) string(managed) string(as) string(a) string(singleton,) string(i.e.,) string(every) string(request)
+ string(of) string(that) string(service) string(will) string(return) string(the) string(same) string(object) string(instance.) string(This) string(is) string(the)
+ string(_singleton_) string(service) string(model.)
+
+
+ string(To) string(select) string(a) string(different) string(service) string(model,) string(pass) string(it) string(as) string(an) string(option) string(when) string(you)
+ string(register) string(the) key(service)error(:)
+
+
+ string(<pre>)
+ string(registry.register() symbol(:foo)operator(,) symbol(:model) string(=>) symbol(:prototype) string(\)) operator({)string(...})
+ string(registry.define.bar() symbol(:model) string(=>) symbol(:threaded) string(\)) operator({)string(...})
+ string(registry.define!) string(do)
+ string(baz() symbol(:model) string(=>) symbol(:singleton_deferred) string(\)) operator({)string(...})
+ string(...)
+ string(end)
+ string(...)
+ string(</pre>)
+
+ operator(-) key<delimiter(")content(create a namespace?)delimiter(")>operator(:) string(>-)
+ string(Namespaces) string(allow) string(you) string(to) string(organize) string(your) string(services) string(into) string(hierarchical)
+ string(packages.) string(You) string(can) string(create) string(namespaces) string(in) string(a) string(few) string(ways.) string(The) string(first) string((and)
+ string(simplest\)) string(is) string(to) string(just) string(call) string(Container#namespace)error(:)
+
+
+ string(<pre>)
+ string(registry.namespace() symbol(:stuff) string(\))
+ string(</pre>)
+
+
+ string(This) string(will) string(create) string(a) string(namespace) string(in) string(the) string(registry,) string(called) string(stuff.) string(If) string(you) string(send) string(a)
+ string(block) string(as) string(well,) string(the) string(block) string(will) string(be) string(invoked) string((with) string(the) string(new) string(namespace) string(yielded)
+ string(to) string(it\)) string(the) string(first) string(time) string(the) string(namespace) string(is) key(requested)error(:)
+
+
+ string(<pre>)
+ string(registry.namespace() symbol(:stuff) string(\)) string(do) string(|ns|)
+ string(ns.register() symbol(:foo) string(\)) operator({)string(...})
+ string(ns.define.bar) operator({)string(...})
+ string(ns.define!) string(do)
+ string(baz) operator({)string(...})
+ string(buf) operator({)string(...})
+ string(end)
+ string(end)
+ string(</pre>)
+
+ string(Because) string(it) string(is) string(so) string(common) string(to) string(immediately) string(define) string(services) string(on) string(the) string(new)
+ string(namespace,) string(there) string(are) string(some) string(convenience) string(methods) string(to) string(make) string(this) string(more...)
+ string(convenient.)
+
+
+ string(<pre>)
+ string(registry.namespace_define!() symbol(:stuff) string(\)) string(do)
+ string(foo) operator({)string(...})
+ string(bar) operator({)string(...})
+ string(baz) operator({)string(...})
+ string(end)
+
+ string(registry.namespace_define() symbol(:more_stuff) string(\)) string(do) string(|b|)
+ string(b.blah) operator({)string(...})
+ string(b.argh) operator({)string(...})
+ string(b.hack) operator({)string(...})
+ string(end)
+ string(</pre>)
+
+
+ string(The) string(first) string(one,) string(above,) string(creates) string(the) string(namespace) string(and) string(calls) string(Container#define!.)
+ string(The) string(second) string(creates) string(the) string(namespace) string(and) string(calls) string(Container#define.) string(In) string(both)
+ string(cases,) string(_the) string(namespace) string(is) string(created) string(immediately_,) string(unlike) string(Container#namespace)
+ string(which) string(only) string(creates) string(the) string(namespace) string(when) string(it) string(is) string(first) string(requested.)
+
+
+ string(Lastly,) string(note) string(that) string(namespace's) string(are) string(just) string(special) string(services.) string(Thus,) string(you) string(can)
+ string(pass) string(options) string(to) string(the) string(namespace) string(methods) string(just) string(as) string(you) string(can) string(with)
+ string(Container#register) string(and) string(friends.)
+
+ operator(-) key<delimiter(")content(write log messages?)delimiter(")>operator(:) string(>-)
+ string(You) string(can) string(obtain) string(a) string(new) string(logger) string(instance) string(from) string(the) string(@)symbol(:logs)string(@) string(and) string(@)symbol(:log_for)string(@)
+ string(services.) string(Once) string(you) string(have) string(a) string(logger) string(instance,) string(you) string(can) string(invoke) string(the) comment(#debug,)
+ comment(#info, #warn, #error, and #fatal methods on the instance to log messages)
+ string(of) string(the) string(corresponding) string(severity.)
+
+
+ string(<pre>)
+ string(logger) string(=) string(registry.logs.get() string("a) string(name) string(for) string(my) string(logger") string(\))
+ string(logger.debug) string("This) string(is) string(a) string(debug) string(message")
+ string(logger.info) string("This) string(is) string(an) string(informational) string(message")
+ string(...)
+ string(logger2) string(=) string(registry.log_for() string("another) string(logger) string(name") string(\))
+ string(...)
+ string(</pre>)
+
+
+ string(The) string(two) string(approaches) string(shown) string(above) string(are) string(identical--the) string(second) string(approach) string((using)
+ string(the) string(@log_for@) string(service\)) string(is) string(just) string(a) string(convenience) string(for) string(@logs.get@.)
+
+
+ string(Log) string(messages) string(are) string(written,) string(by) string(default,) string(to) string(a) string(file) string(called) string("needle.log",) string(in)
+ string(the) string(same) string(directory) string(that) string(the) string(application) string(was) string(invoked) string(from.)
+
+
+ string(You) string(can) string(also) string(use) string(a) string(logging) string(interceptor) string(to) string(automatically) string(log) string(all) string(external)
+ string(method) string(invocations) string(on) string(a) string(service.) string(This) string(includes) string(method) string(entry) string(and) string(exit,) string(as)
+ string(well) string(as) string(any) string(exceptions) string(that) string(are) string(raised) string(inside) string(the) string(method.)
+
+
+ string(<pre>)
+ string(registry.register() symbol(:foo) string(\)) operator({) string(...) operator(})
+ string(registry.intercept() symbol(:foo) string(\).with) operator({) string(|r|) string(r.logging_interceptor) operator(})
+
+ string(foo.something)
+ string(foo.another_method() string(1,) string(2,) string(3) string(\))
+ string(</pre>)
+
+
+ string(See) string(the) string(chapter) string(in) string(the) key<delimiter(")content(User's Manual)delimiter(")>symbol(:http)error(:)string(//needle.rubyforge.org) string(about)
+ string(logging) string(for) string(more) string(information) string(on) string(how) string(to) string(use) string(and) string(configure) string(loggers.)
+
+ operator(-) key<delimiter(")content(exclude methods from being intercepted?)delimiter(")>operator(:) string(>-)
+ string(Only) string(interceptors) string(that) string(explicitly) string(support) string(exclusion) string(of) string(methods) string(can) string(help)
+ string(you) string(here.) string(Fortunately,) string(the) string(LoggingInterceptor) string(is) string(one) string(of) string(them.) string((If) string(you)
+ string(write) string(your) string(own) string(interceptor) string(and) string(would) string(like) string(similar) string(functionality,) string(see) string(the)
+ string(IncludeExclude) string(module.\))
+
+
+ string(In) string(the) string(case) string(of) string(the) string(LoggingInterceptor,) string(just) string(pass) string(an) string(array) string(of) string(patterns)
+ string((matching) string(method) string(names) string(and/or) string(arities\)) string(as) string(the) string("exclude") string(option,) string(when)
+ string(declaring) string(the) key(interceptor)error(:)
+
+
+ string(<pre>)
+ string(registry.register() symbol(:foo) string(\)) operator({) string(...) operator(})
+ string(registry.intercept() symbol(:foo) string(\).)
+ string(with) operator({) string(|r|) string(r.logging_interceptor) operator(})string(.)
+ string(with_options) symbol(:exclude) string(=>) operator([) string('foo',) string('bar(>4\)',) string('*(<2\)') operator(])
+ string(</pre>)
+
+
+ string(The) string(above) string(will) string(exclude) string(from) string(interception) string(any) string(method) string(named) string('foo',) string(or) string(any)
+ string(invocation) string(of) string('bar') string(with) string(more) string(than) string(4) string(arguments,) string(or) string(any) string(method) string(invocation)
+ string(with) string(fewer) string(than) string(two) string(arguments.)
+
+
+ string(You) string(can) string(also) string(give) string(an) string(array) string(of) string(patterns) string(to) string(_include_.) string(These) string(cause) string(methods)
+ string(to) string(be) string(explicitly) string(intercepted) string(even) string(if) string(they) string(match) string(an) string(exclude) key(pattern)error(:)
+
+
+ string(<pre>)
+ string(registry.register() symbol(:foo) string(\)) operator({) string(...) operator(})
+ string(registry.intercept() symbol(:foo) string(\).)
+ string(with) operator({) string(|r|) string(r.logging_interceptor) operator(})string(.)
+ string(with_options) symbol(:exclude) string(=>) operator([) string('foo',) string('bar(>4\)',) string('*(<2\)') operator(])operator(,)
+ symbol(:include) string(=>) operator([) string('baz') operator(])
+
+ string(foo) string(=) string(registry.foo)
+ string(foo.baz)
+ string(</pre>)
+
+
+ string(This) string(would) string(result) string(in) string(the) string(call) string(to) comment(#baz being intercepted, even though it)
+ string(matches) string(an) string(exclude) string(pattern) string((@*(<2\)@\).)
+
+ operator(-) key<delimiter(")content(include services defined in another library?)delimiter(")>operator(:) string(>-)
+ string(This) string(requires) string(that) string(the) string(other) string(library) string(be) string(implemented) string(in) string(such) string(a) string(way) string(that) string(it)
+ string(expects) string(to) string(be) string("included") string(by) string(other) string(libraries/applications.) string(For) string(example,)
+ string(Needle) string(encourages) string(the) string(use) string(of) string(a) string(method) string(called) string(@register_services@,) string(which)
+ string(accepts) string(a) string(container) string(as) string(a) key(parameter)error(:)
+
+
+ string(<pre>)
+ string(module) string(A)
+ string(module) string(B)
+ string(def) string(register_services() string(container) string(\))
+ string(...)
+ string(end)
+ string(module_function) symbol(:register_services)
+ string(end)
+ string(end)
+ string(</pre>)
+
+
+ string(If) string(the) string(library) string(has) string(been) string(implemented) string(in) string(this) string(way,) string(you) string(can) string(simply) string(do) string(a)
+ string(require) string(of) string(the) string(library) string(and) string(then) string(invoke) string(the) string(@register_services@) string(method.)
+
+
+ string(There) string(is) string(a) string(convenience) string(method) string(in) string(Container) string(for) string(doing) string(this.) string(Just) string(call)
+ string(Container#require,) string(passing) string(the) string(file) string(to) string(require) string(and) string(a) string(string) string((or) string(symbol\))
+ string(identifying) string(the) string(name) string(of) string(the) string(module) string(that) string(contains) string(the) string(registration) string(method.)
+ string(You) string(can) string(also) string(pass) string(a) string(symbol) string(as) string(the) string(third) string(parameter) string(naming) string(the) string(registration)
+ string(method,) string(but) string(it) string(defaults) string(to) string(@)symbol(:register_services)string(@.)
+
+
+ string(<pre>)
+ string(require) string('a/b')
+ key(A)error(:)symbol(:B)string(.register_services() string(container) string(\))
+
+ comment(# or)
+
+ string(container.require() string('a/b',) string("A)error(:)symbol(:B)string(") string(\))
+ string(</pre>)
+
+
+ string(The) string(definition) string(context) string((i.e.,) string(the) string("builder") string(object\)) string(also) string(supports) string(the)
+ string(require) string(method,) string(so) string(you) string(can) key(do)error(:)
+
+
+ string(<pre>)
+ string(container.define) string(do) string(|b|)
+ string(b.require) string("a/b",) string("A)error(:)symbol(:B)string(")
+ string(b.foo) operator({) string(...) operator(})
+ string(...)
+ string(end)
+ string(</pre>)
+
+operator(-) key<delimiter(")content(When should I...)delimiter(")>error(:)
+ operator(-) key<delimiter(")content(use a different service model?)delimiter(")>error(:)
+ operator(-) key<delimiter(")content(Like, :prototype?)delimiter(")>operator(:) string(>-)
+ string(The) string(prototype) string(service) string(model) string(is) string(appropriate) string(when) string(the) key(service)error(:)
+
+
+ string(*) string(has) string(internal) string(state)
+
+ string(*) string(will) string(be) string(used) string(multiple) string(times) string(for) string(different) string(situations)
+
+
+ string(For) string(example,) string(if) string(you) string(have) string(a) string(GUI) string(library,) string(a) string("button") string(service) string(could) string(be) string(a)
+ string(prototype,) string(because) string(you) string(will) string(likely) string(have) string(many) string(buttons) string(in) string(an) string(application,)
+ string(with) string(each) string(button) string(being) string(an) string(independent) string(instance.)
+
+ operator(-) key<delimiter(")content(Like, :singleton?)delimiter(")>operator(:) string(>-)
+ string(The) string(singleton) string(service) string(model) string(is) string(the) string(default,) string(so) string(you) string(should) string(rarely) string(need)
+ string(to) string(explicitly) string(specify) string(it) string(as) string(a) string(model.) string(It) string(is) string(appropriate) string(for) string(services)
+ key(that)error(:)
+
+
+ string(*) string(guard) string(some) string(specific) string(functionality)
+
+ string(*) string(represent) string(state) string(that) string(is) string(global) string(across) string(an) string(application)
+
+ operator(-) key<delimiter(")content(Like, :threaded?)delimiter(")>operator(:) string(>-)
+ string(Threaded) string(is) string(similar) string(to) string(singleton,) string(but) string(it) string(allows) string(one) string(unique) string(instance) string(of)
+ string(the) string(service) string(_per) string(thread_.) string(Thus,) string(it) string(is) string(appropriate) string(to) string(the) string(same)
+ string(situations) string(as) string(singleton,) string(but) string(specific) string(to) string(a) string(thread,) string(instead) string(of) string(an)
+ string(application.) string(This) string(is) string(useful) string(for) string(web) string(applications) string(that) string(are) string(run) string(in) string(a)
+ string(single) string(virtual) string(machine,) string(and) string(which) string(share) string(a) string(single) string(registry.)
+
+ operator(-) key<delimiter(")content(Like, deferred?)delimiter(")>operator(:) string(>-)
+ string(Deferred) string(models) string(use) string(a) string(proxy) string(to) string(enforce) string(lazy) string(initialization) string(of) string(the)
+ string(service.) string(A) string(service) string(using) string(a) string(deferred) string(service) string(model) string((ie,)
+ string(@)symbol(:prototype_deferred)string(@,) string(@)symbol(:multiton_deferred)string(@,) string(@)symbol(:singleton_deferred)string(@,) string(or)
+ string(@)symbol(:threaded_deferred)string(@\)) string(will) string(not) string(be) string(instantiated) string(until) string(the) string(first) string(time) string(a)
+ string(method) string(is) string(invoked) string(on) string(the) string(service.)
+
+
+ string(This) string(makes) string(a) string(deferred) string(model) string(appropriate) string(when) string(a) string(service) string(is) string(expensive) string(to)
+ string(instantiate,) string(since) string(you) string(can) string(wait) string(to) string(do) string(the) string(expensive) string(initialization)
+ string(until) string(it) string(is) string(really) string(needed.) string(Applications) string(will) string(start) string(up) string(faster) string(when) string(their)
+ string(dependences) string(use) string(deferred) string(instantiation.)
+
+ operator(-) key<delimiter(")content(Like, initialize?)delimiter(")>operator(:) string(>-)
+ string(This) string(is) string(useful) string(when) string(you) string(have) string(a) string(method) string(that) string(you) string(want) string(to) string(be) string(invoked)
+ string(automatically) string(after) string(a) string(service) string(has) string(been) string(instantiated.) string(Consider) string(the) string(case)
+ string(where) string(a) string(service) string(is) string(initialized) string(primarily) string(using) string(setters,) string(but) string(requires)
+ string(some) string(logic) string(to) string(be) string(executed) string(to) string(complete) string(the) string(initialization) string(phase.) string(In) string(this)
+ string(case,) string(you) string(could) string(always) string(explicitly) string(invoke) string(the) string(initialization) string(method(s\))
+ string(in) string(the) string(constructor) string(block,) string(but) string(if) string(many) string(services) string(use) string(the) string(same)
+ string(initialization) string(method,) string(it) string(can) string(be) string(more) string(convenient) string(to) string(use) string(an) string("initialize")
+ string(service) string(model.)
+
+ operator(-) key<delimiter(")content(Like, multiton?)delimiter(")>operator(:) string(>-)
+ string(Multitons) string(are) string(useful) string(for) string(factories,) string(where) string(you) string(have) string(a) string(class) string(that)
+ string(differentiates) string(its) string(instances) string(based) string(on) string(some) string(construction) string(parameters) string(that)
+ string(need) string(to) string(be) string(determined) string(at) string(runtime.) string(Thus,) string(multitons) string(are) string(always) string(used) string(with)
+ string(parameterized) string(services.)
diff --git a/test/scanners/yaml/faq.in.yml b/test/scanners/yaml/faq.in.yml
new file mode 100644
index 0000000..bcd8438
--- /dev/null
+++ b/test/scanners/yaml/faq.in.yml
@@ -0,0 +1,492 @@
+---
+- "What is a...":
+ - "container?": >-
+ A _container_ is collection of service points and other containers. It
+ is used to organize services. Each container has access to all of the
+ service points in its ancestor containers.
+
+ - "registry?": >-
+ A _registry_ is a special kind of container that has no parent container.
+ It also defines a few services (such as the LoggingInterceptor, and
+ the various service models and pipeline elements), so that they are
+ available by default to all of the services it contains.
+
+ - "service point?": >-
+ A _service point_ is the definition of a service. Just as a class is the
+ definition of an object, and you instantiate an object from a class, so
+ do you instantiate services from service points.
+
+ - "service?": >-
+ A _service_ is the instantiation of a service point.
+
+ - "parameterized service?": >-
+ A _parameterized_ service is a service that allows contextual parameters
+ to be passed to the service when it is created. Such services are
+ typically used in conjunction with the @multiton@ service model, but
+ the only real requirement is that they _not_ be used with a service model
+ that does not support multiple parameters (like @singleton@ or
+ @threaded@).
+
+ - "service model?": >-
+ A _service model_ is a description of the lifecycle of a service. By
+ default, all services are _singletons_, meaning that every time you ask
+ a container for a particular service, you'll get the same object
+ instance back.
+
+
+ There are other service models available, though, including "prototype"
+ (which returns a new instance for each request of a service) and
+ "deferred" (which returns a proxy, deferring the instatiation of the
+ service itself until a method is invoked on the service).
+
+ - "interceptor?": >-
+ An _interceptor_ is an object that may be placed between the client and
+ a service. Every request to the service is thus _intercepted_ by that
+ object, which can do operations on the request (such as logging) and may
+ even reroute or ignore the request altogether. This provides a kind of
+ "poor man's AOP", since you can do "before", "after", and "around" advice
+ on the methods of a service.
+
+
+ Needle comes with one standard interceptor, the LoggingInterceptor. It
+ will log a message on method entry and exit, and also when an exception
+ is raised.
+
+ - "pipeline?": >-
+ In Needle, the _instantiation pipeline_ is used to control how and when
+ services are instantiated. The _service models_ are implemented as
+ pipelines.
+
+
+ Just as the _interceptors_ are for hooking into method invocations, the
+ pipelines are for hooking into service instantiations. Every time a
+ service is requested, it's instantiation pipeline is executed. By
+ choosing the appropriate kinds of pipeline elements, all of the available
+ service models can be implemented (prototype, prototype_deferred,
+ singleton, singleton_deferred, etc.).
+
+- "How do I...":
+ - "create a new registry?": >-
+ There are several ways to create a new registry. The simplist is just to
+ invoke Registry#new.
+
+
+ <pre>
+ reg = Needle::Registry.new
+ </pre>
+
+
+ This will create a new Registry instance. You can also send a block to
+ #new, in which case the new registry will be yielded to it:
+
+
+ <pre>
+ reg = Needle::Registry.new do |r|
+ ...
+ end
+ </pre>
+
+
+ There are two other factory methods you can use for creating a Registry
+ instance. Both require a block.
+
+
+ <pre>
+ r1 = Needle::Registry.define do |builder|
+ ...
+ end
+
+ r2 = Needle::Registry.define! do
+ ...
+ end
+ </pre>
+
+
+ Registry#define creates a "builder" object that you can use define
+ services more conveniently. Register#define! (with a bang) does the same
+ thing, but evaluates the block within the context of the builder.
+
+ - "register a service?": >-
+ The first way to register a service is by calling #register on the
+ registry (or a namespace):
+
+
+ <pre>
+ reg.register( :foo ) { Foo.new }
+ </pre>
+
+
+ The (first) parameter to #register is the name of the service, and the
+ block should return the implementation of the service. If needed, the
+ block can accept two parameters--the container that the service is being
+ registered with, and an object that represents the service being defined
+ (called a "service point"):
+
+
+ <pre>
+ reg.register( :foo ) do |container,point|
+ Foo.new( container[:bar], point.fullname )
+ end
+ </pre>
+
+
+ You can also use Container#define and Container#define! to register
+ services. These approaches are friendlier if you are needing to register
+ several services at once.
+
+
+ <pre>
+ reg.define do |builder|
+ builder.foo { Foo.new }
+ builder.bar { |c,p| Bar.new( c[:foo], p.name ) }
+ end
+
+ reg.define! do
+ baz { |c,p| Baz.new( c[:bar], p.name ) }
+ zoom { Buggy.new }
+ end
+ </pre>
+
+
+ Container#define yields a new "builder" object to the block. Messages
+ sent to the builder are interpreted as service names, and if a block is
+ sent with the message, a new service is registered under that name.
+
+
+ Container#define! does likewise, except it evaluates the block within the
+ context of the builder object.
+
+
+ If you do not pass a block to #define, it will return the builder object,
+ so you could do something like the following if you only need to define
+ one or two services:
+
+
+ <pre>
+ reg.define.foo { ... }
+ </pre>
+
+
+ Lastly, you can get the builder directly and add services using it:
+
+
+ <pre>
+ builder = reg.builder
+ builder.baz { ... }
+ builder.bar { ... }
+ </pre>
+
+
+ (This last is the same as calling #define without arguments, but is more
+ readable if you intend to use the builder object multiple times.)
+
+ - "reference a service?": >-
+ Referencing a service can be done in either of two ways. The first is to
+ treat the container (i.e., registry) as a hash, passing the name of the
+ service as an argument to Container#[]:
+
+
+ <pre>
+ svc = registry[:foo]
+ svc.do_something_interesting
+ </pre>
+
+
+ A more convenient (but slightly more peril-fraught) approach is to send
+ the name of the method to the registry as a message:
+
+
+ <pre>
+ svc = registry.foo
+ </pre>
+
+
+ Be aware that this latter approach will only work when the service name
+ does not conflict with the name of an existing method on the container.
+ For example, if you were to do:
+
+
+ <pre>
+ registry.register( :hash ) { "hello, world" }
+ p registry.hash
+ </pre>
+
+
+ You would get the hash value of the registry object, instead of the value
+ value of the service (which would be "hello, world").
+
+ - "select a service model for a service (i.e., change the default model of lifecycle management)?": >-
+ By default, a service will be managed as a singleton, i.e., every request
+ of that service will return the same object instance. This is the
+ _singleton_ service model.
+
+
+ To select a different service model, pass it as an option when you
+ register the service:
+
+
+ <pre>
+ registry.register( :foo, :model => :prototype ) {...}
+ registry.define.bar( :model => :threaded ) {...}
+ registry.define! do
+ baz( :model => :singleton_deferred ) {...}
+ ...
+ end
+ ...
+ </pre>
+
+ - "create a namespace?": >-
+ Namespaces allow you to organize your services into hierarchical
+ packages. You can create namespaces in a few ways. The first (and
+ simplest) is to just call Container#namespace:
+
+
+ <pre>
+ registry.namespace( :stuff )
+ </pre>
+
+
+ This will create a namespace in the registry, called stuff. If you send a
+ block as well, the block will be invoked (with the new namespace yielded
+ to it) the first time the namespace is requested:
+
+
+ <pre>
+ registry.namespace( :stuff ) do |ns|
+ ns.register( :foo ) {...}
+ ns.define.bar {...}
+ ns.define! do
+ baz {...}
+ buf {...}
+ end
+ end
+ </pre>
+
+ Because it is so common to immediately define services on the new
+ namespace, there are some convenience methods to make this more...
+ convenient.
+
+
+ <pre>
+ registry.namespace_define!( :stuff ) do
+ foo {...}
+ bar {...}
+ baz {...}
+ end
+
+ registry.namespace_define( :more_stuff ) do |b|
+ b.blah {...}
+ b.argh {...}
+ b.hack {...}
+ end
+ </pre>
+
+
+ The first one, above, creates the namespace and calls Container#define!.
+ The second creates the namespace and calls Container#define. In both
+ cases, _the namespace is created immediately_, unlike Container#namespace
+ which only creates the namespace when it is first requested.
+
+
+ Lastly, note that namespace's are just special services. Thus, you can
+ pass options to the namespace methods just as you can with
+ Container#register and friends.
+
+ - "write log messages?": >-
+ You can obtain a new logger instance from the @:logs@ and @:log_for@
+ services. Once you have a logger instance, you can invoke the #debug,
+ #info, #warn, #error, and #fatal methods on the instance to log messages
+ of the corresponding severity.
+
+
+ <pre>
+ logger = registry.logs.get( "a name for my logger" )
+ logger.debug "This is a debug message"
+ logger.info "This is an informational message"
+ ...
+ logger2 = registry.log_for( "another logger name" )
+ ...
+ </pre>
+
+
+ The two approaches shown above are identical--the second approach (using
+ the @log_for@ service) is just a convenience for @logs.get@.
+
+
+ Log messages are written, by default, to a file called "needle.log", in
+ the same directory that the application was invoked from.
+
+
+ You can also use a logging interceptor to automatically log all external
+ method invocations on a service. This includes method entry and exit, as
+ well as any exceptions that are raised inside the method.
+
+
+ <pre>
+ registry.register( :foo ) { ... }
+ registry.intercept( :foo ).with { |r| r.logging_interceptor }
+
+ foo.something
+ foo.another_method( 1, 2, 3 )
+ </pre>
+
+
+ See the chapter in the "User's Manual":http://needle.rubyforge.org about
+ logging for more information on how to use and configure loggers.
+
+ - "exclude methods from being intercepted?": >-
+ Only interceptors that explicitly support exclusion of methods can help
+ you here. Fortunately, the LoggingInterceptor is one of them. (If you
+ write your own interceptor and would like similar functionality, see the
+ IncludeExclude module.)
+
+
+ In the case of the LoggingInterceptor, just pass an array of patterns
+ (matching method names and/or arities) as the "exclude" option, when
+ declaring the interceptor:
+
+
+ <pre>
+ registry.register( :foo ) { ... }
+ registry.intercept( :foo ).
+ with { |r| r.logging_interceptor }.
+ with_options :exclude => [ 'foo', 'bar(>4)', '*(<2)' ]
+ </pre>
+
+
+ The above will exclude from interception any method named 'foo', or any
+ invocation of 'bar' with more than 4 arguments, or any method invocation
+ with fewer than two arguments.
+
+
+ You can also give an array of patterns to _include_. These cause methods
+ to be explicitly intercepted even if they match an exclude pattern:
+
+
+ <pre>
+ registry.register( :foo ) { ... }
+ registry.intercept( :foo ).
+ with { |r| r.logging_interceptor }.
+ with_options :exclude => [ 'foo', 'bar(>4)', '*(<2)' ],
+ :include => [ 'baz' ]
+
+ foo = registry.foo
+ foo.baz
+ </pre>
+
+
+ This would result in the call to #baz being intercepted, even though it
+ matches an exclude pattern (@*(<2)@).
+
+ - "include services defined in another library?": >-
+ This requires that the other library be implemented in such a way that it
+ expects to be "included" by other libraries/applications. For example,
+ Needle encourages the use of a method called @register_services@, which
+ accepts a container as a parameter:
+
+
+ <pre>
+ module A
+ module B
+ def register_services( container )
+ ...
+ end
+ module_function :register_services
+ end
+ end
+ </pre>
+
+
+ If the library has been implemented in this way, you can simply do a
+ require of the library and then invoke the @register_services@ method.
+
+
+ There is a convenience method in Container for doing this. Just call
+ Container#require, passing the file to require and a string (or symbol)
+ identifying the name of the module that contains the registration method.
+ You can also pass a symbol as the third parameter naming the registration
+ method, but it defaults to @:register_services@.
+
+
+ <pre>
+ require 'a/b'
+ A::B.register_services( container )
+
+ # or
+
+ container.require( 'a/b', "A::B" )
+ </pre>
+
+
+ The definition context (i.e., the "builder" object) also supports the
+ require method, so you can do:
+
+
+ <pre>
+ container.define do |b|
+ b.require "a/b", "A::B"
+ b.foo { ... }
+ ...
+ end
+ </pre>
+
+- "When should I...":
+ - "use a different service model?":
+ - "Like, :prototype?": >-
+ The prototype service model is appropriate when the service:
+
+
+ * has internal state
+
+ * will be used multiple times for different situations
+
+
+ For example, if you have a GUI library, a "button" service could be a
+ prototype, because you will likely have many buttons in an application,
+ with each button being an independent instance.
+
+ - "Like, :singleton?": >-
+ The singleton service model is the default, so you should rarely need
+ to explicitly specify it as a model. It is appropriate for services
+ that:
+
+
+ * guard some specific functionality
+
+ * represent state that is global across an application
+
+ - "Like, :threaded?": >-
+ Threaded is similar to singleton, but it allows one unique instance of
+ the service _per thread_. Thus, it is appropriate to the same
+ situations as singleton, but specific to a thread, instead of an
+ application. This is useful for web applications that are run in a
+ single virtual machine, and which share a single registry.
+
+ - "Like, deferred?": >-
+ Deferred models use a proxy to enforce lazy initialization of the
+ service. A service using a deferred service model (ie,
+ @:prototype_deferred@, @:multiton_deferred@, @:singleton_deferred@, or
+ @:threaded_deferred@) will not be instantiated until the first time a
+ method is invoked on the service.
+
+
+ This makes a deferred model appropriate when a service is expensive to
+ instantiate, since you can wait to do the expensive initialization
+ until it is really needed. Applications will start up faster when their
+ dependences use deferred instantiation.
+
+ - "Like, initialize?": >-
+ This is useful when you have a method that you want to be invoked
+ automatically after a service has been instantiated. Consider the case
+ where a service is initialized primarily using setters, but requires
+ some logic to be executed to complete the initialization phase. In this
+ case, you could always explicitly invoke the initialization method(s)
+ in the constructor block, but if many services use the same
+ initialization method, it can be more convenient to use an "initialize"
+ service model.
+
+ - "Like, multiton?": >-
+ Multitons are useful for factories, where you have a class that
+ differentiates its instances based on some construction parameters that
+ need to be determined at runtime. Thus, multitons are always used with
+ parameterized services.
diff --git a/test/scanners/yaml/gemspec.expected.raydebug b/test/scanners/yaml/gemspec.expected.raydebug
new file mode 100644
index 0000000..11cf53f
--- /dev/null
+++ b/test/scanners/yaml/gemspec.expected.raydebug
@@ -0,0 +1,111 @@
+tag(---) type(!ruby/object)operator(:)class(Gem::Specification)
+key(name)operator(:) string(coderay)
+key(version)operator(:) type(!ruby/object)operator(:)class(Gem::Version)
+ key(version)operator(:) string(0.7.9.257)
+key(platform)operator(:) string(ruby)
+key(authors)operator(:)
+operator(-) string(murphy)
+key(autorequire)operator(:) string(coderay)
+key(bindir)operator(:) string(bin)
+key(cert_chain)operator(:) string([])
+
+key(date)operator(:) string(2008-09-24 00:00:00 +02:00)
+key(default_executable)operator(:)
+key(dependencies)operator(:) string([])
+
+key(description)operator(:) string("CodeRay is a Ruby library for syntax highlighting. I try to make CodeRay easy to use and intuitive, but at the same time fully featured, complete, fast and efficient. Usage is simple: require 'coderay' code = 'some %q(weird (Ruby\) can't shock\) me!' puts CodeRay.scan(code, :ruby\).html")
+key(email)operator(:) string(murphy@cYcnus.de)
+key(executables)operator(:)
+operator(-) string(coderay)
+operator(-) string(coderay_stylesheet)
+key(extensions)operator(:) string([])
+
+key(extra_rdoc_files)operator(:)
+operator(-) string(./README)
+operator(-) string(./FOLDERS)
+key(files)operator(:)
+operator(-) string(./lib/coderay/duo.rb)
+operator(-) string(./lib/coderay/encoder.rb)
+operator(-) string(./lib/coderay/encoders/_map.rb)
+operator(-) string(./lib/coderay/encoders/count.rb)
+operator(-) string(./lib/coderay/encoders/debug.rb)
+operator(-) string(./lib/coderay/encoders/div.rb)
+operator(-) string(./lib/coderay/encoders/html/css.rb)
+operator(-) string(./lib/coderay/encoders/html/numerization.rb)
+operator(-) string(./lib/coderay/encoders/html/output.rb)
+operator(-) string(./lib/coderay/encoders/html.rb)
+operator(-) string(./lib/coderay/encoders/null.rb)
+operator(-) string(./lib/coderay/encoders/page.rb)
+operator(-) string(./lib/coderay/encoders/span.rb)
+operator(-) string(./lib/coderay/encoders/statistic.rb)
+operator(-) string(./lib/coderay/encoders/text.rb)
+operator(-) string(./lib/coderay/encoders/tokens.rb)
+operator(-) string(./lib/coderay/encoders/xml.rb)
+operator(-) string(./lib/coderay/encoders/yaml.rb)
+operator(-) string(./lib/coderay/for_redcloth.rb)
+operator(-) string(./lib/coderay/helpers/file_type.rb)
+operator(-) string(./lib/coderay/helpers/gzip_simple.rb)
+operator(-) string(./lib/coderay/helpers/plugin.rb)
+operator(-) string(./lib/coderay/helpers/word_list.rb)
+operator(-) string(./lib/coderay/scanner.rb)
+operator(-) string(./lib/coderay/scanners/_map.rb)
+operator(-) string(./lib/coderay/scanners/c.rb)
+operator(-) string(./lib/coderay/scanners/css.rb)
+operator(-) string(./lib/coderay/scanners/debug.rb)
+operator(-) string(./lib/coderay/scanners/delphi.rb)
+operator(-) string(./lib/coderay/scanners/html.rb)
+operator(-) string(./lib/coderay/scanners/java/builtin_types.rb)
+operator(-) string(./lib/coderay/scanners/java.rb)
+operator(-) string(./lib/coderay/scanners/java_script.rb)
+operator(-) string(./lib/coderay/scanners/nitro_xhtml.rb)
+operator(-) string(./lib/coderay/scanners/plaintext.rb)
+operator(-) string(./lib/coderay/scanners/rhtml.rb)
+operator(-) string(./lib/coderay/scanners/ruby/patterns.rb)
+operator(-) string(./lib/coderay/scanners/ruby.rb)
+operator(-) string(./lib/coderay/scanners/scheme.rb)
+operator(-) string(./lib/coderay/scanners/xml.rb)
+operator(-) string(./lib/coderay/style.rb)
+operator(-) string(./lib/coderay/styles/_map.rb)
+operator(-) string(./lib/coderay/styles/cycnus.rb)
+operator(-) string(./lib/coderay/styles/murphy.rb)
+operator(-) string(./lib/coderay/token_classes.rb)
+operator(-) string(./lib/coderay/tokens.rb)
+operator(-) string(./lib/coderay.rb)
+operator(-) string(./lib/term/ansicolor.rb)
+operator(-) string(./README)
+operator(-) string(./LICENSE)
+operator(-) string(./FOLDERS)
+operator(-) string(bin/coderay)
+operator(-) string(bin/coderay_stylesheet)
+key(has_rdoc)operator(:) string(true)
+key(homepage)operator(:) string(http://coderay.rubychan.de)
+key(post_install_message)operator(:)
+key(rdoc_options)operator(:)
+operator(-) string(-SNw2)
+operator(-) string(-mREADME)
+operator(-) string(-a)
+operator(-) string(-t) string(CodeRay) string(Documentation)
+key(require_paths)operator(:)
+operator(-) string(lib)
+key(required_ruby_version)operator(:) type(!ruby/object)operator(:)class(Gem::Requirement)
+ key(requirements)operator(:)
+ operator(-) operator(-) string(">=")
+ operator(-) type(!ruby/object)operator(:)class(Gem::Version)
+ key(version)operator(:) string(1.8.2)
+ key(version)operator(:)
+key(required_rubygems_version)operator(:) type(!ruby/object)operator(:)class(Gem::Requirement)
+ key(requirements)operator(:)
+ operator(-) operator(-) string(">=")
+ operator(-) type(!ruby/object)operator(:)class(Gem::Version)
+ key(version)operator(:) string("0")
+ key(version)operator(:)
+key(requirements)operator(:)
+operator(-) string(strscan)
+key(rubyforge_project)operator(:) string(coderay)
+key(rubygems_version)operator(:) string(1.3.0)
+key(signing_key)operator(:)
+key(specification_version)operator(:) string(2)
+key(summary)operator(:) string(CodeRay is a fast syntax highlighter engine for many languages.)
+key(test_files)operator(:) string([])
+
+
diff --git a/test/scanners/yaml/gemspec.in.yml b/test/scanners/yaml/gemspec.in.yml
new file mode 100644
index 0000000..9f8ddf0
--- /dev/null
+++ b/test/scanners/yaml/gemspec.in.yml
@@ -0,0 +1,111 @@
+--- !ruby/object:Gem::Specification
+name: coderay
+version: !ruby/object:Gem::Version
+ version: 0.7.9.257
+platform: ruby
+authors:
+- murphy
+autorequire: coderay
+bindir: bin
+cert_chain: []
+
+date: 2008-09-24 00:00:00 +02:00
+default_executable:
+dependencies: []
+
+description: "CodeRay is a Ruby library for syntax highlighting. I try to make CodeRay easy to use and intuitive, but at the same time fully featured, complete, fast and efficient. Usage is simple: require 'coderay' code = 'some %q(weird (Ruby) can't shock) me!' puts CodeRay.scan(code, :ruby).html"
+email: murphy@cYcnus.de
+executables:
+- coderay
+- coderay_stylesheet
+extensions: []
+
+extra_rdoc_files:
+- ./README
+- ./FOLDERS
+files:
+- ./lib/coderay/duo.rb
+- ./lib/coderay/encoder.rb
+- ./lib/coderay/encoders/_map.rb
+- ./lib/coderay/encoders/count.rb
+- ./lib/coderay/encoders/debug.rb
+- ./lib/coderay/encoders/div.rb
+- ./lib/coderay/encoders/html/css.rb
+- ./lib/coderay/encoders/html/numerization.rb
+- ./lib/coderay/encoders/html/output.rb
+- ./lib/coderay/encoders/html.rb
+- ./lib/coderay/encoders/null.rb
+- ./lib/coderay/encoders/page.rb
+- ./lib/coderay/encoders/span.rb
+- ./lib/coderay/encoders/statistic.rb
+- ./lib/coderay/encoders/text.rb
+- ./lib/coderay/encoders/tokens.rb
+- ./lib/coderay/encoders/xml.rb
+- ./lib/coderay/encoders/yaml.rb
+- ./lib/coderay/for_redcloth.rb
+- ./lib/coderay/helpers/file_type.rb
+- ./lib/coderay/helpers/gzip_simple.rb
+- ./lib/coderay/helpers/plugin.rb
+- ./lib/coderay/helpers/word_list.rb
+- ./lib/coderay/scanner.rb
+- ./lib/coderay/scanners/_map.rb
+- ./lib/coderay/scanners/c.rb
+- ./lib/coderay/scanners/css.rb
+- ./lib/coderay/scanners/debug.rb
+- ./lib/coderay/scanners/delphi.rb
+- ./lib/coderay/scanners/html.rb
+- ./lib/coderay/scanners/java/builtin_types.rb
+- ./lib/coderay/scanners/java.rb
+- ./lib/coderay/scanners/java_script.rb
+- ./lib/coderay/scanners/nitro_xhtml.rb
+- ./lib/coderay/scanners/plaintext.rb
+- ./lib/coderay/scanners/rhtml.rb
+- ./lib/coderay/scanners/ruby/patterns.rb
+- ./lib/coderay/scanners/ruby.rb
+- ./lib/coderay/scanners/scheme.rb
+- ./lib/coderay/scanners/xml.rb
+- ./lib/coderay/style.rb
+- ./lib/coderay/styles/_map.rb
+- ./lib/coderay/styles/cycnus.rb
+- ./lib/coderay/styles/murphy.rb
+- ./lib/coderay/token_classes.rb
+- ./lib/coderay/tokens.rb
+- ./lib/coderay.rb
+- ./lib/term/ansicolor.rb
+- ./README
+- ./LICENSE
+- ./FOLDERS
+- bin/coderay
+- bin/coderay_stylesheet
+has_rdoc: true
+homepage: http://coderay.rubychan.de
+post_install_message:
+rdoc_options:
+- -SNw2
+- -mREADME
+- -a
+- -t CodeRay Documentation
+require_paths:
+- lib
+required_ruby_version: !ruby/object:Gem::Requirement
+ requirements:
+ - - ">="
+ - !ruby/object:Gem::Version
+ version: 1.8.2
+ version:
+required_rubygems_version: !ruby/object:Gem::Requirement
+ requirements:
+ - - ">="
+ - !ruby/object:Gem::Version
+ version: "0"
+ version:
+requirements:
+- strscan
+rubyforge_project: coderay
+rubygems_version: 1.3.0
+signing_key:
+specification_version: 2
+summary: CodeRay is a fast syntax highlighter engine for many languages.
+test_files: []
+
+
diff --git a/test/scanners/yaml/latex_entities.expected.raydebug b/test/scanners/yaml/latex_entities.expected.raydebug
new file mode 100644
index 0000000..9e4ffd2
--- /dev/null
+++ b/test/scanners/yaml/latex_entities.expected.raydebug
@@ -0,0 +1,2414 @@
+comment(# based on "SGML/XML character entity reference" at http://www.bitjungle.com/isoent/)
+comment(#)
+tag(---)
+comment(#EM SPACE)
+key(emsp)operator(:) string(\\hspace{1em})
+comment(#EM SPACE)
+key<delimiter(")content(8195)delimiter(")>operator(:) string(\\hspace{1em})
+comment(#EN SPACE)
+key(ensp)operator(:) string(\\hspace{0.5em})
+comment(#EN SPACE)
+key<delimiter(")content(8194)delimiter(")>operator(:) string(\\hspace{0.5em})
+comment(#THREE-PER-EM SPACE)
+key<delimiter(")content(8196)delimiter(")>operator(:) string(\\hspace{0.33em})
+comment(#FOUR-PER-EM SPACE)
+key<delimiter(")content(8197)delimiter(")>operator(:) string(\\hspace{0.25em})
+comment(#FIGURE SPACE)
+key<delimiter(")content(8199)delimiter(")>operator(:) string(\\hphantom{0})
+comment(#PUNCTUATION SPACE)
+key<delimiter(")content(8200)delimiter(")>operator(:) string(\\hphantom{,})
+comment(#THIN SPACE)
+key(thinsp)operator(:) string(\\hspace{0.167em})
+comment(#THIN SPACE)
+key<delimiter(")content(8201)delimiter(")>operator(:) string(\\hspace{0.167em})
+comment(#HAIR SPACE)
+key<delimiter(")content(8202)delimiter(")>operator(:) string(\\hspace{1pt})
+comment(#EM DASH)
+key(mdash)operator(:) string(---)
+comment(#EM DASH)
+key<delimiter(")content(8212)delimiter(")>operator(:) string(---)
+comment(#EN DASH)
+key(ndash)operator(:) string(--)
+comment(#EN DASH)
+key<delimiter(")content(8211)delimiter(")>operator(:) string(--)
+comment(#HYPHEN)
+key<delimiter(")content(8208)delimiter(")>operator(:) string("-")
+comment(#OPEN BOX)
+key<delimiter(")content(9251)delimiter(")>operator(:) string(\\textvisiblespace{})
+comment(#HORIZONTAL ELLIPSIS)
+key(hellip)operator(:) string(\\ldots{})
+comment(#HORIZONTAL ELLIPSIS)
+key<delimiter(")content(8230)delimiter(")>operator(:) string(\\ldots{})
+comment(#TWO DOT LEADER)
+key<delimiter(")content(8229)delimiter(")>operator(:) string(\\nldr{})
+comment(#VULGAR FRACTION ONE THIRD)
+key<delimiter(")content(8531)delimiter(")>operator(:) string(\\sfrac{1}{3})
+comment(#VULGAR FRACTION TWO THIRDS)
+key<delimiter(")content(8532)delimiter(")>operator(:) string(\\sfrac{2}{3})
+comment(#VULGAR FRACTION ONE FIFTH)
+key<delimiter(")content(8533)delimiter(")>operator(:) string(\\sfrac{1}{5})
+comment(#VULGAR FRACTION TWO FIFTHS)
+key<delimiter(")content(8534)delimiter(")>operator(:) string(\\sfrac{2}{5})
+comment(#VULGAR FRACTION THREE FIFTHS)
+key<delimiter(")content(8535)delimiter(")>operator(:) string(\\sfrac{3}{5})
+comment(#VULGAR FRACTION FOUR FIFTHS)
+key<delimiter(")content(8536)delimiter(")>operator(:) string(\\sfrac{4}{5})
+comment(#VULGAR FRACTION ONE SIXTH)
+key<delimiter(")content(8537)delimiter(")>operator(:) string(\\sfrac{1}{6})
+comment(#VULGAR FRACTION FIVE SIXTHS)
+key<delimiter(")content(8538)delimiter(")>operator(:) string(\\sfrac{5}{6})
+comment(#CARE OF)
+key<delimiter(")content(8453)delimiter(")>operator(:) string("{^c\\\\!/\\\\!_o}")
+comment(#FULL BLOCK)
+key<delimiter(")content(9608)delimiter(")>operator(:) string(\\block{})
+comment(#UPPER HALF BLOCK)
+key<delimiter(")content(9600)delimiter(")>operator(:) string(\\uhblk{})
+comment(#LOWER HALF BLOCK)
+key<delimiter(")content(9604)delimiter(")>operator(:) string(\\lhblk{})
+comment(#LIGHT SHADE)
+comment(#requires color)
+key<delimiter(")content(9617)delimiter(")>operator(:) string(\\textcolor[gray]{.75}{\\block})
+comment(#MEDIUM SHADE)
+comment(#requires color)
+key<delimiter(")content(9618)delimiter(")>operator(:) string(\\textcolor[gray]{.5}{\\block})
+comment(#DARK SHADE)
+comment(#requires color)
+key<delimiter(")content(9619)delimiter(")>operator(:) string(\\textcolor[gray]{.25}{\\block})
+comment(#BLACK VERTICAL RECTANGLE)
+key<delimiter(")content(9646)delimiter(")>operator(:) string(\\marker{})
+comment(#WHITE CIRCLE)
+key<delimiter(")content(9675)delimiter(")>operator(:) string(\\circ{})
+comment(#WHITE SQUARE)
+comment(#requires amssymb)
+key<delimiter(")content(9633)delimiter(")>operator(:) string(\\square{})
+comment(#WHITE RECTANGLE)
+key<delimiter(")content(9645)delimiter(")>operator(:) string(\\fbox{~~})
+comment(#WHITE UP-POINTING TRIANGLE)
+comment(#requires amssymb)
+key<delimiter(")content(9653)delimiter(")>operator(:) string(\\vartriangle{})
+comment(#WHITE DOWN-POINTING TRIANGLE)
+comment(#requires amssymb)
+key<delimiter(")content(9663)delimiter(")>operator(:) string(\\triangledown{})
+comment(#WHITE STAR)
+comment(#requires pifont)
+key<delimiter(")content(9734)delimiter(")>operator(:) string(\\ding{73})
+comment(#BULLET)
+key(bull)operator(:) string(\\textbullet{})
+comment(#BULLET)
+key<delimiter(")content(8226)delimiter(")>operator(:) string(\\textbullet{})
+comment(#BLACK SMALL SQUARE)
+comment(#requires amssymb)
+key<delimiter(")content(9642)delimiter(")>operator(:) string(\\blacksquare{})
+comment(#BLACK UP-POINTING TRIANGLE)
+comment(#requires amssymb)
+key<delimiter(")content(9652)delimiter(")>operator(:) string(\\blacktriangle{})
+comment(#BLACK DOWN-POINTING TRIANGLE)
+comment(#requires amssymb)
+key<delimiter(")content(9662)delimiter(")>operator(:) string(\\blacktriangledown{})
+comment(#BLACK LEFT-POINTING TRIANGLE)
+comment(#requires amssymb)
+key<delimiter(")content(9666)delimiter(")>operator(:) string(\\blacktriangleleft{})
+comment(#BLACK RIGHT-POINTING TRIANGLE)
+comment(#requires amssymb)
+key<delimiter(")content(9656)delimiter(")>operator(:) string(\\blacktriangleright{})
+comment(#BLACK CLUB SUIT)
+comment(#requires pifont)
+key(clubs)operator(:) string(\\ding{168})
+comment(#BLACK CLUB SUIT)
+comment(#requires pifont)
+key<delimiter(")content(9827)delimiter(")>operator(:) string(\\ding{168})
+comment(#BLACK DIAMOND SUIT)
+comment(#requires pifont)
+key(diams)operator(:) string(\\ding{169})
+comment(#BLACK DIAMOND SUIT)
+comment(#requires pifont)
+key<delimiter(")content(9830)delimiter(")>operator(:) string(\\ding{169})
+comment(#BLACK HEART SUIT)
+comment(#requires pifont)
+key(hearts)operator(:) string(\\ding{170})
+comment(#BLACK HEART SUIT)
+key<delimiter(")content(9829)delimiter(")>operator(:) string(\\ding{170})
+comment(#BLACK SPADE SUIT)
+comment(#requires pifont)
+key(spades)operator(:) string(\\ding{171})
+comment(#BLACK SPADE SUIT)
+comment(#requires pifont)
+key<delimiter(")content(9824)delimiter(")>operator(:) string(\\ding{171})
+comment(#MALTESE CROSS)
+comment(#requires pifont)
+key<delimiter(")content(10016)delimiter(")>operator(:) string(\\maltese{})
+comment(#DAGGER)
+key(dagger)operator(:) string(\\dag{})
+comment(#DAGGER)
+key<delimiter(")content(8224)delimiter(")>operator(:) string(\\dag{})
+comment(#DOUBLE DAGGER)
+key(Dagger)operator(:) string(\\ddag{})
+comment(#DOUBLE DAGGER)
+key<delimiter(")content(8225)delimiter(")>operator(:) string(\\ddag{})
+comment(#CHECK MARK)
+comment(#requires pifont)
+key<delimiter(")content(10003)delimiter(")>operator(:) string(\\checkmark{})
+comment(#BALLOT X)
+comment(#requires pifont)
+key<delimiter(")content(10007)delimiter(")>operator(:) string(\\ding{55})
+comment(#MUSIC SHARP SIGN)
+key<delimiter(")content(9839)delimiter(")>operator(:) string(\\sharp{})
+comment(#MUSIC FLAT SIGN)
+key<delimiter(")content(9837)delimiter(")>operator(:) string(\\flat{})
+comment(#MALE SIGN)
+comment(#requires wasysym)
+key<delimiter(")content(9794)delimiter(")>operator(:) string(\\male{})
+comment(#FEMALE SIGN)
+comment(#requires wasysym)
+key<delimiter(")content(9792)delimiter(")>operator(:) string(\\female{})
+comment(#TELEPHONE SIGN)
+comment(#requires pifont)
+key<delimiter(")content(9742)delimiter(")>operator(:) string(\\phone{})
+comment(#TELEPHONE RECORDER)
+comment(#requires wasysym)
+key<delimiter(")content(8981)delimiter(")>operator(:) string(\\recorder{})
+comment(#SOUND RECORDING COPYRIGHT)
+comment(#requires textcomp)
+key<delimiter(")content(8471)delimiter(")>operator(:) string(\\textcircledP{})
+comment(#CARET)
+key<delimiter(")content(8257)delimiter(")>operator(:) string(\\mathchar"1356)
+comment(#SINGLE LOW-9 QUOTATION MARK)
+comment(#requires fontenc:T1)
+key(lsquor)operator(:) string(",")
+comment(#SINGLE LOW-9 QUOTATION MARK)
+comment(#requires fontenc:T1)
+key<delimiter(")content(8218)delimiter(")>operator(:) string(",")
+comment(#DOUBLE LOW-9 QUOTATION MARK)
+comment(#requires fontenc:T1)
+key(ldquor)operator(:) string(,,)
+comment(#DOUBLE LOW-9 QUOTATION MARK)
+comment(#requires fontenc:T1)
+key<delimiter(")content(8222)delimiter(")>operator(:) string(,,)
+comment(#LATIN SMALL LIGATURE FF)
+key<delimiter(")content(64256)delimiter(")>operator(:) string(ff)
+comment(#LATIN SMALL LIGATURE FI)
+key<delimiter(")content(64257)delimiter(")>operator(:) string(fi)
+comment(#SMALL FJ LIGATURE)
+key<delimiter(")content(58290)delimiter(")>operator(:) string(fj)
+comment(#LATIN SMALL LIGATURE FFI)
+key<delimiter(")content(64259)delimiter(")>operator(:) string(ffi)
+comment(#LATIN SMALL LIGATURE FFL)
+key<delimiter(")content(64260)delimiter(")>operator(:) string(ffl)
+comment(#LATIN SMALL LIGATURE FL)
+key<delimiter(")content(64258)delimiter(")>operator(:) string(fl)
+comment(#DOUBLE HIGH-REVERSED-9 QUOTATION MARK)
+key<delimiter(")content(8223)delimiter(")>operator(:) string(``)
+comment(#SINGLE HIGH-REVERSED-9 QUOTATION MARK)
+key<delimiter(")content(8219)delimiter(")>operator(:) string(`)
+comment(#VERTICAL ELLIPSIS)
+key<delimiter(")content(8942)delimiter(")>operator(:) string(\\vdots{})
+comment(#HYPHEN BULLET)
+key<delimiter(")content(8259)delimiter(")>operator(:) string(\\hybull{})
+comment(#LOZENGE)
+comment(#requires amssymb)
+key(loz)operator(:) string(\\lozenge{})
+comment(#LOZENGE)
+comment(#requires amssymb)
+key<delimiter(")content(9674)delimiter(")>operator(:) string(\\lozenge{})
+comment(#LOZENGE, FILLED)
+comment(#requires amssymb)
+key<delimiter(")content(59403)delimiter(")>operator(:) string(\\blacklozenge{})
+comment(#WHITE LEFT-POINTING TRIANGLE)
+key<delimiter(")content(9667)delimiter(")>operator(:) string(\\triangleleft{})
+comment(#WHITE RIGHT-POINTING TRIANGLE)
+key<delimiter(")content(9657)delimiter(")>operator(:) string(\\triangleright{})
+comment(#BLACK STAR)
+comment(#requires amssymb)
+key<delimiter(")content(9733)delimiter(")>operator(:) string(\\bigstar{})
+comment(#MUSIC NATURAL SIGN)
+key<delimiter(")content(9838)delimiter(")>operator(:) string(\\natural{})
+comment(#PRESCRIPTION TAKE)
+comment(#requires textcomp)
+key<delimiter(")content(8478)delimiter(")>operator(:) string(\\textrecipe{})
+comment(#SIX POINTED BLACK STAR)
+comment(#requires pifont)
+key<delimiter(")content(10038)delimiter(")>operator(:) string(\\ding{86})
+comment(#POSITION INDICATOR)
+key<delimiter(")content(8982)delimiter(")>operator(:) string(\\mathchar"2208)
+comment(#BOTTOM LEFT CROP)
+key<delimiter(")content(8973)delimiter(")>operator(:) string(\\dlcrop{})
+comment(#BOTTOM RIGHT CROP)
+key<delimiter(")content(8972)delimiter(")>operator(:) string(\\drcrop{})
+comment(#TOP LEFT CROP)
+key<delimiter(")content(8975)delimiter(")>operator(:) string(\\ulcrop{})
+comment(#TOP RIGHT CROP)
+key<delimiter(")content(8974)delimiter(")>operator(:) string(\\urcrop{})
+comment(#VULGAR FRACTION ONE HALF)
+key(frac12)operator(:) string(\\sfrac{1}{2})
+comment(#VULGAR FRACTION ONE HALF)
+key<delimiter(")content(189)delimiter(")>operator(:) string(\\sfrac{1}{2})
+comment(#VULGAR FRACTION ONE QUARTER)
+key(frac14)operator(:) string(\\sfrac{1}{4})
+comment(#VULGAR FRACTION ONE QUARTER)
+key<delimiter(")content(188)delimiter(")>operator(:) string(\\sfrac{1}{4})
+comment(#VULGAR FRACTION THREE QUARTERS)
+key(frac34)operator(:) string(\\sfrac{3}{4})
+comment(#VULGAR FRACTION THREE QUARTERS)
+key<delimiter(")content(190)delimiter(")>operator(:) string(\\sfrac{3}{4})
+comment(#VULGAR FRACTION ONE EIGHTH)
+key<delimiter(")content(8539)delimiter(")>operator(:) string(\\sfrac{1}{8})
+comment(#VULGAR FRACTION THREE EIGHTHS)
+key<delimiter(")content(8540)delimiter(")>operator(:) string(\\sfrac{3}{8})
+comment(#VULGAR FRACTION FIVE EIGHTHS)
+key<delimiter(")content(8541)delimiter(")>operator(:) string(\\sfrac{5}{8})
+comment(#VULGAR FRACTION SEVEN EIGHTHS)
+key<delimiter(")content(8542)delimiter(")>operator(:) string(\\sfrac{7}{8})
+comment(#SUPERSCRIPT ONE)
+key(sup1)operator(:) string(^1)
+comment(#SUPERSCRIPT ONE)
+key<delimiter(")content(185)delimiter(")>operator(:) string(^1)
+comment(#SUPERSCRIPT TWO)
+key(sup2)operator(:) string(^2)
+comment(#SUPERSCRIPT TWO)
+key<delimiter(")content(178)delimiter(")>operator(:) string(^2)
+comment(#SUPERSCRIPT THREE)
+key(sup3)operator(:) string(^3)
+comment(#SUPERSCRIPT THREE)
+key<delimiter(")content(179)delimiter(")>operator(:) string(^3)
+comment(#PLUS SIGN)
+key<delimiter(")content(43)delimiter(")>operator(:) string(+)
+comment(#PLUS-MINUS SIGN)
+comment(#requires textcomp)
+key(plusmn)operator(:) string(\\textpm{})
+comment(#PLUS-MINUS SIGN)
+comment(#requires textcomp)
+key<delimiter(")content(177)delimiter(")>operator(:) string(\\textpm{})
+comment(#LESS-THAN SIGN)
+key(lt)operator(:) string(\\textless{})
+comment(#LESS-THAN SIGN)
+key<delimiter(")content(60)delimiter(")>operator(:) string(\\textless{})
+comment(#EQUALS SIGN)
+key<delimiter(")content(61)delimiter(")>operator(:) string("=")
+comment(#GREATER-THAN SIGN)
+key(gt)operator(:) string(\\textgreater{})
+comment(#GREATER-THAN SIGN)
+key<delimiter(")content(62)delimiter(")>operator(:) string(\\textgreater{})
+comment(#DIVISION SIGN)
+comment(#requires textcomp)
+key(divide)operator(:) string(\\textdiv{})
+comment(#DIVISION SIGN)
+comment(#requires textcomp)
+key<delimiter(")content(247)delimiter(")>operator(:) string(\\textdiv{})
+comment(#MULTIPLICATION SIGN)
+comment(#requires textcomp)
+key(times)operator(:) string(\\texttimes{})
+comment(#MULTIPLICATION SIGN)
+comment(#requires textcomp)
+key<delimiter(")content(215)delimiter(")>operator(:) string(\\texttimes{})
+comment(#CURRENCY SIGN)
+comment(#requires wasysym)
+key(curren)operator(:) string(\\textcurrency{})
+comment(#CURRENCY SIGN)
+comment(#requires wasysym)
+key<delimiter(")content(164)delimiter(")>operator(:) string(\\textcurrency{})
+comment(#POUND SIGN)
+key(pound)operator(:) string(\\pounds{})
+comment(#POUND SIGN)
+key<delimiter(")content(163)delimiter(")>operator(:) string(\\pounds{})
+comment(#DOLLAR SIGN)
+key<delimiter(")content(36)delimiter(")>operator(:) string(\\$)
+comment(#CENT SIGN)
+comment(#requires wasysym)
+key(cent)operator(:) string(\\textcent{})
+comment(#CENT SIGN)
+comment(#requires wasysym)
+key<delimiter(")content(162)delimiter(")>operator(:) string(\\textcent{})
+comment(#YEN SIGN)
+comment(#requires amsfonts)
+key(yen)operator(:) string(\\textyen{})
+comment(#YEN SIGN)
+comment(#requires amsfonts)
+key<delimiter(")content(165)delimiter(")>operator(:) string(\\textyen{})
+comment(#NUMBER SIGN)
+key<delimiter(")content(35)delimiter(")>operator(:) string(\\#)
+comment(#PERCENT SIGN)
+key<delimiter(")content(37)delimiter(")>operator(:) string(\\%)
+comment(#AMPERSAND)
+key(amp)operator(:) string(\\&)
+comment(#AMPERSAND)
+key<delimiter(")content(38)delimiter(")>operator(:) string(\\&)
+comment(#ASTERISK)
+key<delimiter(")content(42)delimiter(")>operator(:) string(\\ast{})
+comment(#COMMERCIAL AT)
+key<delimiter(")content(64)delimiter(")>operator(:) string("@")
+comment(#LEFT SQUARE BRACKET)
+key<delimiter(")content(91)delimiter(")>operator(:) string("[")
+comment(#REVERSE SOLIDUS)
+key<delimiter(")content(92)delimiter(")>operator(:) string(\\textbackslash{})
+comment(#RIGHT SQUARE BRACKET)
+key<delimiter(")content(93)delimiter(")>operator(:) string("]")
+comment(#LEFT CURLY BRACKET)
+key<delimiter(")content(123)delimiter(")>operator(:) string(\\{)
+comment(#HORIZONTAL BAR)
+key<delimiter(")content(8213)delimiter(")>operator(:) string(---)
+comment(#VERTICAL LINE)
+key<delimiter(")content(124)delimiter(")>operator(:) string(\\textbar{})
+comment(#RIGHT CURLY BRACKET)
+key<delimiter(")content(125)delimiter(")>operator(:) string(\\})
+comment(#MICRO SIGN)
+comment(#requires textcomp)
+key(micro)operator(:) string(\\textmu{})
+comment(#MICRO SIGN)
+comment(#requires textcomp)
+key<delimiter(")content(181)delimiter(")>operator(:) string(\\textmu{})
+comment(#OHM SIGN)
+comment(#requires textcomp)
+key<delimiter(")content(8486)delimiter(")>operator(:) string(\\textohm{})
+comment(#DEGREE SIGN)
+comment(#requires textcomp)
+key(deg)operator(:) string(\\textdegree{})
+comment(#DEGREE SIGN)
+comment(#requires textcomp)
+key<delimiter(")content(176)delimiter(")>operator(:) string(\\textdegree{})
+comment(#MASCULINE ORDINAL INDICATOR)
+comment(#requires textcomp)
+key(ordm)operator(:) string(\\textordmasculine{})
+comment(#MASCULINE ORDINAL INDICATOR)
+comment(#requires textcomp)
+key<delimiter(")content(186)delimiter(")>operator(:) string(\\textordmasculine{})
+comment(#FEMININE ORDINAL INDICATOR)
+comment(#requires textcomp)
+key(ordf)operator(:) string(\\textordfeminine{})
+comment(#FEMININE ORDINAL INDICATOR)
+comment(#requires textcomp)
+key<delimiter(")content(170)delimiter(")>operator(:) string(\\textordfeminine{})
+comment(#SECTION SIGN)
+comment(#requires textcomp)
+key(sect)operator(:) string(\\S{})
+comment(#SECTION SIGN)
+comment(#requires textcomp)
+key<delimiter(")content(167)delimiter(")>operator(:) string(\\S{})
+comment(#PILCROW SIGN)
+comment(#requires textcomp)
+key(para)operator(:) string(\\P{})
+comment(#PILCROW SIGN)
+comment(#requires textcomp)
+key<delimiter(")content(182)delimiter(")>operator(:) string(\\P{})
+comment(#MIDDLE DOT)
+comment(#requires amssymb)
+key(middot)operator(:) string(\\textperiodcentered{})
+comment(#MIDDLE DOT)
+comment(#requires amssymb)
+key<delimiter(")content(183)delimiter(")>operator(:) string(\\textperiodcentered{})
+comment(#LEFTWARDS ARROW)
+comment(#requires textcomp)
+key(larr)operator(:) string(\\textleftarrow{})
+comment(#LEFTWARDS ARROW)
+comment(#requires textcomp)
+key<delimiter(")content(8592)delimiter(")>operator(:) string(\\textleftarrow{})
+comment(#RIGHTWARDS ARROW)
+comment(#requires textcomp)
+key(rarr)operator(:) string(\\textrightarrow{})
+comment(#RIGHTWARDS ARROW)
+comment(#requires textcomp)
+key<delimiter(")content(8594)delimiter(")>operator(:) string(\\textrightarrow{})
+comment(#UPWARDS ARROW)
+comment(#requires textcomp)
+key(uarr)operator(:) string(\\textuparrow{})
+comment(#UPWARDS ARROW)
+comment(#requires textcomp)
+key<delimiter(")content(8593)delimiter(")>operator(:) string(\\textuparrow{})
+comment(#DOWNWARDS ARROW)
+comment(#requires textcomp)
+key(darr)operator(:) string(\\textdownarrow{})
+comment(#DOWNWARDS ARROW)
+comment(#requires textcomp)
+key<delimiter(")content(8595)delimiter(")>operator(:) string(\\textdownarrow{})
+comment(#COPYRIGHT SIGN)
+comment(#requires textcomp)
+key(copy)operator(:) string(\\copyright{})
+comment(#COPYRIGHT SIGN)
+comment(#requires textcomp)
+key<delimiter(")content(169)delimiter(")>operator(:) string(\\copyright{})
+comment(#REGISTERED SIGN)
+comment(#requires amssymb)
+key(reg)operator(:) string(\\textregistered{})
+comment(#REGISTERED SIGN)
+comment(#requires amssymb)
+key<delimiter(")content(174)delimiter(")>operator(:) string(\\textregistered{})
+comment(#TRADE MARK SIGN)
+key(trade)operator(:) string(\\texttrademark{})
+comment(#TRADE MARK SIGN)
+key<delimiter(")content(8482)delimiter(")>operator(:) string(\\texttrademark{})
+comment(#BROKEN BAR)
+comment(#requires wasysym)
+key(brvbar)operator(:) string(\\textbrokenbar{})
+comment(#BROKEN BAR)
+comment(#requires wasysym)
+key<delimiter(")content(166)delimiter(")>operator(:) string(\\textbrokenbar{})
+comment(#NOT SIGN)
+comment(#requires textcomp)
+key(not)operator(:) string(\\textlnot{})
+comment(#NOT SIGN)
+comment(#requires textcomp)
+key<delimiter(")content(172)delimiter(")>operator(:) string(\\textlnot{})
+comment(#EIGHTH NOTE)
+comment(#requires wasysym)
+key<delimiter(")content(9834)delimiter(")>operator(:) string(\\textmusicalnote{})
+comment(#EXCLAMATION MARK)
+key<delimiter(")content(33)delimiter(")>operator(:) string("!")
+comment(#INVERTED EXCLAMATION MARK)
+key(iexcl)operator(:) string("!`")
+comment(#INVERTED EXCLAMATION MARK)
+key<delimiter(")content(161)delimiter(")>operator(:) string("!`")
+comment(#QUOTATION MARK)
+comment(#requires fontenc:T1)
+key(quot)operator(:) string("\\"")
+comment(#QUOTATION MARK)
+comment(#requires fontenc:T1)
+key<delimiter(")content(34)delimiter(")>operator(:) string("\\"")
+comment(#APOSTROPHE)
+comment(#requires textcomp)
+key<delimiter(")content(39)delimiter(")>operator(:) string("'")
+comment(#LEFT PARENTHESIS)
+key<delimiter(")content(40)delimiter(")>operator(:) string(()
+comment(#RIGHT PARENTHESIS)
+key<delimiter(")content(41)delimiter(")>operator(:) string(\))
+comment(#COMMA)
+key<delimiter(")content(44)delimiter(")>operator(:) string(",")
+comment(#LOW LINE)
+key<delimiter(")content(95)delimiter(")>operator(:) string(\\_)
+comment(#HYPHEN-MINUS)
+key<delimiter(")content(45)delimiter(")>operator(:) string("-")
+comment(#FULL STOP)
+key<delimiter(")content(46)delimiter(")>operator(:) string(.)
+comment(#SOLIDUS)
+key<delimiter(")content(47)delimiter(")>operator(:) string(/)
+comment(#COLON)
+key<delimiter(")content(58)delimiter(")>operator(:) string(":")
+comment(#SEMICOLON)
+key<delimiter(")content(59)delimiter(")>operator(:) string(;)
+comment(#QUESTION MARK)
+key<delimiter(")content(63)delimiter(")>operator(:) string("?")
+comment(#INVERTED QUESTION MARK)
+key(iquest)operator(:) string(?`)
+comment(#INVERTED QUESTION MARK)
+key<delimiter(")content(191)delimiter(")>operator(:) string(?`)
+comment(#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK)
+comment(#requires fontenc:T1)
+key(laquo)operator(:) string(\\guillemotleft{})
+comment(#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK)
+comment(#requires fontenc:T1)
+key<delimiter(")content(171)delimiter(")>operator(:) string(\\guillemotleft{})
+comment(#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK)
+comment(#requires fontenc:T1)
+key(raquo)operator(:) string(\\guillemotright{})
+comment(#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK)
+comment(#requires fontenc:T1)
+key<delimiter(")content(187)delimiter(")>operator(:) string(\\guillemotright{})
+comment(#LEFT SINGLE QUOTATION MARK)
+key(lsquo)operator(:) string(`)
+comment(#LEFT SINGLE QUOTATION MARK)
+key<delimiter(")content(8216)delimiter(")>operator(:) string(`)
+comment(#RIGHT SINGLE QUOTATION MARK)
+key(rsquo)operator(:) string("'")
+comment(#RIGHT SINGLE QUOTATION MARK)
+key<delimiter(")content(8217)delimiter(")>operator(:) string("'")
+comment(#LEFT DOUBLE QUOTATION MARK)
+key(ldquo)operator(:) string(``)
+comment(#LEFT DOUBLE QUOTATION MARK)
+key<delimiter(")content(8220)delimiter(")>operator(:) string(``)
+comment(#RIGHT DOUBLE QUOTATION MARK)
+key(rdquo)operator(:) string("''")
+comment(#RIGHT DOUBLE QUOTATION MARK)
+key<delimiter(")content(8221)delimiter(")>operator(:) string("''")
+comment(#NO-BREAK SPACE)
+key(nbsp)operator(:) string("~")
+comment(#NO-BREAK SPACE)
+key<delimiter(")content(160)delimiter(")>operator(:) string("~")
+comment(#SOFT HYPHEN)
+key(shy)operator(:) string(\\-)
+comment(#SOFT HYPHEN)
+key<delimiter(")content(173)delimiter(")>operator(:) string(\\-)
+comment(#BOX DRAWINGS LIGHT HORIZONTAL)
+key<delimiter(")content(9472)delimiter(")>operator(:) string(\\boxh{})
+comment(#BOX DRAWINGS LIGHT VERTICAL)
+key<delimiter(")content(9474)delimiter(")>operator(:) string(\\boxv{})
+comment(#BOX DRAWINGS LIGHT UP AND RIGHT)
+key<delimiter(")content(9492)delimiter(")>operator(:) string(\\boxur{})
+comment(#BOX DRAWINGS LIGHT UP AND LEFT)
+key<delimiter(")content(9496)delimiter(")>operator(:) string(\\boxul{})
+comment(#BOX DRAWINGS LIGHT DOWN AND LEFT)
+key<delimiter(")content(9488)delimiter(")>operator(:) string(\\boxdl{})
+comment(#BOX DRAWINGS LIGHT DOWN AND RIGHT)
+key<delimiter(")content(9484)delimiter(")>operator(:) string(\\boxdr{})
+comment(#BOX DRAWINGS LIGHT VERTICAL AND RIGHT)
+key<delimiter(")content(9500)delimiter(")>operator(:) string(\\boxvr{})
+comment(#BOX DRAWINGS LIGHT UP AND HORIZONTAL)
+key<delimiter(")content(9524)delimiter(")>operator(:) string(\\boxhu{})
+comment(#BOX DRAWINGS LIGHT VERTICAL AND LEFT)
+key<delimiter(")content(9508)delimiter(")>operator(:) string(\\boxvl{})
+comment(#BOX DRAWINGS LIGHT DOWN AND HORIZONTAL)
+key<delimiter(")content(9516)delimiter(")>operator(:) string(\\boxhd{})
+comment(#BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL)
+key<delimiter(")content(9532)delimiter(")>operator(:) string(\\boxvh{})
+comment(#BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE)
+key<delimiter(")content(9566)delimiter(")>operator(:) string(\\boxvR{})
+comment(#BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE)
+key<delimiter(")content(9576)delimiter(")>operator(:) string(\\boxhU{})
+comment(#BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE)
+key<delimiter(")content(9569)delimiter(")>operator(:) string(\\boxvL{})
+comment(#BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE)
+key<delimiter(")content(9573)delimiter(")>operator(:) string(\\boxhD{})
+comment(#BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE)
+key<delimiter(")content(9578)delimiter(")>operator(:) string(\\boxvH{})
+comment(#BOX DRAWINGS DOUBLE HORIZONTAL)
+key<delimiter(")content(9552)delimiter(")>operator(:) string(\\boxH{})
+comment(#BOX DRAWINGS DOUBLE VERTICAL)
+key<delimiter(")content(9553)delimiter(")>operator(:) string(\\boxV{})
+comment(#BOX DRAWINGS DOUBLE UP AND RIGHT)
+key<delimiter(")content(9562)delimiter(")>operator(:) string(\\boxUR{})
+comment(#BOX DRAWINGS DOUBLE UP AND LEFT)
+key<delimiter(")content(9565)delimiter(")>operator(:) string(\\boxUL{})
+comment(#BOX DRAWINGS DOUBLE DOWN AND LEFT)
+key<delimiter(")content(9559)delimiter(")>operator(:) string(\\boxDL{})
+comment(#BOX DRAWINGS DOUBLE DOWN AND RIGHT)
+key<delimiter(")content(9556)delimiter(")>operator(:) string(\\boxDR{})
+comment(#BOX DRAWINGS DOUBLE VERTICAL AND RIGHT)
+key<delimiter(")content(9568)delimiter(")>operator(:) string(\\boxVR{})
+comment(#BOX DRAWINGS DOUBLE UP AND HORIZONTAL)
+key<delimiter(")content(9577)delimiter(")>operator(:) string(\\boxHU{})
+comment(#BOX DRAWINGS DOUBLE VERTICAL AND LEFT)
+key<delimiter(")content(9571)delimiter(")>operator(:) string(\\boxVL{})
+comment(#BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL)
+key<delimiter(")content(9574)delimiter(")>operator(:) string(\\boxHD{})
+comment(#BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL)
+key<delimiter(")content(9580)delimiter(")>operator(:) string(\\boxVH{})
+comment(#BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE)
+key<delimiter(")content(9567)delimiter(")>operator(:) string(\\boxVr{})
+comment(#BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE)
+key<delimiter(")content(9575)delimiter(")>operator(:) string(\\boxHu{})
+comment(#BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE)
+key<delimiter(")content(9570)delimiter(")>operator(:) string(\\boxVl{})
+comment(#BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE)
+key<delimiter(")content(9572)delimiter(")>operator(:) string(\\boxHd{})
+comment(#BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE)
+key<delimiter(")content(9579)delimiter(")>operator(:) string(\\boxVh{})
+comment(#BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE)
+key<delimiter(")content(9560)delimiter(")>operator(:) string(\\boxuR{})
+comment(#BOX DRAWINGS UP DOUBLE AND LEFT SINGLE)
+key<delimiter(")content(9564)delimiter(")>operator(:) string(\\boxUl{})
+comment(#BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE)
+key<delimiter(")content(9557)delimiter(")>operator(:) string(\\boxdL{})
+comment(#BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE)
+key<delimiter(")content(9555)delimiter(")>operator(:) string(\\boxDr{})
+comment(#BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE)
+key<delimiter(")content(9561)delimiter(")>operator(:) string(\\boxUr{})
+comment(#BOX DRAWINGS UP SINGLE AND LEFT DOUBLE)
+key<delimiter(")content(9563)delimiter(")>operator(:) string(\\boxuL{})
+comment(#BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE)
+key<delimiter(")content(9558)delimiter(")>operator(:) string(\\boxDl{})
+comment(#BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE)
+key<delimiter(")content(9554)delimiter(")>operator(:) string(\\boxdR{})
+comment(#ALEF SYMBOL)
+key(alefsym)operator(:) string(\\aleph{})
+comment(#ALEF SYMBOL)
+key<delimiter(")content(8501)delimiter(")>operator(:) string(\\aleph{})
+comment(#LOGICAL AND)
+key(and)operator(:) string(\\wedge{})
+comment(#LOGICAL AND)
+key<delimiter(")content(8743)delimiter(")>operator(:) string(\\wedge{})
+comment(#RIGHT ANGLE)
+key<delimiter(")content(8735)delimiter(")>operator(:) string(\\sqangle{})
+comment(#SPHERICAL ANGLE)
+comment(#requires amssymb)
+key<delimiter(")content(8738)delimiter(")>operator(:) string(\\sphericalangle{})
+comment(#ALMOST EQUAL TO)
+key<delimiter(")content(8776)delimiter(")>operator(:) string(\\approx{})
+comment(#BECAUSE)
+comment(#requires amssymb)
+key<delimiter(")content(8757)delimiter(")>operator(:) string(\\because{})
+comment(#UP TACK)
+key<delimiter(")content(8869)delimiter(")>operator(:) string(\\bot{})
+comment(#INTERSECTION)
+key(cap)operator(:) string(\\cap{})
+comment(#INTERSECTION)
+key<delimiter(")content(8745)delimiter(")>operator(:) string(\\cap{})
+comment(#APPROXIMATELY EQUAL TO)
+key(cong)operator(:) string(\\cong{})
+comment(#APPROXIMATELY EQUAL TO)
+key<delimiter(")content(8773)delimiter(")>operator(:) string(\\cong{})
+comment(#CONTOUR INTEGRAL)
+key<delimiter(")content(8750)delimiter(")>operator(:) string(\\oint{})
+comment(#UNION)
+key(cup)operator(:) string(\\cup{})
+comment(#UNION)
+key<delimiter(")content(8746)delimiter(")>operator(:) string(\\cup{})
+comment(#IDENTICAL TO)
+key(equiv)operator(:) string(\\equiv{})
+comment(#IDENTICAL TO)
+key<delimiter(")content(8801)delimiter(")>operator(:) string(\\equiv{})
+comment(#THERE EXISTS)
+key(exist)operator(:) string(\\exists{})
+comment(#THERE EXISTS)
+key<delimiter(")content(8707)delimiter(")>operator(:) string(\\exists{})
+comment(#FOR ALL)
+key(forall)operator(:) string(\\forall{})
+comment(#FOR ALL)
+key<delimiter(")content(8704)delimiter(")>operator(:) string(\\forall{})
+comment(#LATIN SMALL LETTER F WITH HOOK)
+key(fnof)operator(:) string(f)
+comment(#LATIN SMALL LETTER F WITH HOOK)
+key<delimiter(")content(402)delimiter(")>operator(:) string(f)
+comment(#GREATER-THAN OR EQUAL TO)
+key(ge)operator(:) string(\\geq{})
+comment(#GREATER-THAN OR EQUAL TO)
+key<delimiter(")content(8805)delimiter(")>operator(:) string(\\geq{})
+comment(#LEFT RIGHT DOUBLE ARROW)
+key<delimiter(")content(8660)delimiter(")>operator(:) string(\\iff{})
+comment(#INFINITY)
+key(infin)operator(:) string(\\infty{})
+comment(#INFINITY)
+key<delimiter(")content(8734)delimiter(")>operator(:) string(\\infty{})
+comment(#INTEGRAL)
+key(int)operator(:) string(\\int{})
+comment(#INTEGRAL)
+key<delimiter(")content(8747)delimiter(")>operator(:) string(\\int{})
+comment(#ELEMENT OF)
+key(isin)operator(:) string(\\in{})
+comment(#ELEMENT OF)
+key<delimiter(")content(8712)delimiter(")>operator(:) string(\\in{})
+comment(#LEFT ANGLE BRACKET)
+comment(#requires textcomp)
+key(lang)operator(:) string(\\textlangle{})
+comment(#LEFT ANGLE BRACKET)
+comment(#requires textcomp)
+key<delimiter(")content(12296)delimiter(")>operator(:) string(\\textlangle{})
+comment(#LEFTWARDS DOUBLE ARROW)
+key(lArr)operator(:) string(\\Leftarrow{})
+comment(#LEFTWARDS DOUBLE ARROW)
+key<delimiter(")content(8656)delimiter(")>operator(:) string(\\Leftarrow{})
+comment(#LESS-THAN OR EQUAL TO)
+key(le)operator(:) string(\\leq{})
+comment(#LESS-THAN OR EQUAL TO)
+key<delimiter(")content(8804)delimiter(")>operator(:) string(\\leq{})
+comment(#MINUS SIGN)
+comment(#requires textcomp)
+key(minus)operator(:) string(\\textminus{})
+comment(#MINUS SIGN)
+comment(#requires textcomp)
+key<delimiter(")content(8722)delimiter(")>operator(:) string(\\textminus{})
+comment(#MINUS-OR-PLUS SIGN)
+key<delimiter(")content(8723)delimiter(")>operator(:) string(\\mp{})
+comment(#NABLA)
+key(nabla)operator(:) string(\\nabla{})
+comment(#NABLA)
+key<delimiter(")content(8711)delimiter(")>operator(:) string(\\nabla{})
+comment(#NOT EQUAL TO)
+key(ne)operator(:) string(\\not=)
+comment(#NOT EQUAL TO)
+key<delimiter(")content(8800)delimiter(")>operator(:) string(\\not=)
+comment(#CONTAINS AS MEMBER)
+key(ni)operator(:) string(\\ni{})
+comment(#CONTAINS AS MEMBER)
+key<delimiter(")content(8715)delimiter(")>operator(:) string(\\ni{})
+comment(#LOGICAL OR)
+key(or)operator(:) string(\\vee{})
+comment(#LOGICAL OR)
+key<delimiter(")content(8744)delimiter(")>operator(:) string(\\vee{})
+comment(#PARALLEL TO)
+key<delimiter(")content(8741)delimiter(")>operator(:) string(\\parallel{})
+comment(#PARTIAL DIFFERENTIAL)
+key(part)operator(:) string(\\partial{})
+comment(#PARTIAL DIFFERENTIAL)
+key<delimiter(")content(8706)delimiter(")>operator(:) string(\\partial{})
+comment(#PER MILLE SIGN)
+comment(#requires wasysym)
+key(permil)operator(:) string(\\textperthousand{})
+comment(#PER MILLE SIGN)
+comment(#requires wasysym)
+key<delimiter(")content(8240)delimiter(")>operator(:) string(\\textperthousand{})
+comment(#UP TACK)
+key(perp)operator(:) string(\\perp{})
+comment(#UP TACK)
+key<delimiter(")content(8869)delimiter(")>operator(:) string(\\perp{})
+comment(#PRIME)
+key(prime)operator(:) string(^\\prime)
+comment(#PRIME)
+key<delimiter(")content(8242)delimiter(")>operator(:) string(^\\prime)
+comment(#DOUBLE PRIME)
+key(Prime)operator(:) string("{''}")
+comment(#DOUBLE PRIME)
+key<delimiter(")content(8243)delimiter(")>operator(:) string("{''}")
+comment(#PROPORTIONAL TO)
+key(prop)operator(:) string(\\propto{})
+comment(#PROPORTIONAL TO)
+key<delimiter(")content(8733)delimiter(")>operator(:) string(\\propto{})
+comment(#FOURTH ROOT)
+comment(#requires textcomp)
+key(radic)operator(:) string(\\textsurd{})
+comment(#FOURTH ROOT)
+comment(#requires textcomp)
+key<delimiter(")content(8730)delimiter(")>operator(:) string(\\textsurd{})
+comment(#RIGHT ANGLE BRACKET)
+comment(#requires textcomp)
+key(rang)operator(:) string(\\textrangle{})
+comment(#RIGHT ANGLE BRACKET)
+comment(#requires textcomp)
+key<delimiter(")content(12297)delimiter(")>operator(:) string(\\textrangle{})
+comment(#RIGHTWARDS DOUBLE ARROW)
+key(rArr)operator(:) string(\\Rightarrow{})
+comment(#RIGHTWARDS DOUBLE ARROW)
+key<delimiter(")content(8658)delimiter(")>operator(:) string(\\Rightarrow{})
+comment(#TILDE OPERATOR)
+key(sim)operator(:) string(\\sim{})
+comment(#TILDE OPERATOR)
+key<delimiter(")content(8764)delimiter(")>operator(:) string(\\sim{})
+comment(#APPROXIMATELY EQUAL TO)
+key<delimiter(")content(8771)delimiter(")>operator(:) string(\\simeq{})
+comment(#BLACK SQUARE)
+comment(#requires amssymb)
+key<delimiter(")content(9632)delimiter(")>operator(:) string(\\square{})
+comment(#SUBSET OF)
+key(sub)operator(:) string(\\subset{})
+comment(#SUBSET OF)
+key<delimiter(")content(8834)delimiter(")>operator(:) string(\\subset{})
+comment(#SUBSET OF OR EQUAL TO)
+key(sube)operator(:) string(\\subseteq{})
+comment(#SUBSET OF OR EQUAL TO)
+key<delimiter(")content(8838)delimiter(")>operator(:) string(\\subseteq{})
+comment(#SUPERSET OF)
+key(sup)operator(:) string(\\supset{})
+comment(#SUPERSET OF)
+key<delimiter(")content(8835)delimiter(")>operator(:) string(\\supset{})
+comment(#SUPERSET OF OR EQUAL TO)
+key(supe)operator(:) string(\\supseteq{})
+comment(#SUPERSET OF OR EQUAL TO)
+key<delimiter(")content(8839)delimiter(")>operator(:) string(\\supseteq{})
+comment(#THEREFORE)
+comment(#requires amssymb)
+key(there4)operator(:) string(\\therefore{})
+comment(#THEREFORE)
+comment(#requires amssymb)
+key<delimiter(")content(8756)delimiter(")>operator(:) string(\\therefore{})
+comment(#DOUBLE VERTICAL LINE)
+comment(#requires textcomp)
+key<delimiter(")content(8214)delimiter(")>operator(:) string(\\textbardbl{})
+comment(#ANGSTROM SIGN)
+key<delimiter(")content(8491)delimiter(")>operator(:) string(\\AA{})
+comment(#SCRIPT CAPITAL B)
+comment(#requires mathrsfs)
+key<delimiter(")content(8492)delimiter(")>operator(:) string(B)
+comment(#RING OPERATOR)
+key<delimiter(")content(8728)delimiter(")>operator(:) string(\\circ{})
+comment(#DIAERESIS)
+key<delimiter(")content(168)delimiter(")>operator(:) string(\\ddot{})
+comment(#COMBINING FOUR DOTS ABOVE)
+key<delimiter(")content(8412)delimiter(")>operator(:) string(\\ddot{}\\kern4.5pt\\ddot{ })
+comment(#SCRIPT CAPITAL H)
+comment(#requires mathrsfs)
+key<delimiter(")content(8459)delimiter(")>operator(:) string(H)
+comment(#SCRIPT CAPITAL L)
+comment(#requires mathrsfs)
+key<delimiter(")content(8466)delimiter(")>operator(:) string(L)
+comment(#ASTERISK OPERATOR)
+key(lowast)operator(:) string(_\\ast)
+comment(#ASTERISK OPERATOR)
+key<delimiter(")content(8727)delimiter(")>operator(:) string(_\\ast)
+comment(#NOT AN ELEMENT OF)
+key(notin)operator(:) string(\\not\\in{})
+comment(#NOT AN ELEMENT OF)
+key<delimiter(")content(8713)delimiter(")>operator(:) string(\\not\\in{})
+comment(#SCRIPT SMALL O)
+key<delimiter(")content(8500)delimiter(")>operator(:) string(\\mathit{o})
+comment(#SCRIPT CAPITAL M)
+comment(#requires mathrsfs)
+key<delimiter(")content(8499)delimiter(")>operator(:) string(M)
+comment(#COMBINING THREE DOTS ABOVE)
+key<delimiter(")content(8411)delimiter(")>operator(:) string(\\ddot{}\\kern 3pt\\dot{ })
+comment(#TRIPLE PRIME)
+key<delimiter(")content(8244)delimiter(")>operator(:) string("{'''}")
+comment(#ESTIMATES)
+key<delimiter(")content(8793)delimiter(")>operator(:) string(\\stackrel{\\wedge}{=})
+comment(#GREEK SMALL LETTER ALPHA)
+key(alpha)operator(:) string(\\alpha{})
+comment(#GREEK SMALL LETTER ALPHA)
+key<delimiter(")content(945)delimiter(")>operator(:) string(\\alpha{})
+comment(#GREEK SMALL LETTER BETA)
+key(beta)operator(:) string(\\beta{})
+comment(#GREEK SMALL LETTER BETA)
+key<delimiter(")content(946)delimiter(")>operator(:) string(\\beta{})
+comment(#GREEK SMALL LETTER GAMMA)
+key(gamma)operator(:) string(\\gamma{})
+comment(#GREEK SMALL LETTER GAMMA)
+key<delimiter(")content(947)delimiter(")>operator(:) string(\\gamma{})
+comment(#GREEK CAPITAL LETTER GAMMA)
+key(Gamma)operator(:) string(\\Gamma{})
+comment(#GREEK CAPITAL LETTER GAMMA)
+key<delimiter(")content(915)delimiter(")>operator(:) string(\\Gamma{})
+comment(#GREEK LETTER DIGAMMA)
+comment(#requires amssymb)
+key<delimiter(")content(988)delimiter(")>operator(:) string(\\digamma{})
+comment(#GREEK SMALL LETTER DELTA)
+key(delta)operator(:) string(\\delta{})
+comment(#GREEK SMALL LETTER DELTA)
+key<delimiter(")content(948)delimiter(")>operator(:) string(\\delta{})
+comment(#GREEK CAPITAL LETTER DELTA)
+key(Delta)operator(:) string(\\Delta{})
+comment(#GREEK CAPITAL LETTER DELTA)
+key<delimiter(")content(916)delimiter(")>operator(:) string(\\Delta{})
+comment(#GREEK SMALL LETTER EPSILON)
+key(epsilon)operator(:) string(\\epsilon{})
+comment(#GREEK SMALL LETTER EPSILON)
+key<delimiter(")content(949)delimiter(")>operator(:) string(\\epsilon{})
+comment(#SMALL ELEMENT OF)
+key<delimiter(")content(8714)delimiter(")>operator(:) string(\\epsilon{})
+comment(#GREEK SMALL LETTER ZETA)
+key(zeta)operator(:) string(\\zeta{})
+comment(#GREEK SMALL LETTER ZETA)
+key<delimiter(")content(950)delimiter(")>operator(:) string(\\zeta{})
+comment(#GREEK SMALL LETTER ETA)
+key(eta)operator(:) string(\\eta{})
+comment(#GREEK SMALL LETTER ETA)
+key<delimiter(")content(951)delimiter(")>operator(:) string(\\eta{})
+comment(#GREEK SMALL LETTER THETA)
+key(theta)operator(:) string(\\theta{})
+comment(#GREEK SMALL LETTER THETA)
+key<delimiter(")content(952)delimiter(")>operator(:) string(\\theta{})
+comment(#GREEK CAPITAL LETTER THETA)
+key(Theta)operator(:) string(\\Theta{})
+comment(#GREEK CAPITAL LETTER THETA)
+key<delimiter(")content(920)delimiter(")>operator(:) string(\\Theta{})
+comment(#GREEK THETA SYMBOL)
+key(thetasym)operator(:) string(\\vartheta{})
+comment(#GREEK THETA SYMBOL)
+key<delimiter(")content(977)delimiter(")>operator(:) string(\\vartheta{})
+comment(#GREEK SMALL LETTER IOTA)
+key(iota)operator(:) string(\\iota{})
+comment(#GREEK SMALL LETTER IOTA)
+key<delimiter(")content(953)delimiter(")>operator(:) string(\\iota{})
+comment(#GREEK SMALL LETTER KAPPA)
+key(kappa)operator(:) string(\\kappa{})
+comment(#GREEK SMALL LETTER KAPPA)
+key<delimiter(")content(954)delimiter(")>operator(:) string(\\kappa{})
+comment(#GREEK KAPPA SYMBOL)
+comment(#requires amssymb)
+key<delimiter(")content(1008)delimiter(")>operator(:) string(\\varkappa{})
+comment(#GREEK SMALL LETTER LAMDA)
+key(lambda)operator(:) string(\\lambda{})
+comment(#GREEK SMALL LETTER LAMDA)
+key<delimiter(")content(955)delimiter(")>operator(:) string(\\lambda{})
+comment(#GREEK CAPITAL LETTER LAMDA)
+key(Lambda)operator(:) string(\\Lambda{})
+comment(#GREEK CAPITAL LETTER LAMDA)
+key<delimiter(")content(923)delimiter(")>operator(:) string(\\Lambda{})
+comment(#GREEK SMALL LETTER MU)
+key(mu)operator(:) string(\\mu{})
+comment(#GREEK SMALL LETTER MU)
+key<delimiter(")content(956)delimiter(")>operator(:) string(\\mu{})
+comment(#GREEK SMALL LETTER NU)
+key(nu)operator(:) string(\\nu{})
+comment(#GREEK SMALL LETTER NU)
+key<delimiter(")content(957)delimiter(")>operator(:) string(\\nu{})
+comment(#GREEK SMALL LETTER XI)
+key(xi)operator(:) string(\\xi{})
+comment(#GREEK SMALL LETTER XI)
+key<delimiter(")content(958)delimiter(")>operator(:) string(\\xi{})
+comment(#GREEK CAPITAL LETTER XI)
+key(Xi)operator(:) string(\\Xi{})
+comment(#GREEK CAPITAL LETTER XI)
+key<delimiter(")content(926)delimiter(")>operator(:) string(\\Xi{})
+comment(#GREEK SMALL LETTER PI)
+key(pi)operator(:) string(\\pi{})
+comment(#GREEK SMALL LETTER PI)
+key<delimiter(")content(960)delimiter(")>operator(:) string(\\pi{})
+comment(#GREEK PI SYMBOL)
+key(piv)operator(:) string(\\varpi{})
+comment(#GREEK PI SYMBOL)
+key<delimiter(")content(982)delimiter(")>operator(:) string(\\varpi{})
+comment(#GREEK CAPITAL LETTER PI)
+key(Pi)operator(:) string(\\Pi{})
+comment(#GREEK CAPITAL LETTER PI)
+key<delimiter(")content(928)delimiter(")>operator(:) string(\\Pi{})
+comment(#GREEK SMALL LETTER RHO)
+key(rho)operator(:) string(\\rho{})
+comment(#GREEK SMALL LETTER RHO)
+key<delimiter(")content(961)delimiter(")>operator(:) string(\\rho{})
+comment(#GREEK RHO SYMBOL)
+key<delimiter(")content(1009)delimiter(")>operator(:) string(\\varrho{})
+comment(#GREEK SMALL LETTER SIGMA)
+key(sigma)operator(:) string(\\sigma{})
+comment(#GREEK SMALL LETTER SIGMA)
+key<delimiter(")content(963)delimiter(")>operator(:) string(\\sigma{})
+comment(#GREEK CAPITAL LETTER SIGMA)
+key(Sigma)operator(:) string(\\Sigma{})
+comment(#GREEK CAPITAL LETTER SIGMA)
+key<delimiter(")content(931)delimiter(")>operator(:) string(\\Sigma{})
+comment(#GREEK SMALL LETTER FINAL SIGMA)
+key(sigmaf)operator(:) string(\\varsigma{})
+comment(#GREEK SMALL LETTER FINAL SIGMA)
+key<delimiter(")content(962)delimiter(")>operator(:) string(\\varsigma{})
+comment(#GREEK SMALL LETTER TAU)
+key(tau)operator(:) string(\\tau{})
+comment(#GREEK SMALL LETTER TAU)
+key<delimiter(")content(964)delimiter(")>operator(:) string(\\tau{})
+comment(#GREEK SMALL LETTER UPSILON)
+key(upsi)operator(:) string(\\upsilon{})
+comment(#GREEK SMALL LETTER UPSILON)
+key<delimiter(")content(965)delimiter(")>operator(:) string(\\upsilon{})
+comment(#GREEK UPSILON WITH HOOK SYMBOL)
+key(upsih)operator(:) string(\\Upsilon{})
+comment(#GREEK UPSILON WITH HOOK SYMBOL)
+key<delimiter(")content(978)delimiter(")>operator(:) string(\\Upsilon{})
+comment(#GREEK SMALL LETTER PHI)
+key(phis)operator(:) string(\\phi{})
+comment(#GREEK SMALL LETTER PHI)
+key<delimiter(")content(966)delimiter(")>operator(:) string(\\phi{})
+comment(#GREEK CAPITAL LETTER PHI)
+key(Phi)operator(:) string(\\Phi{})
+comment(#GREEK CAPITAL LETTER PHI)
+key<delimiter(")content(934)delimiter(")>operator(:) string(\\Phi{})
+comment(#GREEK PHI SYMBOL)
+key<delimiter(")content(981)delimiter(")>operator(:) string(\\varphi{})
+comment(#GREEK SMALL LETTER CHI)
+key(chi)operator(:) string(\\chi{})
+comment(#GREEK SMALL LETTER CHI)
+key<delimiter(")content(967)delimiter(")>operator(:) string(\\chi{})
+comment(#GREEK SMALL LETTER PSI)
+key(psi)operator(:) string(\\psi{})
+comment(#GREEK SMALL LETTER PSI)
+key<delimiter(")content(968)delimiter(")>operator(:) string(\\psi{})
+comment(#GREEK CAPITAL LETTER PSI)
+key(Psi)operator(:) string(\\Psi{})
+comment(#GREEK CAPITAL LETTER PSI)
+key<delimiter(")content(936)delimiter(")>operator(:) string(\\Psi{})
+comment(#GREEK SMALL LETTER OMEGA)
+key(omega)operator(:) string(\\omega{})
+comment(#GREEK SMALL LETTER OMEGA)
+key<delimiter(")content(969)delimiter(")>operator(:) string(\\omega{})
+comment(#GREEK CAPITAL LETTER OMEGA)
+key(Omega)operator(:) string(\\Omega{})
+comment(#GREEK CAPITAL LETTER OMEGA)
+key<delimiter(")content(937)delimiter(")>operator(:) string(\\Omega{})
+comment(#GREEK SMALL LETTER ALPHA)
+comment(#requires amsbsy)
+key<delimiter(")content(945)delimiter(")>operator(:) string(\\alpha{})
+comment(#GREEK SMALL LETTER BETA)
+comment(#requires amsbsy)
+key<delimiter(")content(946)delimiter(")>operator(:) string(\\beta{})
+comment(#GREEK SMALL LETTER GAMMA)
+comment(#requires amsbsy)
+key<delimiter(")content(947)delimiter(")>operator(:) string(\\gamma{})
+comment(#GREEK CAPITAL LETTER GAMMA)
+comment(#requires amsbsy)
+key<delimiter(")content(915)delimiter(")>operator(:) string(\\Gamma{})
+comment(#GREEK LETTER DIGAMMA)
+comment(#requires amsbsy,amssymb)
+key<delimiter(")content(988)delimiter(")>operator(:) string(\\digamma{})
+comment(#GREEK SMALL LETTER DELTA)
+comment(#requires amsbsy)
+key<delimiter(")content(948)delimiter(")>operator(:) string(\\delta{})
+comment(#GREEK CAPITAL LETTER DELTA)
+comment(#requires amsbsy)
+key<delimiter(")content(916)delimiter(")>operator(:) string(\\Delta{})
+comment(#GREEK SMALL LETTER EPSILON)
+comment(#requires amsbsy)
+key<delimiter(")content(949)delimiter(")>operator(:) string(\\epsilon{})
+comment(#GREEK SMALL LETTER EPSILON)
+comment(#requires amsbsy)
+key<delimiter(")content(949)delimiter(")>operator(:) string(\\varepsilon{})
+comment(#GREEK SMALL LETTER EPSILON)
+comment(#requires amsbsy)
+key<delimiter(")content(949)delimiter(")>operator(:) string(\\epsilon{})
+comment(#GREEK SMALL LETTER ZETA)
+comment(#requires amsbsy)
+key<delimiter(")content(950)delimiter(")>operator(:) string(\\zeta{})
+comment(#GREEK SMALL LETTER ETA)
+comment(#requires amsbsy)
+key<delimiter(")content(951)delimiter(")>operator(:) string(\\eta{})
+comment(#GREEK SMALL LETTER THETA)
+comment(#requires amsbsy)
+key<delimiter(")content(952)delimiter(")>operator(:) string(\\theta{})
+comment(#GREEK CAPITAL LETTER THETA)
+comment(#requires amsbsy)
+key<delimiter(")content(920)delimiter(")>operator(:) string(\\Theta{})
+comment(#GREEK THETA SYMBOL)
+comment(#requires amsbsy)
+key<delimiter(")content(977)delimiter(")>operator(:) string(\\vartheta{})
+comment(#GREEK SMALL LETTER IOTA)
+comment(#requires amsbsy)
+key<delimiter(")content(953)delimiter(")>operator(:) string(\\iota{})
+comment(#GREEK SMALL LETTER KAPPA)
+comment(#requires amsbsy)
+key<delimiter(")content(954)delimiter(")>operator(:) string(\\kappa{})
+comment(#GREEK KAPPA SYMBOL)
+comment(#requires amsbsy,amssymb)
+key<delimiter(")content(1008)delimiter(")>operator(:) string(\\varkappa{})
+comment(#GREEK SMALL LETTER LAMDA)
+comment(#requires amsbsy)
+key<delimiter(")content(955)delimiter(")>operator(:) string(\\lambda{})
+comment(#GREEK CAPITAL LETTER LAMDA)
+comment(#requires amsbsy)
+key<delimiter(")content(923)delimiter(")>operator(:) string(\\Lambda{})
+comment(#GREEK SMALL LETTER MU)
+comment(#requires amsbsy)
+key<delimiter(")content(956)delimiter(")>operator(:) string(\\mu{})
+comment(#GREEK SMALL LETTER NU)
+comment(#requires amsbsy)
+key<delimiter(")content(957)delimiter(")>operator(:) string(\\nu{})
+comment(#GREEK SMALL LETTER XI)
+comment(#requires amsbsy)
+key<delimiter(")content(958)delimiter(")>operator(:) string(\\xi{})
+comment(#GREEK CAPITAL LETTER XI)
+comment(#requires amsbsy)
+key<delimiter(")content(926)delimiter(")>operator(:) string(\\Xi{})
+comment(#GREEK SMALL LETTER PI)
+comment(#requires amsbsy)
+key<delimiter(")content(960)delimiter(")>operator(:) string(\\pi{})
+comment(#GREEK CAPITAL LETTER PI)
+comment(#requires amsbsy)
+key<delimiter(")content(928)delimiter(")>operator(:) string(\\Pi{})
+comment(#GREEK PI SYMBOL)
+comment(#requires amsbsy)
+key<delimiter(")content(982)delimiter(")>operator(:) string(\\varpi{})
+comment(#GREEK SMALL LETTER RHO)
+comment(#requires amsbsy)
+key<delimiter(")content(961)delimiter(")>operator(:) string(\\rho{})
+comment(#GREEK RHO SYMBOL)
+comment(#requires amsbsy)
+key<delimiter(")content(1009)delimiter(")>operator(:) string(\\varrho{})
+comment(#GREEK SMALL LETTER SIGMA)
+comment(#requires amsbsy)
+key<delimiter(")content(963)delimiter(")>operator(:) string(\\sigma{})
+comment(#GREEK CAPITAL LETTER SIGMA)
+comment(#requires amsbsy)
+key<delimiter(")content(931)delimiter(")>operator(:) string(\\Sigma{})
+comment(#GREEK SMALL LETTER FINAL SIGMA)
+comment(#requires amsbsy)
+key<delimiter(")content(962)delimiter(")>operator(:) string(\\varsigma{})
+comment(#GREEK SMALL LETTER TAU)
+comment(#requires amsbsy)
+key<delimiter(")content(964)delimiter(")>operator(:) string(\\tau{})
+comment(#GREEK SMALL LETTER UPSILON)
+comment(#requires amsbsy)
+key<delimiter(")content(965)delimiter(")>operator(:) string(\\upsilon{})
+comment(#GREEK CAPITAL LETTER UPSILON)
+comment(#requires amsbsy)
+key<delimiter(")content(978)delimiter(")>operator(:) string(\\Upsilon{})
+comment(#GREEK SMALL LETTER PHI)
+comment(#requires amsbsy)
+key<delimiter(")content(966)delimiter(")>operator(:) string(\\phi{})
+comment(#GREEK CAPITAL LETTER PHI)
+comment(#requires amsbsy)
+key<delimiter(")content(934)delimiter(")>operator(:) string(\\Phi{})
+comment(#GREEK PHI SYMBOL)
+comment(#requires amsbsy)
+key<delimiter(")content(981)delimiter(")>operator(:) string(\\varphi{})
+comment(#GREEK SMALL LETTER CHI)
+comment(#requires amsbsy)
+key<delimiter(")content(967)delimiter(")>operator(:) string(\\chi{})
+comment(#GREEK SMALL LETTER PSI)
+comment(#requires amsbsy)
+key<delimiter(")content(968)delimiter(")>operator(:) string(\\psi{})
+comment(#GREEK CAPITAL LETTER PSI)
+comment(#requires amsbsy)
+key<delimiter(")content(936)delimiter(")>operator(:) string(\\Psi{})
+comment(#GREEK SMALL LETTER OMEGA)
+comment(#requires amsbsy)
+key<delimiter(")content(969)delimiter(")>operator(:) string(\\omega{})
+comment(#GREEK CAPITAL LETTER OMEGA)
+comment(#requires amsbsy)
+key<delimiter(")content(937)delimiter(")>operator(:) string(\\Omega{})
+comment(#ANGLE)
+key(ang)operator(:) string(\\angle{})
+comment(#ANGLE)
+key<delimiter(")content(8736)delimiter(")>operator(:) string(\\angle{})
+comment(#MEASURED ANGLE)
+comment(#requires amssymb)
+key<delimiter(")content(8737)delimiter(")>operator(:) string(\\measuredangle{})
+comment(#BET SYMBOL)
+comment(#requires amssymb)
+key<delimiter(")content(8502)delimiter(")>operator(:) string(\\beth{})
+comment(#REVERSED PRIME)
+comment(#requires amssymb)
+key<delimiter(")content(8245)delimiter(")>operator(:) string(^\\backprime)
+comment(#COMPLEMENT)
+comment(#requires amssymb)
+key<delimiter(")content(8705)delimiter(")>operator(:) string(\\complement{})
+comment(#DALET SYMBOL)
+comment(#requires amssymb)
+key<delimiter(")content(8504)delimiter(")>operator(:) string(\\daleth{})
+comment(#SCRIPT SMALL L)
+key<delimiter(")content(8467)delimiter(")>operator(:) string(\\ell{})
+comment(#EMPTY SET)
+key(empty)operator(:) string(\\emptyset{})
+comment(#EMPTY SET)
+key<delimiter(")content(8709)delimiter(")>operator(:) string(\\emptyset{})
+comment(#GIMEL SYMBOL)
+comment(#requires amssymb)
+key<delimiter(")content(8503)delimiter(")>operator(:) string(\\gimel{})
+comment(#BLACK-LETTER CAPITAL I)
+key(image)operator(:) string(\\Im{})
+comment(#BLACK-LETTER CAPITAL I)
+key<delimiter(")content(8465)delimiter(")>operator(:) string(\\Im{})
+comment(#THERE DOES NOT EXIST)
+comment(#requires amssymb)
+key<delimiter(")content(8708)delimiter(")>operator(:) string(\\nexists{})
+comment(#CIRCLED LATIN CAPITAL LETTER S)
+comment(#requires amssymb)
+key<delimiter(")content(9416)delimiter(")>operator(:) string(\\textcircled{S})
+comment(#PLANCK CONSTANT OVER TWO PI)
+key<delimiter(")content(8463)delimiter(")>operator(:) string(\\hbar{})
+comment(#BLACK-LETTER CAPITAL R)
+key(real)operator(:) string(\\Re{})
+comment(#BLACK-LETTER CAPITAL R)
+key<delimiter(")content(8476)delimiter(")>operator(:) string(\\Re{})
+comment(#SMALL REVERSE SOLIDUS)
+comment(#requires amssymb)
+key<delimiter(")content(65128)delimiter(")>operator(:) string(\\smallsetminus{})
+comment(#SCRIPT CAPITAL P)
+key(weierp)operator(:) string(\\wp{})
+comment(#SCRIPT CAPITAL P)
+key<delimiter(")content(8472)delimiter(")>operator(:) string(\\wp{})
+comment(#N-ARY COPRODUCT)
+key<delimiter(")content(8720)delimiter(")>operator(:) string(\\amalg{})
+comment(#PERSPECTIVE)
+comment(#requires amssymb)
+key<delimiter(")content(8966)delimiter(")>operator(:) string(\\doublebarwedge{})
+comment(#NAND)
+comment(#requires amssymb)
+key<delimiter(")content(8892)delimiter(")>operator(:) string(\\barwedge{})
+comment(#DOUBLE INTERSECTION)
+comment(#requires amssymb)
+key<delimiter(")content(8914)delimiter(")>operator(:) string(\\Cap{})
+comment(#DOUBLE UNION)
+comment(#requires amssymb)
+key<delimiter(")content(8915)delimiter(")>operator(:) string(\\Cup{})
+comment(#CURLY LOGICAL OR)
+comment(#requires amssymb)
+key<delimiter(")content(8910)delimiter(")>operator(:) string(\\curlyvee{})
+comment(#CURLY LOGICAL AND)
+comment(#requires amssymb)
+key<delimiter(")content(8911)delimiter(")>operator(:) string(\\curlywedge{})
+comment(#DIAMOND OPERATOR)
+key<delimiter(")content(8900)delimiter(")>operator(:) string(\\diamond{})
+comment(#DIVISION TIMES)
+comment(#requires amssymb)
+key<delimiter(")content(8903)delimiter(")>operator(:) string(\\divideontimes{})
+comment(#INTERCALATE)
+comment(#requires amssymb)
+key<delimiter(")content(8890)delimiter(")>operator(:) string(\\intercal{})
+comment(#LEFT SEMIDIRECT PRODUCT)
+comment(#requires amssymb)
+key<delimiter(")content(8907)delimiter(")>operator(:) string(\\leftthreetimes{})
+comment(#LEFT NORMAL FACTOR SEMIDIRECT PRODUCT)
+comment(#requires amssymb)
+key<delimiter(")content(8905)delimiter(")>operator(:) string(\\ltimes{})
+comment(#SQUARED MINUS)
+comment(#requires amssymb)
+key<delimiter(")content(8863)delimiter(")>operator(:) string(\\boxminus{})
+comment(#CIRCLED ASTERISK OPERATOR)
+comment(#requires amssymb)
+key<delimiter(")content(8859)delimiter(")>operator(:) string(\\circledast{})
+comment(#CIRCLED RING OPERATOR)
+comment(#requires amssymb)
+key<delimiter(")content(8858)delimiter(")>operator(:) string(\\circledcirc{})
+comment(#CIRCLED DASH)
+comment(#requires amssymb)
+key<delimiter(")content(8861)delimiter(")>operator(:) string(\\circleddash{})
+comment(#CIRCLED DOT OPERATOR)
+key<delimiter(")content(8857)delimiter(")>operator(:) string(\\odot{})
+comment(#CIRCLED MINUS)
+key<delimiter(")content(8854)delimiter(")>operator(:) string(\\ominus{})
+comment(#CIRCLED PLUS)
+key(oplus)operator(:) string(\\oplus{})
+comment(#CIRCLED PLUS)
+key<delimiter(")content(8853)delimiter(")>operator(:) string(\\oplus{})
+comment(#CIRCLED DIVISION SLASH)
+key<delimiter(")content(8856)delimiter(")>operator(:) string(\\oslash{})
+comment(#CIRCLED TIMES)
+key(otimes)operator(:) string(\\otimes{})
+comment(#CIRCLED TIMES)
+key<delimiter(")content(8855)delimiter(")>operator(:) string(\\otimes{})
+comment(#SQUARED PLUS)
+comment(#requires amssymb)
+key<delimiter(")content(8862)delimiter(")>operator(:) string(\\boxplus{})
+comment(#DOT PLUS)
+comment(#requires amssymb)
+key<delimiter(")content(8724)delimiter(")>operator(:) string(\\dotplus{})
+comment(#RIGHT SEMIDIRECT PRODUCT)
+comment(#requires amssymb)
+key<delimiter(")content(8908)delimiter(")>operator(:) string(\\rightthreetimes{})
+comment(#RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT)
+comment(#requires amssymb)
+key<delimiter(")content(8906)delimiter(")>operator(:) string(\\rtimes{})
+comment(#DOT OPERATOR)
+key(sdot)operator(:) string(\\cdot{})
+comment(#DOT OPERATOR)
+key<delimiter(")content(8901)delimiter(")>operator(:) string(\\cdot{})
+comment(#SQUARED DOT OPERATOR)
+comment(#requires amssymb)
+key<delimiter(")content(8865)delimiter(")>operator(:) string(\\boxdot{})
+comment(#SET MINUS)
+key<delimiter(")content(8726)delimiter(")>operator(:) string(\\setminus{})
+comment(#SQUARE CAP)
+key<delimiter(")content(8851)delimiter(")>operator(:) string(\\sqcap{})
+comment(#SQUARE CUP)
+key<delimiter(")content(8852)delimiter(")>operator(:) string(\\sqcup{})
+comment(#STAR OPERATOR)
+key<delimiter(")content(8902)delimiter(")>operator(:) string(\\star{})
+comment(#SQUARED TIMES)
+comment(#requires amssymb)
+key<delimiter(")content(8864)delimiter(")>operator(:) string(\\boxtimes{})
+comment(#DOWN TACK)
+key<delimiter(")content(8868)delimiter(")>operator(:) string(\\top{})
+comment(#MULTISET UNION)
+key<delimiter(")content(8846)delimiter(")>operator(:) string(\\uplus{})
+comment(#WREATH PRODUCT)
+key<delimiter(")content(8768)delimiter(")>operator(:) string(\\wr{})
+comment(#LARGE CIRCLE)
+comment(#requires textcomp)
+key<delimiter(")content(9711)delimiter(")>operator(:) string(\\textbigcircle{})
+comment(#WHITE DOWN-POINTING TRIANGLE)
+key<delimiter(")content(9661)delimiter(")>operator(:) string(\\bigtriangledown{})
+comment(#WHITE UP-POINTING TRIANGLE)
+key<delimiter(")content(9651)delimiter(")>operator(:) string(\\bigtriangleup{})
+comment(#N-ARY COPRODUCT)
+key<delimiter(")content(8720)delimiter(")>operator(:) string(\\coprod{})
+comment(#N-ARY PRODUCT)
+key(prod)operator(:) string(\\prod{})
+comment(#N-ARY PRODUCT)
+key<delimiter(")content(8719)delimiter(")>operator(:) string(\\prod{})
+comment(#N-ARY SUMMATION)
+key(sum)operator(:) string(\\sum{})
+comment(#N-ARY SUMMATION)
+key<delimiter(")content(8721)delimiter(")>operator(:) string(\\sum{})
+comment(#ALMOST EQUAL OR EQUAL TO)
+comment(#requires amssymb)
+key<delimiter(")content(8778)delimiter(")>operator(:) string(\\approxeq{})
+comment(#EQUIVALENT TO)
+key(asymp)operator(:) string(\\asymp{})
+comment(#EQUIVALENT TO)
+key<delimiter(")content(8781)delimiter(")>operator(:) string(\\asymp{})
+comment(#ALL EQUAL TO)
+comment(#requires amssymb)
+key<delimiter(")content(8780)delimiter(")>operator(:) string(\\backcong{})
+comment(#SMALL CONTAINS AS MEMBER)
+comment(#requires amssymb)
+key<delimiter(")content(8717)delimiter(")>operator(:) string(\\backepsilon{})
+comment(#BOWTIE)
+key<delimiter(")content(8904)delimiter(")>operator(:) string(\\bowtie{})
+comment(#REVERSED TILDE)
+comment(#requires amssymb)
+key<delimiter(")content(8765)delimiter(")>operator(:) string(\\backsim{})
+comment(#REVERSED TILDE EQUALS)
+comment(#requires amssymb)
+key<delimiter(")content(8909)delimiter(")>operator(:) string(\\backsimeq{})
+comment(#GEOMETRICALLY EQUIVALENT TO)
+comment(#requires amssymb)
+key<delimiter(")content(8782)delimiter(")>operator(:) string(\\Bumpeq{})
+comment(#DIFFERENCE BETWEEN)
+comment(#requires amssymb)
+key<delimiter(")content(8783)delimiter(")>operator(:) string(\\bumpeq{})
+comment(#RING EQUAL TO)
+comment(#requires amssymb)
+key<delimiter(")content(8791)delimiter(")>operator(:) string(\\circeq{})
+comment(#COLON EQUALS)
+key<delimiter(")content(8788)delimiter(")>operator(:) string(":=")
+comment(#EQUAL TO OR PRECEDES)
+comment(#requires amssymb)
+key<delimiter(")content(8926)delimiter(")>operator(:) string(\\curlyeqprec{})
+comment(#EQUAL TO OR SUCCEEDS)
+comment(#requires amssymb)
+key<delimiter(")content(8927)delimiter(")>operator(:) string(\\curlyeqsucc{})
+comment(#PRECEDES OR EQUAL TO)
+comment(#requires amssymb)
+key<delimiter(")content(8828)delimiter(")>operator(:) string(\\preccurlyeq{})
+comment(#LEFT TACK)
+key<delimiter(")content(8867)delimiter(")>operator(:) string(\\dashv{})
+comment(#RING IN EQUAL TO)
+comment(#requires amssymb)
+key<delimiter(")content(8790)delimiter(")>operator(:) string(\\eqcirc{})
+comment(#EQUALS COLON)
+key<delimiter(")content(8789)delimiter(")>operator(:) string("=:")
+comment(#GEOMETRICALLY EQUAL TO)
+comment(#requires amssymb)
+key<delimiter(")content(8785)delimiter(")>operator(:) string(\\doteqdot{})
+comment(#APPROACHES THE LIMIT)
+key<delimiter(")content(8784)delimiter(")>operator(:) string(\\doteq{})
+comment(#APPROXIMATELY EQUAL TO OR THE IMAGE OF)
+comment(#requires amssymb)
+key<delimiter(")content(8786)delimiter(")>operator(:) string(\\fallingdotseq{})
+comment(#EQUAL TO OR GREATER-THAN)
+comment(#requires amssymb)
+key<delimiter(")content(8925)delimiter(")>operator(:) string(\\eqslantgtr{})
+comment(#EQUAL TO OR LESS-THAN)
+comment(#requires amssymb)
+key<delimiter(")content(8924)delimiter(")>operator(:) string(\\eqslantless{})
+comment(#IMAGE OF OR APPROXIMATELY EQUAL TO)
+comment(#requires amssymb)
+key<delimiter(")content(8787)delimiter(")>operator(:) string(\\risingdotseq{})
+comment(#PITCHFORK)
+comment(#requires amssymb)
+key<delimiter(")content(8916)delimiter(")>operator(:) string(\\pitchfork{})
+comment(#FROWN)
+key<delimiter(")content(8994)delimiter(")>operator(:) string(\\frown{})
+comment(#GREATER-THAN WITH DOT)
+comment(#requires amssymb)
+key<delimiter(")content(8919)delimiter(")>operator(:) string(\\gtrdot{})
+comment(#GREATER-THAN OVER EQUAL TO)
+comment(#requires amssymb)
+key<delimiter(")content(8807)delimiter(")>operator(:) string(\\geqq{})
+comment(#GREATER-THAN EQUAL TO OR LESS-THAN)
+comment(#requires amssymb)
+key<delimiter(")content(8923)delimiter(")>operator(:) string(\\gtreqless{})
+comment(#GREATER-THAN EQUAL TO OR LESS-THAN)
+comment(#requires amssymb)
+key<delimiter(")content(8923)delimiter(")>operator(:) string(\\gtreqqless{})
+comment(#VERY MUCH GREATER-THAN)
+comment(#requires amssymb)
+key<delimiter(")content(8921)delimiter(")>operator(:) string(\\ggg{})
+comment(#GREATER-THAN OR LESS-THAN)
+comment(#requires amssymb)
+key<delimiter(")content(8823)delimiter(")>operator(:) string(\\gtrless{})
+comment(#GREATER-THAN OR EQUIVALENT TO)
+comment(#requires amssymb)
+key<delimiter(")content(8819)delimiter(")>operator(:) string(\\gtrsim{})
+comment(#MUCH GREATER-THAN)
+key<delimiter(")content(8811)delimiter(")>operator(:) string(\\gg{})
+comment(#LESS-THAN WITH DOT)
+comment(#requires amssymb)
+key<delimiter(")content(8918)delimiter(")>operator(:) string(\\lessdot{})
+comment(#LESS-THAN OVER EQUAL TO)
+comment(#requires amssymb)
+key<delimiter(")content(8806)delimiter(")>operator(:) string(\\leqq{})
+comment(#LESS-THAN EQUAL TO OR GREATER-THAN)
+comment(#requires amssymb)
+key<delimiter(")content(8922)delimiter(")>operator(:) string(\\lesseqqgtr{})
+comment(#LESS-THAN EQUAL TO OR GREATER-THAN)
+comment(#requires amssymb)
+key<delimiter(")content(8922)delimiter(")>operator(:) string(\\lesseqgtr{})
+comment(#LESS-THAN OR GREATER-THAN)
+comment(#requires amssymb)
+key<delimiter(")content(8822)delimiter(")>operator(:) string(\\lessgtr{})
+comment(#VERY MUCH LESS-THAN)
+comment(#requires amssymb)
+key<delimiter(")content(8920)delimiter(")>operator(:) string(\\lll{})
+comment(#LESS-THAN OR EQUIVALENT TO)
+comment(#requires amssymb)
+key<delimiter(")content(8818)delimiter(")>operator(:) string(\\lesssim{})
+comment(#MUCH LESS-THAN)
+key<delimiter(")content(8810)delimiter(")>operator(:) string(\\ll{})
+comment(#NORMAL SUBGROUP OF OR EQUAL TO)
+comment(#requires amssymb)
+key<delimiter(")content(8884)delimiter(")>operator(:) string(\\trianglelefteq{})
+comment(#DIVIDES)
+key<delimiter(")content(8739)delimiter(")>operator(:) string(\\mid{})
+comment(#MODELS)
+key<delimiter(")content(8871)delimiter(")>operator(:) string(\\models{})
+comment(#PRECEDES)
+key<delimiter(")content(8826)delimiter(")>operator(:) string(\\prec{})
+comment(#PRECEDES OR EQUAL TO)
+key<delimiter(")content(8828)delimiter(")>operator(:) string(\\preceq{})
+comment(#PRECEDES OR EQUIVALENT TO)
+comment(#requires amssymb)
+key<delimiter(")content(8830)delimiter(")>operator(:) string(\\precsim{})
+comment(#CONTAINS AS NORMAL SUBGROUP OR EQUAL TO)
+comment(#requires amssymb)
+key<delimiter(")content(8885)delimiter(")>operator(:) string(\\trianglerighteq{})
+comment(#SUCCEEDS)
+key<delimiter(")content(8827)delimiter(")>operator(:) string(\\succ{})
+comment(#SUCCEEDS OR EQUAL TO)
+comment(#requires amssymb)
+key<delimiter(")content(8829)delimiter(")>operator(:) string(\\succcurlyeq{})
+comment(#SUCCEEDS OR EQUAL TO)
+key<delimiter(")content(8829)delimiter(")>operator(:) string(\\succeq{})
+comment(#SUCCEEDS OR EQUIVALENT TO)
+comment(#requires amssymb)
+key<delimiter(")content(8831)delimiter(")>operator(:) string(\\succsim{})
+comment(#SMILE)
+key<delimiter(")content(8995)delimiter(")>operator(:) string(\\smile{})
+comment(#SQUARE IMAGE OF)
+comment(#requires amssymb)
+key<delimiter(")content(8847)delimiter(")>operator(:) string(\\sqsubset{})
+comment(#SQUARE IMAGE OF OR EQUAL TO)
+key<delimiter(")content(8849)delimiter(")>operator(:) string(\\sqsubseteq{})
+comment(#SQUARE ORIGINAL OF)
+comment(#requires amssymb)
+key<delimiter(")content(8848)delimiter(")>operator(:) string(\\sqsupset{})
+comment(#SQUARE ORIGINAL OF OR EQUAL TO)
+key<delimiter(")content(8850)delimiter(")>operator(:) string(\\sqsupseteq{})
+comment(#DOUBLE SUBSET)
+comment(#requires amssymb)
+key<delimiter(")content(8912)delimiter(")>operator(:) string(\\Subset{})
+comment(#SUBSET OF OR EQUAL TO)
+comment(#requires amssymb)
+key<delimiter(")content(8838)delimiter(")>operator(:) string(\\subseteqq{})
+comment(#DOUBLE SUPERSET)
+comment(#requires amssymb)
+key<delimiter(")content(8913)delimiter(")>operator(:) string(\\Supset{})
+comment(#SUPERSET OF OR EQUAL TO)
+comment(#requires amssymb)
+key<delimiter(")content(8839)delimiter(")>operator(:) string(\\supseteqq{})
+comment(#DELTA EQUAL TO)
+comment(#requires amssymb)
+key<delimiter(")content(8796)delimiter(")>operator(:) string(\\triangleq{})
+comment(#BETWEEN)
+comment(#requires amssymb)
+key<delimiter(")content(8812)delimiter(")>operator(:) string(\\between{})
+comment(#RIGHT TACK)
+key<delimiter(")content(8866)delimiter(")>operator(:) string(\\vdash{})
+comment(#FORCES)
+comment(#requires amssymb)
+key<delimiter(")content(8873)delimiter(")>operator(:) string(\\Vdash{})
+comment(#TRUE)
+comment(#requires amssymb)
+key<delimiter(")content(8872)delimiter(")>operator(:) string(\\vDash{})
+comment(#XOR)
+comment(#requires amssymb)
+key<delimiter(")content(8891)delimiter(")>operator(:) string(\\veebar{})
+comment(#NORMAL SUBGROUP OF)
+comment(#requires amssymb)
+key<delimiter(")content(8882)delimiter(")>operator(:) string(\\vartriangleleft{})
+comment(#PROPORTIONAL TO)
+comment(#requires amssymb)
+key<delimiter(")content(8733)delimiter(")>operator(:) string(\\varpropto{})
+comment(#CONTAINS AS NORMAL SUBGROUP)
+comment(#requires amssymb)
+key<delimiter(")content(8883)delimiter(")>operator(:) string(\\vartriangleright{})
+comment(#TRIPLE VERTICAL BAR RIGHT TURNSTILE)
+comment(#requires amssymb)
+key<delimiter(")content(8874)delimiter(")>operator(:) string(\\Vvdash{})
+comment(#GREATER-THAN BUT NOT EQUAL TO)
+comment(#requires amssymb)
+key<delimiter(")content(8809)delimiter(")>operator(:) string(\\gneq{})
+comment(#GREATER-THAN BUT NOT EQUAL TO)
+comment(#requires amssymb)
+key<delimiter(")content(8809)delimiter(")>operator(:) string(\\gneqq{})
+comment(#GREATER-THAN BUT NOT EQUIVALENT TO)
+comment(#requires amssymb)
+key<delimiter(")content(8935)delimiter(")>operator(:) string(\\gnsim{})
+comment(#GREATER-THAN BUT NOT EQUAL TO)
+comment(#requires amssymb)
+key<delimiter(")content(8809)delimiter(")>operator(:) string(\\gvertneqq{})
+comment(#LESS-THAN BUT NOT EQUAL TO)
+comment(#requires amssymb)
+key<delimiter(")content(8808)delimiter(")>operator(:) string(\\lneqq{})
+comment(#LESS-THAN BUT NOT EQUAL TO)
+comment(#requires amssymb)
+key<delimiter(")content(8808)delimiter(")>operator(:) string(\\lneq{})
+comment(#LESS-THAN BUT NOT EQUIVALENT TO)
+comment(#requires amssymb)
+key<delimiter(")content(8934)delimiter(")>operator(:) string(\\lnsim{})
+comment(#LESS-THAN BUT NOT EQUAL TO)
+comment(#requires amssymb)
+key<delimiter(")content(8808)delimiter(")>operator(:) string(\\lvertneqq{})
+comment(#NOT ALMOST EQUAL TO)
+key<delimiter(")content(8777)delimiter(")>operator(:) string(\\not\\approx{})
+comment(#NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO)
+comment(#requires amssymb)
+key<delimiter(")content(8775)delimiter(")>operator(:) string(\\not\\cong{})
+comment(#NOT IDENTICAL TO)
+key<delimiter(")content(8802)delimiter(")>operator(:) string(\\not\\equiv{})
+comment(#NEITHER GREATER-THAN NOR EQUAL TO)
+comment(#requires amssymb)
+key<delimiter(")content(8817)delimiter(")>operator(:) string(\\not\\geq{})
+comment(#NEITHER GREATER-THAN NOR EQUAL TO)
+comment(#requires amssymb)
+key<delimiter(")content(8817)delimiter(")>operator(:) string(\\ngeqslant{})
+comment(#NOT GREATER-THAN)
+comment(#requires amssymb)
+key<delimiter(")content(8815)delimiter(")>operator(:) string(\\not>)
+comment(#NEITHER LESS-THAN NOR EQUAL TO)
+comment(#requires amssymb)
+key<delimiter(")content(8816)delimiter(")>operator(:) string(\\not\\leq{})
+comment(#NEITHER LESS-THAN NOR EQUAL TO)
+comment(#requires amssymb)
+key<delimiter(")content(8816)delimiter(")>operator(:) string(\\nleqslant{})
+comment(#NOT LESS-THAN)
+comment(#requires amssymb)
+key<delimiter(")content(8814)delimiter(")>operator(:) string(\\not<)
+comment(#NOT NORMAL SUBGROUP OF)
+comment(#requires amssymb)
+key<delimiter(")content(8938)delimiter(")>operator(:) string(\\ntriangleleft{})
+comment(#NOT NORMAL SUBGROUP OF OR EQUAL TO)
+comment(#requires amssymb)
+key<delimiter(")content(8940)delimiter(")>operator(:) string(\\ntrianglelefteq{})
+comment(#DOES NOT DIVIDE)
+comment(#requires amssymb)
+key<delimiter(")content(8740)delimiter(")>operator(:) string(\\nmid{})
+comment(#NOT PARALLEL TO)
+comment(#requires amssymb)
+key<delimiter(")content(8742)delimiter(")>operator(:) string(\\nparallel{})
+comment(#DOES NOT PRECEDE)
+comment(#requires amssymb)
+key<delimiter(")content(8832)delimiter(")>operator(:) string(\\not\\prec{})
+comment(#DOES NOT PRECEDE OR EQUAL)
+comment(#requires amssymb)
+key<delimiter(")content(8928)delimiter(")>operator(:) string(\\not\\preceq{})
+comment(#DOES NOT CONTAIN AS NORMAL SUBGROUP)
+comment(#requires amssymb)
+key<delimiter(")content(8939)delimiter(")>operator(:) string(\\ntriangleright{})
+comment(#DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL)
+comment(#requires amssymb)
+key<delimiter(")content(8941)delimiter(")>operator(:) string(\\ntrianglerighteq{})
+comment(#DOES NOT SUCCEED)
+comment(#requires amssymb)
+key<delimiter(")content(8833)delimiter(")>operator(:) string(\\not\\succ{})
+comment(#DOES NOT SUCCEED OR EQUAL)
+comment(#requires amssymb)
+key<delimiter(")content(8929)delimiter(")>operator(:) string(\\not\\succeq{})
+comment(#NOT TILDE)
+comment(#requires amssymb)
+key<delimiter(")content(8769)delimiter(")>operator(:) string(\\not\\sim{})
+comment(#NOT ASYMPTOTICALLY EQUAL TO)
+key<delimiter(")content(8772)delimiter(")>operator(:) string(\\not\\simeq{})
+comment(#NOT A SUBSET OF)
+key(nsub)operator(:) string(\\not\\subset{})
+comment(#NOT A SUBSET OF)
+key<delimiter(")content(8836)delimiter(")>operator(:) string(\\not\\subset{})
+comment(#NEITHER A SUBSET OF NOR EQUAL TO)
+comment(#requires amssymb)
+key<delimiter(")content(8840)delimiter(")>operator(:) string(\\not\\subseteq{})
+comment(#NEITHER A SUBSET OF NOR EQUAL TO)
+comment(#requires amssymb)
+key<delimiter(")content(8840)delimiter(")>operator(:) string(\\nsubseteqq{})
+comment(#NOT A SUPERSET OF)
+key<delimiter(")content(8837)delimiter(")>operator(:) string(\\not\\supset{})
+comment(#NEITHER A SUPERSET OF NOR EQUAL TO)
+comment(#requires amssymb)
+key<delimiter(")content(8841)delimiter(")>operator(:) string(\\nsupseteqq{})
+comment(#NEITHER A SUPERSET OF NOR EQUAL TO)
+comment(#requires amssymb)
+key<delimiter(")content(8841)delimiter(")>operator(:) string(\\not\\supseteq{})
+comment(#DOES NOT PROVE)
+comment(#requires amssymb)
+key<delimiter(")content(8876)delimiter(")>operator(:) string(\\nvdash{})
+comment(#NOT TRUE)
+comment(#requires amssymb)
+key<delimiter(")content(8877)delimiter(")>operator(:) string(\\nvDash{})
+comment(#NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE)
+comment(#requires amssymb)
+key<delimiter(")content(8879)delimiter(")>operator(:) string(\\nVDash{})
+comment(#DOES NOT FORCE)
+comment(#requires amssymb)
+key<delimiter(")content(8878)delimiter(")>operator(:) string(\\nVdash{})
+comment(#PRECEDES BUT NOT EQUIVALENT TO)
+comment(#requires amssymb)
+key<delimiter(")content(8936)delimiter(")>operator(:) string(\\precnsim{})
+comment(#SUCCEEDS BUT NOT EQUIVALENT TO)
+comment(#requires amssymb)
+key<delimiter(")content(8937)delimiter(")>operator(:) string(\\succnsim{})
+comment(#TRUE)
+comment(#requires amssymb)
+key<delimiter(")content(8842)delimiter(")>operator(:) string(\\subsetneq{})
+comment(#TRUE)
+comment(#requires amssymb)
+key<delimiter(")content(8842)delimiter(")>operator(:) string(\\subsetneqq{})
+comment(#SUPERSET OF WITH NOT EQUAL TO)
+comment(#requires amssymb)
+key<delimiter(")content(8843)delimiter(")>operator(:) string(\\supsetneq{})
+comment(#SUPERSET OF WITH NOT EQUAL TO)
+comment(#requires amssymb)
+key<delimiter(")content(8843)delimiter(")>operator(:) string(\\supsetneqq{})
+comment(#ANTICLOCKWISE TOP SEMICIRCLE ARROW)
+comment(#requires amssymb)
+key<delimiter(")content(8630)delimiter(")>operator(:) string(\\curvearrowleft{})
+comment(#CLOCKWISE TOP SEMICIRCLE ARROW)
+comment(#requires amssymb)
+key<delimiter(")content(8631)delimiter(")>operator(:) string(\\curvearrowright{})
+comment(#DOWNWARDS DOUBLE ARROW)
+key(dArr)operator(:) string(\\Downarrow{})
+comment(#DOWNWARDS DOUBLE ARROW)
+key<delimiter(")content(8659)delimiter(")>operator(:) string(\\Downarrow{})
+comment(#DOWNWARDS PAIRED ARROWS)
+comment(#requires amssymb)
+key<delimiter(")content(8650)delimiter(")>operator(:) string(\\downdownarrows{})
+comment(#DOWNWARDS HARPOON WITH BARB LEFTWARDS)
+comment(#requires amssymb)
+key<delimiter(")content(8643)delimiter(")>operator(:) string(\\downharpoonleft{})
+comment(#DOWNWARDS HARPOON WITH BARB RIGHTWARDS)
+comment(#requires amssymb)
+key<delimiter(")content(8642)delimiter(")>operator(:) string(\\downharpoonright{})
+comment(#LEFTWARDS TRIPLE ARROW)
+comment(#requires amssymb)
+key<delimiter(")content(8666)delimiter(")>operator(:) string(\\Lleftarrow{})
+comment(#LEFTWARDS TWO HEADED ARROW)
+comment(#requires amssymb)
+key<delimiter(")content(8606)delimiter(")>operator(:) string(\\twoheadleftarrow{})
+comment(#LEFTWARDS PAIRED ARROWS)
+comment(#requires amssymb)
+key<delimiter(")content(8647)delimiter(")>operator(:) string(\\leftleftarrows{})
+comment(#LEFTWARDS ARROW WITH HOOK)
+key<delimiter(")content(8617)delimiter(")>operator(:) string(\\hookleftarrow{})
+comment(#LEFTWARDS ARROW WITH LOOP)
+comment(#requires amssymb)
+key<delimiter(")content(8619)delimiter(")>operator(:) string(\\looparrowleft{})
+comment(#LEFTWARDS ARROW WITH TAIL)
+comment(#requires amssymb)
+key<delimiter(")content(8610)delimiter(")>operator(:) string(\\leftarrowtail{})
+comment(#LEFTWARDS HARPOON WITH BARB DOWNWARDS)
+key<delimiter(")content(8637)delimiter(")>operator(:) string(\\leftharpoondown{})
+comment(#LEFTWARDS HARPOON WITH BARB UPWARDS)
+key<delimiter(")content(8636)delimiter(")>operator(:) string(\\leftharpoonup{})
+comment(#LEFT RIGHT DOUBLE ARROW)
+key(hArr)operator(:) string(\\Leftrightarrow{})
+comment(#LEFT RIGHT DOUBLE ARROW)
+key<delimiter(")content(8660)delimiter(")>operator(:) string(\\Leftrightarrow{})
+comment(#LEFT RIGHT ARROW)
+key(harr)operator(:) string(\\leftrightarrow{})
+comment(#LEFT RIGHT ARROW)
+key<delimiter(")content(8596)delimiter(")>operator(:) string(\\leftrightarrow{})
+comment(#LEFTWARDS ARROW OVER RIGHTWARDS ARROW)
+comment(#requires amssymb)
+key<delimiter(")content(8646)delimiter(")>operator(:) string(\\leftrightarrows{})
+comment(#RIGHTWARDS ARROW OVER LEFTWARDS ARROW)
+comment(#requires amssymb)
+key<delimiter(")content(8644)delimiter(")>operator(:) string(\\rightleftarrows{})
+comment(#LEFT RIGHT WAVE ARROW)
+comment(#requires amssymb)
+key<delimiter(")content(8621)delimiter(")>operator(:) string(\\leftrightsquigarrow{})
+comment(#RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON)
+key<delimiter(")content(8652)delimiter(")>operator(:) string(\\rightleftharpoons{})
+comment(#LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON)
+comment(#requires amssymb)
+key<delimiter(")content(8651)delimiter(")>operator(:) string(\\leftrightharpoons{})
+comment(#UPWARDS ARROW WITH TIP LEFTWARDS)
+comment(#requires amssymb)
+key<delimiter(")content(8624)delimiter(")>operator(:) string(\\Lsh{})
+comment(#RIGHTWARDS ARROW FROM BAR)
+key<delimiter(")content(8614)delimiter(")>operator(:) string(\\mapsto{})
+comment(#MULTIMAP)
+comment(#requires amssymb)
+key<delimiter(")content(8888)delimiter(")>operator(:) string(\\multimap{})
+comment(#NORTH EAST ARROW)
+key<delimiter(")content(8599)delimiter(")>operator(:) string(\\nearrow{})
+comment(#LEFTWARDS DOUBLE ARROW WITH STROKE)
+comment(#requires amssymb)
+key<delimiter(")content(8653)delimiter(")>operator(:) string(\\nLeftarrow{})
+comment(#LEFTWARDS ARROW WITH STROKE)
+comment(#requires amssymb)
+key<delimiter(")content(8602)delimiter(")>operator(:) string(\\nleftarrow{})
+comment(#LEFT RIGHT DOUBLE ARROW WITH STROKE)
+comment(#requires amssymb)
+key<delimiter(")content(8654)delimiter(")>operator(:) string(\\nLeftrightarrow{})
+comment(#LEFT RIGHT ARROW WITH STROKE)
+comment(#requires amssymb)
+key<delimiter(")content(8622)delimiter(")>operator(:) string(\\nleftrightarrow{})
+comment(#RIGHTWARDS ARROW WITH STROKE)
+comment(#requires amssymb)
+key<delimiter(")content(8603)delimiter(")>operator(:) string(\\nrightarrow{})
+comment(#RIGHTWARDS DOUBLE ARROW WITH STROKE)
+comment(#requires amssymb)
+key<delimiter(")content(8655)delimiter(")>operator(:) string(\\nRightarrow{})
+comment(#NORTH WEST ARROW)
+key<delimiter(")content(8598)delimiter(")>operator(:) string(\\nwarrow{})
+comment(#ANTICLOCKWISE OPEN CIRCLE ARROW)
+comment(#requires amssymb)
+key<delimiter(")content(8634)delimiter(")>operator(:) string(\\circlearrowleft{})
+comment(#CLOCKWISE OPEN CIRCLE ARROW)
+comment(#requires amssymb)
+key<delimiter(")content(8635)delimiter(")>operator(:) string(\\circlearrowright{})
+comment(#RIGHTWARDS TRIPLE ARROW)
+comment(#requires amssymb)
+key<delimiter(")content(8667)delimiter(")>operator(:) string(\\Rrightarrow{})
+comment(#RIGHTWARDS TWO HEADED ARROW)
+comment(#requires amssymb)
+key<delimiter(")content(8608)delimiter(")>operator(:) string(\\twoheadrightarrow{})
+comment(#RIGHTWARDS PAIRED ARROWS)
+comment(#requires amssymb)
+key<delimiter(")content(8649)delimiter(")>operator(:) string(\\rightrightarrows{})
+comment(#RIGHTWARDS ARROW WITH HOOK)
+key<delimiter(")content(8618)delimiter(")>operator(:) string(\\hookrightarrow{})
+comment(#RIGHTWARDS ARROW WITH LOOP)
+comment(#requires amssymb)
+key<delimiter(")content(8620)delimiter(")>operator(:) string(\\looparrowright{})
+comment(#RIGHTWARDS ARROW WITH TAIL)
+comment(#requires amssymb)
+key<delimiter(")content(8611)delimiter(")>operator(:) string(\\rightarrowtail{})
+comment(#RIGHTWARDS SQUIGGLE ARROW)
+comment(#requires amssymb)
+key<delimiter(")content(8669)delimiter(")>operator(:) string(\\rightsquigarrow{})
+comment(#RIGHTWARDS HARPOON WITH BARB DOWNWARDS)
+key<delimiter(")content(8641)delimiter(")>operator(:) string(\\rightharpoondown{})
+comment(#RIGHTWARDS HARPOON WITH BARB UPWARDS)
+key<delimiter(")content(8640)delimiter(")>operator(:) string(\\rightharpoonup{})
+comment(#UPWARDS ARROW WITH TIP RIGHTWARDS)
+comment(#requires amssymb)
+key<delimiter(")content(8625)delimiter(")>operator(:) string(\\Rsh{})
+comment(#SOUTH EAST ARROW)
+key<delimiter(")content(8600)delimiter(")>operator(:) string(\\searrow{})
+comment(#SOUTH WEST ARROW)
+key<delimiter(")content(8601)delimiter(")>operator(:) string(\\swarrow{})
+comment(#UPWARDS DOUBLE ARROW)
+key(uArr)operator(:) string(\\Uparrow{})
+comment(#UPWARDS DOUBLE ARROW)
+key<delimiter(")content(8657)delimiter(")>operator(:) string(\\Uparrow{})
+comment(#UPWARDS PAIRED ARROWS)
+comment(#requires amssymb)
+key<delimiter(")content(8648)delimiter(")>operator(:) string(\\upuparrows{})
+comment(#UP DOWN DOUBLE ARROW)
+key<delimiter(")content(8661)delimiter(")>operator(:) string(\\Updownarrow{})
+comment(#UP DOWN ARROW)
+key<delimiter(")content(8597)delimiter(")>operator(:) string(\\updownarrow{})
+comment(#UPWARDS HARPOON WITH BARB LEFTWARDS)
+comment(#requires amssymb)
+key<delimiter(")content(8639)delimiter(")>operator(:) string(\\upharpoonleft{})
+comment(#UPWARDS HARPOON WITH BARB RIGHTWARDS)
+comment(#requires amssymb)
+key<delimiter(")content(8638)delimiter(")>operator(:) string(\\upharpoonright{})
+comment(#RIGHT CEILING)
+key(rceil)operator(:) string(\\rceil{})
+comment(#RIGHT CEILING)
+key<delimiter(")content(8969)delimiter(")>operator(:) string(\\rceil{})
+comment(#RIGHT FLOOR)
+key(rfloor)operator(:) string(\\rfloor{})
+comment(#RIGHT FLOOR)
+key<delimiter(")content(8971)delimiter(")>operator(:) string(\\rfloor{})
+comment(#TOP RIGHT CORNER)
+comment(#requires amsfonts)
+key<delimiter(")content(8989)delimiter(")>operator(:) string(\\urcorner{})
+comment(#BOTTOM RIGHT CORNER)
+comment(#requires amsfonts)
+key<delimiter(")content(8991)delimiter(")>operator(:) string(\\lrcorner{})
+comment(#LEFT CEILING)
+key(lceil)operator(:) string(\\lceil{})
+comment(#LEFT CEILING)
+key<delimiter(")content(8968)delimiter(")>operator(:) string(\\lceil{})
+comment(#LEFT FLOOR)
+key(lfloor)operator(:) string(\\lfloor{})
+comment(#LEFT FLOOR)
+key<delimiter(")content(8970)delimiter(")>operator(:) string(\\lfloor{})
+comment(#TOP LEFT CORNER)
+comment(#requires amsfonts)
+key<delimiter(")content(8988)delimiter(")>operator(:) string(\\ulcorner{})
+comment(#BOTTOM LEFT CORNER)
+comment(#requires amsfonts)
+key<delimiter(")content(8990)delimiter(")>operator(:) string(\\llcorner{})
+comment(#LATIN SMALL LETTER A WITH ACUTE)
+key(aacute)operator(:) string(\\'{a})
+comment(#LATIN SMALL LETTER A WITH ACUTE)
+key<delimiter(")content(225)delimiter(")>operator(:) string(\\'{a})
+comment(#LATIN CAPITAL LETTER A WITH ACUTE)
+key(Aacute)operator(:) string(\\'{A})
+comment(#LATIN CAPITAL LETTER A WITH ACUTE)
+key<delimiter(")content(193)delimiter(")>operator(:) string(\\'{A})
+comment(#LATIN SMALL LETTER A WITH CIRCUMFLEX)
+key(acirc)operator(:) string(\\^{a})
+comment(#LATIN SMALL LETTER A WITH CIRCUMFLEX)
+key<delimiter(")content(226)delimiter(")>operator(:) string(\\^{a})
+comment(#LATIN CAPITAL LETTER A WITH CIRCUMFLEX)
+key(Acirc)operator(:) string(\\^{A})
+comment(#LATIN CAPITAL LETTER A WITH CIRCUMFLEX)
+key<delimiter(")content(194)delimiter(")>operator(:) string(\\^{A})
+comment(#LATIN SMALL LETTER A WITH GRAVE)
+key(agrave)operator(:) string(\\`{a})
+comment(#LATIN SMALL LETTER A WITH GRAVE)
+key<delimiter(")content(224)delimiter(")>operator(:) string(\\`{a})
+comment(#LATIN CAPITAL LETTER A WITH GRAVE)
+key(Agrave)operator(:) string(\\`{A})
+comment(#LATIN CAPITAL LETTER A WITH GRAVE)
+key<delimiter(")content(192)delimiter(")>operator(:) string(\\`{A})
+comment(#LATIN SMALL LETTER A WITH RING ABOVE)
+key(aring)operator(:) string(\\aa{})
+comment(#LATIN SMALL LETTER A WITH RING ABOVE)
+key<delimiter(")content(229)delimiter(")>operator(:) string(\\aa{})
+comment(#LATIN CAPITAL LETTER A WITH RING ABOVE)
+key(Aring)operator(:) string(\\AA{})
+comment(#LATIN CAPITAL LETTER A WITH RING ABOVE)
+key<delimiter(")content(197)delimiter(")>operator(:) string(\\AA{})
+comment(#LATIN SMALL LETTER A WITH TILDE)
+key(atilde)operator(:) string(\\~{a})
+comment(#LATIN SMALL LETTER A WITH TILDE)
+key<delimiter(")content(227)delimiter(")>operator(:) string(\\~{a})
+comment(#LATIN CAPITAL LETTER A WITH TILDE)
+key(Atilde)operator(:) string(\\~{A})
+comment(#LATIN CAPITAL LETTER A WITH TILDE)
+key<delimiter(")content(195)delimiter(")>operator(:) string(\\~{A})
+comment(#LATIN SMALL LETTER A WITH DIAERESIS)
+key(auml)operator(:) string(\\"{a})
+comment(#LATIN SMALL LETTER A WITH DIAERESIS)
+key<delimiter(")content(228)delimiter(")>operator(:) string(\\"{a})
+comment(#LATIN CAPITAL LETTER A WITH DIAERESIS)
+key(Auml)operator(:) string(\\"{A})
+comment(#LATIN CAPITAL LETTER A WITH DIAERESIS)
+key<delimiter(")content(196)delimiter(")>operator(:) string(\\"{A})
+comment(#LATIN SMALL LETTER AE)
+key(aelig)operator(:) string(\\ae{})
+comment(#LATIN SMALL LETTER AE)
+key<delimiter(")content(230)delimiter(")>operator(:) string(\\ae{})
+comment(#LATIN CAPITAL LETTER AE)
+key(AElig)operator(:) string(\\AE{})
+comment(#LATIN CAPITAL LETTER AE)
+key<delimiter(")content(198)delimiter(")>operator(:) string(\\AE{})
+comment(#LATIN SMALL LETTER C WITH CEDILLA)
+key(ccedil)operator(:) string(\\c{c})
+comment(#LATIN SMALL LETTER C WITH CEDILLA)
+key<delimiter(")content(231)delimiter(")>operator(:) string(\\c{c})
+comment(#LATIN CAPITAL LETTER C WITH CEDILLA)
+key(Ccedil)operator(:) string(\\c{C})
+comment(#LATIN CAPITAL LETTER C WITH CEDILLA)
+key<delimiter(")content(199)delimiter(")>operator(:) string(\\c{C})
+comment(#LATIN SMALL LETTER ETH)
+comment(#requires amssymb)
+key(eth)operator(:) string(\\dh{})
+comment(#LATIN SMALL LETTER ETH)
+comment(#requires amssymb)
+key<delimiter(")content(240)delimiter(")>operator(:) string(\\dh{})
+comment(#LATIN CAPITAL LETTER ETH)
+comment(#requires wasysym)
+key(ETH)operator(:) string(\\DH{})
+comment(#LATIN CAPITAL LETTER ETH)
+comment(#requires wasysym)
+key<delimiter(")content(208)delimiter(")>operator(:) string(\\DH{})
+comment(#LATIN SMALL LETTER E WITH ACUTE)
+key(eacute)operator(:) string(\\'{e})
+comment(#LATIN SMALL LETTER E WITH ACUTE)
+key<delimiter(")content(233)delimiter(")>operator(:) string(\\'{e})
+comment(#LATIN CAPITAL LETTER E WITH ACUTE)
+key(Eacute)operator(:) string(\\'{E})
+comment(#LATIN CAPITAL LETTER E WITH ACUTE)
+key<delimiter(")content(201)delimiter(")>operator(:) string(\\'{E})
+comment(#LATIN SMALL LETTER E WITH CIRCUMFLEX)
+key(ecirc)operator(:) string(\\^{e})
+comment(#LATIN SMALL LETTER E WITH CIRCUMFLEX)
+key<delimiter(")content(234)delimiter(")>operator(:) string(\\^{e})
+comment(#LATIN CAPITAL LETTER E WITH CIRCUMFLEX)
+key(Ecirc)operator(:) string(\\^{E})
+comment(#LATIN CAPITAL LETTER E WITH CIRCUMFLEX)
+key<delimiter(")content(202)delimiter(")>operator(:) string(\\^{E})
+comment(#LATIN SMALL LETTER E WITH GRAVE)
+key(egrave)operator(:) string(\\`{e})
+comment(#LATIN SMALL LETTER E WITH GRAVE)
+key<delimiter(")content(232)delimiter(")>operator(:) string(\\`{e})
+comment(#LATIN CAPITAL LETTER E WITH GRAVE)
+key(Egrave)operator(:) string(\\`{E})
+comment(#LATIN CAPITAL LETTER E WITH GRAVE)
+key<delimiter(")content(200)delimiter(")>operator(:) string(\\`{E})
+comment(#LATIN SMALL LETTER E WITH DIAERESIS)
+key(euml)operator(:) string(\\"{e})
+comment(#LATIN SMALL LETTER E WITH DIAERESIS)
+key<delimiter(")content(235)delimiter(")>operator(:) string(\\"{e})
+comment(#LATIN CAPITAL LETTER E WITH DIAERESIS)
+key(Euml)operator(:) string(\\"{E})
+comment(#LATIN CAPITAL LETTER E WITH DIAERESIS)
+key<delimiter(")content(203)delimiter(")>operator(:) string(\\"{E})
+comment(#LATIN SMALL LETTER I WITH ACUTE)
+key(iacute)operator(:) string(\\'{\\i})
+comment(#LATIN SMALL LETTER I WITH ACUTE)
+key<delimiter(")content(237)delimiter(")>operator(:) string(\\'{\\i})
+comment(#LATIN CAPITAL LETTER I WITH ACUTE)
+key(Iacute)operator(:) string(\\'{I})
+comment(#LATIN CAPITAL LETTER I WITH ACUTE)
+key<delimiter(")content(205)delimiter(")>operator(:) string(\\'{I})
+comment(#LATIN SMALL LETTER I WITH CIRCUMFLEX)
+key(icirc)operator(:) string(\\^{\\i})
+comment(#LATIN SMALL LETTER I WITH CIRCUMFLEX)
+key<delimiter(")content(238)delimiter(")>operator(:) string(\\^{\\i})
+comment(#LATIN CAPITAL LETTER I WITH CIRCUMFLEX)
+key(Icirc)operator(:) string(\\^{I})
+comment(#LATIN CAPITAL LETTER I WITH CIRCUMFLEX)
+key<delimiter(")content(206)delimiter(")>operator(:) string(\\^{I})
+comment(#LATIN SMALL LETTER I WITH GRAVE)
+key(igrave)operator(:) string(\\`{\\i})
+comment(#LATIN SMALL LETTER I WITH GRAVE)
+key<delimiter(")content(236)delimiter(")>operator(:) string(\\`{\\i})
+comment(#LATIN CAPITAL LETTER I WITH GRAVE)
+key(Igrave)operator(:) string(\\`{I})
+comment(#LATIN CAPITAL LETTER I WITH GRAVE)
+key<delimiter(")content(204)delimiter(")>operator(:) string(\\`{I})
+comment(#LATIN SMALL LETTER I WITH DIAERESIS)
+key(iuml)operator(:) string(\\"{\\i})
+comment(#LATIN SMALL LETTER I WITH DIAERESIS)
+key<delimiter(")content(239)delimiter(")>operator(:) string(\\"{\\i})
+comment(#LATIN CAPITAL LETTER I WITH DIAERESIS)
+key(Iuml)operator(:) string(\\"{I})
+comment(#LATIN CAPITAL LETTER I WITH DIAERESIS)
+key<delimiter(")content(207)delimiter(")>operator(:) string(\\"{I})
+comment(#LATIN SMALL LETTER N WITH TILDE)
+key(ntilde)operator(:) string(\\~{n})
+comment(#LATIN SMALL LETTER N WITH TILDE)
+key<delimiter(")content(241)delimiter(")>operator(:) string(\\~{n})
+comment(#LATIN CAPITAL LETTER N WITH TILDE)
+key(Ntilde)operator(:) string(\\~{N})
+comment(#LATIN CAPITAL LETTER N WITH TILDE)
+key<delimiter(")content(209)delimiter(")>operator(:) string(\\~{N})
+comment(#LATIN SMALL LETTER O WITH ACUTE)
+key(oacute)operator(:) string(\\'{o})
+comment(#LATIN SMALL LETTER O WITH ACUTE)
+key<delimiter(")content(243)delimiter(")>operator(:) string(\\'{o})
+comment(#LATIN CAPITAL LETTER O WITH ACUTE)
+key(Oacute)operator(:) string(\\'{O})
+comment(#LATIN CAPITAL LETTER O WITH ACUTE)
+key<delimiter(")content(211)delimiter(")>operator(:) string(\\'{O})
+comment(#LATIN SMALL LETTER O WITH CIRCUMFLEX)
+key(ocirc)operator(:) string(\\^{o})
+comment(#LATIN SMALL LETTER O WITH CIRCUMFLEX)
+key<delimiter(")content(244)delimiter(")>operator(:) string(\\^{o})
+comment(#LATIN CAPITAL LETTER O WITH CIRCUMFLEX)
+key(Ocirc)operator(:) string(\\^{O})
+comment(#LATIN CAPITAL LETTER O WITH CIRCUMFLEX)
+key<delimiter(")content(212)delimiter(")>operator(:) string(\\^{O})
+comment(#LATIN SMALL LETTER O WITH GRAVE)
+key(ograve)operator(:) string(\\`{o})
+comment(#LATIN SMALL LETTER O WITH GRAVE)
+key<delimiter(")content(242)delimiter(")>operator(:) string(\\`{o})
+comment(#LATIN CAPITAL LETTER O WITH GRAVE)
+key(Ograve)operator(:) string(\\`{O})
+comment(#LATIN CAPITAL LETTER O WITH GRAVE)
+key<delimiter(")content(210)delimiter(")>operator(:) string(\\`{O})
+comment(#LATIN SMALL LETTER O WITH STROKE)
+key(oslash)operator(:) string(\\o{})
+comment(#LATIN SMALL LETTER O WITH STROKE)
+key<delimiter(")content(248)delimiter(")>operator(:) string(\\o{})
+comment(#LATIN CAPITAL LETTER O WITH STROKE)
+key(Oslash)operator(:) string(\\O{})
+comment(#LATIN CAPITAL LETTER O WITH STROKE)
+key<delimiter(")content(216)delimiter(")>operator(:) string(\\O{})
+comment(#LATIN SMALL LETTER O WITH TILDE)
+key(otilde)operator(:) string(\\~{o})
+comment(#LATIN SMALL LETTER O WITH TILDE)
+key<delimiter(")content(245)delimiter(")>operator(:) string(\\~{o})
+comment(#LATIN CAPITAL LETTER O WITH TILDE)
+key(Otilde)operator(:) string(\\~{O})
+comment(#LATIN CAPITAL LETTER O WITH TILDE)
+key<delimiter(")content(213)delimiter(")>operator(:) string(\\~{O})
+comment(#LATIN SMALL LETTER O WITH DIAERESIS)
+key(ouml)operator(:) string(\\"{o})
+comment(#LATIN SMALL LETTER O WITH DIAERESIS)
+key<delimiter(")content(246)delimiter(")>operator(:) string(\\"{o})
+comment(#LATIN CAPITAL LETTER O WITH DIAERESIS)
+key(Ouml)operator(:) string(\\"{O})
+comment(#LATIN CAPITAL LETTER O WITH DIAERESIS)
+key<delimiter(")content(214)delimiter(")>operator(:) string(\\"{O})
+comment(#LATIN SMALL LETTER SHARP S)
+key(szlig)operator(:) string(\\ss{})
+comment(#LATIN SMALL LETTER SHARP S)
+key<delimiter(")content(223)delimiter(")>operator(:) string(\\ss{})
+comment(#LATIN SMALL LETTER THORN)
+comment(#requires wasysym)
+key(thorn)operator(:) string(\\th{})
+comment(#LATIN SMALL LETTER THORN)
+comment(#requires wasysym)
+key<delimiter(")content(254)delimiter(")>operator(:) string(\\th{})
+comment(#LATIN CAPITAL LETTER THORN)
+comment(#requires wasysym)
+key(THORN)operator(:) string(\\TH{})
+comment(#LATIN CAPITAL LETTER THORN)
+comment(#requires wasysym)
+key<delimiter(")content(222)delimiter(")>operator(:) string(\\TH{})
+comment(#LATIN SMALL LETTER U WITH ACUTE)
+key(uacute)operator(:) string(\\'{u})
+comment(#LATIN SMALL LETTER U WITH ACUTE)
+key<delimiter(")content(250)delimiter(")>operator(:) string(\\'{u})
+comment(#LATIN CAPITAL LETTER U WITH ACUTE)
+key(Uacute)operator(:) string(\\'{U})
+comment(#LATIN CAPITAL LETTER U WITH ACUTE)
+key<delimiter(")content(218)delimiter(")>operator(:) string(\\'{U})
+comment(#LATIN SMALL LETTER U WITH CIRCUMFLEX)
+key(ucirc)operator(:) string(\\^{u})
+comment(#LATIN SMALL LETTER U WITH CIRCUMFLEX)
+key<delimiter(")content(251)delimiter(")>operator(:) string(\\^{u})
+comment(#LATIN CAPITAL LETTER U WITH CIRCUMFLEX)
+key(Ucirc)operator(:) string(\\^{U})
+comment(#LATIN CAPITAL LETTER U WITH CIRCUMFLEX)
+key<delimiter(")content(219)delimiter(")>operator(:) string(\\^{U})
+comment(#LATIN SMALL LETTER U WITH GRAVE)
+key(ugrave)operator(:) string(\\`{u})
+comment(#LATIN SMALL LETTER U WITH GRAVE)
+key<delimiter(")content(249)delimiter(")>operator(:) string(\\`{u})
+comment(#LATIN CAPITAL LETTER U WITH GRAVE)
+key(Ugrave)operator(:) string(\\`{U})
+comment(#LATIN CAPITAL LETTER U WITH GRAVE)
+key<delimiter(")content(217)delimiter(")>operator(:) string(\\`{U})
+comment(#LATIN SMALL LETTER U WITH DIAERESIS)
+key(uuml)operator(:) string(\\"{u})
+comment(#LATIN SMALL LETTER U WITH DIAERESIS)
+key<delimiter(")content(252)delimiter(")>operator(:) string(\\"{u})
+comment(#LATIN CAPITAL LETTER U WITH DIAERESIS)
+key(Uuml)operator(:) string(\\"{U})
+comment(#LATIN CAPITAL LETTER U WITH DIAERESIS)
+key<delimiter(")content(220)delimiter(")>operator(:) string(\\"{U})
+comment(#LATIN SMALL LETTER Y WITH ACUTE)
+key(yacute)operator(:) string(\\'{y})
+comment(#LATIN SMALL LETTER Y WITH ACUTE)
+key<delimiter(")content(253)delimiter(")>operator(:) string(\\'{y})
+comment(#LATIN CAPITAL LETTER Y WITH ACUTE)
+key(Yacute)operator(:) string(\\'{Y})
+comment(#LATIN CAPITAL LETTER Y WITH ACUTE)
+key<delimiter(")content(221)delimiter(")>operator(:) string(\\'{Y})
+comment(#LATIN SMALL LETTER Y WITH DIAERESIS)
+key(yuml)operator(:) string(\\"{y})
+comment(#LATIN SMALL LETTER Y WITH DIAERESIS)
+key<delimiter(")content(255)delimiter(")>operator(:) string(\\"{y})
+comment(#LATIN SMALL LETTER A WITH BREVE)
+key<delimiter(")content(259)delimiter(")>operator(:) string(\\u{a})
+comment(#LATIN CAPITAL LETTER A WITH BREVE)
+key<delimiter(")content(258)delimiter(")>operator(:) string(\\u{A})
+comment(#LATIN SMALL LETTER A WITH MACRON)
+key<delimiter(")content(257)delimiter(")>operator(:) string(\\={a})
+comment(#LATIN CAPITAL LETTER A WITH MACRON)
+key<delimiter(")content(256)delimiter(")>operator(:) string(\\={A})
+comment(#LATIN SMALL LETTER A WITH OGONEK)
+comment(#requires fontenc:T1)
+key<delimiter(")content(261)delimiter(")>operator(:) string(\\k{a})
+comment(#LATIN CAPITAL LETTER A WITH OGONEK)
+comment(#requires fontenc:T1)
+key<delimiter(")content(260)delimiter(")>operator(:) string(\\k{A})
+comment(#LATIN SMALL LETTER C WITH ACUTE)
+key<delimiter(")content(263)delimiter(")>operator(:) string(\\'{c})
+comment(#LATIN CAPITAL LETTER C WITH ACUTE)
+key<delimiter(")content(262)delimiter(")>operator(:) string(\\'{C})
+comment(#LATIN SMALL LETTER C WITH CARON)
+key<delimiter(")content(269)delimiter(")>operator(:) string(\\v{c})
+comment(#LATIN CAPITAL LETTER C WITH CARON)
+key<delimiter(")content(268)delimiter(")>operator(:) string(\\v{C})
+comment(#LATIN SMALL LETTER C WITH CIRCUMFLEX)
+key<delimiter(")content(265)delimiter(")>operator(:) string(\\^{c})
+comment(#LATIN CAPITAL LETTER C WITH CIRCUMFLEX)
+key<delimiter(")content(264)delimiter(")>operator(:) string(\\^{C})
+comment(#LATIN SMALL LETTER C WITH DOT ABOVE)
+key<delimiter(")content(267)delimiter(")>operator(:) string(\\.{c})
+comment(#LATIN CAPITAL LETTER C WITH DOT ABOVE)
+key<delimiter(")content(266)delimiter(")>operator(:) string(\\.{C})
+comment(#LATIN SMALL LETTER D WITH CARON)
+key<delimiter(")content(271)delimiter(")>operator(:) string(\\v{d})
+comment(#LATIN CAPITAL LETTER D WITH CARON)
+key<delimiter(")content(270)delimiter(")>operator(:) string(\\v{D})
+comment(#LATIN SMALL LETTER D WITH STROKE)
+comment(#requires fontenc:T1)
+key<delimiter(")content(273)delimiter(")>operator(:) string(\\dj{})
+comment(#LATIN CAPITAL LETTER D WITH STROKE)
+comment(#requires fontenc:T1)
+key<delimiter(")content(272)delimiter(")>operator(:) string(\\DJ{})
+comment(#LATIN SMALL LETTER E WITH CARON)
+key<delimiter(")content(283)delimiter(")>operator(:) string(\\v{e})
+comment(#LATIN CAPITAL LETTER E WITH CARON)
+key<delimiter(")content(282)delimiter(")>operator(:) string(\\v{E})
+comment(#LATIN SMALL LETTER E WITH DOT ABOVE)
+key<delimiter(")content(279)delimiter(")>operator(:) string(\\.{e})
+comment(#LATIN CAPITAL LETTER E WITH DOT ABOVE)
+key<delimiter(")content(278)delimiter(")>operator(:) string(\\.{E})
+comment(#LATIN SMALL LETTER E WITH MACRON)
+key<delimiter(")content(275)delimiter(")>operator(:) string(\\={e})
+comment(#LATIN CAPITAL LETTER E WITH MACRON)
+key<delimiter(")content(274)delimiter(")>operator(:) string(\\={E})
+comment(#LATIN SMALL LETTER E WITH OGONEK)
+comment(#requires fontenc:T1)
+key<delimiter(")content(281)delimiter(")>operator(:) string(\\k{e})
+comment(#LATIN CAPITAL LETTER E WITH OGONEK)
+comment(#requires fontenc:T1)
+key<delimiter(")content(280)delimiter(")>operator(:) string(\\k{E})
+comment(#LATIN SMALL LETTER G WITH ACUTE)
+key<delimiter(")content(501)delimiter(")>operator(:) string(\\'{g})
+comment(#LATIN SMALL LETTER G WITH BREVE)
+key<delimiter(")content(287)delimiter(")>operator(:) string(\\u{g})
+comment(#LATIN CAPITAL LETTER G WITH BREVE)
+key<delimiter(")content(286)delimiter(")>operator(:) string(\\u{G})
+comment(#LATIN CAPITAL LETTER G WITH CEDILLA)
+key<delimiter(")content(290)delimiter(")>operator(:) string(\\c{G})
+comment(#LATIN SMALL LETTER G WITH CIRCUMFLEX)
+key<delimiter(")content(285)delimiter(")>operator(:) string(\\^{g})
+comment(#LATIN CAPITAL LETTER G WITH CIRCUMFLEX)
+key<delimiter(")content(284)delimiter(")>operator(:) string(\\^{G})
+comment(#LATIN SMALL LETTER G WITH DOT ABOVE)
+key<delimiter(")content(289)delimiter(")>operator(:) string(\\.{g})
+comment(#LATIN CAPITAL LETTER G WITH DOT ABOVE)
+key<delimiter(")content(288)delimiter(")>operator(:) string(\\.{G})
+comment(#LATIN SMALL LETTER H WITH CIRCUMFLEX)
+key<delimiter(")content(293)delimiter(")>operator(:) string(\\^{h})
+comment(#LATIN CAPITAL LETTER H WITH CIRCUMFLEX)
+key<delimiter(")content(292)delimiter(")>operator(:) string(\\^{H})
+comment(#LATIN SMALL LETTER H WITH STROKE)
+key<delimiter(")content(295)delimiter(")>operator(:) string(\\hstrok{})
+comment(#LATIN CAPITAL LETTER H WITH STROKE)
+key<delimiter(")content(294)delimiter(")>operator(:) string(\\Hstrok{})
+comment(#LATIN CAPITAL LETTER I WITH DOT ABOVE)
+key<delimiter(")content(304)delimiter(")>operator(:) string(\\.{I})
+comment(#LATIN CAPITAL LETTER I WITH MACRON)
+key<delimiter(")content(298)delimiter(")>operator(:) string(\\={I})
+comment(#LATIN SMALL LETTER I WITH MACRON)
+key<delimiter(")content(299)delimiter(")>operator(:) string(\\={\\i})
+comment(#LATIN SMALL LIGATURE IJ)
+key<delimiter(")content(307)delimiter(")>operator(:) string(i\\kern -.15em j)
+comment(#LATIN CAPITAL LIGATURE IJ)
+key<delimiter(")content(306)delimiter(")>operator(:) string(I\\kern -.15em J)
+comment(#LATIN SMALL LETTER DOTLESS I)
+key<delimiter(")content(305)delimiter(")>operator(:) string(\\i{})
+comment(#LATIN SMALL LETTER I WITH OGONEK)
+comment(#requires fontenc:T1)
+key<delimiter(")content(303)delimiter(")>operator(:) string(\\k{i})
+comment(#LATIN CAPITAL LETTER I WITH OGONEK)
+comment(#requires fontenc:T1)
+key<delimiter(")content(302)delimiter(")>operator(:) string(\\k{I})
+comment(#LATIN SMALL LETTER I WITH TILDE)
+key<delimiter(")content(297)delimiter(")>operator(:) string(\\~{\\i})
+comment(#LATIN CAPITAL LETTER I WITH TILDE)
+key<delimiter(")content(296)delimiter(")>operator(:) string(\\~{I})
+comment(#LATIN SMALL LETTER J WITH CIRCUMFLEX)
+key<delimiter(")content(309)delimiter(")>operator(:) string(\\^{\\j})
+comment(#LATIN CAPITAL LETTER J WITH CIRCUMFLEX)
+key<delimiter(")content(308)delimiter(")>operator(:) string(\\^{J})
+comment(#LATIN SMALL LETTER K WITH CEDILLA)
+key<delimiter(")content(311)delimiter(")>operator(:) string(\\c{k})
+comment(#LATIN CAPITAL LETTER K WITH CEDILLA)
+key<delimiter(")content(310)delimiter(")>operator(:) string(\\c{K})
+comment(#LATIN SMALL LETTER KRA)
+key<delimiter(")content(312)delimiter(")>operator(:) string(\\textsc{k})
+comment(#LATIN SMALL LETTER L WITH ACUTE)
+key<delimiter(")content(314)delimiter(")>operator(:) string(\\'{l})
+comment(#LATIN CAPITAL LETTER L WITH ACUTE)
+key<delimiter(")content(313)delimiter(")>operator(:) string(\\'{L})
+comment(#LATIN SMALL LETTER L WITH CARON)
+key<delimiter(")content(318)delimiter(")>operator(:) string(\\v{l})
+comment(#LATIN CAPITAL LETTER L WITH CARON)
+key<delimiter(")content(317)delimiter(")>operator(:) string(\\v{L})
+comment(#LATIN SMALL LETTER L WITH CEDILLA)
+key<delimiter(")content(316)delimiter(")>operator(:) string(\\c{l})
+comment(#LATIN CAPITAL LETTER L WITH CEDILLA)
+key<delimiter(")content(315)delimiter(")>operator(:) string(\\c{L})
+comment(#LATIN SMALL LETTER L WITH MIDDLE DOT)
+key<delimiter(")content(320)delimiter(")>operator(:) string(\\lmidot{})
+comment(#LATIN CAPITAL LETTER L WITH MIDDLE DOT)
+key<delimiter(")content(319)delimiter(")>operator(:) string(\\Lmidot{})
+comment(#LATIN SMALL LETTER L WITH STROKE)
+key<delimiter(")content(322)delimiter(")>operator(:) string(\\l{})
+comment(#LATIN CAPITAL LETTER L WITH STROKE)
+key<delimiter(")content(321)delimiter(")>operator(:) string(\\L{})
+comment(#LATIN SMALL LETTER N WITH ACUTE)
+key<delimiter(")content(324)delimiter(")>operator(:) string(\\'{n})
+comment(#LATIN CAPITAL LETTER N WITH ACUTE)
+key<delimiter(")content(323)delimiter(")>operator(:) string(\\'{N})
+comment(#LATIN SMALL LETTER ENG)
+comment(#requires fontenc:T1)
+key<delimiter(")content(331)delimiter(")>operator(:) string(\\ng{})
+comment(#LATIN CAPITAL LETTER ENG)
+comment(#requires fontenc:T1)
+key<delimiter(")content(330)delimiter(")>operator(:) string(\\NG{})
+comment(#LATIN SMALL LETTER N PRECEDED BY APOSTROPHE)
+key<delimiter(")content(329)delimiter(")>operator(:) string(n\\kern-.2em\\textsf{'})
+comment(#LATIN SMALL LETTER N WITH CARON)
+key<delimiter(")content(328)delimiter(")>operator(:) string(\\v{n})
+comment(#LATIN CAPITAL LETTER N WITH CARON)
+key<delimiter(")content(327)delimiter(")>operator(:) string(\\v{N})
+comment(#LATIN SMALL LETTER N WITH CEDILLA)
+key<delimiter(")content(326)delimiter(")>operator(:) string(\\c{n})
+comment(#LATIN CAPITAL LETTER N WITH CEDILLA)
+key<delimiter(")content(325)delimiter(")>operator(:) string(\\c{N})
+comment(#LATIN SMALL LETTER O WITH DOUBLE ACUTE)
+key<delimiter(")content(337)delimiter(")>operator(:) string(\\H{o})
+comment(#LATIN CAPITAL LETTER O WITH DOUBLE ACUTE)
+key<delimiter(")content(336)delimiter(")>operator(:) string(\\H{O})
+comment(#LATIN CAPITAL LETTER O WITH MACRON)
+key<delimiter(")content(332)delimiter(")>operator(:) string(\\={O})
+comment(#LATIN SMALL LETTER O WITH MACRON)
+key<delimiter(")content(333)delimiter(")>operator(:) string(\\={o})
+comment(#LATIN SMALL LIGATURE OE)
+key(oelig)operator(:) string(\\oe{})
+comment(#LATIN SMALL LIGATURE OE)
+key<delimiter(")content(339)delimiter(")>operator(:) string(\\oe{})
+comment(#LATIN CAPITAL LIGATURE OE)
+key(OElig)operator(:) string(\\OE{})
+comment(#LATIN CAPITAL LIGATURE OE)
+key<delimiter(")content(338)delimiter(")>operator(:) string(\\OE{})
+comment(#LATIN SMALL LETTER R WITH ACUTE)
+key<delimiter(")content(341)delimiter(")>operator(:) string(\\'{r})
+comment(#LATIN CAPITAL LETTER R WITH ACUTE)
+key<delimiter(")content(340)delimiter(")>operator(:) string(\\'{R})
+comment(#LATIN SMALL LETTER R WITH CARON)
+key<delimiter(")content(345)delimiter(")>operator(:) string(\\v{r})
+comment(#LATIN CAPITAL LETTER R WITH CARON)
+key<delimiter(")content(344)delimiter(")>operator(:) string(\\v{R})
+comment(#LATIN SMALL LETTER R WITH CEDILLA)
+key<delimiter(")content(343)delimiter(")>operator(:) string(\\c{r})
+comment(#LATIN CAPITAL LETTER R WITH CEDILLA)
+key<delimiter(")content(342)delimiter(")>operator(:) string(\\c{R})
+comment(#LATIN SMALL LETTER S WITH ACUTE)
+key<delimiter(")content(347)delimiter(")>operator(:) string(\\'{s})
+comment(#LATIN CAPITAL LETTER S WITH ACUTE)
+key<delimiter(")content(346)delimiter(")>operator(:) string(\\'{S})
+comment(#LATIN SMALL LETTER S WITH CARON)
+key(scaron)operator(:) string(\\v{s})
+comment(#LATIN SMALL LETTER S WITH CARON)
+key<delimiter(")content(353)delimiter(")>operator(:) string(\\v{s})
+comment(#LATIN CAPITAL LETTER S WITH CARON)
+key(Scaron)operator(:) string(\\v{S})
+comment(#LATIN CAPITAL LETTER S WITH CARON)
+key<delimiter(")content(352)delimiter(")>operator(:) string(\\v{S})
+comment(#LATIN SMALL LETTER S WITH CEDILLA)
+key<delimiter(")content(351)delimiter(")>operator(:) string(\\c{s})
+comment(#LATIN CAPITAL LETTER S WITH CEDILLA)
+key<delimiter(")content(350)delimiter(")>operator(:) string(\\c{S})
+comment(#LATIN SMALL LETTER S WITH CIRCUMFLEX)
+key<delimiter(")content(349)delimiter(")>operator(:) string(\\^{s})
+comment(#LATIN CAPITAL LETTER S WITH CIRCUMFLEX)
+key<delimiter(")content(348)delimiter(")>operator(:) string(\\^{S})
+comment(#LATIN SMALL LETTER T WITH CARON)
+key<delimiter(")content(357)delimiter(")>operator(:) string(\\v{t})
+comment(#LATIN CAPITAL LETTER T WITH CARON)
+key<delimiter(")content(356)delimiter(")>operator(:) string(\\v{T})
+comment(#LATIN SMALL LETTER T WITH CEDILLA)
+key<delimiter(")content(355)delimiter(")>operator(:) string(\\c{t})
+comment(#LATIN CAPITAL LETTER T WITH CEDILLA)
+key<delimiter(")content(354)delimiter(")>operator(:) string(\\c{T})
+comment(#LATIN SMALL LETTER T WITH STROKE)
+key<delimiter(")content(359)delimiter(")>operator(:) string(\\tstrok{})
+comment(#LATIN CAPITAL LETTER T WITH STROKE)
+key<delimiter(")content(358)delimiter(")>operator(:) string(\\Tstrok{})
+comment(#LATIN SMALL LETTER U WITH BREVE)
+key<delimiter(")content(365)delimiter(")>operator(:) string(\\u{u})
+comment(#LATIN CAPITAL LETTER U WITH BREVE)
+key<delimiter(")content(364)delimiter(")>operator(:) string(\\u{U})
+comment(#LATIN SMALL LETTER U WITH DOUBLE ACUTE)
+key<delimiter(")content(369)delimiter(")>operator(:) string(\\H{u})
+comment(#LATIN CAPITAL LETTER U WITH DOUBLE ACUTE)
+key<delimiter(")content(368)delimiter(")>operator(:) string(\\H{U})
+comment(#LATIN SMALL LETTER U WITH MACRON)
+key<delimiter(")content(363)delimiter(")>operator(:) string(\\={u})
+comment(#LATIN CAPITAL LETTER U WITH MACRON)
+key<delimiter(")content(362)delimiter(")>operator(:) string(\\={U})
+comment(#LATIN SMALL LETTER U WITH OGONEK)
+comment(#requires fontenc:T1)
+key<delimiter(")content(371)delimiter(")>operator(:) string(\\k{u})
+comment(#LATIN CAPITAL LETTER U WITH OGONEK)
+comment(#requires fontenc:T1)
+key<delimiter(")content(370)delimiter(")>operator(:) string(\\k{U})
+comment(#LATIN SMALL LETTER U WITH RING ABOVE)
+key<delimiter(")content(367)delimiter(")>operator(:) string(\\r{u})
+comment(#LATIN CAPITAL LETTER U WITH RING ABOVE)
+key<delimiter(")content(366)delimiter(")>operator(:) string(\\r{U})
+comment(#LATIN SMALL LETTER U WITH TILDE)
+key<delimiter(")content(361)delimiter(")>operator(:) string(\\~{u})
+comment(#LATIN CAPITAL LETTER U WITH TILDE)
+key<delimiter(")content(360)delimiter(")>operator(:) string(\\~{U})
+comment(#LATIN SMALL LETTER W WITH CIRCUMFLEX)
+key<delimiter(")content(373)delimiter(")>operator(:) string(\\^{w})
+comment(#LATIN CAPITAL LETTER W WITH CIRCUMFLEX)
+key<delimiter(")content(372)delimiter(")>operator(:) string(\\^{W})
+comment(#LATIN SMALL LETTER Y WITH CIRCUMFLEX)
+key<delimiter(")content(375)delimiter(")>operator(:) string(\\^{y})
+comment(#LATIN CAPITAL LETTER Y WITH CIRCUMFLEX)
+key<delimiter(")content(374)delimiter(")>operator(:) string(\\^{Y})
+comment(#LATIN CAPITAL LETTER Y WITH DIAERESIS)
+key(Yuml)operator(:) string(\\"{Y})
+comment(#LATIN CAPITAL LETTER Y WITH DIAERESIS)
+key<delimiter(")content(376)delimiter(")>operator(:) string(\\"{Y})
+comment(#LATIN SMALL LETTER Z WITH ACUTE)
+key<delimiter(")content(378)delimiter(")>operator(:) string(\\'{z})
+comment(#LATIN CAPITAL LETTER Z WITH ACUTE)
+key<delimiter(")content(377)delimiter(")>operator(:) string(\\'{Z})
+comment(#LATIN SMALL LETTER Z WITH CARON)
+key<delimiter(")content(382)delimiter(")>operator(:) string(\\v{z})
+comment(#LATIN CAPITAL LETTER Z WITH CARON)
+key<delimiter(")content(381)delimiter(")>operator(:) string(\\v{Z})
+comment(#LATIN SMALL LETTER Z WITH DOT ABOVE)
+key<delimiter(")content(380)delimiter(")>operator(:) string(\\.{z})
+comment(#LATIN CAPITAL LETTER Z WITH DOT ABOVE)
+key<delimiter(")content(379)delimiter(")>operator(:) string(\\.{Z})
+comment(#ACUTE ACCENT)
+comment(#requires textcomp)
+key(acute)operator(:) string(\\'{})
+comment(#ACUTE ACCENT)
+comment(#requires textcomp)
+key<delimiter(")content(180)delimiter(")>operator(:) string(\\'{})
+comment(#BREVE)
+comment(#requires textcomp)
+key<delimiter(")content(728)delimiter(")>operator(:) string(\\u{})
+comment(#CARON)
+comment(#requires textcomp)
+key<delimiter(")content(711)delimiter(")>operator(:) string(\\v{})
+comment(#CEDILLA)
+key(cedil)operator(:) string(\\c{})
+comment(#CEDILLA)
+key<delimiter(")content(184)delimiter(")>operator(:) string(\\c{})
+comment(#CIRCUMFLEX ACCENT)
+key(circ)operator(:) string(\\^{})
+comment(#CIRCUMFLEX ACCENT)
+key<delimiter(")content(94)delimiter(")>operator(:) string(\\^{})
+comment(#DOUBLE ACUTE ACCENT)
+comment(#requires textcomp)
+key<delimiter(")content(733)delimiter(")>operator(:) string(\\H{})
+comment(#DIAERESIS)
+comment(#requires textcomp)
+key(uml)operator(:) string(\\"{})
+comment(#DIAERESIS)
+comment(#requires textcomp)
+key<delimiter(")content(168)delimiter(")>operator(:) string(\\"{})
+comment(#DOT ABOVE)
+key<delimiter(")content(729)delimiter(")>operator(:) string(\\.{})
+comment(#GRAVE ACCENT)
+comment(#requires textcomp)
+key<delimiter(")content(96)delimiter(")>operator(:) string(\\`{})
+comment(#MACRON)
+comment(#requires textcomp)
+key(macr)operator(:) string(\\={})
+comment(#MACRON)
+comment(#requires textcomp)
+key<delimiter(")content(175)delimiter(")>operator(:) string(\\={})
+comment(#OGONEK)
+comment(#requires fontenc:T1)
+key<delimiter(")content(731)delimiter(")>operator(:) string(\\k{})
+comment(#RING ABOVE)
+key<delimiter(")content(730)delimiter(")>operator(:) string(\\r{})
+comment(#TILDE)
+comment(#requires textcomp)
+key(tilde)operator(:) string(\\~{})
+comment(#TILDE)
+comment(#requires textcomp)
+key<delimiter(")content(126)delimiter(")>operator(:) string(\\~{})
+comment(#HORIZONTAL TABULATION)
+key<delimiter(")content(9)delimiter(")>operator(:) string(\\>,\\=)
+comment(#LINE FEED)
+key<delimiter(")content(10)delimiter(")>operator(:) string(\\\\)
+comment(#SINGLE LEFT-POINTING ANGLE QUOTATION MARK)
+comment(#requires fontenc:T1)
+key(lsaquo)operator(:) string(\\guilsinglleft{})
+comment(#SINGLE LEFT-POINTING ANGLE QUOTATION MARK)
+comment(#requires fontenc:T1)
+key<delimiter(")content(8249)delimiter(")>operator(:) string(\\guilsinglleft{})
+comment(#SINGLE RIGHT-POINTING ANGLE QUOTATION MARK)
+comment(#requires fontenc:T1)
+key(rsaquo)operator(:) string(\\guilsinglright{})
+comment(#SINGLE RIGHT-POINTING ANGLE QUOTATION MARK)
+comment(#requires fontenc:T1)
+key<delimiter(")content(8250)delimiter(")>operator(:) string(\\guilsinglright{})
+comment(#OVERLINE)
+key(oline)operator(:) string(\\={})
+comment(#OVERLINE)
+key<delimiter(")content(8254)delimiter(")>operator(:) string(\\={})
+comment(#FRACTION SLASH)
+comment(#requires textcomp)
+key(frasl)operator(:) string(\\textfractionsolidus{})
+comment(#FRACTION SLASH)
+comment(#requires textcomp)
+key<delimiter(")content(8260)delimiter(")>operator(:) string(\\textfractionsolidus{})
+comment(#EURO SIGN)
+comment(#requires textcomp)
+key(euro)operator(:) string(\\texteuro{})
+comment(#EURO SIGN)
+comment(#requires textcomp)
+key<delimiter(")content(8364)delimiter(")>operator(:) string(\\texteuro{})
+comment(#LEFTWARDS DASHED ARROW)
+comment(#requires amssymb)
+key<delimiter(")content(8672)delimiter(")>operator(:) string(\\dashleftarrow{})
+comment(#RIGHTWARDS DASHED ARROW)
+comment(#requires amssymb)
+key<delimiter(")content(8674)delimiter(")>operator(:) string(\\dashrightarrow{})
+comment(#INVERTED OHM SIGN)
+comment(#requires amssymb)
+key<delimiter(")content(8487)delimiter(")>operator(:) string(\\textmho{})
+comment(#PROPORTION)
+key<delimiter(")content(8759)delimiter(")>operator(:) string("::")
+comment(#LEFT WHITE SQUARE BRACKET)
+comment(#requires stmaryrd)
+key<delimiter(")content(12314)delimiter(")>operator(:) string(\\textlbrackdbl{})
+comment(#PER TEN THOUSAND SIGN)
+comment(#requires textcomp)
+key<delimiter(")content(8241)delimiter(")>operator(:) string(\\textpertenthousand{})
+comment(#RIGHT WHITE SQUARE BRACKET)
+comment(#requires stmaryrd)
+key<delimiter(")content(12315)delimiter(")>operator(:) string(\\textrbrackdbl{})
+comment(#MODIFIER LETTER LOW MACRON)
+key<delimiter(")content(717)delimiter(")>operator(:) string(\\b{})
+comment(#COMBINING DOT BELOW)
+key<delimiter(")content(803)delimiter(")>operator(:) string(\\d{})
+comment(#COMBINING DOUBLE INVERTED BREVE)
+key<delimiter(")content(865)delimiter(")>operator(:) string(\\t{})
+comment(#REFERENCE MARK)
+comment(#requires textcomp)
+key<delimiter(")content(8251)delimiter(")>operator(:) string(\\textreferencemark{}) \ No newline at end of file
diff --git a/test/scanners/yaml/latex_entities.in.yml b/test/scanners/yaml/latex_entities.in.yml
new file mode 100644
index 0000000..3621fc8
--- /dev/null
+++ b/test/scanners/yaml/latex_entities.in.yml
@@ -0,0 +1,2414 @@
+# based on "SGML/XML character entity reference" at http://www.bitjungle.com/isoent/
+#
+---
+#EM SPACE
+emsp: \hspace{1em}
+#EM SPACE
+"8195": \hspace{1em}
+#EN SPACE
+ensp: \hspace{0.5em}
+#EN SPACE
+"8194": \hspace{0.5em}
+#THREE-PER-EM SPACE
+"8196": \hspace{0.33em}
+#FOUR-PER-EM SPACE
+"8197": \hspace{0.25em}
+#FIGURE SPACE
+"8199": \hphantom{0}
+#PUNCTUATION SPACE
+"8200": \hphantom{,}
+#THIN SPACE
+thinsp: \hspace{0.167em}
+#THIN SPACE
+"8201": \hspace{0.167em}
+#HAIR SPACE
+"8202": \hspace{1pt}
+#EM DASH
+mdash: ---
+#EM DASH
+"8212": ---
+#EN DASH
+ndash: --
+#EN DASH
+"8211": --
+#HYPHEN
+"8208": "-"
+#OPEN BOX
+"9251": \textvisiblespace{}
+#HORIZONTAL ELLIPSIS
+hellip: \ldots{}
+#HORIZONTAL ELLIPSIS
+"8230": \ldots{}
+#TWO DOT LEADER
+"8229": \nldr{}
+#VULGAR FRACTION ONE THIRD
+"8531": \sfrac{1}{3}
+#VULGAR FRACTION TWO THIRDS
+"8532": \sfrac{2}{3}
+#VULGAR FRACTION ONE FIFTH
+"8533": \sfrac{1}{5}
+#VULGAR FRACTION TWO FIFTHS
+"8534": \sfrac{2}{5}
+#VULGAR FRACTION THREE FIFTHS
+"8535": \sfrac{3}{5}
+#VULGAR FRACTION FOUR FIFTHS
+"8536": \sfrac{4}{5}
+#VULGAR FRACTION ONE SIXTH
+"8537": \sfrac{1}{6}
+#VULGAR FRACTION FIVE SIXTHS
+"8538": \sfrac{5}{6}
+#CARE OF
+"8453": "{^c\\!/\\!_o}"
+#FULL BLOCK
+"9608": \block{}
+#UPPER HALF BLOCK
+"9600": \uhblk{}
+#LOWER HALF BLOCK
+"9604": \lhblk{}
+#LIGHT SHADE
+#requires color
+"9617": \textcolor[gray]{.75}{\block}
+#MEDIUM SHADE
+#requires color
+"9618": \textcolor[gray]{.5}{\block}
+#DARK SHADE
+#requires color
+"9619": \textcolor[gray]{.25}{\block}
+#BLACK VERTICAL RECTANGLE
+"9646": \marker{}
+#WHITE CIRCLE
+"9675": \circ{}
+#WHITE SQUARE
+#requires amssymb
+"9633": \square{}
+#WHITE RECTANGLE
+"9645": \fbox{~~}
+#WHITE UP-POINTING TRIANGLE
+#requires amssymb
+"9653": \vartriangle{}
+#WHITE DOWN-POINTING TRIANGLE
+#requires amssymb
+"9663": \triangledown{}
+#WHITE STAR
+#requires pifont
+"9734": \ding{73}
+#BULLET
+bull: \textbullet{}
+#BULLET
+"8226": \textbullet{}
+#BLACK SMALL SQUARE
+#requires amssymb
+"9642": \blacksquare{}
+#BLACK UP-POINTING TRIANGLE
+#requires amssymb
+"9652": \blacktriangle{}
+#BLACK DOWN-POINTING TRIANGLE
+#requires amssymb
+"9662": \blacktriangledown{}
+#BLACK LEFT-POINTING TRIANGLE
+#requires amssymb
+"9666": \blacktriangleleft{}
+#BLACK RIGHT-POINTING TRIANGLE
+#requires amssymb
+"9656": \blacktriangleright{}
+#BLACK CLUB SUIT
+#requires pifont
+clubs: \ding{168}
+#BLACK CLUB SUIT
+#requires pifont
+"9827": \ding{168}
+#BLACK DIAMOND SUIT
+#requires pifont
+diams: \ding{169}
+#BLACK DIAMOND SUIT
+#requires pifont
+"9830": \ding{169}
+#BLACK HEART SUIT
+#requires pifont
+hearts: \ding{170}
+#BLACK HEART SUIT
+"9829": \ding{170}
+#BLACK SPADE SUIT
+#requires pifont
+spades: \ding{171}
+#BLACK SPADE SUIT
+#requires pifont
+"9824": \ding{171}
+#MALTESE CROSS
+#requires pifont
+"10016": \maltese{}
+#DAGGER
+dagger: \dag{}
+#DAGGER
+"8224": \dag{}
+#DOUBLE DAGGER
+Dagger: \ddag{}
+#DOUBLE DAGGER
+"8225": \ddag{}
+#CHECK MARK
+#requires pifont
+"10003": \checkmark{}
+#BALLOT X
+#requires pifont
+"10007": \ding{55}
+#MUSIC SHARP SIGN
+"9839": \sharp{}
+#MUSIC FLAT SIGN
+"9837": \flat{}
+#MALE SIGN
+#requires wasysym
+"9794": \male{}
+#FEMALE SIGN
+#requires wasysym
+"9792": \female{}
+#TELEPHONE SIGN
+#requires pifont
+"9742": \phone{}
+#TELEPHONE RECORDER
+#requires wasysym
+"8981": \recorder{}
+#SOUND RECORDING COPYRIGHT
+#requires textcomp
+"8471": \textcircledP{}
+#CARET
+"8257": \mathchar"1356
+#SINGLE LOW-9 QUOTATION MARK
+#requires fontenc:T1
+lsquor: ","
+#SINGLE LOW-9 QUOTATION MARK
+#requires fontenc:T1
+"8218": ","
+#DOUBLE LOW-9 QUOTATION MARK
+#requires fontenc:T1
+ldquor: ,,
+#DOUBLE LOW-9 QUOTATION MARK
+#requires fontenc:T1
+"8222": ,,
+#LATIN SMALL LIGATURE FF
+"64256": ff
+#LATIN SMALL LIGATURE FI
+"64257": fi
+#SMALL FJ LIGATURE
+"58290": fj
+#LATIN SMALL LIGATURE FFI
+"64259": ffi
+#LATIN SMALL LIGATURE FFL
+"64260": ffl
+#LATIN SMALL LIGATURE FL
+"64258": fl
+#DOUBLE HIGH-REVERSED-9 QUOTATION MARK
+"8223": ``
+#SINGLE HIGH-REVERSED-9 QUOTATION MARK
+"8219": `
+#VERTICAL ELLIPSIS
+"8942": \vdots{}
+#HYPHEN BULLET
+"8259": \hybull{}
+#LOZENGE
+#requires amssymb
+loz: \lozenge{}
+#LOZENGE
+#requires amssymb
+"9674": \lozenge{}
+#LOZENGE, FILLED
+#requires amssymb
+"59403": \blacklozenge{}
+#WHITE LEFT-POINTING TRIANGLE
+"9667": \triangleleft{}
+#WHITE RIGHT-POINTING TRIANGLE
+"9657": \triangleright{}
+#BLACK STAR
+#requires amssymb
+"9733": \bigstar{}
+#MUSIC NATURAL SIGN
+"9838": \natural{}
+#PRESCRIPTION TAKE
+#requires textcomp
+"8478": \textrecipe{}
+#SIX POINTED BLACK STAR
+#requires pifont
+"10038": \ding{86}
+#POSITION INDICATOR
+"8982": \mathchar"2208
+#BOTTOM LEFT CROP
+"8973": \dlcrop{}
+#BOTTOM RIGHT CROP
+"8972": \drcrop{}
+#TOP LEFT CROP
+"8975": \ulcrop{}
+#TOP RIGHT CROP
+"8974": \urcrop{}
+#VULGAR FRACTION ONE HALF
+frac12: \sfrac{1}{2}
+#VULGAR FRACTION ONE HALF
+"189": \sfrac{1}{2}
+#VULGAR FRACTION ONE QUARTER
+frac14: \sfrac{1}{4}
+#VULGAR FRACTION ONE QUARTER
+"188": \sfrac{1}{4}
+#VULGAR FRACTION THREE QUARTERS
+frac34: \sfrac{3}{4}
+#VULGAR FRACTION THREE QUARTERS
+"190": \sfrac{3}{4}
+#VULGAR FRACTION ONE EIGHTH
+"8539": \sfrac{1}{8}
+#VULGAR FRACTION THREE EIGHTHS
+"8540": \sfrac{3}{8}
+#VULGAR FRACTION FIVE EIGHTHS
+"8541": \sfrac{5}{8}
+#VULGAR FRACTION SEVEN EIGHTHS
+"8542": \sfrac{7}{8}
+#SUPERSCRIPT ONE
+sup1: ^1
+#SUPERSCRIPT ONE
+"185": ^1
+#SUPERSCRIPT TWO
+sup2: ^2
+#SUPERSCRIPT TWO
+"178": ^2
+#SUPERSCRIPT THREE
+sup3: ^3
+#SUPERSCRIPT THREE
+"179": ^3
+#PLUS SIGN
+"43": +
+#PLUS-MINUS SIGN
+#requires textcomp
+plusmn: \textpm{}
+#PLUS-MINUS SIGN
+#requires textcomp
+"177": \textpm{}
+#LESS-THAN SIGN
+lt: \textless{}
+#LESS-THAN SIGN
+"60": \textless{}
+#EQUALS SIGN
+"61": "="
+#GREATER-THAN SIGN
+gt: \textgreater{}
+#GREATER-THAN SIGN
+"62": \textgreater{}
+#DIVISION SIGN
+#requires textcomp
+divide: \textdiv{}
+#DIVISION SIGN
+#requires textcomp
+"247": \textdiv{}
+#MULTIPLICATION SIGN
+#requires textcomp
+times: \texttimes{}
+#MULTIPLICATION SIGN
+#requires textcomp
+"215": \texttimes{}
+#CURRENCY SIGN
+#requires wasysym
+curren: \textcurrency{}
+#CURRENCY SIGN
+#requires wasysym
+"164": \textcurrency{}
+#POUND SIGN
+pound: \pounds{}
+#POUND SIGN
+"163": \pounds{}
+#DOLLAR SIGN
+"36": \$
+#CENT SIGN
+#requires wasysym
+cent: \textcent{}
+#CENT SIGN
+#requires wasysym
+"162": \textcent{}
+#YEN SIGN
+#requires amsfonts
+yen: \textyen{}
+#YEN SIGN
+#requires amsfonts
+"165": \textyen{}
+#NUMBER SIGN
+"35": \#
+#PERCENT SIGN
+"37": \%
+#AMPERSAND
+amp: \&
+#AMPERSAND
+"38": \&
+#ASTERISK
+"42": \ast{}
+#COMMERCIAL AT
+"64": "@"
+#LEFT SQUARE BRACKET
+"91": "["
+#REVERSE SOLIDUS
+"92": \textbackslash{}
+#RIGHT SQUARE BRACKET
+"93": "]"
+#LEFT CURLY BRACKET
+"123": \{
+#HORIZONTAL BAR
+"8213": ---
+#VERTICAL LINE
+"124": \textbar{}
+#RIGHT CURLY BRACKET
+"125": \}
+#MICRO SIGN
+#requires textcomp
+micro: \textmu{}
+#MICRO SIGN
+#requires textcomp
+"181": \textmu{}
+#OHM SIGN
+#requires textcomp
+"8486": \textohm{}
+#DEGREE SIGN
+#requires textcomp
+deg: \textdegree{}
+#DEGREE SIGN
+#requires textcomp
+"176": \textdegree{}
+#MASCULINE ORDINAL INDICATOR
+#requires textcomp
+ordm: \textordmasculine{}
+#MASCULINE ORDINAL INDICATOR
+#requires textcomp
+"186": \textordmasculine{}
+#FEMININE ORDINAL INDICATOR
+#requires textcomp
+ordf: \textordfeminine{}
+#FEMININE ORDINAL INDICATOR
+#requires textcomp
+"170": \textordfeminine{}
+#SECTION SIGN
+#requires textcomp
+sect: \S{}
+#SECTION SIGN
+#requires textcomp
+"167": \S{}
+#PILCROW SIGN
+#requires textcomp
+para: \P{}
+#PILCROW SIGN
+#requires textcomp
+"182": \P{}
+#MIDDLE DOT
+#requires amssymb
+middot: \textperiodcentered{}
+#MIDDLE DOT
+#requires amssymb
+"183": \textperiodcentered{}
+#LEFTWARDS ARROW
+#requires textcomp
+larr: \textleftarrow{}
+#LEFTWARDS ARROW
+#requires textcomp
+"8592": \textleftarrow{}
+#RIGHTWARDS ARROW
+#requires textcomp
+rarr: \textrightarrow{}
+#RIGHTWARDS ARROW
+#requires textcomp
+"8594": \textrightarrow{}
+#UPWARDS ARROW
+#requires textcomp
+uarr: \textuparrow{}
+#UPWARDS ARROW
+#requires textcomp
+"8593": \textuparrow{}
+#DOWNWARDS ARROW
+#requires textcomp
+darr: \textdownarrow{}
+#DOWNWARDS ARROW
+#requires textcomp
+"8595": \textdownarrow{}
+#COPYRIGHT SIGN
+#requires textcomp
+copy: \copyright{}
+#COPYRIGHT SIGN
+#requires textcomp
+"169": \copyright{}
+#REGISTERED SIGN
+#requires amssymb
+reg: \textregistered{}
+#REGISTERED SIGN
+#requires amssymb
+"174": \textregistered{}
+#TRADE MARK SIGN
+trade: \texttrademark{}
+#TRADE MARK SIGN
+"8482": \texttrademark{}
+#BROKEN BAR
+#requires wasysym
+brvbar: \textbrokenbar{}
+#BROKEN BAR
+#requires wasysym
+"166": \textbrokenbar{}
+#NOT SIGN
+#requires textcomp
+not: \textlnot{}
+#NOT SIGN
+#requires textcomp
+"172": \textlnot{}
+#EIGHTH NOTE
+#requires wasysym
+"9834": \textmusicalnote{}
+#EXCLAMATION MARK
+"33": "!"
+#INVERTED EXCLAMATION MARK
+iexcl: "!`"
+#INVERTED EXCLAMATION MARK
+"161": "!`"
+#QUOTATION MARK
+#requires fontenc:T1
+quot: "\""
+#QUOTATION MARK
+#requires fontenc:T1
+"34": "\""
+#APOSTROPHE
+#requires textcomp
+"39": "'"
+#LEFT PARENTHESIS
+"40": (
+#RIGHT PARENTHESIS
+"41": )
+#COMMA
+"44": ","
+#LOW LINE
+"95": \_
+#HYPHEN-MINUS
+"45": "-"
+#FULL STOP
+"46": .
+#SOLIDUS
+"47": /
+#COLON
+"58": ":"
+#SEMICOLON
+"59": ;
+#QUESTION MARK
+"63": "?"
+#INVERTED QUESTION MARK
+iquest: ?`
+#INVERTED QUESTION MARK
+"191": ?`
+#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+#requires fontenc:T1
+laquo: \guillemotleft{}
+#LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
+#requires fontenc:T1
+"171": \guillemotleft{}
+#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+#requires fontenc:T1
+raquo: \guillemotright{}
+#RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
+#requires fontenc:T1
+"187": \guillemotright{}
+#LEFT SINGLE QUOTATION MARK
+lsquo: `
+#LEFT SINGLE QUOTATION MARK
+"8216": `
+#RIGHT SINGLE QUOTATION MARK
+rsquo: "'"
+#RIGHT SINGLE QUOTATION MARK
+"8217": "'"
+#LEFT DOUBLE QUOTATION MARK
+ldquo: ``
+#LEFT DOUBLE QUOTATION MARK
+"8220": ``
+#RIGHT DOUBLE QUOTATION MARK
+rdquo: "''"
+#RIGHT DOUBLE QUOTATION MARK
+"8221": "''"
+#NO-BREAK SPACE
+nbsp: "~"
+#NO-BREAK SPACE
+"160": "~"
+#SOFT HYPHEN
+shy: \-
+#SOFT HYPHEN
+"173": \-
+#BOX DRAWINGS LIGHT HORIZONTAL
+"9472": \boxh{}
+#BOX DRAWINGS LIGHT VERTICAL
+"9474": \boxv{}
+#BOX DRAWINGS LIGHT UP AND RIGHT
+"9492": \boxur{}
+#BOX DRAWINGS LIGHT UP AND LEFT
+"9496": \boxul{}
+#BOX DRAWINGS LIGHT DOWN AND LEFT
+"9488": \boxdl{}
+#BOX DRAWINGS LIGHT DOWN AND RIGHT
+"9484": \boxdr{}
+#BOX DRAWINGS LIGHT VERTICAL AND RIGHT
+"9500": \boxvr{}
+#BOX DRAWINGS LIGHT UP AND HORIZONTAL
+"9524": \boxhu{}
+#BOX DRAWINGS LIGHT VERTICAL AND LEFT
+"9508": \boxvl{}
+#BOX DRAWINGS LIGHT DOWN AND HORIZONTAL
+"9516": \boxhd{}
+#BOX DRAWINGS LIGHT VERTICAL AND HORIZONTAL
+"9532": \boxvh{}
+#BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
+"9566": \boxvR{}
+#BOX DRAWINGS UP DOUBLE AND HORIZONTAL SINGLE
+"9576": \boxhU{}
+#BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
+"9569": \boxvL{}
+#BOX DRAWINGS DOWN DOUBLE AND HORIZONTAL SINGLE
+"9573": \boxhD{}
+#BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
+"9578": \boxvH{}
+#BOX DRAWINGS DOUBLE HORIZONTAL
+"9552": \boxH{}
+#BOX DRAWINGS DOUBLE VERTICAL
+"9553": \boxV{}
+#BOX DRAWINGS DOUBLE UP AND RIGHT
+"9562": \boxUR{}
+#BOX DRAWINGS DOUBLE UP AND LEFT
+"9565": \boxUL{}
+#BOX DRAWINGS DOUBLE DOWN AND LEFT
+"9559": \boxDL{}
+#BOX DRAWINGS DOUBLE DOWN AND RIGHT
+"9556": \boxDR{}
+#BOX DRAWINGS DOUBLE VERTICAL AND RIGHT
+"9568": \boxVR{}
+#BOX DRAWINGS DOUBLE UP AND HORIZONTAL
+"9577": \boxHU{}
+#BOX DRAWINGS DOUBLE VERTICAL AND LEFT
+"9571": \boxVL{}
+#BOX DRAWINGS DOUBLE DOWN AND HORIZONTAL
+"9574": \boxHD{}
+#BOX DRAWINGS DOUBLE VERTICAL AND HORIZONTAL
+"9580": \boxVH{}
+#BOX DRAWINGS VERTICAL DOUBLE AND RIGHT SINGLE
+"9567": \boxVr{}
+#BOX DRAWINGS UP SINGLE AND HORIZONTAL DOUBLE
+"9575": \boxHu{}
+#BOX DRAWINGS VERTICAL DOUBLE AND LEFT SINGLE
+"9570": \boxVl{}
+#BOX DRAWINGS DOWN SINGLE AND HORIZONTAL DOUBLE
+"9572": \boxHd{}
+#BOX DRAWINGS VERTICAL DOUBLE AND HORIZONTAL SINGLE
+"9579": \boxVh{}
+#BOX DRAWINGS UP SINGLE AND RIGHT DOUBLE
+"9560": \boxuR{}
+#BOX DRAWINGS UP DOUBLE AND LEFT SINGLE
+"9564": \boxUl{}
+#BOX DRAWINGS DOWN SINGLE AND LEFT DOUBLE
+"9557": \boxdL{}
+#BOX DRAWINGS DOWN DOUBLE AND RIGHT SINGLE
+"9555": \boxDr{}
+#BOX DRAWINGS UP DOUBLE AND RIGHT SINGLE
+"9561": \boxUr{}
+#BOX DRAWINGS UP SINGLE AND LEFT DOUBLE
+"9563": \boxuL{}
+#BOX DRAWINGS DOWN DOUBLE AND LEFT SINGLE
+"9558": \boxDl{}
+#BOX DRAWINGS DOWN SINGLE AND RIGHT DOUBLE
+"9554": \boxdR{}
+#ALEF SYMBOL
+alefsym: \aleph{}
+#ALEF SYMBOL
+"8501": \aleph{}
+#LOGICAL AND
+and: \wedge{}
+#LOGICAL AND
+"8743": \wedge{}
+#RIGHT ANGLE
+"8735": \sqangle{}
+#SPHERICAL ANGLE
+#requires amssymb
+"8738": \sphericalangle{}
+#ALMOST EQUAL TO
+"8776": \approx{}
+#BECAUSE
+#requires amssymb
+"8757": \because{}
+#UP TACK
+"8869": \bot{}
+#INTERSECTION
+cap: \cap{}
+#INTERSECTION
+"8745": \cap{}
+#APPROXIMATELY EQUAL TO
+cong: \cong{}
+#APPROXIMATELY EQUAL TO
+"8773": \cong{}
+#CONTOUR INTEGRAL
+"8750": \oint{}
+#UNION
+cup: \cup{}
+#UNION
+"8746": \cup{}
+#IDENTICAL TO
+equiv: \equiv{}
+#IDENTICAL TO
+"8801": \equiv{}
+#THERE EXISTS
+exist: \exists{}
+#THERE EXISTS
+"8707": \exists{}
+#FOR ALL
+forall: \forall{}
+#FOR ALL
+"8704": \forall{}
+#LATIN SMALL LETTER F WITH HOOK
+fnof: f
+#LATIN SMALL LETTER F WITH HOOK
+"402": f
+#GREATER-THAN OR EQUAL TO
+ge: \geq{}
+#GREATER-THAN OR EQUAL TO
+"8805": \geq{}
+#LEFT RIGHT DOUBLE ARROW
+"8660": \iff{}
+#INFINITY
+infin: \infty{}
+#INFINITY
+"8734": \infty{}
+#INTEGRAL
+int: \int{}
+#INTEGRAL
+"8747": \int{}
+#ELEMENT OF
+isin: \in{}
+#ELEMENT OF
+"8712": \in{}
+#LEFT ANGLE BRACKET
+#requires textcomp
+lang: \textlangle{}
+#LEFT ANGLE BRACKET
+#requires textcomp
+"12296": \textlangle{}
+#LEFTWARDS DOUBLE ARROW
+lArr: \Leftarrow{}
+#LEFTWARDS DOUBLE ARROW
+"8656": \Leftarrow{}
+#LESS-THAN OR EQUAL TO
+le: \leq{}
+#LESS-THAN OR EQUAL TO
+"8804": \leq{}
+#MINUS SIGN
+#requires textcomp
+minus: \textminus{}
+#MINUS SIGN
+#requires textcomp
+"8722": \textminus{}
+#MINUS-OR-PLUS SIGN
+"8723": \mp{}
+#NABLA
+nabla: \nabla{}
+#NABLA
+"8711": \nabla{}
+#NOT EQUAL TO
+ne: \not=
+#NOT EQUAL TO
+"8800": \not=
+#CONTAINS AS MEMBER
+ni: \ni{}
+#CONTAINS AS MEMBER
+"8715": \ni{}
+#LOGICAL OR
+or: \vee{}
+#LOGICAL OR
+"8744": \vee{}
+#PARALLEL TO
+"8741": \parallel{}
+#PARTIAL DIFFERENTIAL
+part: \partial{}
+#PARTIAL DIFFERENTIAL
+"8706": \partial{}
+#PER MILLE SIGN
+#requires wasysym
+permil: \textperthousand{}
+#PER MILLE SIGN
+#requires wasysym
+"8240": \textperthousand{}
+#UP TACK
+perp: \perp{}
+#UP TACK
+"8869": \perp{}
+#PRIME
+prime: ^\prime
+#PRIME
+"8242": ^\prime
+#DOUBLE PRIME
+Prime: "{''}"
+#DOUBLE PRIME
+"8243": "{''}"
+#PROPORTIONAL TO
+prop: \propto{}
+#PROPORTIONAL TO
+"8733": \propto{}
+#FOURTH ROOT
+#requires textcomp
+radic: \textsurd{}
+#FOURTH ROOT
+#requires textcomp
+"8730": \textsurd{}
+#RIGHT ANGLE BRACKET
+#requires textcomp
+rang: \textrangle{}
+#RIGHT ANGLE BRACKET
+#requires textcomp
+"12297": \textrangle{}
+#RIGHTWARDS DOUBLE ARROW
+rArr: \Rightarrow{}
+#RIGHTWARDS DOUBLE ARROW
+"8658": \Rightarrow{}
+#TILDE OPERATOR
+sim: \sim{}
+#TILDE OPERATOR
+"8764": \sim{}
+#APPROXIMATELY EQUAL TO
+"8771": \simeq{}
+#BLACK SQUARE
+#requires amssymb
+"9632": \square{}
+#SUBSET OF
+sub: \subset{}
+#SUBSET OF
+"8834": \subset{}
+#SUBSET OF OR EQUAL TO
+sube: \subseteq{}
+#SUBSET OF OR EQUAL TO
+"8838": \subseteq{}
+#SUPERSET OF
+sup: \supset{}
+#SUPERSET OF
+"8835": \supset{}
+#SUPERSET OF OR EQUAL TO
+supe: \supseteq{}
+#SUPERSET OF OR EQUAL TO
+"8839": \supseteq{}
+#THEREFORE
+#requires amssymb
+there4: \therefore{}
+#THEREFORE
+#requires amssymb
+"8756": \therefore{}
+#DOUBLE VERTICAL LINE
+#requires textcomp
+"8214": \textbardbl{}
+#ANGSTROM SIGN
+"8491": \AA{}
+#SCRIPT CAPITAL B
+#requires mathrsfs
+"8492": B
+#RING OPERATOR
+"8728": \circ{}
+#DIAERESIS
+"168": \ddot{}
+#COMBINING FOUR DOTS ABOVE
+"8412": \ddot{}\kern4.5pt\ddot{ }
+#SCRIPT CAPITAL H
+#requires mathrsfs
+"8459": H
+#SCRIPT CAPITAL L
+#requires mathrsfs
+"8466": L
+#ASTERISK OPERATOR
+lowast: _\ast
+#ASTERISK OPERATOR
+"8727": _\ast
+#NOT AN ELEMENT OF
+notin: \not\in{}
+#NOT AN ELEMENT OF
+"8713": \not\in{}
+#SCRIPT SMALL O
+"8500": \mathit{o}
+#SCRIPT CAPITAL M
+#requires mathrsfs
+"8499": M
+#COMBINING THREE DOTS ABOVE
+"8411": \ddot{}\kern 3pt\dot{ }
+#TRIPLE PRIME
+"8244": "{'''}"
+#ESTIMATES
+"8793": \stackrel{\wedge}{=}
+#GREEK SMALL LETTER ALPHA
+alpha: \alpha{}
+#GREEK SMALL LETTER ALPHA
+"945": \alpha{}
+#GREEK SMALL LETTER BETA
+beta: \beta{}
+#GREEK SMALL LETTER BETA
+"946": \beta{}
+#GREEK SMALL LETTER GAMMA
+gamma: \gamma{}
+#GREEK SMALL LETTER GAMMA
+"947": \gamma{}
+#GREEK CAPITAL LETTER GAMMA
+Gamma: \Gamma{}
+#GREEK CAPITAL LETTER GAMMA
+"915": \Gamma{}
+#GREEK LETTER DIGAMMA
+#requires amssymb
+"988": \digamma{}
+#GREEK SMALL LETTER DELTA
+delta: \delta{}
+#GREEK SMALL LETTER DELTA
+"948": \delta{}
+#GREEK CAPITAL LETTER DELTA
+Delta: \Delta{}
+#GREEK CAPITAL LETTER DELTA
+"916": \Delta{}
+#GREEK SMALL LETTER EPSILON
+epsilon: \epsilon{}
+#GREEK SMALL LETTER EPSILON
+"949": \epsilon{}
+#SMALL ELEMENT OF
+"8714": \epsilon{}
+#GREEK SMALL LETTER ZETA
+zeta: \zeta{}
+#GREEK SMALL LETTER ZETA
+"950": \zeta{}
+#GREEK SMALL LETTER ETA
+eta: \eta{}
+#GREEK SMALL LETTER ETA
+"951": \eta{}
+#GREEK SMALL LETTER THETA
+theta: \theta{}
+#GREEK SMALL LETTER THETA
+"952": \theta{}
+#GREEK CAPITAL LETTER THETA
+Theta: \Theta{}
+#GREEK CAPITAL LETTER THETA
+"920": \Theta{}
+#GREEK THETA SYMBOL
+thetasym: \vartheta{}
+#GREEK THETA SYMBOL
+"977": \vartheta{}
+#GREEK SMALL LETTER IOTA
+iota: \iota{}
+#GREEK SMALL LETTER IOTA
+"953": \iota{}
+#GREEK SMALL LETTER KAPPA
+kappa: \kappa{}
+#GREEK SMALL LETTER KAPPA
+"954": \kappa{}
+#GREEK KAPPA SYMBOL
+#requires amssymb
+"1008": \varkappa{}
+#GREEK SMALL LETTER LAMDA
+lambda: \lambda{}
+#GREEK SMALL LETTER LAMDA
+"955": \lambda{}
+#GREEK CAPITAL LETTER LAMDA
+Lambda: \Lambda{}
+#GREEK CAPITAL LETTER LAMDA
+"923": \Lambda{}
+#GREEK SMALL LETTER MU
+mu: \mu{}
+#GREEK SMALL LETTER MU
+"956": \mu{}
+#GREEK SMALL LETTER NU
+nu: \nu{}
+#GREEK SMALL LETTER NU
+"957": \nu{}
+#GREEK SMALL LETTER XI
+xi: \xi{}
+#GREEK SMALL LETTER XI
+"958": \xi{}
+#GREEK CAPITAL LETTER XI
+Xi: \Xi{}
+#GREEK CAPITAL LETTER XI
+"926": \Xi{}
+#GREEK SMALL LETTER PI
+pi: \pi{}
+#GREEK SMALL LETTER PI
+"960": \pi{}
+#GREEK PI SYMBOL
+piv: \varpi{}
+#GREEK PI SYMBOL
+"982": \varpi{}
+#GREEK CAPITAL LETTER PI
+Pi: \Pi{}
+#GREEK CAPITAL LETTER PI
+"928": \Pi{}
+#GREEK SMALL LETTER RHO
+rho: \rho{}
+#GREEK SMALL LETTER RHO
+"961": \rho{}
+#GREEK RHO SYMBOL
+"1009": \varrho{}
+#GREEK SMALL LETTER SIGMA
+sigma: \sigma{}
+#GREEK SMALL LETTER SIGMA
+"963": \sigma{}
+#GREEK CAPITAL LETTER SIGMA
+Sigma: \Sigma{}
+#GREEK CAPITAL LETTER SIGMA
+"931": \Sigma{}
+#GREEK SMALL LETTER FINAL SIGMA
+sigmaf: \varsigma{}
+#GREEK SMALL LETTER FINAL SIGMA
+"962": \varsigma{}
+#GREEK SMALL LETTER TAU
+tau: \tau{}
+#GREEK SMALL LETTER TAU
+"964": \tau{}
+#GREEK SMALL LETTER UPSILON
+upsi: \upsilon{}
+#GREEK SMALL LETTER UPSILON
+"965": \upsilon{}
+#GREEK UPSILON WITH HOOK SYMBOL
+upsih: \Upsilon{}
+#GREEK UPSILON WITH HOOK SYMBOL
+"978": \Upsilon{}
+#GREEK SMALL LETTER PHI
+phis: \phi{}
+#GREEK SMALL LETTER PHI
+"966": \phi{}
+#GREEK CAPITAL LETTER PHI
+Phi: \Phi{}
+#GREEK CAPITAL LETTER PHI
+"934": \Phi{}
+#GREEK PHI SYMBOL
+"981": \varphi{}
+#GREEK SMALL LETTER CHI
+chi: \chi{}
+#GREEK SMALL LETTER CHI
+"967": \chi{}
+#GREEK SMALL LETTER PSI
+psi: \psi{}
+#GREEK SMALL LETTER PSI
+"968": \psi{}
+#GREEK CAPITAL LETTER PSI
+Psi: \Psi{}
+#GREEK CAPITAL LETTER PSI
+"936": \Psi{}
+#GREEK SMALL LETTER OMEGA
+omega: \omega{}
+#GREEK SMALL LETTER OMEGA
+"969": \omega{}
+#GREEK CAPITAL LETTER OMEGA
+Omega: \Omega{}
+#GREEK CAPITAL LETTER OMEGA
+"937": \Omega{}
+#GREEK SMALL LETTER ALPHA
+#requires amsbsy
+"945": \alpha{}
+#GREEK SMALL LETTER BETA
+#requires amsbsy
+"946": \beta{}
+#GREEK SMALL LETTER GAMMA
+#requires amsbsy
+"947": \gamma{}
+#GREEK CAPITAL LETTER GAMMA
+#requires amsbsy
+"915": \Gamma{}
+#GREEK LETTER DIGAMMA
+#requires amsbsy,amssymb
+"988": \digamma{}
+#GREEK SMALL LETTER DELTA
+#requires amsbsy
+"948": \delta{}
+#GREEK CAPITAL LETTER DELTA
+#requires amsbsy
+"916": \Delta{}
+#GREEK SMALL LETTER EPSILON
+#requires amsbsy
+"949": \epsilon{}
+#GREEK SMALL LETTER EPSILON
+#requires amsbsy
+"949": \varepsilon{}
+#GREEK SMALL LETTER EPSILON
+#requires amsbsy
+"949": \epsilon{}
+#GREEK SMALL LETTER ZETA
+#requires amsbsy
+"950": \zeta{}
+#GREEK SMALL LETTER ETA
+#requires amsbsy
+"951": \eta{}
+#GREEK SMALL LETTER THETA
+#requires amsbsy
+"952": \theta{}
+#GREEK CAPITAL LETTER THETA
+#requires amsbsy
+"920": \Theta{}
+#GREEK THETA SYMBOL
+#requires amsbsy
+"977": \vartheta{}
+#GREEK SMALL LETTER IOTA
+#requires amsbsy
+"953": \iota{}
+#GREEK SMALL LETTER KAPPA
+#requires amsbsy
+"954": \kappa{}
+#GREEK KAPPA SYMBOL
+#requires amsbsy,amssymb
+"1008": \varkappa{}
+#GREEK SMALL LETTER LAMDA
+#requires amsbsy
+"955": \lambda{}
+#GREEK CAPITAL LETTER LAMDA
+#requires amsbsy
+"923": \Lambda{}
+#GREEK SMALL LETTER MU
+#requires amsbsy
+"956": \mu{}
+#GREEK SMALL LETTER NU
+#requires amsbsy
+"957": \nu{}
+#GREEK SMALL LETTER XI
+#requires amsbsy
+"958": \xi{}
+#GREEK CAPITAL LETTER XI
+#requires amsbsy
+"926": \Xi{}
+#GREEK SMALL LETTER PI
+#requires amsbsy
+"960": \pi{}
+#GREEK CAPITAL LETTER PI
+#requires amsbsy
+"928": \Pi{}
+#GREEK PI SYMBOL
+#requires amsbsy
+"982": \varpi{}
+#GREEK SMALL LETTER RHO
+#requires amsbsy
+"961": \rho{}
+#GREEK RHO SYMBOL
+#requires amsbsy
+"1009": \varrho{}
+#GREEK SMALL LETTER SIGMA
+#requires amsbsy
+"963": \sigma{}
+#GREEK CAPITAL LETTER SIGMA
+#requires amsbsy
+"931": \Sigma{}
+#GREEK SMALL LETTER FINAL SIGMA
+#requires amsbsy
+"962": \varsigma{}
+#GREEK SMALL LETTER TAU
+#requires amsbsy
+"964": \tau{}
+#GREEK SMALL LETTER UPSILON
+#requires amsbsy
+"965": \upsilon{}
+#GREEK CAPITAL LETTER UPSILON
+#requires amsbsy
+"978": \Upsilon{}
+#GREEK SMALL LETTER PHI
+#requires amsbsy
+"966": \phi{}
+#GREEK CAPITAL LETTER PHI
+#requires amsbsy
+"934": \Phi{}
+#GREEK PHI SYMBOL
+#requires amsbsy
+"981": \varphi{}
+#GREEK SMALL LETTER CHI
+#requires amsbsy
+"967": \chi{}
+#GREEK SMALL LETTER PSI
+#requires amsbsy
+"968": \psi{}
+#GREEK CAPITAL LETTER PSI
+#requires amsbsy
+"936": \Psi{}
+#GREEK SMALL LETTER OMEGA
+#requires amsbsy
+"969": \omega{}
+#GREEK CAPITAL LETTER OMEGA
+#requires amsbsy
+"937": \Omega{}
+#ANGLE
+ang: \angle{}
+#ANGLE
+"8736": \angle{}
+#MEASURED ANGLE
+#requires amssymb
+"8737": \measuredangle{}
+#BET SYMBOL
+#requires amssymb
+"8502": \beth{}
+#REVERSED PRIME
+#requires amssymb
+"8245": ^\backprime
+#COMPLEMENT
+#requires amssymb
+"8705": \complement{}
+#DALET SYMBOL
+#requires amssymb
+"8504": \daleth{}
+#SCRIPT SMALL L
+"8467": \ell{}
+#EMPTY SET
+empty: \emptyset{}
+#EMPTY SET
+"8709": \emptyset{}
+#GIMEL SYMBOL
+#requires amssymb
+"8503": \gimel{}
+#BLACK-LETTER CAPITAL I
+image: \Im{}
+#BLACK-LETTER CAPITAL I
+"8465": \Im{}
+#THERE DOES NOT EXIST
+#requires amssymb
+"8708": \nexists{}
+#CIRCLED LATIN CAPITAL LETTER S
+#requires amssymb
+"9416": \textcircled{S}
+#PLANCK CONSTANT OVER TWO PI
+"8463": \hbar{}
+#BLACK-LETTER CAPITAL R
+real: \Re{}
+#BLACK-LETTER CAPITAL R
+"8476": \Re{}
+#SMALL REVERSE SOLIDUS
+#requires amssymb
+"65128": \smallsetminus{}
+#SCRIPT CAPITAL P
+weierp: \wp{}
+#SCRIPT CAPITAL P
+"8472": \wp{}
+#N-ARY COPRODUCT
+"8720": \amalg{}
+#PERSPECTIVE
+#requires amssymb
+"8966": \doublebarwedge{}
+#NAND
+#requires amssymb
+"8892": \barwedge{}
+#DOUBLE INTERSECTION
+#requires amssymb
+"8914": \Cap{}
+#DOUBLE UNION
+#requires amssymb
+"8915": \Cup{}
+#CURLY LOGICAL OR
+#requires amssymb
+"8910": \curlyvee{}
+#CURLY LOGICAL AND
+#requires amssymb
+"8911": \curlywedge{}
+#DIAMOND OPERATOR
+"8900": \diamond{}
+#DIVISION TIMES
+#requires amssymb
+"8903": \divideontimes{}
+#INTERCALATE
+#requires amssymb
+"8890": \intercal{}
+#LEFT SEMIDIRECT PRODUCT
+#requires amssymb
+"8907": \leftthreetimes{}
+#LEFT NORMAL FACTOR SEMIDIRECT PRODUCT
+#requires amssymb
+"8905": \ltimes{}
+#SQUARED MINUS
+#requires amssymb
+"8863": \boxminus{}
+#CIRCLED ASTERISK OPERATOR
+#requires amssymb
+"8859": \circledast{}
+#CIRCLED RING OPERATOR
+#requires amssymb
+"8858": \circledcirc{}
+#CIRCLED DASH
+#requires amssymb
+"8861": \circleddash{}
+#CIRCLED DOT OPERATOR
+"8857": \odot{}
+#CIRCLED MINUS
+"8854": \ominus{}
+#CIRCLED PLUS
+oplus: \oplus{}
+#CIRCLED PLUS
+"8853": \oplus{}
+#CIRCLED DIVISION SLASH
+"8856": \oslash{}
+#CIRCLED TIMES
+otimes: \otimes{}
+#CIRCLED TIMES
+"8855": \otimes{}
+#SQUARED PLUS
+#requires amssymb
+"8862": \boxplus{}
+#DOT PLUS
+#requires amssymb
+"8724": \dotplus{}
+#RIGHT SEMIDIRECT PRODUCT
+#requires amssymb
+"8908": \rightthreetimes{}
+#RIGHT NORMAL FACTOR SEMIDIRECT PRODUCT
+#requires amssymb
+"8906": \rtimes{}
+#DOT OPERATOR
+sdot: \cdot{}
+#DOT OPERATOR
+"8901": \cdot{}
+#SQUARED DOT OPERATOR
+#requires amssymb
+"8865": \boxdot{}
+#SET MINUS
+"8726": \setminus{}
+#SQUARE CAP
+"8851": \sqcap{}
+#SQUARE CUP
+"8852": \sqcup{}
+#STAR OPERATOR
+"8902": \star{}
+#SQUARED TIMES
+#requires amssymb
+"8864": \boxtimes{}
+#DOWN TACK
+"8868": \top{}
+#MULTISET UNION
+"8846": \uplus{}
+#WREATH PRODUCT
+"8768": \wr{}
+#LARGE CIRCLE
+#requires textcomp
+"9711": \textbigcircle{}
+#WHITE DOWN-POINTING TRIANGLE
+"9661": \bigtriangledown{}
+#WHITE UP-POINTING TRIANGLE
+"9651": \bigtriangleup{}
+#N-ARY COPRODUCT
+"8720": \coprod{}
+#N-ARY PRODUCT
+prod: \prod{}
+#N-ARY PRODUCT
+"8719": \prod{}
+#N-ARY SUMMATION
+sum: \sum{}
+#N-ARY SUMMATION
+"8721": \sum{}
+#ALMOST EQUAL OR EQUAL TO
+#requires amssymb
+"8778": \approxeq{}
+#EQUIVALENT TO
+asymp: \asymp{}
+#EQUIVALENT TO
+"8781": \asymp{}
+#ALL EQUAL TO
+#requires amssymb
+"8780": \backcong{}
+#SMALL CONTAINS AS MEMBER
+#requires amssymb
+"8717": \backepsilon{}
+#BOWTIE
+"8904": \bowtie{}
+#REVERSED TILDE
+#requires amssymb
+"8765": \backsim{}
+#REVERSED TILDE EQUALS
+#requires amssymb
+"8909": \backsimeq{}
+#GEOMETRICALLY EQUIVALENT TO
+#requires amssymb
+"8782": \Bumpeq{}
+#DIFFERENCE BETWEEN
+#requires amssymb
+"8783": \bumpeq{}
+#RING EQUAL TO
+#requires amssymb
+"8791": \circeq{}
+#COLON EQUALS
+"8788": ":="
+#EQUAL TO OR PRECEDES
+#requires amssymb
+"8926": \curlyeqprec{}
+#EQUAL TO OR SUCCEEDS
+#requires amssymb
+"8927": \curlyeqsucc{}
+#PRECEDES OR EQUAL TO
+#requires amssymb
+"8828": \preccurlyeq{}
+#LEFT TACK
+"8867": \dashv{}
+#RING IN EQUAL TO
+#requires amssymb
+"8790": \eqcirc{}
+#EQUALS COLON
+"8789": "=:"
+#GEOMETRICALLY EQUAL TO
+#requires amssymb
+"8785": \doteqdot{}
+#APPROACHES THE LIMIT
+"8784": \doteq{}
+#APPROXIMATELY EQUAL TO OR THE IMAGE OF
+#requires amssymb
+"8786": \fallingdotseq{}
+#EQUAL TO OR GREATER-THAN
+#requires amssymb
+"8925": \eqslantgtr{}
+#EQUAL TO OR LESS-THAN
+#requires amssymb
+"8924": \eqslantless{}
+#IMAGE OF OR APPROXIMATELY EQUAL TO
+#requires amssymb
+"8787": \risingdotseq{}
+#PITCHFORK
+#requires amssymb
+"8916": \pitchfork{}
+#FROWN
+"8994": \frown{}
+#GREATER-THAN WITH DOT
+#requires amssymb
+"8919": \gtrdot{}
+#GREATER-THAN OVER EQUAL TO
+#requires amssymb
+"8807": \geqq{}
+#GREATER-THAN EQUAL TO OR LESS-THAN
+#requires amssymb
+"8923": \gtreqless{}
+#GREATER-THAN EQUAL TO OR LESS-THAN
+#requires amssymb
+"8923": \gtreqqless{}
+#VERY MUCH GREATER-THAN
+#requires amssymb
+"8921": \ggg{}
+#GREATER-THAN OR LESS-THAN
+#requires amssymb
+"8823": \gtrless{}
+#GREATER-THAN OR EQUIVALENT TO
+#requires amssymb
+"8819": \gtrsim{}
+#MUCH GREATER-THAN
+"8811": \gg{}
+#LESS-THAN WITH DOT
+#requires amssymb
+"8918": \lessdot{}
+#LESS-THAN OVER EQUAL TO
+#requires amssymb
+"8806": \leqq{}
+#LESS-THAN EQUAL TO OR GREATER-THAN
+#requires amssymb
+"8922": \lesseqqgtr{}
+#LESS-THAN EQUAL TO OR GREATER-THAN
+#requires amssymb
+"8922": \lesseqgtr{}
+#LESS-THAN OR GREATER-THAN
+#requires amssymb
+"8822": \lessgtr{}
+#VERY MUCH LESS-THAN
+#requires amssymb
+"8920": \lll{}
+#LESS-THAN OR EQUIVALENT TO
+#requires amssymb
+"8818": \lesssim{}
+#MUCH LESS-THAN
+"8810": \ll{}
+#NORMAL SUBGROUP OF OR EQUAL TO
+#requires amssymb
+"8884": \trianglelefteq{}
+#DIVIDES
+"8739": \mid{}
+#MODELS
+"8871": \models{}
+#PRECEDES
+"8826": \prec{}
+#PRECEDES OR EQUAL TO
+"8828": \preceq{}
+#PRECEDES OR EQUIVALENT TO
+#requires amssymb
+"8830": \precsim{}
+#CONTAINS AS NORMAL SUBGROUP OR EQUAL TO
+#requires amssymb
+"8885": \trianglerighteq{}
+#SUCCEEDS
+"8827": \succ{}
+#SUCCEEDS OR EQUAL TO
+#requires amssymb
+"8829": \succcurlyeq{}
+#SUCCEEDS OR EQUAL TO
+"8829": \succeq{}
+#SUCCEEDS OR EQUIVALENT TO
+#requires amssymb
+"8831": \succsim{}
+#SMILE
+"8995": \smile{}
+#SQUARE IMAGE OF
+#requires amssymb
+"8847": \sqsubset{}
+#SQUARE IMAGE OF OR EQUAL TO
+"8849": \sqsubseteq{}
+#SQUARE ORIGINAL OF
+#requires amssymb
+"8848": \sqsupset{}
+#SQUARE ORIGINAL OF OR EQUAL TO
+"8850": \sqsupseteq{}
+#DOUBLE SUBSET
+#requires amssymb
+"8912": \Subset{}
+#SUBSET OF OR EQUAL TO
+#requires amssymb
+"8838": \subseteqq{}
+#DOUBLE SUPERSET
+#requires amssymb
+"8913": \Supset{}
+#SUPERSET OF OR EQUAL TO
+#requires amssymb
+"8839": \supseteqq{}
+#DELTA EQUAL TO
+#requires amssymb
+"8796": \triangleq{}
+#BETWEEN
+#requires amssymb
+"8812": \between{}
+#RIGHT TACK
+"8866": \vdash{}
+#FORCES
+#requires amssymb
+"8873": \Vdash{}
+#TRUE
+#requires amssymb
+"8872": \vDash{}
+#XOR
+#requires amssymb
+"8891": \veebar{}
+#NORMAL SUBGROUP OF
+#requires amssymb
+"8882": \vartriangleleft{}
+#PROPORTIONAL TO
+#requires amssymb
+"8733": \varpropto{}
+#CONTAINS AS NORMAL SUBGROUP
+#requires amssymb
+"8883": \vartriangleright{}
+#TRIPLE VERTICAL BAR RIGHT TURNSTILE
+#requires amssymb
+"8874": \Vvdash{}
+#GREATER-THAN BUT NOT EQUAL TO
+#requires amssymb
+"8809": \gneq{}
+#GREATER-THAN BUT NOT EQUAL TO
+#requires amssymb
+"8809": \gneqq{}
+#GREATER-THAN BUT NOT EQUIVALENT TO
+#requires amssymb
+"8935": \gnsim{}
+#GREATER-THAN BUT NOT EQUAL TO
+#requires amssymb
+"8809": \gvertneqq{}
+#LESS-THAN BUT NOT EQUAL TO
+#requires amssymb
+"8808": \lneqq{}
+#LESS-THAN BUT NOT EQUAL TO
+#requires amssymb
+"8808": \lneq{}
+#LESS-THAN BUT NOT EQUIVALENT TO
+#requires amssymb
+"8934": \lnsim{}
+#LESS-THAN BUT NOT EQUAL TO
+#requires amssymb
+"8808": \lvertneqq{}
+#NOT ALMOST EQUAL TO
+"8777": \not\approx{}
+#NEITHER APPROXIMATELY NOR ACTUALLY EQUAL TO
+#requires amssymb
+"8775": \not\cong{}
+#NOT IDENTICAL TO
+"8802": \not\equiv{}
+#NEITHER GREATER-THAN NOR EQUAL TO
+#requires amssymb
+"8817": \not\geq{}
+#NEITHER GREATER-THAN NOR EQUAL TO
+#requires amssymb
+"8817": \ngeqslant{}
+#NOT GREATER-THAN
+#requires amssymb
+"8815": \not>
+#NEITHER LESS-THAN NOR EQUAL TO
+#requires amssymb
+"8816": \not\leq{}
+#NEITHER LESS-THAN NOR EQUAL TO
+#requires amssymb
+"8816": \nleqslant{}
+#NOT LESS-THAN
+#requires amssymb
+"8814": \not<
+#NOT NORMAL SUBGROUP OF
+#requires amssymb
+"8938": \ntriangleleft{}
+#NOT NORMAL SUBGROUP OF OR EQUAL TO
+#requires amssymb
+"8940": \ntrianglelefteq{}
+#DOES NOT DIVIDE
+#requires amssymb
+"8740": \nmid{}
+#NOT PARALLEL TO
+#requires amssymb
+"8742": \nparallel{}
+#DOES NOT PRECEDE
+#requires amssymb
+"8832": \not\prec{}
+#DOES NOT PRECEDE OR EQUAL
+#requires amssymb
+"8928": \not\preceq{}
+#DOES NOT CONTAIN AS NORMAL SUBGROUP
+#requires amssymb
+"8939": \ntriangleright{}
+#DOES NOT CONTAIN AS NORMAL SUBGROUP OR EQUAL
+#requires amssymb
+"8941": \ntrianglerighteq{}
+#DOES NOT SUCCEED
+#requires amssymb
+"8833": \not\succ{}
+#DOES NOT SUCCEED OR EQUAL
+#requires amssymb
+"8929": \not\succeq{}
+#NOT TILDE
+#requires amssymb
+"8769": \not\sim{}
+#NOT ASYMPTOTICALLY EQUAL TO
+"8772": \not\simeq{}
+#NOT A SUBSET OF
+nsub: \not\subset{}
+#NOT A SUBSET OF
+"8836": \not\subset{}
+#NEITHER A SUBSET OF NOR EQUAL TO
+#requires amssymb
+"8840": \not\subseteq{}
+#NEITHER A SUBSET OF NOR EQUAL TO
+#requires amssymb
+"8840": \nsubseteqq{}
+#NOT A SUPERSET OF
+"8837": \not\supset{}
+#NEITHER A SUPERSET OF NOR EQUAL TO
+#requires amssymb
+"8841": \nsupseteqq{}
+#NEITHER A SUPERSET OF NOR EQUAL TO
+#requires amssymb
+"8841": \not\supseteq{}
+#DOES NOT PROVE
+#requires amssymb
+"8876": \nvdash{}
+#NOT TRUE
+#requires amssymb
+"8877": \nvDash{}
+#NEGATED DOUBLE VERTICAL BAR DOUBLE RIGHT TURNSTILE
+#requires amssymb
+"8879": \nVDash{}
+#DOES NOT FORCE
+#requires amssymb
+"8878": \nVdash{}
+#PRECEDES BUT NOT EQUIVALENT TO
+#requires amssymb
+"8936": \precnsim{}
+#SUCCEEDS BUT NOT EQUIVALENT TO
+#requires amssymb
+"8937": \succnsim{}
+#TRUE
+#requires amssymb
+"8842": \subsetneq{}
+#TRUE
+#requires amssymb
+"8842": \subsetneqq{}
+#SUPERSET OF WITH NOT EQUAL TO
+#requires amssymb
+"8843": \supsetneq{}
+#SUPERSET OF WITH NOT EQUAL TO
+#requires amssymb
+"8843": \supsetneqq{}
+#ANTICLOCKWISE TOP SEMICIRCLE ARROW
+#requires amssymb
+"8630": \curvearrowleft{}
+#CLOCKWISE TOP SEMICIRCLE ARROW
+#requires amssymb
+"8631": \curvearrowright{}
+#DOWNWARDS DOUBLE ARROW
+dArr: \Downarrow{}
+#DOWNWARDS DOUBLE ARROW
+"8659": \Downarrow{}
+#DOWNWARDS PAIRED ARROWS
+#requires amssymb
+"8650": \downdownarrows{}
+#DOWNWARDS HARPOON WITH BARB LEFTWARDS
+#requires amssymb
+"8643": \downharpoonleft{}
+#DOWNWARDS HARPOON WITH BARB RIGHTWARDS
+#requires amssymb
+"8642": \downharpoonright{}
+#LEFTWARDS TRIPLE ARROW
+#requires amssymb
+"8666": \Lleftarrow{}
+#LEFTWARDS TWO HEADED ARROW
+#requires amssymb
+"8606": \twoheadleftarrow{}
+#LEFTWARDS PAIRED ARROWS
+#requires amssymb
+"8647": \leftleftarrows{}
+#LEFTWARDS ARROW WITH HOOK
+"8617": \hookleftarrow{}
+#LEFTWARDS ARROW WITH LOOP
+#requires amssymb
+"8619": \looparrowleft{}
+#LEFTWARDS ARROW WITH TAIL
+#requires amssymb
+"8610": \leftarrowtail{}
+#LEFTWARDS HARPOON WITH BARB DOWNWARDS
+"8637": \leftharpoondown{}
+#LEFTWARDS HARPOON WITH BARB UPWARDS
+"8636": \leftharpoonup{}
+#LEFT RIGHT DOUBLE ARROW
+hArr: \Leftrightarrow{}
+#LEFT RIGHT DOUBLE ARROW
+"8660": \Leftrightarrow{}
+#LEFT RIGHT ARROW
+harr: \leftrightarrow{}
+#LEFT RIGHT ARROW
+"8596": \leftrightarrow{}
+#LEFTWARDS ARROW OVER RIGHTWARDS ARROW
+#requires amssymb
+"8646": \leftrightarrows{}
+#RIGHTWARDS ARROW OVER LEFTWARDS ARROW
+#requires amssymb
+"8644": \rightleftarrows{}
+#LEFT RIGHT WAVE ARROW
+#requires amssymb
+"8621": \leftrightsquigarrow{}
+#RIGHTWARDS HARPOON OVER LEFTWARDS HARPOON
+"8652": \rightleftharpoons{}
+#LEFTWARDS HARPOON OVER RIGHTWARDS HARPOON
+#requires amssymb
+"8651": \leftrightharpoons{}
+#UPWARDS ARROW WITH TIP LEFTWARDS
+#requires amssymb
+"8624": \Lsh{}
+#RIGHTWARDS ARROW FROM BAR
+"8614": \mapsto{}
+#MULTIMAP
+#requires amssymb
+"8888": \multimap{}
+#NORTH EAST ARROW
+"8599": \nearrow{}
+#LEFTWARDS DOUBLE ARROW WITH STROKE
+#requires amssymb
+"8653": \nLeftarrow{}
+#LEFTWARDS ARROW WITH STROKE
+#requires amssymb
+"8602": \nleftarrow{}
+#LEFT RIGHT DOUBLE ARROW WITH STROKE
+#requires amssymb
+"8654": \nLeftrightarrow{}
+#LEFT RIGHT ARROW WITH STROKE
+#requires amssymb
+"8622": \nleftrightarrow{}
+#RIGHTWARDS ARROW WITH STROKE
+#requires amssymb
+"8603": \nrightarrow{}
+#RIGHTWARDS DOUBLE ARROW WITH STROKE
+#requires amssymb
+"8655": \nRightarrow{}
+#NORTH WEST ARROW
+"8598": \nwarrow{}
+#ANTICLOCKWISE OPEN CIRCLE ARROW
+#requires amssymb
+"8634": \circlearrowleft{}
+#CLOCKWISE OPEN CIRCLE ARROW
+#requires amssymb
+"8635": \circlearrowright{}
+#RIGHTWARDS TRIPLE ARROW
+#requires amssymb
+"8667": \Rrightarrow{}
+#RIGHTWARDS TWO HEADED ARROW
+#requires amssymb
+"8608": \twoheadrightarrow{}
+#RIGHTWARDS PAIRED ARROWS
+#requires amssymb
+"8649": \rightrightarrows{}
+#RIGHTWARDS ARROW WITH HOOK
+"8618": \hookrightarrow{}
+#RIGHTWARDS ARROW WITH LOOP
+#requires amssymb
+"8620": \looparrowright{}
+#RIGHTWARDS ARROW WITH TAIL
+#requires amssymb
+"8611": \rightarrowtail{}
+#RIGHTWARDS SQUIGGLE ARROW
+#requires amssymb
+"8669": \rightsquigarrow{}
+#RIGHTWARDS HARPOON WITH BARB DOWNWARDS
+"8641": \rightharpoondown{}
+#RIGHTWARDS HARPOON WITH BARB UPWARDS
+"8640": \rightharpoonup{}
+#UPWARDS ARROW WITH TIP RIGHTWARDS
+#requires amssymb
+"8625": \Rsh{}
+#SOUTH EAST ARROW
+"8600": \searrow{}
+#SOUTH WEST ARROW
+"8601": \swarrow{}
+#UPWARDS DOUBLE ARROW
+uArr: \Uparrow{}
+#UPWARDS DOUBLE ARROW
+"8657": \Uparrow{}
+#UPWARDS PAIRED ARROWS
+#requires amssymb
+"8648": \upuparrows{}
+#UP DOWN DOUBLE ARROW
+"8661": \Updownarrow{}
+#UP DOWN ARROW
+"8597": \updownarrow{}
+#UPWARDS HARPOON WITH BARB LEFTWARDS
+#requires amssymb
+"8639": \upharpoonleft{}
+#UPWARDS HARPOON WITH BARB RIGHTWARDS
+#requires amssymb
+"8638": \upharpoonright{}
+#RIGHT CEILING
+rceil: \rceil{}
+#RIGHT CEILING
+"8969": \rceil{}
+#RIGHT FLOOR
+rfloor: \rfloor{}
+#RIGHT FLOOR
+"8971": \rfloor{}
+#TOP RIGHT CORNER
+#requires amsfonts
+"8989": \urcorner{}
+#BOTTOM RIGHT CORNER
+#requires amsfonts
+"8991": \lrcorner{}
+#LEFT CEILING
+lceil: \lceil{}
+#LEFT CEILING
+"8968": \lceil{}
+#LEFT FLOOR
+lfloor: \lfloor{}
+#LEFT FLOOR
+"8970": \lfloor{}
+#TOP LEFT CORNER
+#requires amsfonts
+"8988": \ulcorner{}
+#BOTTOM LEFT CORNER
+#requires amsfonts
+"8990": \llcorner{}
+#LATIN SMALL LETTER A WITH ACUTE
+aacute: \'{a}
+#LATIN SMALL LETTER A WITH ACUTE
+"225": \'{a}
+#LATIN CAPITAL LETTER A WITH ACUTE
+Aacute: \'{A}
+#LATIN CAPITAL LETTER A WITH ACUTE
+"193": \'{A}
+#LATIN SMALL LETTER A WITH CIRCUMFLEX
+acirc: \^{a}
+#LATIN SMALL LETTER A WITH CIRCUMFLEX
+"226": \^{a}
+#LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+Acirc: \^{A}
+#LATIN CAPITAL LETTER A WITH CIRCUMFLEX
+"194": \^{A}
+#LATIN SMALL LETTER A WITH GRAVE
+agrave: \`{a}
+#LATIN SMALL LETTER A WITH GRAVE
+"224": \`{a}
+#LATIN CAPITAL LETTER A WITH GRAVE
+Agrave: \`{A}
+#LATIN CAPITAL LETTER A WITH GRAVE
+"192": \`{A}
+#LATIN SMALL LETTER A WITH RING ABOVE
+aring: \aa{}
+#LATIN SMALL LETTER A WITH RING ABOVE
+"229": \aa{}
+#LATIN CAPITAL LETTER A WITH RING ABOVE
+Aring: \AA{}
+#LATIN CAPITAL LETTER A WITH RING ABOVE
+"197": \AA{}
+#LATIN SMALL LETTER A WITH TILDE
+atilde: \~{a}
+#LATIN SMALL LETTER A WITH TILDE
+"227": \~{a}
+#LATIN CAPITAL LETTER A WITH TILDE
+Atilde: \~{A}
+#LATIN CAPITAL LETTER A WITH TILDE
+"195": \~{A}
+#LATIN SMALL LETTER A WITH DIAERESIS
+auml: \"{a}
+#LATIN SMALL LETTER A WITH DIAERESIS
+"228": \"{a}
+#LATIN CAPITAL LETTER A WITH DIAERESIS
+Auml: \"{A}
+#LATIN CAPITAL LETTER A WITH DIAERESIS
+"196": \"{A}
+#LATIN SMALL LETTER AE
+aelig: \ae{}
+#LATIN SMALL LETTER AE
+"230": \ae{}
+#LATIN CAPITAL LETTER AE
+AElig: \AE{}
+#LATIN CAPITAL LETTER AE
+"198": \AE{}
+#LATIN SMALL LETTER C WITH CEDILLA
+ccedil: \c{c}
+#LATIN SMALL LETTER C WITH CEDILLA
+"231": \c{c}
+#LATIN CAPITAL LETTER C WITH CEDILLA
+Ccedil: \c{C}
+#LATIN CAPITAL LETTER C WITH CEDILLA
+"199": \c{C}
+#LATIN SMALL LETTER ETH
+#requires amssymb
+eth: \dh{}
+#LATIN SMALL LETTER ETH
+#requires amssymb
+"240": \dh{}
+#LATIN CAPITAL LETTER ETH
+#requires wasysym
+ETH: \DH{}
+#LATIN CAPITAL LETTER ETH
+#requires wasysym
+"208": \DH{}
+#LATIN SMALL LETTER E WITH ACUTE
+eacute: \'{e}
+#LATIN SMALL LETTER E WITH ACUTE
+"233": \'{e}
+#LATIN CAPITAL LETTER E WITH ACUTE
+Eacute: \'{E}
+#LATIN CAPITAL LETTER E WITH ACUTE
+"201": \'{E}
+#LATIN SMALL LETTER E WITH CIRCUMFLEX
+ecirc: \^{e}
+#LATIN SMALL LETTER E WITH CIRCUMFLEX
+"234": \^{e}
+#LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+Ecirc: \^{E}
+#LATIN CAPITAL LETTER E WITH CIRCUMFLEX
+"202": \^{E}
+#LATIN SMALL LETTER E WITH GRAVE
+egrave: \`{e}
+#LATIN SMALL LETTER E WITH GRAVE
+"232": \`{e}
+#LATIN CAPITAL LETTER E WITH GRAVE
+Egrave: \`{E}
+#LATIN CAPITAL LETTER E WITH GRAVE
+"200": \`{E}
+#LATIN SMALL LETTER E WITH DIAERESIS
+euml: \"{e}
+#LATIN SMALL LETTER E WITH DIAERESIS
+"235": \"{e}
+#LATIN CAPITAL LETTER E WITH DIAERESIS
+Euml: \"{E}
+#LATIN CAPITAL LETTER E WITH DIAERESIS
+"203": \"{E}
+#LATIN SMALL LETTER I WITH ACUTE
+iacute: \'{\i}
+#LATIN SMALL LETTER I WITH ACUTE
+"237": \'{\i}
+#LATIN CAPITAL LETTER I WITH ACUTE
+Iacute: \'{I}
+#LATIN CAPITAL LETTER I WITH ACUTE
+"205": \'{I}
+#LATIN SMALL LETTER I WITH CIRCUMFLEX
+icirc: \^{\i}
+#LATIN SMALL LETTER I WITH CIRCUMFLEX
+"238": \^{\i}
+#LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+Icirc: \^{I}
+#LATIN CAPITAL LETTER I WITH CIRCUMFLEX
+"206": \^{I}
+#LATIN SMALL LETTER I WITH GRAVE
+igrave: \`{\i}
+#LATIN SMALL LETTER I WITH GRAVE
+"236": \`{\i}
+#LATIN CAPITAL LETTER I WITH GRAVE
+Igrave: \`{I}
+#LATIN CAPITAL LETTER I WITH GRAVE
+"204": \`{I}
+#LATIN SMALL LETTER I WITH DIAERESIS
+iuml: \"{\i}
+#LATIN SMALL LETTER I WITH DIAERESIS
+"239": \"{\i}
+#LATIN CAPITAL LETTER I WITH DIAERESIS
+Iuml: \"{I}
+#LATIN CAPITAL LETTER I WITH DIAERESIS
+"207": \"{I}
+#LATIN SMALL LETTER N WITH TILDE
+ntilde: \~{n}
+#LATIN SMALL LETTER N WITH TILDE
+"241": \~{n}
+#LATIN CAPITAL LETTER N WITH TILDE
+Ntilde: \~{N}
+#LATIN CAPITAL LETTER N WITH TILDE
+"209": \~{N}
+#LATIN SMALL LETTER O WITH ACUTE
+oacute: \'{o}
+#LATIN SMALL LETTER O WITH ACUTE
+"243": \'{o}
+#LATIN CAPITAL LETTER O WITH ACUTE
+Oacute: \'{O}
+#LATIN CAPITAL LETTER O WITH ACUTE
+"211": \'{O}
+#LATIN SMALL LETTER O WITH CIRCUMFLEX
+ocirc: \^{o}
+#LATIN SMALL LETTER O WITH CIRCUMFLEX
+"244": \^{o}
+#LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+Ocirc: \^{O}
+#LATIN CAPITAL LETTER O WITH CIRCUMFLEX
+"212": \^{O}
+#LATIN SMALL LETTER O WITH GRAVE
+ograve: \`{o}
+#LATIN SMALL LETTER O WITH GRAVE
+"242": \`{o}
+#LATIN CAPITAL LETTER O WITH GRAVE
+Ograve: \`{O}
+#LATIN CAPITAL LETTER O WITH GRAVE
+"210": \`{O}
+#LATIN SMALL LETTER O WITH STROKE
+oslash: \o{}
+#LATIN SMALL LETTER O WITH STROKE
+"248": \o{}
+#LATIN CAPITAL LETTER O WITH STROKE
+Oslash: \O{}
+#LATIN CAPITAL LETTER O WITH STROKE
+"216": \O{}
+#LATIN SMALL LETTER O WITH TILDE
+otilde: \~{o}
+#LATIN SMALL LETTER O WITH TILDE
+"245": \~{o}
+#LATIN CAPITAL LETTER O WITH TILDE
+Otilde: \~{O}
+#LATIN CAPITAL LETTER O WITH TILDE
+"213": \~{O}
+#LATIN SMALL LETTER O WITH DIAERESIS
+ouml: \"{o}
+#LATIN SMALL LETTER O WITH DIAERESIS
+"246": \"{o}
+#LATIN CAPITAL LETTER O WITH DIAERESIS
+Ouml: \"{O}
+#LATIN CAPITAL LETTER O WITH DIAERESIS
+"214": \"{O}
+#LATIN SMALL LETTER SHARP S
+szlig: \ss{}
+#LATIN SMALL LETTER SHARP S
+"223": \ss{}
+#LATIN SMALL LETTER THORN
+#requires wasysym
+thorn: \th{}
+#LATIN SMALL LETTER THORN
+#requires wasysym
+"254": \th{}
+#LATIN CAPITAL LETTER THORN
+#requires wasysym
+THORN: \TH{}
+#LATIN CAPITAL LETTER THORN
+#requires wasysym
+"222": \TH{}
+#LATIN SMALL LETTER U WITH ACUTE
+uacute: \'{u}
+#LATIN SMALL LETTER U WITH ACUTE
+"250": \'{u}
+#LATIN CAPITAL LETTER U WITH ACUTE
+Uacute: \'{U}
+#LATIN CAPITAL LETTER U WITH ACUTE
+"218": \'{U}
+#LATIN SMALL LETTER U WITH CIRCUMFLEX
+ucirc: \^{u}
+#LATIN SMALL LETTER U WITH CIRCUMFLEX
+"251": \^{u}
+#LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+Ucirc: \^{U}
+#LATIN CAPITAL LETTER U WITH CIRCUMFLEX
+"219": \^{U}
+#LATIN SMALL LETTER U WITH GRAVE
+ugrave: \`{u}
+#LATIN SMALL LETTER U WITH GRAVE
+"249": \`{u}
+#LATIN CAPITAL LETTER U WITH GRAVE
+Ugrave: \`{U}
+#LATIN CAPITAL LETTER U WITH GRAVE
+"217": \`{U}
+#LATIN SMALL LETTER U WITH DIAERESIS
+uuml: \"{u}
+#LATIN SMALL LETTER U WITH DIAERESIS
+"252": \"{u}
+#LATIN CAPITAL LETTER U WITH DIAERESIS
+Uuml: \"{U}
+#LATIN CAPITAL LETTER U WITH DIAERESIS
+"220": \"{U}
+#LATIN SMALL LETTER Y WITH ACUTE
+yacute: \'{y}
+#LATIN SMALL LETTER Y WITH ACUTE
+"253": \'{y}
+#LATIN CAPITAL LETTER Y WITH ACUTE
+Yacute: \'{Y}
+#LATIN CAPITAL LETTER Y WITH ACUTE
+"221": \'{Y}
+#LATIN SMALL LETTER Y WITH DIAERESIS
+yuml: \"{y}
+#LATIN SMALL LETTER Y WITH DIAERESIS
+"255": \"{y}
+#LATIN SMALL LETTER A WITH BREVE
+"259": \u{a}
+#LATIN CAPITAL LETTER A WITH BREVE
+"258": \u{A}
+#LATIN SMALL LETTER A WITH MACRON
+"257": \={a}
+#LATIN CAPITAL LETTER A WITH MACRON
+"256": \={A}
+#LATIN SMALL LETTER A WITH OGONEK
+#requires fontenc:T1
+"261": \k{a}
+#LATIN CAPITAL LETTER A WITH OGONEK
+#requires fontenc:T1
+"260": \k{A}
+#LATIN SMALL LETTER C WITH ACUTE
+"263": \'{c}
+#LATIN CAPITAL LETTER C WITH ACUTE
+"262": \'{C}
+#LATIN SMALL LETTER C WITH CARON
+"269": \v{c}
+#LATIN CAPITAL LETTER C WITH CARON
+"268": \v{C}
+#LATIN SMALL LETTER C WITH CIRCUMFLEX
+"265": \^{c}
+#LATIN CAPITAL LETTER C WITH CIRCUMFLEX
+"264": \^{C}
+#LATIN SMALL LETTER C WITH DOT ABOVE
+"267": \.{c}
+#LATIN CAPITAL LETTER C WITH DOT ABOVE
+"266": \.{C}
+#LATIN SMALL LETTER D WITH CARON
+"271": \v{d}
+#LATIN CAPITAL LETTER D WITH CARON
+"270": \v{D}
+#LATIN SMALL LETTER D WITH STROKE
+#requires fontenc:T1
+"273": \dj{}
+#LATIN CAPITAL LETTER D WITH STROKE
+#requires fontenc:T1
+"272": \DJ{}
+#LATIN SMALL LETTER E WITH CARON
+"283": \v{e}
+#LATIN CAPITAL LETTER E WITH CARON
+"282": \v{E}
+#LATIN SMALL LETTER E WITH DOT ABOVE
+"279": \.{e}
+#LATIN CAPITAL LETTER E WITH DOT ABOVE
+"278": \.{E}
+#LATIN SMALL LETTER E WITH MACRON
+"275": \={e}
+#LATIN CAPITAL LETTER E WITH MACRON
+"274": \={E}
+#LATIN SMALL LETTER E WITH OGONEK
+#requires fontenc:T1
+"281": \k{e}
+#LATIN CAPITAL LETTER E WITH OGONEK
+#requires fontenc:T1
+"280": \k{E}
+#LATIN SMALL LETTER G WITH ACUTE
+"501": \'{g}
+#LATIN SMALL LETTER G WITH BREVE
+"287": \u{g}
+#LATIN CAPITAL LETTER G WITH BREVE
+"286": \u{G}
+#LATIN CAPITAL LETTER G WITH CEDILLA
+"290": \c{G}
+#LATIN SMALL LETTER G WITH CIRCUMFLEX
+"285": \^{g}
+#LATIN CAPITAL LETTER G WITH CIRCUMFLEX
+"284": \^{G}
+#LATIN SMALL LETTER G WITH DOT ABOVE
+"289": \.{g}
+#LATIN CAPITAL LETTER G WITH DOT ABOVE
+"288": \.{G}
+#LATIN SMALL LETTER H WITH CIRCUMFLEX
+"293": \^{h}
+#LATIN CAPITAL LETTER H WITH CIRCUMFLEX
+"292": \^{H}
+#LATIN SMALL LETTER H WITH STROKE
+"295": \hstrok{}
+#LATIN CAPITAL LETTER H WITH STROKE
+"294": \Hstrok{}
+#LATIN CAPITAL LETTER I WITH DOT ABOVE
+"304": \.{I}
+#LATIN CAPITAL LETTER I WITH MACRON
+"298": \={I}
+#LATIN SMALL LETTER I WITH MACRON
+"299": \={\i}
+#LATIN SMALL LIGATURE IJ
+"307": i\kern -.15em j
+#LATIN CAPITAL LIGATURE IJ
+"306": I\kern -.15em J
+#LATIN SMALL LETTER DOTLESS I
+"305": \i{}
+#LATIN SMALL LETTER I WITH OGONEK
+#requires fontenc:T1
+"303": \k{i}
+#LATIN CAPITAL LETTER I WITH OGONEK
+#requires fontenc:T1
+"302": \k{I}
+#LATIN SMALL LETTER I WITH TILDE
+"297": \~{\i}
+#LATIN CAPITAL LETTER I WITH TILDE
+"296": \~{I}
+#LATIN SMALL LETTER J WITH CIRCUMFLEX
+"309": \^{\j}
+#LATIN CAPITAL LETTER J WITH CIRCUMFLEX
+"308": \^{J}
+#LATIN SMALL LETTER K WITH CEDILLA
+"311": \c{k}
+#LATIN CAPITAL LETTER K WITH CEDILLA
+"310": \c{K}
+#LATIN SMALL LETTER KRA
+"312": \textsc{k}
+#LATIN SMALL LETTER L WITH ACUTE
+"314": \'{l}
+#LATIN CAPITAL LETTER L WITH ACUTE
+"313": \'{L}
+#LATIN SMALL LETTER L WITH CARON
+"318": \v{l}
+#LATIN CAPITAL LETTER L WITH CARON
+"317": \v{L}
+#LATIN SMALL LETTER L WITH CEDILLA
+"316": \c{l}
+#LATIN CAPITAL LETTER L WITH CEDILLA
+"315": \c{L}
+#LATIN SMALL LETTER L WITH MIDDLE DOT
+"320": \lmidot{}
+#LATIN CAPITAL LETTER L WITH MIDDLE DOT
+"319": \Lmidot{}
+#LATIN SMALL LETTER L WITH STROKE
+"322": \l{}
+#LATIN CAPITAL LETTER L WITH STROKE
+"321": \L{}
+#LATIN SMALL LETTER N WITH ACUTE
+"324": \'{n}
+#LATIN CAPITAL LETTER N WITH ACUTE
+"323": \'{N}
+#LATIN SMALL LETTER ENG
+#requires fontenc:T1
+"331": \ng{}
+#LATIN CAPITAL LETTER ENG
+#requires fontenc:T1
+"330": \NG{}
+#LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
+"329": n\kern-.2em\textsf{'}
+#LATIN SMALL LETTER N WITH CARON
+"328": \v{n}
+#LATIN CAPITAL LETTER N WITH CARON
+"327": \v{N}
+#LATIN SMALL LETTER N WITH CEDILLA
+"326": \c{n}
+#LATIN CAPITAL LETTER N WITH CEDILLA
+"325": \c{N}
+#LATIN SMALL LETTER O WITH DOUBLE ACUTE
+"337": \H{o}
+#LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
+"336": \H{O}
+#LATIN CAPITAL LETTER O WITH MACRON
+"332": \={O}
+#LATIN SMALL LETTER O WITH MACRON
+"333": \={o}
+#LATIN SMALL LIGATURE OE
+oelig: \oe{}
+#LATIN SMALL LIGATURE OE
+"339": \oe{}
+#LATIN CAPITAL LIGATURE OE
+OElig: \OE{}
+#LATIN CAPITAL LIGATURE OE
+"338": \OE{}
+#LATIN SMALL LETTER R WITH ACUTE
+"341": \'{r}
+#LATIN CAPITAL LETTER R WITH ACUTE
+"340": \'{R}
+#LATIN SMALL LETTER R WITH CARON
+"345": \v{r}
+#LATIN CAPITAL LETTER R WITH CARON
+"344": \v{R}
+#LATIN SMALL LETTER R WITH CEDILLA
+"343": \c{r}
+#LATIN CAPITAL LETTER R WITH CEDILLA
+"342": \c{R}
+#LATIN SMALL LETTER S WITH ACUTE
+"347": \'{s}
+#LATIN CAPITAL LETTER S WITH ACUTE
+"346": \'{S}
+#LATIN SMALL LETTER S WITH CARON
+scaron: \v{s}
+#LATIN SMALL LETTER S WITH CARON
+"353": \v{s}
+#LATIN CAPITAL LETTER S WITH CARON
+Scaron: \v{S}
+#LATIN CAPITAL LETTER S WITH CARON
+"352": \v{S}
+#LATIN SMALL LETTER S WITH CEDILLA
+"351": \c{s}
+#LATIN CAPITAL LETTER S WITH CEDILLA
+"350": \c{S}
+#LATIN SMALL LETTER S WITH CIRCUMFLEX
+"349": \^{s}
+#LATIN CAPITAL LETTER S WITH CIRCUMFLEX
+"348": \^{S}
+#LATIN SMALL LETTER T WITH CARON
+"357": \v{t}
+#LATIN CAPITAL LETTER T WITH CARON
+"356": \v{T}
+#LATIN SMALL LETTER T WITH CEDILLA
+"355": \c{t}
+#LATIN CAPITAL LETTER T WITH CEDILLA
+"354": \c{T}
+#LATIN SMALL LETTER T WITH STROKE
+"359": \tstrok{}
+#LATIN CAPITAL LETTER T WITH STROKE
+"358": \Tstrok{}
+#LATIN SMALL LETTER U WITH BREVE
+"365": \u{u}
+#LATIN CAPITAL LETTER U WITH BREVE
+"364": \u{U}
+#LATIN SMALL LETTER U WITH DOUBLE ACUTE
+"369": \H{u}
+#LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
+"368": \H{U}
+#LATIN SMALL LETTER U WITH MACRON
+"363": \={u}
+#LATIN CAPITAL LETTER U WITH MACRON
+"362": \={U}
+#LATIN SMALL LETTER U WITH OGONEK
+#requires fontenc:T1
+"371": \k{u}
+#LATIN CAPITAL LETTER U WITH OGONEK
+#requires fontenc:T1
+"370": \k{U}
+#LATIN SMALL LETTER U WITH RING ABOVE
+"367": \r{u}
+#LATIN CAPITAL LETTER U WITH RING ABOVE
+"366": \r{U}
+#LATIN SMALL LETTER U WITH TILDE
+"361": \~{u}
+#LATIN CAPITAL LETTER U WITH TILDE
+"360": \~{U}
+#LATIN SMALL LETTER W WITH CIRCUMFLEX
+"373": \^{w}
+#LATIN CAPITAL LETTER W WITH CIRCUMFLEX
+"372": \^{W}
+#LATIN SMALL LETTER Y WITH CIRCUMFLEX
+"375": \^{y}
+#LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
+"374": \^{Y}
+#LATIN CAPITAL LETTER Y WITH DIAERESIS
+Yuml: \"{Y}
+#LATIN CAPITAL LETTER Y WITH DIAERESIS
+"376": \"{Y}
+#LATIN SMALL LETTER Z WITH ACUTE
+"378": \'{z}
+#LATIN CAPITAL LETTER Z WITH ACUTE
+"377": \'{Z}
+#LATIN SMALL LETTER Z WITH CARON
+"382": \v{z}
+#LATIN CAPITAL LETTER Z WITH CARON
+"381": \v{Z}
+#LATIN SMALL LETTER Z WITH DOT ABOVE
+"380": \.{z}
+#LATIN CAPITAL LETTER Z WITH DOT ABOVE
+"379": \.{Z}
+#ACUTE ACCENT
+#requires textcomp
+acute: \'{}
+#ACUTE ACCENT
+#requires textcomp
+"180": \'{}
+#BREVE
+#requires textcomp
+"728": \u{}
+#CARON
+#requires textcomp
+"711": \v{}
+#CEDILLA
+cedil: \c{}
+#CEDILLA
+"184": \c{}
+#CIRCUMFLEX ACCENT
+circ: \^{}
+#CIRCUMFLEX ACCENT
+"94": \^{}
+#DOUBLE ACUTE ACCENT
+#requires textcomp
+"733": \H{}
+#DIAERESIS
+#requires textcomp
+uml: \"{}
+#DIAERESIS
+#requires textcomp
+"168": \"{}
+#DOT ABOVE
+"729": \.{}
+#GRAVE ACCENT
+#requires textcomp
+"96": \`{}
+#MACRON
+#requires textcomp
+macr: \={}
+#MACRON
+#requires textcomp
+"175": \={}
+#OGONEK
+#requires fontenc:T1
+"731": \k{}
+#RING ABOVE
+"730": \r{}
+#TILDE
+#requires textcomp
+tilde: \~{}
+#TILDE
+#requires textcomp
+"126": \~{}
+#HORIZONTAL TABULATION
+"9": \>,\=
+#LINE FEED
+"10": \\
+#SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+#requires fontenc:T1
+lsaquo: \guilsinglleft{}
+#SINGLE LEFT-POINTING ANGLE QUOTATION MARK
+#requires fontenc:T1
+"8249": \guilsinglleft{}
+#SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+#requires fontenc:T1
+rsaquo: \guilsinglright{}
+#SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
+#requires fontenc:T1
+"8250": \guilsinglright{}
+#OVERLINE
+oline: \={}
+#OVERLINE
+"8254": \={}
+#FRACTION SLASH
+#requires textcomp
+frasl: \textfractionsolidus{}
+#FRACTION SLASH
+#requires textcomp
+"8260": \textfractionsolidus{}
+#EURO SIGN
+#requires textcomp
+euro: \texteuro{}
+#EURO SIGN
+#requires textcomp
+"8364": \texteuro{}
+#LEFTWARDS DASHED ARROW
+#requires amssymb
+"8672": \dashleftarrow{}
+#RIGHTWARDS DASHED ARROW
+#requires amssymb
+"8674": \dashrightarrow{}
+#INVERTED OHM SIGN
+#requires amssymb
+"8487": \textmho{}
+#PROPORTION
+"8759": "::"
+#LEFT WHITE SQUARE BRACKET
+#requires stmaryrd
+"12314": \textlbrackdbl{}
+#PER TEN THOUSAND SIGN
+#requires textcomp
+"8241": \textpertenthousand{}
+#RIGHT WHITE SQUARE BRACKET
+#requires stmaryrd
+"12315": \textrbrackdbl{}
+#MODIFIER LETTER LOW MACRON
+"717": \b{}
+#COMBINING DOT BELOW
+"803": \d{}
+#COMBINING DOUBLE INVERTED BREVE
+"865": \t{}
+#REFERENCE MARK
+#requires textcomp
+"8251": \textreferencemark{} \ No newline at end of file
diff --git a/test/scanners/yaml/suite.rb b/test/scanners/yaml/suite.rb
new file mode 100644
index 0000000..9231fb2
--- /dev/null
+++ b/test/scanners/yaml/suite.rb
@@ -0,0 +1,2 @@
+class YAML < CodeRay::TestCase
+end
diff --git a/test/scanners/yaml/threshold.expected.raydebug b/test/scanners/yaml/threshold.expected.raydebug
new file mode 100644
index 0000000..8d3c8f5
--- /dev/null
+++ b/test/scanners/yaml/threshold.expected.raydebug
@@ -0,0 +1,772 @@
+tag(---) comment(# From http://thresholdstate.com/articles/4312/the-textile-reference-manual)
+key(name)operator(:) string(paragraph)
+key(desc)operator(:) string(Paragraphs are separated by blank lines. Each paragraph of text is transformed into a XHTML <p> paragraph block.)
+key(in)operator(:) string(|-)
+ string(A) string(paragraph.)
+
+ string(Another) string(paragraph.)
+key(html)operator(:) string(|-)
+ string(<p>A) string(paragraph.</p>)
+ string(<p>Another) string(paragraph.</p>)
+tag(---)
+key(name)operator(:) string(line breaks)
+key(desc)operator(:) string(Line breaks within paragraphs are transformed into XHTML line breaks.)
+key(in)operator(:) string(|-)
+ string(A) string(paragraph) string(with)
+ string(a) string(line) string(break.)
+key(html)operator(:) string(|-)
+ string(<p>A) string(paragraph) string(with<br) string(/>)
+ string(a) string(line) string(break.</p>)
+tag(---)
+key(name)operator(:) string(xhtml tags)
+key(desc)operator(:) string(Simple XHTML tags may be included in a paragraph.)
+key(in)operator(:) string(Here's some <b>bold</b> text.)
+key(html)operator(:) string(<p>Here&#8217;s some <b>bold</b> text.</p>)
+tag(---)
+key(name)operator(:) string(no paragraph tags)
+key(desc)operator(:) string(A line beginning with a space will be left untouched, and not wrapped in <p> tags.)
+key(in)operator(:) string(" No paragraph tags here.")
+key(html)operator(:) string("No paragraph tags here.")
+key(valid_html)operator(:) string(false)
+tag(---)
+key(name)operator(:) string(smart quotes)
+key(desc)operator(:) string(Single and double typewriter quotation marks ' and " are transformed into typographically correct “curly” quote marks.)
+key(in)operator(:) string('"Proceed!" said he to the host.')
+key(html)operator(:) string('<p>&#8220;Proceed!&#8221; said he to the host.</p>')
+tag(---)
+key(name)operator(:) string(smart quotes 2)
+key(in)operator(:) string("'Proceed!' said he to the host.")
+key(html)operator(:) string("<p>&#8216;Proceed!&#8217; said he to the host.</p>")
+tag(---)
+key(name)operator(:) string(nested quotation marks)
+key(desc)operator(:) string(Single and double quotation marks may be nested one inside the other.)
+key(in)operator(:) string(|-)
+ string("'I) string(swear,) string(captain,') string(replied) string(I.")
+key(html)operator(:) string(|-)
+ string(<p>&#8220;&#8216;I) string(swear,) string(captain,&#8217;) string(replied) string(I.&#8221;</p>)
+tag(---)
+key(name)operator(:) string(nested quotation marks 2)
+key(in)operator(:) string(|-)
+ string('"I) string(swear,) string(captain,") string(replied) string(I.')
+key(html)operator(:) string(|-)
+ string(<p>&#8216;&#8220;I) string(swear,) string(captain,&#8221;) string(replied) string(I.&#8217;</p>)
+tag(---)
+key(name)operator(:) string(apostrophe glyphs)
+key(desc)operator(:) string(Single quotation marks ' will be turned into apostrophe glyphs when used as such.)
+key(in)operator(:) string(Greengrocers' apostrophe's.)
+key(html)operator(:) string(<p>Greengrocers&#8217; apostrophe&#8217;s.</p>)
+tag(---)
+key(name)operator(:) string(em-dash glyphs)
+key(desc)operator(:) string(Double -- dashes become an em-dash glyph.)
+key(in)operator(:) string(You know the Italian proverb -- Chi ha compagno ha padrone.)
+key(html)operator(:) string(<p>You know the Italian proverb &#8212; Chi ha compagno ha padrone.</p>)
+tag(---)
+key(name)operator(:) string(em-dash glyphs 2)
+key(in)operator(:) string(You know the Italian proverb--Chi ha compagno ha padrone.)
+key(html)operator(:) string(<p>You know the Italian proverb&#8212;Chi ha compagno ha padrone.</p>)
+tag(---)
+key(name)operator(:) string(en-dash glyphs)
+key(desc)operator(:) string(Single - dashes are replaced with en-dashes.)
+key(in)operator(:) string(You know the Italian proverb - Chi ha compagno ha padrone.)
+key(html)operator(:) string(<p>You know the Italian proverb &#8211; Chi ha compagno ha padrone.</p>)
+tag(---)
+key(name)operator(:) string(ellipsis character)
+key(desc)operator(:) string(Three period marks become an ellipsis character.)
+key(in)operator(:) string(Meanwhile...)
+key(html)operator(:) string(<p>Meanwhile&#8230;</p>)
+tag(---)
+key(name)operator(:) string(dimension character)
+key(desc)operator(:) string(An “x” is replaced with the dimension character when used between numbers.)
+key(in)operator(:) string(1 x 2 x 3 = 6)
+key(html)operator(:) string(<p>1 &#215; 2 &#215; 3 = 6</p>)
+tag(---)
+key(name)operator(:) string(dimension character 2)
+key(in)operator(:) string(1x2x3 = 6)
+key(html)operator(:) string(<p>1&#215;2&#215;3 = 6</p>)
+tag(---)
+key(name)operator(:) string(trademark register copyright)
+key(desc)operator(:) string(Trademark, Registered and Copyright symbols are represented by their common plain text equivalents.)
+key(in)operator(:) string(Registered(r\) Trademark(tm\) Copyright (c\).)
+key(html)operator(:) string(<p>Registered&#174; Trademark&#8482; Copyright &#169;.</p>)
+tag(---)
+key(name)operator(:) string(acronyms)
+key(desc)operator(:) string(Acronyms consist of three or more uppercase characters, followed immediately by words in parentheses.)
+key(in)operator(:) string(ABC(Always Be Closing\))
+key(html)operator(:) string(<p><acronym title="Always Be Closing"><span class="caps">ABC</span></acronym></p>)
+key(no_span_caps_html)operator(:) string(<p><acronym title="Always Be Closing">ABC</acronym></p>)
+tag(---)
+key(name)operator(:) string(uppercase)
+key(desc)operator(:) string(Uppercase words of three or more characters are enclosed with a special span element.)
+key(in)operator(:) string(IBM or HAL)
+key(html)operator(:) string(<p><span class="caps">IBM</span> or <span class="caps">HAL</span></p>)
+key(no_span_caps_html)operator(:) string(<p>IBM or HAL</p>)
+tag(---)
+key(name)operator(:) string(emphasis)
+key(desc)operator(:) string(Emphasis is added with _ underscores.)
+key(in)operator(:) string(The _underlying_ cause.)
+key(html)operator(:) string(<p>The <em>underlying</em> cause.</p>)
+tag(---)
+key(name)operator(:) string(strong text)
+key(desc)operator(:) string(Strong text is indicated by * asterisks.)
+key(in)operator(:) string(The *underlying* cause.)
+key(html)operator(:) string(<p>The <strong>underlying</strong> cause.</p>)
+tag(---)
+key(name)operator(:) string(italic text)
+key(desc)operator(:) string(em is a semantic tag, usually represented by browsers as italic text. To produce italic tags instead, use double underscores.)
+key(in)operator(:) string(The __underlying__ cause.)
+key(html)operator(:) string(<p>The <i>underlying</i> cause.</p>)
+tag(---)
+key(name)operator(:) string(bold text)
+key(desc)operator(:) string(strong is a semantic tag, usually represented by browsers as bold text. To produce bold tags instead, use double asterisks.)
+key(in)operator(:) string(The **underlying** cause.)
+key(html)operator(:) string(<p>The <b>underlying</b> cause.</p>)
+tag(---)
+key(name)operator(:) string(citation)
+key(desc)operator(:) string(Double question marks represent a citation, like the title of a book.)
+key(in)operator(:) string(??The Count of Monte Cristo??, by Dumas.)
+key(html)operator(:) string(<p><cite>The Count of Monte Cristo</cite>, by Dumas.</p>)
+tag(---)
+key(name)operator(:) string(inserted and deleted text)
+key(desc)operator(:) string(Inserted and deleted text is represented by + plus and - minus symbols.)
+key(in)operator(:) string(Scratch -that-, replace with +this+.)
+key(html)operator(:) string(<p>Scratch <del>that</del>, replace with <ins>this</ins>.</p>)
+tag(---)
+key(name)operator(:) string(subscript)
+key(desc)operator(:) string(Subscript text is indicated by ~ tilde characters.)
+key(in)operator(:) string(log ~2~ n)
+key(html)operator(:) string(<p>log <sub>2</sub> n</p>)
+tag(---)
+key(name)operator(:) string(superscript)
+key(desc)operator(:) string(Superscript text is indicated by ^ caret characters.)
+key(in)operator(:) string(2 ^x^)
+key(html)operator(:) string(<p>2 <sup>x</sup></p>)
+tag(---)
+key(name)operator(:) string(span tag)
+key(desc)operator(:) string(Percentage marks will enclose text with a XHTML span tag.)
+key(in)operator(:) string(The %underlying% cause.)
+key(html)operator(:) string(<p>The <span>underlying</span> cause.</p>)
+tag(---)
+key(name)operator(:) string(code)
+key(desc)operator(:) string(To include a short snippet of code such as XHTML or Javascript, surround it with @ “at” symbols. XHTML significant characters within a code phrase will be escaped for display to the reader.)
+key(in)operator(:) string(About the @<hr />@ tag.)
+key(html)operator(:) string(<p>About the <code>&lt;hr /&gt;</code> tag.</p>)
+tag(---)
+key(name)operator(:) string(links)
+key(desc)operator(:) string(Links are represented by double quotes and a colon.)
+key(in)operator(:) string('"link text":http://example.com/')
+key(html)operator(:) string(<p><a href="http://example.com/">link text</a></p>)
+tag(---)
+key(name)operator(:) string(local links)
+key(desc)operator(:) string(The host name may be ommitted for local links.)
+key(in)operator(:) string('"link text":/example')
+key(html)operator(:) string(<p><a href="/example">link text</a></p>)
+tag(---)
+key(name)operator(:) string(link title)
+key(desc)operator(:) string(A title may be placed in (\) parentheses.)
+key(in)operator(:) string('"link text(with title\)":http://example.com/')
+key(html)operator(:) string(<p><a href="http://example.com/" title="with title">link text</a></p>)
+tag(---)
+key(name)operator(:) string(link alias)
+key(desc)operator(:) string(For frequent linking to a single URL, you can specify a link alias with [] square brackets.)
+key(in)operator(:) string(|-)
+ string(Here's) key<delimiter(")content(a link)delimiter(")>symbol(:tstate)operator(,) string(and)
+ key<delimiter(")content(another link)delimiter(")>symbol(:tstate) string(to) string(the) string(same) string(site.)
+
+ operator([)string(tstate]http)error(:)string(//thresholdstate.com/)
+key(html)operator(:) string(|-)
+ string(<p>Here&#8217;s) string(<a) string(href="http)error(:)string(//thresholdstate.com/">a) string(link</a>,) string(and<br) string(/>)
+ string(<a) string(href="http)error(:)string(//thresholdstate.com/">another) string(link</a>) string(to) string(the) string(same) string(site.</p>)
+tag(---)
+key(name)operator(:) string(image)
+key(desc)operator(:) string(Use ! exclamation marks to insert an image tag.)
+key(in)operator(:) string("!/img.gif!")
+key(html)operator(:) string(<p><img src="/img.gif" alt="" /></p>)
+tag(---)
+key(name)operator(:) string(image 2)
+key(in)operator(:) string("!http://thresholdstate.com/img.gif!")
+key(html)operator(:) string(<p><img src="http://thresholdstate.com/img.gif" alt="" /></p>)
+tag(---)
+key(name)operator(:) string(image alt)
+key(desc)operator(:) string(Use (\) parentheses to include “alt” text.)
+key(in)operator(:) string("!/img.gif(alt text\)!")
+key(html)operator(:) string(<p><img src="/img.gif" title="alt text" alt="alt text" /></p>)
+tag(---)
+key(name)operator(:) string(image links)
+key(desc)operator(:) string(Images may be combined with links by using an !image! in place of the link text.)
+key(in)operator(:) string("!/img.gif!:http://textpattern.com/")
+key(html)operator(:) string(<p><a href="http://textpattern.com/"><img src="/img.gif" alt="" /></a></p>)
+tag(---)
+key(name)operator(:) string(headers)
+key(desc)operator(:) string(Headers are represented by h1., h2., … h6..)
+key(in)operator(:) string(h1. Heading 1)
+key(html)operator(:) string(<h1>Heading 1</h1>)
+tag(---)
+key(name)operator(:) string(headers 2)
+key(in)operator(:) string(h2. Heading 2)
+key(html)operator(:) string(<h2>Heading 2</h2>)
+tag(---)
+key(name)operator(:) string(headers 3)
+key(in)operator(:) string(h6. Heading 6)
+key(html)operator(:) string(<h6>Heading 6</h6>)
+tag(---)
+key(name)operator(:) string(paragraph text)
+key(desc)operator(:) string("Paragraph p text is represented by p.. This is the default block type: any paragraph without a block modifier will automatically be enclosed with p tags.")
+key(in)operator(:) string(|-)
+ string(p.) string(A) string(paragraph.)
+ string(Continued.)
+
+ string(Also) string(a) string(paragraph.)
+key(html)operator(:) string(|-)
+ string(<p>A) string(paragraph.<br) string(/>)
+ string(Continued.</p>)
+ string(<p>Also) string(a) string(paragraph.</p>)
+tag(---)
+key(name)operator(:) string(block quote)
+key(desc)operator(:) string(bq. indicates a quoted block of text.)
+key(in)operator(:) string(|-)
+ string(bq.) string(A) string(quotation.)
+ string(Continued.)
+
+ string(Regular) string(paragraph.)
+key(html)operator(:) string(|-)
+ string(<blockquote>)
+ string(<p>A) string(quotation.<br) string(/>)
+ string(Continued.</p>)
+ string(</blockquote>)
+ string(<p>Regular) string(paragraph.</p>)
+tag(---)
+key(name)operator(:) string(block quote citation)
+key(desc)operator(:) string(Block quotes may include a citation URL immediately following the period.)
+key(in)operator(:) string(bq.:http://thresholdstate.com/ A cited quotation.)
+key(html)operator(:) string(|-)
+ string(<blockquote) string(cite="http)error(:)string(//thresholdstate.com/">)
+ string(<p>A) string(cited) string(quotation.</p>)
+ string(</blockquote>)
+tag(---)
+key(name)operator(:) string(footnotes)
+key(desc)operator(:) string(Footnotes are represented by the fn1., fn2., … block modifiers.)
+key(in)operator(:) string(|-)
+ string(A) string(footnote) string(reference[1].)
+
+ string(fn1.) string(The) string(footnote.)
+key(html)operator(:) string(|-)
+ string(<p>A) string(footnote) string(reference<sup) string(class="footnote"><a) string(href="#fn1">1</a></sup>.</p>)
+ string(<p) string(class="footnote") string(id="fn1"><sup>1</sup>) string(The) string(footnote.</p>)
+comment(# html: |-)
+comment(# <p>A footnote reference<sup class="footnote"><a href="#fn1216642796463b1223ae29d">1</a></sup>.</p>)
+comment(# <p class="footnote" id="fn1216642796463b1223ae29d"><sup>1</sup> The footnote.</p>)
+tag(---)
+key(name)operator(:) string(block code)
+key(desc)operator(:) string(Code such as XHTML, Javascript or PHP may be displayed using the bc. “block code” modifier. XHTML significant characters such as < and > will be escaped within code blocks – bc is used for displaying code to the reader, not for executing it.)
+key(note)operator(:) string(Note that Textile will interpret any blank lines within the code as indicating the end of the code block. See Extended Blocks below for an explanation of how to display longer blocks of code.)
+key(in)operator(:) string(|-)
+ string(bc.) string(<script>)
+ string(//) string(a) string(Javascript) string(example)
+ string(alert("Hello) string(World"\);)
+ string(</script>)
+key(html)operator(:) string(|-)
+ string(<pre><code>&lt;script&gt;)
+ string(//) string(a) string(Javascript) string(example)
+ string(alert("Hello) string(World"\);)
+ variable(&lt;/script&gt;</code></pre>)
+tag(---)
+key(name)operator(:) string(preformatted text)
+key(desc)operator(:) string(Use the pre. block modifier for pre-formatted text. XHTML significant characters within the block will be escaped.)
+key(note)operator(:) string(pre. is almost identical to bc., with the exception that <code>...</code> tags are not used within the <pre> block.)
+key(in)operator(:) string(|-)
+ string(pre.) string(Pre-formatted)
+ string(text)
+key(html)operator(:) string(|-)
+ string(<pre>Pre-formatted)
+ string(text</pre>)
+tag(---)
+key(name)operator(:) string(notextile)
+key(desc)operator(:) string(The notextile. block modifier applies no Textile processing at all to a block. Raw XHTML characters are passed through untouched, so this may be used to insert explicit XHTML markup, or execute Javascript or PHP code.)
+key(in)operator(:) string(|-)
+ string(notextile.) string(<script) string(type="text/javascript">)
+ string(document.write("Hello) string(World!"\);)
+ string(</script>)
+ string(<noscript>Your) string(browser) string(doesn't) string(support) string(Javascript</noscript>)
+key(html)operator(:) string(|-)
+ string(<script) string(type="text/javascript">)
+ string(document.write("Hello) string(World!"\);)
+ string(</script>)
+ string(<noscript>Your) string(browser) string(doesn't) string(support) string(Javascript</noscript>)
+key(valid_html)operator(:) string(false)
+tag(---)
+key(name)operator(:) string(class attribute)
+key(desc)operator(:) string(CSS classes are specified with (\) parentheses.)
+key(in)operator(:) string(p(myclass\). My classy paragraph.)
+key(html)operator(:) string(<p class="myclass">My classy paragraph.</p>)
+tag(---)
+key(name)operator(:) string(id attribute)
+key(desc)operator(:) string(CSS IDs are specified with (\) parentheses.)
+key(in)operator(:) string(p(#myid\). My ID paragraph.)
+key(html)operator(:) string(<p id="myid">My ID paragraph.</p>)
+tag(---)
+key(name)operator(:) string(style attribute)
+key(desc)operator(:) string(CSS styles are specified with {} braces.)
+key(in)operator(:) string(p{color:red}. Red rum.)
+key(html)operator(:) string(<p style="color:red;">Red rum.</p>)
+tag(---)
+key(name)operator(:) string(lang attribute)
+key(desc)operator(:) string(Languages are specified with [] brackets.)
+key(in)operator(:) string(p[fr-fr]. En français.)
+key(html)operator(:) string(<p lang="fr-fr">En français.</p>)
+tag(---)
+key(name)operator(:) string(phrase modifiers)
+key(desc)operator(:) string(The same syntax may be applied to phrase modifiers.)
+key(in)operator(:) string(A *(myclass\)classy* phrase.)
+key(html)operator(:) string(<p>A <strong class="myclass">classy</strong> phrase.</p>)
+tag(---)
+key(name)operator(:) string(phrase modifiers 2)
+key(in)operator(:) string(An _(#myid2\)ID_ phrase.)
+key(html)operator(:) string(<p>An <em id="myid2">ID</em> phrase.</p>)
+tag(---)
+key(name)operator(:) string(phrase modifiers 3)
+key(in)operator(:) string(The %{color:blue}blue% room.)
+key(html)operator(:) string(<p>The <span style="color:blue;">blue</span> room.</p>)
+tag(---)
+key(name)operator(:) string(block and phrase attributes combined)
+key(desc)operator(:) string(Block and phrase attributes may be combined.)
+key(in)operator(:) string(p(myclass#myid3\){color:green}[de-de]. A complex paragraph.)
+key(html)operator(:) string(<p style="color:green;" class="myclass" lang="de-de" id="myid3">A complex paragraph.</p>)
+tag(---)
+key(name)operator(:) string(block and phrase attributes combined 2)
+key(in)operator(:) string(A ??(myclass#myid4\){color:green}[de-de]complex?? phrase.)
+key(html)operator(:) string(<p>A <cite style="color:green;" class="myclass" lang="de-de" id="myid4">complex</cite> phrase.</p>)
+tag(---)
+key(name)operator(:) string(extended blocks)
+key(desc)operator(:) string(Normally a block modifier covers a single block of text, and ends at the first blank line. To extend a block over multiple paragraphs that include blank lines, use a block modifier with two period marks instead of one. To close the extended block, use a different block modifier on the next paragraph.)
+key(in)operator(:) string(|-)
+ string(bq..) string(A) string(quote.)
+
+ string(The) string(quote) string(continued.)
+
+ string(p.) string(Back) string(to) string(paragraph) string(text.)
+key(html)operator(:) string(|-)
+ string(<blockquote>)
+ string(<p>A) string(quote.</p>)
+ string(<p>The) string(quote) string(continued.</p>)
+ string(</blockquote>)
+ string(<p>Back) string(to) string(paragraph) string(text.</p>)
+tag(---)
+key(name)operator(:) string(extended block code)
+key(desc)operator(:) string(Extended blocks are useful for displaying longer examples of code that contain blank lines.)
+key(in)operator(:) string(|-)
+ string(A) string(PHP) string(code) string(example.)
+
+ string(bc..) string(<?php)
+ string(function) string(hello(\)) operator({)
+ string(//) string(display) string(a) string(hello) string(message)
+
+ string(print) string("Hello,) string(World";)
+ operator(})
+ string(?>)
+
+ string(p.) string(Following) string(paragraph.)
+key(html)operator(:) string(|-)
+ string(<p>A) string(<span) string(class="caps">PHP</span>) string(code) string(example.</p>)
+ string(<pre><code>&lt;?php)
+ string(function) string(hello(\)) operator({)
+ string(//) string(display) string(a) string(hello) string(message</code>)
+
+ string(<code>print) string("Hello,) string(World";)
+ operator(})
+ string(?&gt;</code>)
+
+ string(</pre>)
+ string(<p>Following) string(paragraph.</p>)
+tag(---)
+key(name)operator(:) string(extended block attributes)
+key(desc)operator(:) string(Any block attributes on an extended block will be included on each following block.)
+key(in)operator(:) string(|-)
+ string(p(myclass\)..) string(A) string(classy) string(paragraph.)
+
+ string(Another) string(classy) string(paragraph.)
+
+ string(p.) string(Not) string(so) string(classy.)
+key(html)operator(:) string(|-)
+ string(<p) string(class="myclass">A) string(classy) string(paragraph.</p>)
+ string(<p) string(class="myclass">Another) string(classy) string(paragraph.</p>)
+ string(<p>Not) string(so) string(classy.</p>)
+tag(---)
+key(name)operator(:) string(extended block quote attributes)
+key(desc)operator(:) string(Attributes on bq.. extended blocks will be included on both the inner and outer blocks.)
+key(in)operator(:) string(|-)
+ string(bq(myclass\)..) string(Quote) string(paragraph) string(1.)
+
+ string(Paragraph) string(2.)
+key(html)operator(:) string(|-)
+ string(<blockquote) string(class="myclass">)
+ string(<p) string(class="myclass">Quote) string(paragraph) string(1.</p>)
+ string(<p) string(class="myclass">Paragraph) string(2.</p>)
+ string(</blockquote>)
+tag(---)
+key(name)operator(:) string(extended block code attributes)
+key(desc)operator(:) string(Attributes on bc.. extended blocks will be included on both the inner and outer blocks.)
+key(in)operator(:) string(|-)
+ string(bc(myclass\)..) string(Code) string(block) string(1.)
+
+ string(Code) string(block) string(2.)
+key(html)operator(:) string(|-)
+ string(<pre) string(class="myclass"><code) string(class="myclass">Code) string(block) string(1.</code>)
+
+ string(<code) string(class="myclass">Code) string(block) string(2.</code></pre>)
+tag(---)
+key(name)operator(:) string(raw xhtml left in tact)
+key(desc)operator(:) string(Raw XHTML tags are generally left untouched by Textile. Span tags that enclose only part of a block of text will be left intact, while the block itself is treated normally.)
+key(in)operator(:) string(<b>bold</b> and <i>italic</i>, the hard way.)
+key(html)operator(:) string(<p><b>bold</b> and <i>italic</i>, the hard way.</p>)
+tag(---)
+key(name)operator(:) string(paragraphs entirely raw xhtml)
+key(desc)operator(:) string(Paragraphs that consist entirely of raw XHTML block tags will not be enclosed in <p>...</p> tags.)
+key(in)operator(:) string(<div class="mydiv">My div</div>)
+key(html)operator(:) string(<div class="mydiv">My div</div>)
+tag(---)
+key(name)operator(:) string(paragraphs with inline xhtml)
+key(desc)operator(:) string(Paragraphs that consist only of inline XHTML tags, will be enclosed in <p>...</p> tags.)
+key(in)operator(:) string(<img src="/img.gif" alt="image" />)
+key(html)operator(:) string(<p><img src="/img.gif" alt="image" /></p>)
+tag(---)
+key(name)operator(:) string(paragraphs with inline xhtml 2)
+key(in)operator(:) string(<span class="myspan">I'll make my own way.</span>)
+key(html)operator(:) string('<p><span class="myspan">I&#8217;ll make my own way.</span></p>')
+tag(---)
+key(name)operator(:) string(paragraphs partly enclosed in xhtml block tags)
+key(desc)operator(:) string(Paragraphs that are only partly enclosed in block tags will be enclosed in <p>...</p> tags.)
+key(in)operator(:) string(<div>inside</div> and outside.)
+key(html)operator(:) string(<div>inside</div> <p>and outside.</p>)
+comment(# html: <p><div>inside</div> and outside.</p>)
+tag(---)
+key(name)operator(:) string(complex xhtml blocks)
+key(desc)operator(:) string(Textile can’t always identify the beginning and end of long or complex blocks of XHTML. To prevent Textile from enclosing complex XHTML blocks in paragraph tags, either use a space at the beginning of each line...)
+key(in)operator(:) string(" <div>\\n <span>My div</span>\\n </div>")
+key(html)operator(:) string("<div>\\n<span>My div</span>\\n</div>")
+tag(---)
+key(name)operator(:) string(complex xhtml blocks 2)
+key(desc)operator(:) string(...or a notexile.. extended block.)
+key(in)operator(:) string(|-)
+ string(notextile..) string(<div>)
+
+ string(<span>My) string(div</span>)
+
+ string(</div>)
+key(html)operator(:) string(|-)
+ string(<div>)
+
+ string(<span>My) string(div</span>)
+
+ string(</div>)
+tag(---)
+key(name)operator(:) string(complex xhtml blocks with inline formatting)
+key(desc)operator(:) string(Textile will not wrap lines that start with a space in paragraph tags, but it should parse inline signatures)
+key(in)operator(:) string(" <div>\\n <span>My *div*</span>\\n </div>")
+key(html)operator(:) string("<div>\\n<span>My <strong>div</strong></span>\\n</div>")
+tag(---)
+key(name)operator(:) string(explicit pre escapement)
+key(desc)operator(:) string(The contents of explicit <pre>...</pre> tags are escaped for display. )
+key(in)operator(:) string(|-)
+ string(<pre>)
+ string(A) string(HTML) string(<b>example</b>)
+ string(</pre>)
+key(html)operator(:) string(|-)
+ string(<pre>)
+ string(A) string(HTML) variable(&lt;b&gt;example&lt;/b&gt;)
+ string(</pre>)
+key(note)operator(:) string(This syntax is supported for backwards compatibility only, and doesn’t always work as expected. The block modifier pre. should be used instead.)
+tag(---)
+key(name)operator(:) string(explicit code escapement)
+key(desc)operator(:) string(The contents of explicit <code>...</code> tags are escaped for display.)
+key(in)operator(:) string(|-)
+ string(<code>)
+ string(Another) string(HTML) string(<b>example</b>)
+ string(</code>)
+key(html)operator(:) string(|-)
+ string(<p><code>)
+ string(Another) string(HTML) variable(&lt;b&gt;example&lt;/b&gt;)
+ string(</code></p>)
+key(note)operator(:) string(This syntax is supported for backwards compatibility only, and doesn’t always work as expected. The block modifier bc. should be used instead.)
+tag(---)
+key(name)operator(:) string(notextile tags)
+key(desc)operator(:) string(Blocks enclosed by the pseudo tag <notextile>...</notextile> will be left untouched.)
+key(in)operator(:) string(|-)
+ string(<notextile>)
+ string(p.) string(Leave) string(me) string(alone)
+ string(</notextile>)
+key(html)operator(:) string(|-)
+ string(p.) string(Leave) string(me) string(alone)
+comment(# html: |-)
+comment(# <p>)
+comment(# p. Leave me alone)
+comment(# </p>)
+key(note)operator(:) string(This syntax is supported for backwards compatibility only, and doesn’t always work as expected. The block modifier notextile. should be used instead.)
+key(valid_html)operator(:) string(false)
+tag(---)
+key(name)operator(:) string(left aligned text)
+key(desc)operator(:) string(Left alignment is specified with a < less than symbol.)
+key(in)operator(:) string(p<. Left-aligned paragraph.)
+key(html)operator(:) string(<p style="text-align:left;">Left-aligned paragraph.</p>)
+tag(---)
+key(name)operator(:) string(right aligned text)
+key(desc)operator(:) string(Right alignment is specified with a > greater than symbol.)
+key(in)operator(:) string(h3>. Right-aligned heading.)
+key(html)operator(:) string(<h3 style="text-align:right;">Right-aligned heading.</h3>)
+tag(---)
+key(name)operator(:) string(justified text)
+key(desc)operator(:) string(Use both <> symbols for justified text.)
+key(in)operator(:) string(p<>. Justified paragraph.)
+key(html)operator(:) string(<p style="text-align:justify;">Justified paragraph.</p>)
+tag(---)
+key(name)operator(:) string(centered text)
+key(desc)operator(:) string(An = equals symbol represents centered text.)
+key(in)operator(:) string(h3=. Centered heading.)
+key(html)operator(:) string(<h3 style="text-align:center;">Centered heading.</h3>)
+tag(---)
+key(name)operator(:) string(padding)
+key(desc)operator(:) string(Use empty ( and \) parentheses to add padding to blocks, in multiples of 1 em.)
+key(in)operator(:) string(p(. Left pad 1em.)
+key(html)operator(:) string(<p style="padding-left:1em;">Left pad 1em.</p>)
+tag(---)
+key(name)operator(:) string(padding 2)
+key(in)operator(:) string(p\)\). Right pad 2em.)
+key(html)operator(:) string(<p style="padding-right:2em;">Right pad 2em.</p>)
+tag(---)
+key(name)operator(:) string(padding 3)
+key(in)operator(:) string(p(\). Left and right pad 1em.)
+key(html)operator(:) string(<p style="padding-left:1em;padding-right:1em;">Left and right pad 1em.</p>)
+tag(---)
+key(name)operator(:) string(numeric lists)
+key(desc)operator(:) string(Numeric lists are represented by lines beginning with #.)
+key(in)operator(:) string(|-)
+ comment(# Item one)
+ comment(# Item two)
+ comment(# Item three)
+key(html)operator(:) string(|-)
+ string(<ol>)
+ string(<li>Item) string(one</li>)
+ string(<li>Item) string(two</li>)
+ string(<li>Item) string(three</li>)
+ string(</ol>)
+tag(---)
+key(name)operator(:) string(bulleted lists)
+key(desc)operator(:) string(Bulleted lists are represented by lines beginning with *.)
+key(in)operator(:) string(|-)
+ string(*) string(Item) string(A)
+ string(*) string(Item) string(B)
+ string(*) string(Item) string(C)
+key(html)operator(:) string(|-)
+ string(<ul>)
+ string(<li>Item) string(A</li>)
+ string(<li>Item) string(B</li>)
+ string(<li>Item) string(C</li>)
+ string(</ul>)
+tag(---)
+key(name)operator(:) string(list attributes)
+key(desc)operator(:) string(Attributes applied to the first list item will apply to the list itself.)
+key(in)operator(:) string(|-)
+ string(*{color)symbol(:red)operator(}) string(Item) string(one)
+ string(*) string(Item) string(two)
+ string(*) string(Item) string(three)
+key(html)operator(:) string(|-)
+ string(<ul) string(style="color)symbol(:red)string(;">)
+ string(<li>Item) string(one</li>)
+ string(<li>Item) string(two</li>)
+ string(<li>Item) string(three</li>)
+ string(</ul>)
+tag(---)
+key(name)operator(:) string(nested lists)
+key(desc)operator(:) string(Use multiple # or * symbols to create nested lists.)
+key(in)operator(:) string(|-)
+ comment(# Item one)
+ comment(## Item one-A)
+ comment(## Item one-B)
+ comment(### Item one-B-a)
+ comment(# Item two)
+key(html)operator(:) string(|-)
+ string(<ol>)
+ string(<li>Item) string(one)
+ string(<ol>)
+ string(<li>Item) string(one-A</li>)
+ string(<li>Item) string(one-B)
+ string(<ol>)
+ string(<li>Item) string(one-B-a</li>)
+ string(</ol></li>)
+ string(</ol></li>)
+ string(<li>Item) string(two</li>)
+ string(</ol>)
+tag(---)
+key(name)operator(:) string(tables)
+key(desc)operator(:) string(Tables can be constructed using | “pipe” symbols to separate cells.)
+key(in)operator(:) string(|a|simple|table|)
+key(html)operator(:) string(|-)
+ string(<table>)
+ string(<tr>)
+ string(<td>a</td>)
+ string(<td>simple</td>)
+ string(<td>table</td>)
+ string(</tr>)
+ string(</table>)
+tag(---)
+key(name)operator(:) string(table heading cells)
+key(desc)operator(:) string(Use _. to indicate table heading cells.)
+key(in)operator(:) string(|-)
+ string(|_.) string(a|_.) string(table|_.) string(heading|)
+ string(|a|table|row|)
+key(html)operator(:) string(|-)
+ string(<table>)
+ string(<tr>)
+ string(<th>a</th>)
+ string(<th>table</th>)
+ string(<th>heading</th>)
+ string(</tr>)
+ string(<tr>)
+ string(<td>a</td>)
+ string(<td>table</td>)
+ string(<td>row</td>)
+ string(</tr>)
+ string(</table>)
+tag(---)
+key(name)operator(:) string(cell attributes)
+key(desc)operator(:) string(Attributes may be applied separately to individual cells, rows, and entire tables. Cell attributes are placed within each cell.)
+key(in)operator(:) string(|a|{color:red}. styled|cell|)
+key(html)operator(:) string(|-)
+ string(<table>)
+ string(<tr>)
+ string(<td>a</td>)
+ string(<td) string(style="color)symbol(:red)string(;">styled</td>)
+ string(<td>cell</td>)
+ string(</tr>)
+ string(</table>)
+tag(---)
+key(name)operator(:) string(row attributes)
+key(desc)operator(:) string(Row attributes are placed at the beginning of a row, followed by a dot and a space.)
+key(in)operator(:) string((rowclass\). |a|classy|row|)
+key(html)operator(:) string(|-)
+ string(<table>)
+ string(<tr) string(class="rowclass">)
+ string(<td>a</td>)
+ string(<td>classy</td>)
+ string(<td>row</td>)
+ string(</tr>)
+ string(</table>)
+tag(---)
+key(name)operator(:) string(table attributes)
+key(desc)operator(:) string(Table attributes are specified by placing the special table. block modifier immediately before the table.)
+key(in)operator(:) string(|-)
+ string(table(tableclass\).)
+ string(|a|classy|table|)
+ string(|a|classy|table|)
+key(html)operator(:) string(|-)
+ string(<table) string(class="tableclass">)
+ string(<tr>)
+ string(<td>a</td>)
+ string(<td>classy</td>)
+ string(<td>table</td>)
+ string(</tr>)
+ string(<tr>)
+ string(<td>a</td>)
+ string(<td>classy</td>)
+ string(<td>table</td>)
+ string(</tr>)
+ string(</table>)
+tag(---)
+key(name)operator(:) string(vertical alignment)
+key(desc)operator(:) string(Special alignment symbols are available for vertical alignment within table cells.)
+key(in)operator(:) string(|^. top alignment|)
+key(html)operator(:) string(|-)
+ string(<table>)
+ string(<tr>)
+ string(<td) string(style="vertical-align)symbol(:top)string(;">top) string(alignment</td>)
+ string(</tr>)
+ string(</table>)
+tag(---)
+key(name)operator(:) string(vertical alignment 2)
+key(in)operator(:) string(|-)
+ string(|-.) string(middle) string(alignment|)
+key(html)operator(:) string(|-)
+ string(<table>)
+ string(<tr>)
+ string(<td) string(style="vertical-align)symbol(:middle)string(;">middle) string(alignment</td>)
+ string(</tr>)
+ string(</table>)
+tag(---)
+key(name)operator(:) string(vertical alignment 3)
+key(in)operator(:) string(|-)
+ string(|~.) string(bottom) string(alignment|)
+key(html)operator(:) string(|-)
+ string(<table>)
+ string(<tr>)
+ string(<td) string(style="vertical-align)symbol(:bottom)string(;">bottom) string(alignment</td>)
+ string(</tr>)
+ string(</table>)
+tag(---)
+key(name)operator(:) string(column span)
+key(desc)operator(:) string(Use a \\ backslash to indicate a column span.)
+key(in)operator(:) string(|-)
+ string(|\\2.) string(spans) string(two) string(cols) string(|)
+ string(|) string(col) string(1) string(|) string(col) string(2) string(|)
+key(html)operator(:) string(|-)
+ string(<table>)
+ string(<tr>)
+ string(<td) string(colspan="2">spans) string(two) string(cols) string(</td>)
+ string(</tr>)
+ string(<tr>)
+ string(<td>) string(col) string(1) string(</td>)
+ string(<td>) string(col) string(2) string(</td>)
+ string(</tr>)
+ string(</table>)
+tag(---)
+key(name)operator(:) string(row span)
+key(desc)operator(:) string(Use a / forward slash to indicate a row span.)
+key(in)operator(:) string(|-)
+ string(|/3.) string(spans) string(3) string(rows) string(|) string(row) string(a) string(|)
+ string(|) string(row) string(b) string(|)
+ string(|) string(row) string(c) string(|)
+key(html)operator(:) string(|-)
+ string(<table>)
+ string(<tr>)
+ string(<td) string(rowspan="3">spans) string(3) string(rows) string(</td>)
+ string(<td>) string(row) string(a) string(</td>)
+ string(</tr>)
+ string(<tr>)
+ string(<td>) string(row) string(b) string(</td>)
+ string(</tr>)
+ string(<tr>)
+ string(<td>) string(row) string(c) string(</td>)
+ string(</tr>)
+ string(</table>)
+tag(---)
+key(name)operator(:) string(whitespace required)
+key(desc)operator(:) string(Links, images and phrase modifiers normally require surrounding whitespace.)
+key(in)operator(:) string(this*won't*work)
+key(html)operator(:) string(<p>this*won&#8217;t*work</p>)
+tag(---)
+key(name)operator(:) string(modifier without whitespace)
+key(desc)operator(:) string(To use these without whitespace, surround the modifier with [] square brackets.)
+key(in)operator(:) string(this[*will*]work)
+key(html)operator(:) string(<p>this<strong>will</strong>work</p>)
+tag(---)
+key(name)operator(:) string(modifier without whitespace 2)
+key(desc)operator(:) string(This is particularly useful in conjunction with superscript and subscript.)
+key(in)operator(:) string(1[^st^], 2[^nd^], 3[^rd^].)
+key(html)operator(:) string(<p>1<sup>st</sup>, 2<sup>nd</sup>, 3<sup>rd</sup>.</p>)
+tag(---)
+key(name)operator(:) string(modifier without whitespace 3)
+key(in)operator(:) string(2 log[~n~])
+key(html)operator(:) string(<p>2 log<sub>n</sub></p>)
+tag(---)
+key(name)operator(:) string(modifier without whitespace 4)
+key(desc)operator(:) string(It can also be used to include links and images without surrounding whitespace.)
+key(in)operator(:) string(|-)
+ string(A) string(close[!/img.gif!]image.)
+ string(A) string(tight["text")symbol(:http)error(:)string(//thresholdstate.com/]link.)
+ string(A) operator([)key<delimiter(")content(footnoted link)delimiter(")>symbol(:http)error(:)string(//thresholdstate.com/][1].)
+key(html)operator(:) string(|-)
+ string(<p>A) string(close<img) string(src="/img.gif") string(alt="") string(/>image.<br) string(/>)
+ string(A) string(tight<a) string(href="http)error(:)string(//thresholdstate.com/">text</a>link.<br) string(/>)
+ string(A) string(<a) string(href="http)error(:)string(//thresholdstate.com/">footnoted) string(link</a><sup) string(class="footnote"><a) string(href="#fn1">1</a></sup>.</p>)
+comment(# html: |-)
+comment(# <p>A close<img src="/img.gif" alt="" />image.<br />)
+comment(# A tight<a href="http://thresholdstate.com/">text</a>link.<br />)
+comment(# A <a href="http://thresholdstate.com/">footnoted link</a><sup class="footnote"><a href="#fn1216642796463b1223ae29d">1</a></sup>.</p>) \ No newline at end of file
diff --git a/test/scanners/yaml/threshold.in.yml b/test/scanners/yaml/threshold.in.yml
new file mode 100644
index 0000000..f16d5d9
--- /dev/null
+++ b/test/scanners/yaml/threshold.in.yml
@@ -0,0 +1,772 @@
+--- # From http://thresholdstate.com/articles/4312/the-textile-reference-manual
+name: paragraph
+desc: Paragraphs are separated by blank lines. Each paragraph of text is transformed into a XHTML <p> paragraph block.
+in: |-
+ A paragraph.
+
+ Another paragraph.
+html: |-
+ <p>A paragraph.</p>
+ <p>Another paragraph.</p>
+---
+name: line breaks
+desc: Line breaks within paragraphs are transformed into XHTML line breaks.
+in: |-
+ A paragraph with
+ a line break.
+html: |-
+ <p>A paragraph with<br />
+ a line break.</p>
+---
+name: xhtml tags
+desc: Simple XHTML tags may be included in a paragraph.
+in: Here's some <b>bold</b> text.
+html: <p>Here&#8217;s some <b>bold</b> text.</p>
+---
+name: no paragraph tags
+desc: A line beginning with a space will be left untouched, and not wrapped in <p> tags.
+in: " No paragraph tags here."
+html: "No paragraph tags here."
+valid_html: false
+---
+name: smart quotes
+desc: Single and double typewriter quotation marks ' and " are transformed into typographically correct “curly” quote marks.
+in: '"Proceed!" said he to the host.'
+html: '<p>&#8220;Proceed!&#8221; said he to the host.</p>'
+---
+name: smart quotes 2
+in: "'Proceed!' said he to the host."
+html: "<p>&#8216;Proceed!&#8217; said he to the host.</p>"
+---
+name: nested quotation marks
+desc: Single and double quotation marks may be nested one inside the other.
+in: |-
+ "'I swear, captain,' replied I."
+html: |-
+ <p>&#8220;&#8216;I swear, captain,&#8217; replied I.&#8221;</p>
+---
+name: nested quotation marks 2
+in: |-
+ '"I swear, captain," replied I.'
+html: |-
+ <p>&#8216;&#8220;I swear, captain,&#8221; replied I.&#8217;</p>
+---
+name: apostrophe glyphs
+desc: Single quotation marks ' will be turned into apostrophe glyphs when used as such.
+in: Greengrocers' apostrophe's.
+html: <p>Greengrocers&#8217; apostrophe&#8217;s.</p>
+---
+name: em-dash glyphs
+desc: Double -- dashes become an em-dash glyph.
+in: You know the Italian proverb -- Chi ha compagno ha padrone.
+html: <p>You know the Italian proverb &#8212; Chi ha compagno ha padrone.</p>
+---
+name: em-dash glyphs 2
+in: You know the Italian proverb--Chi ha compagno ha padrone.
+html: <p>You know the Italian proverb&#8212;Chi ha compagno ha padrone.</p>
+---
+name: en-dash glyphs
+desc: Single - dashes are replaced with en-dashes.
+in: You know the Italian proverb - Chi ha compagno ha padrone.
+html: <p>You know the Italian proverb &#8211; Chi ha compagno ha padrone.</p>
+---
+name: ellipsis character
+desc: Three period marks become an ellipsis character.
+in: Meanwhile...
+html: <p>Meanwhile&#8230;</p>
+---
+name: dimension character
+desc: An “x” is replaced with the dimension character when used between numbers.
+in: 1 x 2 x 3 = 6
+html: <p>1 &#215; 2 &#215; 3 = 6</p>
+---
+name: dimension character 2
+in: 1x2x3 = 6
+html: <p>1&#215;2&#215;3 = 6</p>
+---
+name: trademark register copyright
+desc: Trademark, Registered and Copyright symbols are represented by their common plain text equivalents.
+in: Registered(r) Trademark(tm) Copyright (c).
+html: <p>Registered&#174; Trademark&#8482; Copyright &#169;.</p>
+---
+name: acronyms
+desc: Acronyms consist of three or more uppercase characters, followed immediately by words in parentheses.
+in: ABC(Always Be Closing)
+html: <p><acronym title="Always Be Closing"><span class="caps">ABC</span></acronym></p>
+no_span_caps_html: <p><acronym title="Always Be Closing">ABC</acronym></p>
+---
+name: uppercase
+desc: Uppercase words of three or more characters are enclosed with a special span element.
+in: IBM or HAL
+html: <p><span class="caps">IBM</span> or <span class="caps">HAL</span></p>
+no_span_caps_html: <p>IBM or HAL</p>
+---
+name: emphasis
+desc: Emphasis is added with _ underscores.
+in: The _underlying_ cause.
+html: <p>The <em>underlying</em> cause.</p>
+---
+name: strong text
+desc: Strong text is indicated by * asterisks.
+in: The *underlying* cause.
+html: <p>The <strong>underlying</strong> cause.</p>
+---
+name: italic text
+desc: em is a semantic tag, usually represented by browsers as italic text. To produce italic tags instead, use double underscores.
+in: The __underlying__ cause.
+html: <p>The <i>underlying</i> cause.</p>
+---
+name: bold text
+desc: strong is a semantic tag, usually represented by browsers as bold text. To produce bold tags instead, use double asterisks.
+in: The **underlying** cause.
+html: <p>The <b>underlying</b> cause.</p>
+---
+name: citation
+desc: Double question marks represent a citation, like the title of a book.
+in: ??The Count of Monte Cristo??, by Dumas.
+html: <p><cite>The Count of Monte Cristo</cite>, by Dumas.</p>
+---
+name: inserted and deleted text
+desc: Inserted and deleted text is represented by + plus and - minus symbols.
+in: Scratch -that-, replace with +this+.
+html: <p>Scratch <del>that</del>, replace with <ins>this</ins>.</p>
+---
+name: subscript
+desc: Subscript text is indicated by ~ tilde characters.
+in: log ~2~ n
+html: <p>log <sub>2</sub> n</p>
+---
+name: superscript
+desc: Superscript text is indicated by ^ caret characters.
+in: 2 ^x^
+html: <p>2 <sup>x</sup></p>
+---
+name: span tag
+desc: Percentage marks will enclose text with a XHTML span tag.
+in: The %underlying% cause.
+html: <p>The <span>underlying</span> cause.</p>
+---
+name: code
+desc: To include a short snippet of code such as XHTML or Javascript, surround it with @ “at” symbols. XHTML significant characters within a code phrase will be escaped for display to the reader.
+in: About the @<hr />@ tag.
+html: <p>About the <code>&lt;hr /&gt;</code> tag.</p>
+---
+name: links
+desc: Links are represented by double quotes and a colon.
+in: '"link text":http://example.com/'
+html: <p><a href="http://example.com/">link text</a></p>
+---
+name: local links
+desc: The host name may be ommitted for local links.
+in: '"link text":/example'
+html: <p><a href="/example">link text</a></p>
+---
+name: link title
+desc: A title may be placed in () parentheses.
+in: '"link text(with title)":http://example.com/'
+html: <p><a href="http://example.com/" title="with title">link text</a></p>
+---
+name: link alias
+desc: For frequent linking to a single URL, you can specify a link alias with [] square brackets.
+in: |-
+ Here's "a link":tstate, and
+ "another link":tstate to the same site.
+
+ [tstate]http://thresholdstate.com/
+html: |-
+ <p>Here&#8217;s <a href="http://thresholdstate.com/">a link</a>, and<br />
+ <a href="http://thresholdstate.com/">another link</a> to the same site.</p>
+---
+name: image
+desc: Use ! exclamation marks to insert an image tag.
+in: "!/img.gif!"
+html: <p><img src="/img.gif" alt="" /></p>
+---
+name: image 2
+in: "!http://thresholdstate.com/img.gif!"
+html: <p><img src="http://thresholdstate.com/img.gif" alt="" /></p>
+---
+name: image alt
+desc: Use () parentheses to include “alt” text.
+in: "!/img.gif(alt text)!"
+html: <p><img src="/img.gif" title="alt text" alt="alt text" /></p>
+---
+name: image links
+desc: Images may be combined with links by using an !image! in place of the link text.
+in: "!/img.gif!:http://textpattern.com/"
+html: <p><a href="http://textpattern.com/"><img src="/img.gif" alt="" /></a></p>
+---
+name: headers
+desc: Headers are represented by h1., h2., … h6..
+in: h1. Heading 1
+html: <h1>Heading 1</h1>
+---
+name: headers 2
+in: h2. Heading 2
+html: <h2>Heading 2</h2>
+---
+name: headers 3
+in: h6. Heading 6
+html: <h6>Heading 6</h6>
+---
+name: paragraph text
+desc: "Paragraph p text is represented by p.. This is the default block type: any paragraph without a block modifier will automatically be enclosed with p tags."
+in: |-
+ p. A paragraph.
+ Continued.
+
+ Also a paragraph.
+html: |-
+ <p>A paragraph.<br />
+ Continued.</p>
+ <p>Also a paragraph.</p>
+---
+name: block quote
+desc: bq. indicates a quoted block of text.
+in: |-
+ bq. A quotation.
+ Continued.
+
+ Regular paragraph.
+html: |-
+ <blockquote>
+ <p>A quotation.<br />
+ Continued.</p>
+ </blockquote>
+ <p>Regular paragraph.</p>
+---
+name: block quote citation
+desc: Block quotes may include a citation URL immediately following the period.
+in: bq.:http://thresholdstate.com/ A cited quotation.
+html: |-
+ <blockquote cite="http://thresholdstate.com/">
+ <p>A cited quotation.</p>
+ </blockquote>
+---
+name: footnotes
+desc: Footnotes are represented by the fn1., fn2., … block modifiers.
+in: |-
+ A footnote reference[1].
+
+ fn1. The footnote.
+html: |-
+ <p>A footnote reference<sup class="footnote"><a href="#fn1">1</a></sup>.</p>
+ <p class="footnote" id="fn1"><sup>1</sup> The footnote.</p>
+# html: |-
+# <p>A footnote reference<sup class="footnote"><a href="#fn1216642796463b1223ae29d">1</a></sup>.</p>
+# <p class="footnote" id="fn1216642796463b1223ae29d"><sup>1</sup> The footnote.</p>
+---
+name: block code
+desc: Code such as XHTML, Javascript or PHP may be displayed using the bc. “block code” modifier. XHTML significant characters such as < and > will be escaped within code blocks – bc is used for displaying code to the reader, not for executing it.
+note: Note that Textile will interpret any blank lines within the code as indicating the end of the code block. See Extended Blocks below for an explanation of how to display longer blocks of code.
+in: |-
+ bc. <script>
+ // a Javascript example
+ alert("Hello World");
+ </script>
+html: |-
+ <pre><code>&lt;script&gt;
+ // a Javascript example
+ alert("Hello World");
+ &lt;/script&gt;</code></pre>
+---
+name: preformatted text
+desc: Use the pre. block modifier for pre-formatted text. XHTML significant characters within the block will be escaped.
+note: pre. is almost identical to bc., with the exception that <code>...</code> tags are not used within the <pre> block.
+in: |-
+ pre. Pre-formatted
+ text
+html: |-
+ <pre>Pre-formatted
+ text</pre>
+---
+name: notextile
+desc: The notextile. block modifier applies no Textile processing at all to a block. Raw XHTML characters are passed through untouched, so this may be used to insert explicit XHTML markup, or execute Javascript or PHP code.
+in: |-
+ notextile. <script type="text/javascript">
+ document.write("Hello World!");
+ </script>
+ <noscript>Your browser doesn't support Javascript</noscript>
+html: |-
+ <script type="text/javascript">
+ document.write("Hello World!");
+ </script>
+ <noscript>Your browser doesn't support Javascript</noscript>
+valid_html: false
+---
+name: class attribute
+desc: CSS classes are specified with () parentheses.
+in: p(myclass). My classy paragraph.
+html: <p class="myclass">My classy paragraph.</p>
+---
+name: id attribute
+desc: CSS IDs are specified with () parentheses.
+in: p(#myid). My ID paragraph.
+html: <p id="myid">My ID paragraph.</p>
+---
+name: style attribute
+desc: CSS styles are specified with {} braces.
+in: p{color:red}. Red rum.
+html: <p style="color:red;">Red rum.</p>
+---
+name: lang attribute
+desc: Languages are specified with [] brackets.
+in: p[fr-fr]. En français.
+html: <p lang="fr-fr">En français.</p>
+---
+name: phrase modifiers
+desc: The same syntax may be applied to phrase modifiers.
+in: A *(myclass)classy* phrase.
+html: <p>A <strong class="myclass">classy</strong> phrase.</p>
+---
+name: phrase modifiers 2
+in: An _(#myid2)ID_ phrase.
+html: <p>An <em id="myid2">ID</em> phrase.</p>
+---
+name: phrase modifiers 3
+in: The %{color:blue}blue% room.
+html: <p>The <span style="color:blue;">blue</span> room.</p>
+---
+name: block and phrase attributes combined
+desc: Block and phrase attributes may be combined.
+in: p(myclass#myid3){color:green}[de-de]. A complex paragraph.
+html: <p style="color:green;" class="myclass" lang="de-de" id="myid3">A complex paragraph.</p>
+---
+name: block and phrase attributes combined 2
+in: A ??(myclass#myid4){color:green}[de-de]complex?? phrase.
+html: <p>A <cite style="color:green;" class="myclass" lang="de-de" id="myid4">complex</cite> phrase.</p>
+---
+name: extended blocks
+desc: Normally a block modifier covers a single block of text, and ends at the first blank line. To extend a block over multiple paragraphs that include blank lines, use a block modifier with two period marks instead of one. To close the extended block, use a different block modifier on the next paragraph.
+in: |-
+ bq.. A quote.
+
+ The quote continued.
+
+ p. Back to paragraph text.
+html: |-
+ <blockquote>
+ <p>A quote.</p>
+ <p>The quote continued.</p>
+ </blockquote>
+ <p>Back to paragraph text.</p>
+---
+name: extended block code
+desc: Extended blocks are useful for displaying longer examples of code that contain blank lines.
+in: |-
+ A PHP code example.
+
+ bc.. <?php
+ function hello() {
+ // display a hello message
+
+ print "Hello, World";
+ }
+ ?>
+
+ p. Following paragraph.
+html: |-
+ <p>A <span class="caps">PHP</span> code example.</p>
+ <pre><code>&lt;?php
+ function hello() {
+ // display a hello message</code>
+
+ <code>print "Hello, World";
+ }
+ ?&gt;</code>
+
+ </pre>
+ <p>Following paragraph.</p>
+---
+name: extended block attributes
+desc: Any block attributes on an extended block will be included on each following block.
+in: |-
+ p(myclass).. A classy paragraph.
+
+ Another classy paragraph.
+
+ p. Not so classy.
+html: |-
+ <p class="myclass">A classy paragraph.</p>
+ <p class="myclass">Another classy paragraph.</p>
+ <p>Not so classy.</p>
+---
+name: extended block quote attributes
+desc: Attributes on bq.. extended blocks will be included on both the inner and outer blocks.
+in: |-
+ bq(myclass).. Quote paragraph 1.
+
+ Paragraph 2.
+html: |-
+ <blockquote class="myclass">
+ <p class="myclass">Quote paragraph 1.</p>
+ <p class="myclass">Paragraph 2.</p>
+ </blockquote>
+---
+name: extended block code attributes
+desc: Attributes on bc.. extended blocks will be included on both the inner and outer blocks.
+in: |-
+ bc(myclass).. Code block 1.
+
+ Code block 2.
+html: |-
+ <pre class="myclass"><code class="myclass">Code block 1.</code>
+
+ <code class="myclass">Code block 2.</code></pre>
+---
+name: raw xhtml left in tact
+desc: Raw XHTML tags are generally left untouched by Textile. Span tags that enclose only part of a block of text will be left intact, while the block itself is treated normally.
+in: <b>bold</b> and <i>italic</i>, the hard way.
+html: <p><b>bold</b> and <i>italic</i>, the hard way.</p>
+---
+name: paragraphs entirely raw xhtml
+desc: Paragraphs that consist entirely of raw XHTML block tags will not be enclosed in <p>...</p> tags.
+in: <div class="mydiv">My div</div>
+html: <div class="mydiv">My div</div>
+---
+name: paragraphs with inline xhtml
+desc: Paragraphs that consist only of inline XHTML tags, will be enclosed in <p>...</p> tags.
+in: <img src="/img.gif" alt="image" />
+html: <p><img src="/img.gif" alt="image" /></p>
+---
+name: paragraphs with inline xhtml 2
+in: <span class="myspan">I'll make my own way.</span>
+html: '<p><span class="myspan">I&#8217;ll make my own way.</span></p>'
+---
+name: paragraphs partly enclosed in xhtml block tags
+desc: Paragraphs that are only partly enclosed in block tags will be enclosed in <p>...</p> tags.
+in: <div>inside</div> and outside.
+html: <div>inside</div> <p>and outside.</p>
+# html: <p><div>inside</div> and outside.</p>
+---
+name: complex xhtml blocks
+desc: Textile can’t always identify the beginning and end of long or complex blocks of XHTML. To prevent Textile from enclosing complex XHTML blocks in paragraph tags, either use a space at the beginning of each line...
+in: " <div>\n <span>My div</span>\n </div>"
+html: "<div>\n<span>My div</span>\n</div>"
+---
+name: complex xhtml blocks 2
+desc: ...or a notexile.. extended block.
+in: |-
+ notextile.. <div>
+
+ <span>My div</span>
+
+ </div>
+html: |-
+ <div>
+
+ <span>My div</span>
+
+ </div>
+---
+name: complex xhtml blocks with inline formatting
+desc: Textile will not wrap lines that start with a space in paragraph tags, but it should parse inline signatures
+in: " <div>\n <span>My *div*</span>\n </div>"
+html: "<div>\n<span>My <strong>div</strong></span>\n</div>"
+---
+name: explicit pre escapement
+desc: The contents of explicit <pre>...</pre> tags are escaped for display.
+in: |-
+ <pre>
+ A HTML <b>example</b>
+ </pre>
+html: |-
+ <pre>
+ A HTML &lt;b&gt;example&lt;/b&gt;
+ </pre>
+note: This syntax is supported for backwards compatibility only, and doesn’t always work as expected. The block modifier pre. should be used instead.
+---
+name: explicit code escapement
+desc: The contents of explicit <code>...</code> tags are escaped for display.
+in: |-
+ <code>
+ Another HTML <b>example</b>
+ </code>
+html: |-
+ <p><code>
+ Another HTML &lt;b&gt;example&lt;/b&gt;
+ </code></p>
+note: This syntax is supported for backwards compatibility only, and doesn’t always work as expected. The block modifier bc. should be used instead.
+---
+name: notextile tags
+desc: Blocks enclosed by the pseudo tag <notextile>...</notextile> will be left untouched.
+in: |-
+ <notextile>
+ p. Leave me alone
+ </notextile>
+html: |-
+ p. Leave me alone
+# html: |-
+# <p>
+# p. Leave me alone
+# </p>
+note: This syntax is supported for backwards compatibility only, and doesn’t always work as expected. The block modifier notextile. should be used instead.
+valid_html: false
+---
+name: left aligned text
+desc: Left alignment is specified with a < less than symbol.
+in: p<. Left-aligned paragraph.
+html: <p style="text-align:left;">Left-aligned paragraph.</p>
+---
+name: right aligned text
+desc: Right alignment is specified with a > greater than symbol.
+in: h3>. Right-aligned heading.
+html: <h3 style="text-align:right;">Right-aligned heading.</h3>
+---
+name: justified text
+desc: Use both <> symbols for justified text.
+in: p<>. Justified paragraph.
+html: <p style="text-align:justify;">Justified paragraph.</p>
+---
+name: centered text
+desc: An = equals symbol represents centered text.
+in: h3=. Centered heading.
+html: <h3 style="text-align:center;">Centered heading.</h3>
+---
+name: padding
+desc: Use empty ( and ) parentheses to add padding to blocks, in multiples of 1 em.
+in: p(. Left pad 1em.
+html: <p style="padding-left:1em;">Left pad 1em.</p>
+---
+name: padding 2
+in: p)). Right pad 2em.
+html: <p style="padding-right:2em;">Right pad 2em.</p>
+---
+name: padding 3
+in: p(). Left and right pad 1em.
+html: <p style="padding-left:1em;padding-right:1em;">Left and right pad 1em.</p>
+---
+name: numeric lists
+desc: Numeric lists are represented by lines beginning with #.
+in: |-
+ # Item one
+ # Item two
+ # Item three
+html: |-
+ <ol>
+ <li>Item one</li>
+ <li>Item two</li>
+ <li>Item three</li>
+ </ol>
+---
+name: bulleted lists
+desc: Bulleted lists are represented by lines beginning with *.
+in: |-
+ * Item A
+ * Item B
+ * Item C
+html: |-
+ <ul>
+ <li>Item A</li>
+ <li>Item B</li>
+ <li>Item C</li>
+ </ul>
+---
+name: list attributes
+desc: Attributes applied to the first list item will apply to the list itself.
+in: |-
+ *{color:red} Item one
+ * Item two
+ * Item three
+html: |-
+ <ul style="color:red;">
+ <li>Item one</li>
+ <li>Item two</li>
+ <li>Item three</li>
+ </ul>
+---
+name: nested lists
+desc: Use multiple # or * symbols to create nested lists.
+in: |-
+ # Item one
+ ## Item one-A
+ ## Item one-B
+ ### Item one-B-a
+ # Item two
+html: |-
+ <ol>
+ <li>Item one
+ <ol>
+ <li>Item one-A</li>
+ <li>Item one-B
+ <ol>
+ <li>Item one-B-a</li>
+ </ol></li>
+ </ol></li>
+ <li>Item two</li>
+ </ol>
+---
+name: tables
+desc: Tables can be constructed using | “pipe” symbols to separate cells.
+in: |a|simple|table|
+html: |-
+ <table>
+ <tr>
+ <td>a</td>
+ <td>simple</td>
+ <td>table</td>
+ </tr>
+ </table>
+---
+name: table heading cells
+desc: Use _. to indicate table heading cells.
+in: |-
+ |_. a|_. table|_. heading|
+ |a|table|row|
+html: |-
+ <table>
+ <tr>
+ <th>a</th>
+ <th>table</th>
+ <th>heading</th>
+ </tr>
+ <tr>
+ <td>a</td>
+ <td>table</td>
+ <td>row</td>
+ </tr>
+ </table>
+---
+name: cell attributes
+desc: Attributes may be applied separately to individual cells, rows, and entire tables. Cell attributes are placed within each cell.
+in: |a|{color:red}. styled|cell|
+html: |-
+ <table>
+ <tr>
+ <td>a</td>
+ <td style="color:red;">styled</td>
+ <td>cell</td>
+ </tr>
+ </table>
+---
+name: row attributes
+desc: Row attributes are placed at the beginning of a row, followed by a dot and a space.
+in: (rowclass). |a|classy|row|
+html: |-
+ <table>
+ <tr class="rowclass">
+ <td>a</td>
+ <td>classy</td>
+ <td>row</td>
+ </tr>
+ </table>
+---
+name: table attributes
+desc: Table attributes are specified by placing the special table. block modifier immediately before the table.
+in: |-
+ table(tableclass).
+ |a|classy|table|
+ |a|classy|table|
+html: |-
+ <table class="tableclass">
+ <tr>
+ <td>a</td>
+ <td>classy</td>
+ <td>table</td>
+ </tr>
+ <tr>
+ <td>a</td>
+ <td>classy</td>
+ <td>table</td>
+ </tr>
+ </table>
+---
+name: vertical alignment
+desc: Special alignment symbols are available for vertical alignment within table cells.
+in: |^. top alignment|
+html: |-
+ <table>
+ <tr>
+ <td style="vertical-align:top;">top alignment</td>
+ </tr>
+ </table>
+---
+name: vertical alignment 2
+in: |-
+ |-. middle alignment|
+html: |-
+ <table>
+ <tr>
+ <td style="vertical-align:middle;">middle alignment</td>
+ </tr>
+ </table>
+---
+name: vertical alignment 3
+in: |-
+ |~. bottom alignment|
+html: |-
+ <table>
+ <tr>
+ <td style="vertical-align:bottom;">bottom alignment</td>
+ </tr>
+ </table>
+---
+name: column span
+desc: Use a \ backslash to indicate a column span.
+in: |-
+ |\2. spans two cols |
+ | col 1 | col 2 |
+html: |-
+ <table>
+ <tr>
+ <td colspan="2">spans two cols </td>
+ </tr>
+ <tr>
+ <td> col 1 </td>
+ <td> col 2 </td>
+ </tr>
+ </table>
+---
+name: row span
+desc: Use a / forward slash to indicate a row span.
+in: |-
+ |/3. spans 3 rows | row a |
+ | row b |
+ | row c |
+html: |-
+ <table>
+ <tr>
+ <td rowspan="3">spans 3 rows </td>
+ <td> row a </td>
+ </tr>
+ <tr>
+ <td> row b </td>
+ </tr>
+ <tr>
+ <td> row c </td>
+ </tr>
+ </table>
+---
+name: whitespace required
+desc: Links, images and phrase modifiers normally require surrounding whitespace.
+in: this*won't*work
+html: <p>this*won&#8217;t*work</p>
+---
+name: modifier without whitespace
+desc: To use these without whitespace, surround the modifier with [] square brackets.
+in: this[*will*]work
+html: <p>this<strong>will</strong>work</p>
+---
+name: modifier without whitespace 2
+desc: This is particularly useful in conjunction with superscript and subscript.
+in: 1[^st^], 2[^nd^], 3[^rd^].
+html: <p>1<sup>st</sup>, 2<sup>nd</sup>, 3<sup>rd</sup>.</p>
+---
+name: modifier without whitespace 3
+in: 2 log[~n~]
+html: <p>2 log<sub>n</sub></p>
+---
+name: modifier without whitespace 4
+desc: It can also be used to include links and images without surrounding whitespace.
+in: |-
+ A close[!/img.gif!]image.
+ A tight["text":http://thresholdstate.com/]link.
+ A ["footnoted link":http://thresholdstate.com/][1].
+html: |-
+ <p>A close<img src="/img.gif" alt="" />image.<br />
+ A tight<a href="http://thresholdstate.com/">text</a>link.<br />
+ A <a href="http://thresholdstate.com/">footnoted link</a><sup class="footnote"><a href="#fn1">1</a></sup>.</p>
+# html: |-
+# <p>A close<img src="/img.gif" alt="" />image.<br />
+# A tight<a href="http://thresholdstate.com/">text</a>link.<br />
+# A <a href="http://thresholdstate.com/">footnoted link</a><sup class="footnote"><a href="#fn1216642796463b1223ae29d">1</a></sup>.</p> \ No newline at end of file