Background: #fff
Foreground: #000
PrimaryPale: #8cf
PrimaryLight: #18f
PrimaryMid: #04b
PrimaryDark: #014
SecondaryPale: #ffc
SecondaryLight: #fe8
SecondaryMid: #db4
SecondaryDark: #841
TertiaryPale: #eee
TertiaryLight: #ccc
TertiaryMid: #999
TertiaryDark: #666
Error: #f88
/*{{{*/
body {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}

a {color:[[ColorPalette::PrimaryMid]];}
a:hover {background-color:[[ColorPalette::PrimaryMid]]; color:[[ColorPalette::Background]];}
a img {border:0;}

h1,h2,h3,h4,h5,h6 {color:[[ColorPalette::SecondaryDark]]; background:transparent;}
h1 {border-bottom:2px solid [[ColorPalette::TertiaryLight]];}
h2,h3 {border-bottom:1px solid [[ColorPalette::TertiaryLight]];}

.button {color:[[ColorPalette::PrimaryDark]]; border:1px solid [[ColorPalette::Background]];}
.button:hover {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::SecondaryLight]]; border-color:[[ColorPalette::SecondaryMid]];}
.button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::SecondaryDark]];}

.header {background:[[ColorPalette::PrimaryMid]];}
.headerShadow {color:[[ColorPalette::Foreground]];}
.headerShadow a {font-weight:normal; color:[[ColorPalette::Foreground]];}
.headerForeground {color:[[ColorPalette::Background]];}
.headerForeground a {font-weight:normal; color:[[ColorPalette::PrimaryPale]];}

.tabSelected{color:[[ColorPalette::PrimaryDark]];
	background:[[ColorPalette::TertiaryPale]];
	border-left:1px solid [[ColorPalette::TertiaryLight]];
	border-top:1px solid [[ColorPalette::TertiaryLight]];
	border-right:1px solid [[ColorPalette::TertiaryLight]];
}
.tabUnselected {color:[[ColorPalette::Background]]; background:[[ColorPalette::TertiaryMid]];}
.tabContents {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::TertiaryPale]]; border:1px solid [[ColorPalette::TertiaryLight]];}
.tabContents .button {border:0;}

#sidebar {}
#sidebarOptions input {border:1px solid [[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel {background:[[ColorPalette::PrimaryPale]];}
#sidebarOptions .sliderPanel a {border:none;color:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:hover {color:[[ColorPalette::Background]]; background:[[ColorPalette::PrimaryMid]];}
#sidebarOptions .sliderPanel a:active {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::Background]];}

.wizard {background:[[ColorPalette::PrimaryPale]]; border:1px solid [[ColorPalette::PrimaryMid]];}
.wizard h1 {color:[[ColorPalette::PrimaryDark]]; border:none;}
.wizard h2 {color:[[ColorPalette::Foreground]]; border:none;}
.wizardStep {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];
	border:1px solid [[ColorPalette::PrimaryMid]];}
.wizardStep.wizardStepDone {background:[[ColorPalette::TertiaryLight]];}
.wizardFooter {background:[[ColorPalette::PrimaryPale]];}
.wizardFooter .status {background:[[ColorPalette::PrimaryDark]]; color:[[ColorPalette::Background]];}
.wizard .button {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryLight]]; border: 1px solid;
	border-color:[[ColorPalette::SecondaryPale]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryDark]] [[ColorPalette::SecondaryPale]];}
.wizard .button:hover {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Background]];}
.wizard .button:active {color:[[ColorPalette::Background]]; background:[[ColorPalette::Foreground]]; border: 1px solid;
	border-color:[[ColorPalette::PrimaryDark]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryPale]] [[ColorPalette::PrimaryDark]];}

#messageArea {border:1px solid [[ColorPalette::SecondaryMid]]; background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]];}
#messageArea .button {color:[[ColorPalette::PrimaryMid]]; background:[[ColorPalette::SecondaryPale]]; border:none;}

.popupTiddler {background:[[ColorPalette::TertiaryPale]]; border:2px solid [[ColorPalette::TertiaryMid]];}

.popup {background:[[ColorPalette::TertiaryPale]]; color:[[ColorPalette::TertiaryDark]]; border-left:1px solid [[ColorPalette::TertiaryMid]]; border-top:1px solid [[ColorPalette::TertiaryMid]]; border-right:2px solid [[ColorPalette::TertiaryDark]]; border-bottom:2px solid [[ColorPalette::TertiaryDark]];}
.popup hr {color:[[ColorPalette::PrimaryDark]]; background:[[ColorPalette::PrimaryDark]]; border-bottom:1px;}
.popup li.disabled {color:[[ColorPalette::TertiaryMid]];}
.popup li a, .popup li a:visited {color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border: none;}
.popup li a:active {background:[[ColorPalette::SecondaryPale]]; color:[[ColorPalette::Foreground]]; border: none;}
.popupHighlight {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
.listBreak div {border-bottom:1px solid [[ColorPalette::TertiaryDark]];}

.tiddler .defaultCommand {font-weight:bold;}

.shadow .title {color:[[ColorPalette::TertiaryDark]];}

.title {color:[[ColorPalette::SecondaryDark]];}
.subtitle {color:[[ColorPalette::TertiaryDark]];}

.toolbar {color:[[ColorPalette::PrimaryMid]];}
.toolbar a {color:[[ColorPalette::TertiaryLight]];}
.selected .toolbar a {color:[[ColorPalette::TertiaryMid]];}
.selected .toolbar a:hover {color:[[ColorPalette::Foreground]];}

.tagging, .tagged {border:1px solid [[ColorPalette::TertiaryPale]]; background-color:[[ColorPalette::TertiaryPale]];}
.selected .tagging, .selected .tagged {background-color:[[ColorPalette::TertiaryLight]]; border:1px solid [[ColorPalette::TertiaryMid]];}
.tagging .listTitle, .tagged .listTitle {color:[[ColorPalette::PrimaryDark]];}
.tagging .button, .tagged .button {border:none;}

.footer {color:[[ColorPalette::TertiaryLight]];}
.selected .footer {color:[[ColorPalette::TertiaryMid]];}

.sparkline {background:[[ColorPalette::PrimaryPale]]; border:0;}
.sparktick {background:[[ColorPalette::PrimaryDark]];}

.error, .errorButton {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::Error]];}
.warning {color:[[ColorPalette::Foreground]]; background:[[ColorPalette::SecondaryPale]];}
.lowlight {background:[[ColorPalette::TertiaryLight]];}

.zoomer {background:none; color:[[ColorPalette::TertiaryMid]]; border:3px solid [[ColorPalette::TertiaryMid]];}

.imageLink, #displayArea .imageLink {background:transparent;}

.annotation {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; border:2px solid [[ColorPalette::SecondaryMid]];}

.viewer .listTitle {list-style-type:none; margin-left:-2em;}
.viewer .button {border:1px solid [[ColorPalette::SecondaryMid]];}
.viewer blockquote {border-left:3px solid [[ColorPalette::TertiaryDark]];}

.viewer table, table.twtable {border:2px solid [[ColorPalette::TertiaryDark]];}
.viewer th, .viewer thead td, .twtable th, .twtable thead td {background:[[ColorPalette::SecondaryMid]]; border:1px solid [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::Background]];}
.viewer td, .viewer tr, .twtable td, .twtable tr {border:1px solid [[ColorPalette::TertiaryDark]];}

.viewer pre {border:1px solid [[ColorPalette::SecondaryLight]]; background:[[ColorPalette::SecondaryPale]];}
.viewer code {color:[[ColorPalette::SecondaryDark]];}
.viewer hr {border:0; border-top:dashed 1px [[ColorPalette::TertiaryDark]]; color:[[ColorPalette::TertiaryDark]];}

.highlight, .marked {background:[[ColorPalette::SecondaryLight]];}

.editor input {border:1px solid [[ColorPalette::PrimaryMid]];}
.editor textarea {border:1px solid [[ColorPalette::PrimaryMid]]; width:100%;}
.editorFooter {color:[[ColorPalette::TertiaryMid]];}

#backstageArea {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::TertiaryMid]];}
#backstageArea a {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstageArea a:hover {background:[[ColorPalette::SecondaryLight]]; color:[[ColorPalette::Foreground]]; }
#backstageArea a.backstageSelTab {background:[[ColorPalette::Background]]; color:[[ColorPalette::Foreground]];}
#backstageButton a {background:none; color:[[ColorPalette::Background]]; border:none;}
#backstageButton a:hover {background:[[ColorPalette::Foreground]]; color:[[ColorPalette::Background]]; border:none;}
#backstagePanel {background:[[ColorPalette::Background]]; border-color: [[ColorPalette::Background]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]] [[ColorPalette::TertiaryDark]];}
.backstagePanelFooter .button {border:none; color:[[ColorPalette::Background]];}
.backstagePanelFooter .button:hover {color:[[ColorPalette::Foreground]];}
#backstageCloak {background:[[ColorPalette::Foreground]]; opacity:0.6; filter:'alpha(opacity:60)';}
/*}}}*/
/*{{{*/
* html .tiddler {height:1%;}

body {font-size:.75em; font-family:arial,helvetica; margin:0; padding:0;}

h1,h2,h3,h4,h5,h6 {font-weight:bold; text-decoration:none;}
h1,h2,h3 {padding-bottom:1px; margin-top:1.2em;margin-bottom:0.3em;}
h4,h5,h6 {margin-top:1em;}
h1 {font-size:1.35em;}
h2 {font-size:1.25em;}
h3 {font-size:1.1em;}
h4 {font-size:1em;}
h5 {font-size:.9em;}

hr {height:1px;}

a {text-decoration:none;}

dt {font-weight:bold;}

ol {list-style-type:decimal;}
ol ol {list-style-type:lower-alpha;}
ol ol ol {list-style-type:lower-roman;}
ol ol ol ol {list-style-type:decimal;}
ol ol ol ol ol {list-style-type:lower-alpha;}
ol ol ol ol ol ol {list-style-type:lower-roman;}
ol ol ol ol ol ol ol {list-style-type:decimal;}

.txtOptionInput {width:11em;}

#contentWrapper .chkOptionInput {border:0;}

.externalLink {text-decoration:underline;}

.indent {margin-left:3em;}
.outdent {margin-left:3em; text-indent:-3em;}
code.escaped {white-space:nowrap;}

.tiddlyLinkExisting {font-weight:bold;}
.tiddlyLinkNonExisting {font-style:italic;}

/* the 'a' is required for IE, otherwise it renders the whole tiddler in bold */
a.tiddlyLinkNonExisting.shadow {font-weight:bold;}

#mainMenu .tiddlyLinkExisting,
	#mainMenu .tiddlyLinkNonExisting,
	#sidebarTabs .tiddlyLinkNonExisting {font-weight:normal; font-style:normal;}
#sidebarTabs .tiddlyLinkExisting {font-weight:bold; font-style:normal;}

.header {position:relative;}
.header a:hover {background:transparent;}
.headerShadow {position:relative; padding:4.5em 0em 1em 1em; left:-1px; top:-1px;}
.headerForeground {position:absolute; padding:4.5em 0em 1em 1em; left:0px; top:0px;}

.siteTitle {font-size:3em;}
.siteSubtitle {font-size:1.2em;}

#mainMenu {position:absolute; left:0; width:10em; text-align:right; line-height:1.6em; padding:1.5em 0.5em 0.5em 0.5em; font-size:1.1em;}

#sidebar {position:absolute; right:3px; width:16em; font-size:.9em;}
#sidebarOptions {padding-top:0.3em;}
#sidebarOptions a {margin:0em 0.2em; padding:0.2em 0.3em; display:block;}
#sidebarOptions input {margin:0.4em 0.5em;}
#sidebarOptions .sliderPanel {margin-left:1em; padding:0.5em; font-size:.85em;}
#sidebarOptions .sliderPanel a {font-weight:bold; display:inline; padding:0;}
#sidebarOptions .sliderPanel input {margin:0 0 .3em 0;}
#sidebarTabs .tabContents {width:15em; overflow:hidden;}

.wizard {padding:0.1em 1em 0em 2em;}
.wizard h1 {font-size:2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizard h2 {font-size:1.2em; font-weight:bold; background:none; padding:0em 0em 0em 0em; margin:0.4em 0em 0.2em 0em;}
.wizardStep {padding:1em 1em 1em 1em;}
.wizard .button {margin:0.5em 0em 0em 0em; font-size:1.2em;}
.wizardFooter {padding:0.8em 0.4em 0.8em 0em;}
.wizardFooter .status {padding:0em 0.4em 0em 0.4em; margin-left:1em;}
.wizard .button {padding:0.1em 0.2em 0.1em 0.2em;}

#messageArea {position:fixed; top:2em; right:0em; margin:0.5em; padding:0.5em; z-index:2000; _position:absolute;}
.messageToolbar {display:block; text-align:right; padding:0.2em 0.2em 0.2em 0.2em;}
#messageArea a {text-decoration:underline;}

.tiddlerPopupButton {padding:0.2em 0.2em 0.2em 0.2em;}
.popupTiddler {position: absolute; z-index:300; padding:1em 1em 1em 1em; margin:0;}

.popup {position:absolute; z-index:300; font-size:.9em; padding:0; list-style:none; margin:0;}
.popup .popupMessage {padding:0.4em;}
.popup hr {display:block; height:1px; width:auto; padding:0; margin:0.2em 0em;}
.popup li.disabled {padding:0.4em;}
.popup li a {display:block; padding:0.4em; font-weight:normal; cursor:pointer;}
.listBreak {font-size:1px; line-height:1px;}
.listBreak div {margin:2px 0;}

.tabset {padding:1em 0em 0em 0.5em;}
.tab {margin:0em 0em 0em 0.25em; padding:2px;}
.tabContents {padding:0.5em;}
.tabContents ul, .tabContents ol {margin:0; padding:0;}
.txtMainTab .tabContents li {list-style:none;}
.tabContents li.listLink { margin-left:.75em;}

#contentWrapper {display:block;}
#splashScreen {display:none;}

#displayArea {margin:1em 17em 0em 14em;}

.toolbar {text-align:right; font-size:.9em;}

.tiddler {padding:1em 1em 0em 1em;}

.missing .viewer,.missing .title {font-style:italic;}

.title {font-size:1.6em; font-weight:bold;}

.missing .subtitle {display:none;}
.subtitle {font-size:1.1em;}

.tiddler .button {padding:0.2em 0.4em;}

.tagging {margin:0.5em 0.5em 0.5em 0; float:left; display:none;}
.isTag .tagging {display:block;}
.tagged {margin:0.5em; float:right;}
.tagging, .tagged {font-size:0.9em; padding:0.25em;}
.tagging ul, .tagged ul {list-style:none; margin:0.25em; padding:0;}
.tagClear {clear:both;}

.footer {font-size:.9em;}
.footer li {display:inline;}

.annotation {padding:0.5em; margin:0.5em;}

* html .viewer pre {width:99%; padding:0 0 1em 0;}
.viewer {line-height:1.4em; padding-top:0.5em;}
.viewer .button {margin:0em 0.25em; padding:0em 0.25em;}
.viewer blockquote {line-height:1.5em; padding-left:0.8em;margin-left:2.5em;}
.viewer ul, .viewer ol {margin-left:0.5em; padding-left:1.5em;}

.viewer table, table.twtable {border-collapse:collapse; margin:0.8em 1.0em;}
.viewer th, .viewer td, .viewer tr,.viewer caption,.twtable th, .twtable td, .twtable tr,.twtable caption {padding:3px;}
table.listView {font-size:0.85em; margin:0.8em 1.0em;}
table.listView th, table.listView td, table.listView tr {padding:0px 3px 0px 3px;}

.viewer pre {padding:0.5em; margin-left:0.5em; font-size:1.2em; line-height:1.4em; overflow:auto;}
.viewer code {font-size:1.2em; line-height:1.4em;}

.editor {font-size:1.1em;}
.editor input, .editor textarea {display:block; width:100%; font:inherit;}
.editorFooter {padding:0.25em 0em; font-size:.9em;}
.editorFooter .button {padding-top:0px; padding-bottom:0px;}

.fieldsetFix {border:0; padding:0; margin:1px 0px 1px 0px;}

.sparkline {line-height:1em;}
.sparktick {outline:0;}

.zoomer {font-size:1.1em; position:absolute; overflow:hidden;}
.zoomer div {padding:1em;}

* html #backstage {width:99%;}
* html #backstageArea {width:99%;}
#backstageArea {display:none; position:relative; overflow: hidden; z-index:150; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageToolbar {position:relative;}
#backstageArea a {font-weight:bold; margin-left:0.5em; padding:0.3em 0.5em 0.3em 0.5em;}
#backstageButton {display:none; position:absolute; z-index:175; top:0em; right:0em;}
#backstageButton a {padding:0.1em 0.4em 0.1em 0.4em; margin:0.1em 0.1em 0.1em 0.1em;}
#backstage {position:relative; width:100%; z-index:50;}
#backstagePanel {display:none; z-index:100; position:absolute; margin:0em 3em 0em 3em; padding:1em 1em 1em 1em;}
.backstagePanelFooter {padding-top:0.2em; float:right;}
.backstagePanelFooter a {padding:0.2em 0.4em 0.2em 0.4em;}
#backstageCloak {display:none; z-index:20; position:absolute; width:100%; height:100px;}

.whenBackstage {display:none;}
.backstageVisible .whenBackstage {display:block;}
/*}}}*/
/***
StyleSheet for use when a translation requires any css style changes.
This StyleSheet can be used directly by languages such as Chinese, Japanese and Korean which use a logographic writing system and need larger font sizes.
***/

/*{{{*/
body {font-size:0.8em;}

#sidebarOptions {font-size:1.05em;}
#sidebarOptions a {font-style:normal;}
#sidebarOptions .sliderPanel {font-size:0.95em;}

.subtitle {font-size:0.8em;}

.viewer table.listView {font-size:0.95em;}

.htmlarea .toolbarHA table {border:1px solid ButtonFace; margin:0em 0em;}
/*}}}*/
/*{{{*/
@media print {
#mainMenu, #sidebar, #messageArea, .toolbar, #backstageButton, #backstageArea {display: none ! important;}
#displayArea {margin: 1em 1em 0em 1em;}
/* Fixes a feature in Firefox 1.5.0.2 where print preview displays the noscript content */
noscript {display:none;}
}
/*}}}*/
<!--{{{-->
<div class='header' macro='gradient vert [[ColorPalette::PrimaryLight]] [[ColorPalette::PrimaryMid]]'>
<div class='headerShadow'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
<div class='headerForeground'>
<span class='siteTitle' refresh='content' tiddler='SiteTitle'></span>&nbsp;
<span class='siteSubtitle' refresh='content' tiddler='SiteSubtitle'></span>
</div>
</div>
<div id='mainMenu' refresh='content' tiddler='MainMenu'></div>
<div id='sidebar'>
<div id='sidebarOptions' refresh='content' tiddler='SideBarOptions'></div>
<div id='sidebarTabs' refresh='content' force='true' tiddler='SideBarTabs'></div>
</div>
<div id='displayArea'>
<div id='messageArea'></div>
<div id='tiddlerDisplay'></div>
</div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar closeTiddler closeOthers +editTiddler > fields syncing permalink references jump'></div>
<div class='title' macro='view title'></div>
<div class='subtitle'><span macro='view modifier link'></span>, <span macro='view modified date'></span> (<span macro='message views.wikified.createdPrompt'></span> <span macro='view created date'></span>)</div>
<div class='tagging' macro='tagging'></div>
<div class='tagged' macro='tags'></div>
<div class='viewer' macro='view text wikified'></div>
<div class='tagClear'></div>
<!--}}}-->
<!--{{{-->
<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler deleteTiddler'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div><div class='editorFooter'><span macro='message views.editor.tagPrompt'></span><span macro='tagChooser'></span></div>
<!--}}}-->
To get started with this blank TiddlyWiki, you'll need to modify the following tiddlers:
* SiteTitle & SiteSubtitle: The title and subtitle of the site, as shown above (after saving, they will also appear in the browser title bar)
* MainMenu: The menu (usually on the left)
* DefaultTiddlers: Contains the names of the tiddlers that you want to appear when the TiddlyWiki is opened
You'll also need to enter your username for signing your edits: <<option txtUserName>>
These InterfaceOptions for customising TiddlyWiki are saved in your browser

Your username for signing your edits. Write it as a WikiWord (eg JoeBloggs)

<<option txtUserName>>
<<option chkSaveBackups>> SaveBackups
<<option chkAutoSave>> AutoSave
<<option chkRegExpSearch>> RegExpSearch
<<option chkCaseSensitiveSearch>> CaseSensitiveSearch
<<option chkAnimate>> EnableAnimations

----
Also see AdvancedOptions
|''Type:''|file|
|''URL:''|http://tiddlywiki.abego-software.de|
|''Workspace:''|(default)|

This tiddler was automatically created to record the details of this server
|''Type:''|file|
|''URL:''|http://tw.lewcid.org|
|''Workspace:''|(default)|

This tiddler was automatically created to record the details of this server
|''Type:''|file|
|''URL:''|http://www.tiddlytools.com/|
|''Workspace:''|(default)|

This tiddler was automatically created to record the details of this server
/***
|Name|CollapseTiddlersPlugin|
|Source|http://gensoft.revhost.net/Collapse.html|
|Version|2007.10.11|
|Author|Bradley Meck (modified by ELS)|
|License|unknown|
|~CoreVersion|2.1|
|Type|plugin|
|Requires|CollapsedTemplate|
|Overrides||
|Description|show/hide content of a tiddler while leaving tiddler title visible|

|ELS 10/11/2007: moved [[FoldFirst]] inline script and converted to {{{<<foldFirst>>}}} macro. |
|ELS 9/12/2007: suspend/resume SinglePageMode (SPM/TPM/BPM) when folding/unfolding tiddlers |
|ELS 6/5/2007: add "return false" at the end of each command handler to prevent IE 'page transition' problem. |
|ELS 3/30/2007: add a shadow definition for CollapsedTemplate.  Tweak ViewTemplate shadow so "fold/unfold" and "focus" toolbar items automatically appear when using default templates.  Remove error check for "CollapsedTemplate" existence, since shadow version will now always work as a fallback. |
|ELS 2/24/2006: added fallback to "CollapsedTemplate" if "WebCollapsedTemplate" is not found |
|ELS 2/6/2006: added check for 'readOnly' flag to use alternative "WebCollapsedTemplate" |

***/

//{{{

config.shadowTiddlers.CollapsedTemplate=
	"<!--{{{-->\
	<div class='toolbar' macro='toolbar expandTiddler collapseOthers closeTiddler closeOthers +editTiddler permalink references jump'></div>\
	<div class='title' macro='view title'></div>\
	<!--}}}-->";

// automatically tweak shadow ViewTemplate to add "collapseTiddler collapseOthers" commands at 'front' of toolbar (before 'closeTiddler')
config.shadowTiddlers.ViewTemplate=config.shadowTiddlers.ViewTemplate.replace(/closeTiddler/,"collapseTiddler collapseOthers closeTiddler");

config.commands.collapseTiddler = {
	text: "fold",
	tooltip: "Collapse this tiddler",
	handler: function(event,src,title) {
		var e = story.findContainingTiddler(src);
		if(e.getAttribute("template") != config.tiddlerTemplates[DEFAULT_EDIT_TEMPLATE]) {
			var t = (readOnly&&store.tiddlerExists("WebCollapsedTemplate"))?"WebCollapsedTemplate":"CollapsedTemplate";
			if(e.getAttribute("template") != t ){
				e.setAttribute("oldTemplate",e.getAttribute("template"));
				// suspend single page mode (or top/bottom of page mode)
				var saveSPM=config.options.chkSinglePageMode; config.options.chkSinglePageMode=false;
				var saveTPM=config.options.chkTopOfPageMode; config.options.chkTopOfPageMode=false;
				var saveBPM=config.options.chkBottomOfPageMode; config.options.chkBottomOfPageMode=false;
				// display tiddler
				story.displayTiddler(null,title,t);
				// restore SPM/TPM/BPM settings
				config.options.chkBottomOfPageMode=saveBPM;
				config.options.chkTopOfPageMode=saveTPM;
				config.options.chkSinglePageMode=saveSPM;
			}
		}
		return false;
	}
}

config.commands.expandTiddler = {
	text: "unfold",
	tooltip: "Expand this tiddler",
	handler: function(event,src,title) {
		var e = story.findContainingTiddler(src);
		// suspend single page mode (or top/bottom of page mode)
		var saveSPM=config.options.chkSinglePageMode; config.options.chkSinglePageMode=false;
		var saveTPM=config.options.chkTopOfPageMode; config.options.chkTopOfPageMode=false;
		var saveBPM=config.options.chkBottomOfPageMode; config.options.chkBottomOfPageMode=false;
		// display tiddler
		story.displayTiddler(null,title,e.getAttribute("oldTemplate"));
		// restore SPM/TPM/BPM settings
		config.options.chkBottomOfPageMode=saveBPM;
		config.options.chkTopOfPageMode=saveTPM;
		config.options.chkSinglePageMode=saveSPM;
		return false;
	}
}

config.macros.collapseAll = {
	handler: function(place,macroName,params,wikifier,paramString,tiddler){
		createTiddlyButton(place,"Collapse All","",function(){
			story.forEachTiddler(function(title,tiddler){
				if(story.isDirty(tiddler.title)) return;
				var t=(readOnly&&store.tiddlerExists("WebCollapsedTemplate"))?"WebCollapsedTemplate":"CollapsedTemplate";
				// suspend single page mode (or top/bottom of page mode)
				var saveSPM=config.options.chkSinglePageMode; config.options.chkSinglePageMode=false;
				var saveTPM=config.options.chkTopOfPageMode; config.options.chkTopOfPageMode=false;
				var saveBPM=config.options.chkBottomOfPageMode; config.options.chkBottomOfPageMode=false;
				// display tiddler
				story.displayTiddler(null,title,t);
				// restore SPM/TPM/BPM settings
				config.options.chkBottomOfPageMode=saveBPM;
				config.options.chkTopOfPageMode=saveTPM;
				config.options.chkSinglePageMode=saveSPM;
			})
		})
	}
}

config.macros.expandAll = {
	handler: function(place,macroName,params,wikifier,paramString,tiddler){
		createTiddlyButton(place,"Expand All","",function(){
			story.forEachTiddler(function(title,tiddler){
				var t=(readOnly&&store.tiddlerExists("WebCollapsedTemplate"))?"WebCollapsedTemplate":"CollapsedTemplate";
				// suspend single page mode (or top/bottom of page mode)
				var saveSPM=config.options.chkSinglePageMode; config.options.chkSinglePageMode=false;
				var saveTPM=config.options.chkTopOfPageMode; config.options.chkTopOfPageMode=false;
				var saveBPM=config.options.chkBottomOfPageMode; config.options.chkBottomOfPageMode=false;
				// display tiddler
				if(tiddler.getAttribute("template") == t) story.displayTiddler(null,title,tiddler.getAttribute("oldTemplate"));
				// restore SPM/TPM/BPM settings
				config.options.chkBottomOfPageMode=saveBPM;
				config.options.chkTopOfPageMode=saveTPM;
				config.options.chkSinglePageMode=saveSPM;
			})
		})
	}
}

config.commands.collapseOthers = {
	text: "focus",
	tooltip: "Expand this tiddler and collapse all others",
	handler: function(event,src,title) {
		var e = story.findContainingTiddler(src);
		story.forEachTiddler(function(title,tiddler) {
			if(story.isDirty(tiddler.title)) return;
			var t=(readOnly&&store.tiddlerExists("WebCollapsedTemplate"))?"WebCollapsedTemplate":"CollapsedTemplate";
			if (e==tiddler) t=e.getAttribute("oldTemplate");
			// suspend single page mode (or top/bottom of page mode)
			var saveSPM=config.options.chkSinglePageMode; config.options.chkSinglePageMode=false;
			var saveTPM=config.options.chkTopOfPageMode; config.options.chkTopOfPageMode=false;
			var saveBPM=config.options.chkBottomOfPageMode; config.options.chkBottomOfPageMode=false;
			// display tiddler
			story.displayTiddler(null,title,t);
			// restore SPM/TPM/BPM settings
			config.options.chkBottomOfPageMode=saveBPM;
			config.options.chkTopOfPageMode=saveTPM;
			config.options.chkSinglePageMode=saveSPM;
		})
		return false;
	}
}

// {{{<<foldFirst>>}}} macro forces tiddler to be folded when initially displayed.
// Subsequent re-render does NOT re-fold tiddler, but closing/re-opening tiddler DOES cause it to fold first again.
config.macros.foldFirst = {
	handler: function(place,macroName,params,wikifier,paramString,tiddler){
		var here=story.findContainingTiddler(place);
		if (here.foldedFirst) return; // already been folded
		var template = (readOnly&&store.tiddlerExists("WebCollapsedTemplate"))?"WebCollapsedTemplate":"CollapsedTemplate";
		if (!store.tiddlerExists(template)) { displayMessage("FoldFirst: can't find 'CollapsedTemplate'"); return; }
		here.setAttribute("oldTemplate",here.getAttribute("template"));
		story.displayTiddler(null,here.getAttribute("tiddler"),template);
		here.foldedFirst=true; // only when tiddler is first rendered
		return false;
	}
}
//}}}
/***
|Name|CopyTiddlerPlugin|
|Source|http://www.TiddlyTools.com/#CopyTiddlerPlugin|
|Version|3.0.1|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|Quickly create a copy of any existing tiddler|

!!!!!Usage
<<<
View a tiddler and select the "copy" toolbar item.  A new tiddler editor is opened with a title of "Copy of TiddlerName" containing copies of the text/tags from the original tiddler.  Note: If select the "copy" toolbar item while //editing// a tiddler, the current values of the text/tags that are displayed in the existing tiddler editor are used (including any unsaved changes you may have made to those values).
<<<
!!!!!Installation
<<<
import (or copy/paste) the following tiddlers into your document:
''CopyTiddlerPlugin'' (tagged with <<tag systemConfig>>)

* When using the default (shadow) EditTemplate, the plugin automatically updates the template to include the ''copyTiddler'' toolbar command.
* If you have created a custom EditTemplate tiddler, you will need to manually add the ''copyTiddler'' toolbar command to your existing template toolbar definition.
* If you add ''copyTiddler'' to the ViewTemplate toolbar definition, the ''copy'' toolbar command will also appear when viewing a tiddler.
{{{
<!-- add 'copyTiddler' command to existing toolbar definition -->
<div class='toolbar' macro='toolbar ... copyTiddler ... '>
}}}
<<<
!!!!!Revisions
<<<
''2007.09.26 [3.0.1]'' in handler, use findContainingTiddler(src) to get tiddlerElem (and title).  Allows 'copy' command to find correct tiddler when transcluded using {{{<<tiddler>>}}} macro (e.g., [[ToolbarExtras]])
''2007.06.28 [3.0.0]'' complete re-write to handle custom fields and alternative view/edit templates
''2007.05.17 [2.1.2]'' use store.getTiddlerText() to retrieve tiddler content, so that SHADOW tiddlers can be copied correctly when in VIEW mode
''2007.04.01 [2.1.1]'' in copyTiddler.handler(), fix check for editor fields by ensuring that found field actually has edit=="text" attribute
''2007.02.05 [2.1.0]'' in copyTiddler.handler(), if editor fields (textfield and/or tagsfield) can't be found (i.e., tiddler is in VIEW mode, not EDIT mode), then get text/tags values from stored tiddler instead of active editor fields.  Allows use of COPY toolbar directly from VIEW mode (based on a request from LaurentCharles)
''2006.12.12 [2.0.0]'' completely rewritten so plugin just creates a new tiddler EDITOR with a copy of the current tiddler EDITOR contents, instead of creating the new tiddler in the STORE by copying the current tiddler values from the STORE.
''2005.xx.xx [1.0.0]'' original version by Tim Morgan
<<<
!!!!!Credits
>This feature was originally developed by Tim Morgan.  Current version developed by EricShulman from [[ELS Design Studios|http://www.elsdesign.com]]
!!!!!Code
***/
//{{{
version.extensions.copyTiddler= {major: 3, minor: 0, revision: 1, date: new Date(2007,9,26)};

// automatically tweak shadow EditTemplate to add "copyTiddler" toolbar command (following "cancelTiddler")
config.shadowTiddlers.EditTemplate=config.shadowTiddlers.EditTemplate.replace(/cancelTiddler/,"cancelTiddler copyTiddler");

config.commands.copyTiddler = {
	text: 'copy',
	hideReadOnly: true,
	tooltip: 'Make a copy of this tiddler',
	prefix: "Copy of ",
	handler: function(event,src,title) {
		var tiddlerElem=story.findContainingTiddler(src); if (!tiddlerElem) return; // get tiddler... if no tiddler, do nothing.
		title=tiddlerElem.getAttribute("tiddler"); // current tiddler title
		var template=tiddlerElem.getAttribute("template") // current tiddler template
		var newTitle = this.prefix+title; // add "copy of" to create new tiddler title
		if (!story.isDirty(title)) { // if existing tiddler is being VIEWED (not EDITED)
			// duplicate existing stored tiddler (and clear "changecount")
			var tid=store.getTiddler(title);
	                store.saveTiddler(newTitle,newTitle,tid.text,config.options.txtUserName,new Date(),tid.tags, tid.fields, true);
			// display new tiddler using same view template as current tiddler
			story.displayTiddler(story.findContainingTiddler(src),newTitle,template);
		} else {
			// display new tiddler editor using same editor template as current tiddler
			story.displayTiddler(story.findContainingTiddler(src),newTitle,template);
			// get fields from current tiddler editor
			var fields=config.commands.copyTiddler.gatherFields(tiddlerElem);
			// set fields in new editor
			var newTiddlerElem = document.getElementById(story.idPrefix+newTitle);
			for (var f=0; f<fields.length; f++) { 
				if (fields[f].name=="title") fields[f].value=newTitle; // rename title in new tiddler
				var fieldElem=config.commands.copyTiddler.findField(newTiddlerElem,fields[f].name);
				if (fieldElem) {
					if (fieldElem.getAttribute("type")=="checkbox")
						fieldElem.checked=fields[f].value;
					else 
						fieldElem.value=fields[f].value;
				}
			}
		}
		story.focusTiddler(newTitle,"title");
		return false;
	},
	findField: function(tiddlerElem,field) {
		var inputs=tiddlerElem.getElementsByTagName("input");
		for (var i=0; i<inputs.length; i++) {
			if (inputs[i].getAttribute("type")=="checkbox" && inputs[i].field == field) return inputs[i];
			if (inputs[i].getAttribute("type")=="text" && inputs[i].getAttribute("edit") == field) return inputs[i];
		}
		var tas=tiddlerElem.getElementsByTagName("textarea");
		for (var i=0; i<tas.length; i++) if (tas[i].getAttribute("edit") == field) return tas[i];
		var sels=tiddlerElem.getElementsByTagName("select");
		for (var i=0; i<sels.length; i++) if (sels[i].getAttribute("edit") == field) return sels[i];
		return null;
	},
	gatherFields: function(tiddlerElem) { // get field names and values from current tiddler editor
		var fields=[];
		// get checkboxes and edit fields
		var inputs=tiddlerElem.getElementsByTagName("input");
		for (var i=0; i<inputs.length; i++) {
			if (inputs[i].getAttribute("type")=="checkbox")
				if (inputs[i].field) fields.push({name:inputs[i].field,value:inputs[i].checked});
			if (inputs[i].getAttribute("type")=="text")
				if (inputs[i].getAttribute("edit")) fields.push({name:inputs[i].getAttribute("edit"),value:inputs[i].value});
		}
		// get textareas (multi-line edit fields)
		var tas=tiddlerElem.getElementsByTagName("textarea");
		for (var i=0; i<tas.length; i++)
			if (tas[i].getAttribute("edit")) fields.push({name:tas[i].getAttribute("edit"),value:tas[i].value});
		// get selection lists (droplist or listbox)
		var sels=tiddlerElem.getElementsByTagName("select");
		for (var i=0; i<sels.length; i++)
			if (sels[i].getAttribute("edit")) fields.push({name:sels[i].getAttribute("edit"),value:sels[i].value});
		return fields;
	}
};
//}}}
Someone once memorably said: 'It is not clear what quantum mechanics is about.' and he wasn't wrong. The overabundance of quantum 'interpretations' is confusing even to professionals and - as presented in the mainstream media - the quantum theory is inevitably a mystical and bizarre subject involving splitting universes and superimposed cats in which objects do not exist until a conscious mind looks at them, and so on. 

What is not widely understood, even amongst physicists, is that a belief in the mystical aspects of the theory is a //choice// that one makes, rather than something inevitable. One formulation of quantum mechanics - long ignored or derided by just about everyone - which makes this particularly clear is the //pilot-wave theory// (also known as Bohmian mechanics, de ~Broglie-Bohm theory, the causal or ontological interpretation of QM). In this theory, wave particle duality is explained through the startlingly sensible notion of having both waves //and// particles (think about how that makes the double slit experiment intelligible!). So unlike in orthodox QM - where the wave function is all there is - the particles have an objectively real existence and they move along trajectories, guided by the waves. In such a formalism the standard paradoxes related to measurement, observation or wave function collapse (Schrödinger's cat, and so on) simply evaporate. The classical limit emerges out of the theory, rather than being presupposed. All the 'talk' is replaced by sharply-defined mathematics, it becomes possible to 'visualize' the reality of most quantum events, and - most importantly - the theory is completely consistent with the full range of QM predictive-observational data.

Amazingly, we will see that as early as 1924 (before the discovery of the matrix mechanics and Schrödinger theory) Louis de Broglie had the essence of the idea, and in fact he subsequently presented the more-or-less complete mathematical theory at the famous Solvay conference in 1927. How he ended up being beaten into the ground by the Heisenberg/Pauli/Bohr axis, abandoning his theory until Bohm took it up again the 1950s, is a fascinating story which we shall explore. As is the fact that Bohm was in his turn ignored and misinterpreted until an exploration of his work led Bell to his famous inequality which - contrary to popular belief - can be taken as evidence //for// the pilot-wave theory, rather than as a disproof of it. Even today, relatively few people have even heard of the theory.

Strictly speaking, pilot-wave theory is not really an 'interpretation' of anything, but a mathematical formulation of quantum mechanics with essentially the same status as Feynman's path-integral method. As such it can be used to do calculations with quantum particles following trajectories. In addition to looking at the pilot-wave theory in terms of the foundations of QM, we shall therefore try to understand whether such calculations are likely to be of any use to us, either here in the TCM group or elsewhere.

In the last few decades of his life, Bohm began to devote more energy to metaphysical thinking and spent time 'hanging out with Indian gurus' (yet another reason why many refused to take his physics seriously). He explored the idea common in Indian philosophy that (to quote Valentini) `material objects are somehow illusions and projections from something deeper, that things emerge from this deeper level and disappear into this deeper level again. So Bohm tried to adopt an interpretation of the wave as a manifestation of a deeper level, perhaps associated with consciousness. He called the wave an implicate order and the particle an explicate order.' Although it is true that these concepts were not directly connected to physics in any meaningful way, we shall for completeness - since many people mistakenly think them a fundamental part of the pilot-wave theory - look at these ideas in the final lecture.

It is a fact that many people do not appreciate that today it is simply untenable to regard the views of Bohr and Heisenberg expressed in the Copenhagen interpretation as in any sense standard or canonical. The 'meaning' of quantum theory is still a completely open question. However over the last ten or fifteen years, it seems that many people are starting to take pilot-wave ideas seriously and it might be said that the work of de Broglie and Bohm is finally beginning to bother the mainstream. As this is clearly not the case in the Cavendish, I hope that in this course we shall have a great deal of fun exploring the possibility that they were right.

Did I mention the two-slit experiment? But Feynman said this was '//..a phenomenon which is impossible, absolutely impossible, to explain in any classical way, and which has in it the heart of quantum mechanics. In reality it contains the only mystery..//' and '//How does it really work? What machinery is actually producing this thing? Nobody knows any machinery. Nobody can give you a deeper explanation of this phenomenon than I have given; that is, a description of it.//' Hmmm... 

''Acknowledgements'' : //I would like to thank Antony Valentini, Detlef Dürr, and Sheldon Goldstein for helpful advice, and to apologize to anyone who wrote a paper given in the Further Reading section of this website from whom I may have cribbed nice turns of phrase, equations or pictures to create my slides.''//
[[Main Page]]
/***
|''Name:''|DisableWikiLinksPlugin|
|''Description:''|Allows you to disable TiddlyWiki's automatic linking of WikiWords|
|''Author:''|Martin Budden (mjbudden (at) gmail (dot) com)|
|''Source:''|http://www.martinswiki.com/#DisableWikiLinksPlugin|
|''CodeRepository:''|http://svn.tiddlywiki.org/Trunk/contributors/MartinBudden/plugins/DisableWikiLinksPlugin.js|
|''Version:''|0.1.3|
|''Date:''|Aug 5, 2006|
|''Comments:''|Please make comments at http://groups.google.co.uk/group/TiddlyWikiDev|
|''License:''|[[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|''~CoreVersion:''|2.1.0|

|''Disable WikiLinks''|<<option chkDisableWikiLinks>>|

***/

//{{{
// Ensure that the DisableWikiLinksPlugin is only installed once.
if(!version.extensions.DisableWikiLinksPlugin) {
version.extensions.DisableWikiLinksPlugin = {installed:true};

if(version.major < 2 || (version.major == 2 && version.minor < 1))
	{alertAndThrow('DisableWikiLinksPlugin requires TiddlyWiki 2.1 or newer.');}

if (config.options.chkDisableWikiLinks==undefined)
	{config.options.chkDisableWikiLinks = false;}

Tiddler.prototype.autoLinkWikiWords = function()
{
	if(config.options.chkDisableWikiLinks==true)
		{return false;}
	return !this.isTagged('systemConfig') && !this.isTagged('excludeMissing');
};

} // end of 'install only once'
//}}}
<!--{{{-->
<div class='toolbar' macro='toolbar +saveTiddler -cancelTiddler copyTiddler deleteTiddler autosizeEditor'></div>
<div class='title' macro='view title'></div>
<div class='editor' macro='edit title'></div>
<div macro='annotations'></div>
<div class='editor' macro='edit text'></div>
<div class='editor' macro='edit tags'></div>
<div class='editorFooter'>
<span macro='message views.editor.tagPrompt'></span>
<span macro='tagChooser'></span></div>
<div macro='tiddler QuickEditToolbar'></div> 
<span class='toolbar' macro='tiddler QuickEditToolbarCommand'></span> 
<span macro='resizeEditor'></span>
<!--}}}-->
/***
|''Name:''|FootnotesPlugin|
|''Description:''|Create automated tiddler footnotes.|
|''Author:''|Saq Imtiaz ( [email protected] )|
|''Source:''|http://tw.lewcid.org/#FootnotesPlugin|
|''Code Repository:''|http://tw.lewcid.org/svn/plugins|
|''Version:''|2.01|
|''Date:''|10/25/07|
|''License:''|[[Creative Commons Attribution-ShareAlike 3.0 License|http://creativecommons.org/licenses/by-sa/3.0/]]|
|''~CoreVersion:''|2.2.2|

!!Usage:
*To create a footnote, just put the footnote text inside triple backticks.
*Footnotes are numbered automatically, and listed at the bottom of the tiddler.
*{{{Creating a footnote is easy. ```This is the text for my footnote```}}}
*[[Example|FootnotesDemo]]
***/
// /%
//!BEGIN-PLUGIN-CODE
config.footnotesPlugin = {
	backLabel: "back",
	prompt:"show footnote"
};

config.formatters.unshift( {
    name: "footnotes",
    match: "```",
    lookaheadRegExp: /```((?:.|\n)*?)```/g,
    handler: function(w)
    {
        this.lookaheadRegExp.lastIndex = w.matchStart;
        var lookaheadMatch = this.lookaheadRegExp.exec(w.source);
        if(lookaheadMatch && lookaheadMatch.index == w.matchStart )
            {
			var tiddler = story.findContainingTiddler(w.output);
			if (!tiddler.notes)
				tiddler.notes = [];
			var title = tiddler.getAttribute("tiddler");
			tiddler.notes.pushUnique(lookaheadMatch[1]);
			var pos = tiddler.notes.indexOf(lookaheadMatch[1]) + 1;
			createTiddlyButton(w.output,pos,config.footnotesPlugin.prompt,function(){var x = document.getElementById(title+"ftn"+pos);window.scrollTo(0,ensureVisible(x)+(ensureVisible(x)<findScrollY()?(findWindowHeight()-x.offsetHeight):0));return false;},"ftnlink",title+"ftnlink"+pos);			
			w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
            }
    }
});

old_footnotes_refreshTiddler = Story.prototype.refreshTiddler;
Story.prototype.refreshTiddler = function(title,template,force)
{
    var tiddler = old_footnotes_refreshTiddler.apply(this,arguments);
	if (tiddler.notes && tiddler.notes.length)
	{
		var holder = createTiddlyElement(null,"div",null,"footnoteholder");
		var list = createTiddlyElement(holder,"ol",title+"footnoteholder");
		for (var i=0; i<tiddler.notes.length; i++)
		{
			var ftn = createTiddlyElement(list,"li",title+"ftn"+(i+1),"footnote");
			wikify(tiddler.notes[i]+" ",ftn);
			createTiddlyButton(ftn,"["+config.footnotesPlugin.backLabel+"]",config.footnotesPlugin.backLabel,function(){window.scrollTo(0,ensureVisible(document.getElementById(this.parentNode.id.replace("ftn","ftnlink"))));return false;},"ftnbklink");
		}
		var count = tiddler.childNodes.length;
		for (var j=0; j<count; j++){
			if(hasClass(tiddler.childNodes[j],"viewer")){
				var viewer = tiddler.childNodes[j];	
			}
		}
		viewer.appendChild(holder);
		tiddler.notes = [];
	}
    return tiddler;
};

setStylesheet(
".tiddler a.ftnlink {vertical-align: super; font-size: 0.8em; color:red;}\n"+
".tiddler a.ftnlink:hover, .tiddler .footnoteholder a.ftnbklink:hover{color:#fff;background:red;}\n"+
".tiddler div.footnoteholder{margin:1.8em 1.0em; padding:0.1em 1.0em 0.1em 1.0em ;border-left: 1px solid #ccc;}"+
".tiddler footnoteholder ol {font-size: 0.9em; line-height: 1.2em;}\n"+
".tiddler .footnoteholder li.footnote {margin: 0 0 5px 0;}\n"+
".tiddler .footnoteholder a.ftnbklink{color:red;}\n","FootNotesStyles");
//!END-PLUGIN-CODE
// %/
__Websites__
* [[Bohmian-mechanics.net|http://www.bohmian-mechanics.net/]]
* [[David-Bohm.net|http://www.david-bohm.net/]]
* [[Innsbruck group|http://bohm-c705.uibk.ac.at/]] (Movies!)
* [[Portsmouth group|http://www.phys.port.ac.uk/fpweb%20dell]] (Demonstrations - Windows only)
* [[Classic papers|http://www.psiquadrat.de/html_files/qm_paper.html]] from the history of QM.
* [[Bibliographic guide to the foundations of quantum mechanics|local_papers/cabello.pdf]]
__Textbooks__
* //Quantum causality: conceptual issues in the causal theory of quantum mechanics//, P.J. Riggs (Springer, 2009). ([[link|http://books.google.co.uk/books?id=-HlOf2RYf3AC&printsec=frontcover&dq=peter+riggs+causality#v=onepage&q=&f=false]])
* //Bohmian mechanics: the physics and mathematics of quantum theory//, D. Dürr and S. Teufel (Springer, 2009). ([[link|http://books.google.co.uk/books?id=UWP2ZSs-UD0C&pg=PA1&dq=bohmian+mechanics+teufel#v=onepage&q=&f=false]])
* //The quantum theory of motion. An account of the de ~Broglie-Bohm causal interpretation of quantum mechanics//, P.R. Holland (1993) ([[link|http://books.google.co.uk/books?id=BsEfVBzToRMC&pg=PP1&dq=quantum+theory+of+motion+holland#v=onepage&q=&f=false]])
* //The undivided universe//, D. Bohm and B. Hiley (1993). ([[link|http://books.google.co.uk/books?id=Erp0kUhm_NwC&printsec=frontcover&dq=undivided+universe+bohm#v=onepage&q=&f=false]])
__Other books where pilot-wave theory is extensively discussed__
* //Quantum theory at the crossroads: reconsidering the 1927 Solvay Conference//, G. Bacciagaluppi and A. Valentini, Cambridge University Press (2009). ([[l-PDF|local_papers/valentini.pdf]]) ([[link|http://books.google.co.uk/books?id=0oumHAAACAAJ&dq=crossroads+valentini]])
*//Einstein's struggle with quantum theory: a reappraisal//, D. Home and A. Whitaker (2007). ([[link|http://books.google.co.uk/books?id=CB4AOrraj-8C&printsec=frontcover#v=onepage&q=&f=false]])
* //Mind, matter and the implicate order//, P. Pylkkänen (2007). ([[link|http://books.google.co.uk/books?id=_HbrvcEpXeQC&printsec=frontcover&dq=implicate+order#v=onepage&q=&f=false]])
* //Quantum non-locality and relativity//, T. Maudlin (2002). ([[link|http://books.google.co.uk/books?id=dBkRiBzq4r4C&printsec=frontcover#v=onepage&q=&f=false]])
* //Infinite potential. The life and times of David Bohm//, F. David Peat (1997). ([[link|http://books.google.co.uk/books?id=pobZMUmZbAEC&dq=infinite+potential+peat]])
* //Quantum mechanics: historical contingency and the Copenhagen hegemony//, J.T. Cushing (1994) ([[link|http://books.google.co.uk/books?id=imun0l4IN5UC&printsec=frontcover&dq=hegemony+cushing#v=onepage&q=&f=false]])
*//Quantum mechanics and experience//, David Albert (1992). ([[link|http://books.google.co.uk/books?id=HYEZD0Mh8JEC&printsec=frontcover&dq=david+albert+quantum+mechanics+and+experience&ei=Uoj9SoPAOYeSMumW1JsP#v=onepage&q=&f=false]])
* //Speakable and unspeakable in quantum mechanics//, J.S. Bell (1987) ([[link|http://books.google.co.uk/books?id=FGnnHxh2YtQC&printsec=frontcover&dq=unspeakable+bell#v=onepage&q=&f=false]])
__~DeBB Ph.D. and Masters theses__
* //Quantum computing in the de ~Broglie-Bohm pilot-wave picture//, Philipp Roser /Master's thesis (2010). ([[l-PDF|local_papers/roser_thesis.pdf]])
* //De ~Broglie-Bohm theory, quantum to classical transition, and applications in cosmology//, C. Asavaroengchai, Master's thesis (2010). ([[l-PDF|local_papers/asav_thesis.pdf]])
* //A comparative study of the de ~Broglie-Bohm theory and quantum measure theory approaches to quantum mechanics//, Ellen Kite. Master's thesis (2009). ([[l-PDF|local_papers/kite_thesis.pdf]])
* //The de ~Broglie-Bohm pilot-wave interpretation of quantum theory//, W. Struyve Ph.D. thesis (2004). ([[l-PDF|local_papers/struyve_thesis_2004.pdf]])
*//Topics in the foundations of quantum theory and relativity//, H. Westman Ph.D. thesis (2004). ([[l-PDF|local_papers/HW_PhD_2004.pdf]])
* //Connections with Bohmian mechanics//, J.O. Taylor Ph.D. thesis (2003). ([[l-PDF|local_papers/taylor_thesis_2003.pdf]])
* //Hidden variables and non-locality in quantum mechanics//, D.Hemmick Ph.D. thesis (1996). ([[l-PDF|local_papers/hemmick_thesis_1996.pdf]])
*//On the pilot-wave theory of classical, quantum, and subquantum physics//, Antony Valentini Ph.D. thesis (1992). ([[PDF|http://www.sissa.it/ap/PhD/Theses/valentini.pdf]])
*//On the theory of quanta//, Louis de Broglie Ph.D. thesis (1924) ([[l-PDF|local_papers/de_broglie_thesis.pdf]])
__Reviews and general papers__
* //Nuclear and particle physics applications of the Bohm picture of quantum mechanics//, A. Miranda (2009). ([[l-PDF|local_papers/miranda_2009.pdf]])
* //Bohmian mechanics//, D. Dürr, S. Goldstein, R. Tumulka, N. Zanghì (2008). ([[l-PDF|local_papers/bohmian_mechanics_2008.pdf]])
*//Quantum mechanics: myths and facts//, H. Nikolic (2007). ([[l-PDF|local_papers/nikolic_2007b.pdf]])
* //Bohmian mechanics//, S. Goldstein, //Stanford Encyclopedia of Philosophy// (2006). ([[online|http://plato.stanford.edu/entries/qm-bohm/]])
*//What you always wanted to know about Bohmian mechanics but were afraid to ask//, Oliver Passon (2006). ([[l-PDF|local_papers/passon_2006.pdf]])
* //Generalizations of quantum mechanics//, P. Pearle and A. Valentini (2005). ([[l-PDF|local_papers/pearle_valentini_2005.pdf]])
* //Research on hidden variables theories: a review of recent progresses//, Marco Genovese, //Physics Reports// ''413'', 319 (2005). ([[l-PDF|local_papers/genovese_2005.pdf]])
* //Understanding Bohmian mechanics: a dialogue//, R. Tumulka (2004). ([[l-PDF|local_papers/tumulka_dialogue.pdf]])
*//Pilot-wave theory of fields, gravitation and cosmology//, A. Valentini (1996). ([[l-PDF|local_papers/valentini_1996.pdf]])
* //Bohmian mechanics as the foundation of quantum mechanics//, D. Dürr, S. Goldstein, N. Zanghì (1995) ([[l-PDF|local_papers/foundation_2005.pdf]])
* //Quantum mechanics, randomness, and deterministic reality//, D. Dürr, S. Goldstein, and N. Zanghì (1992). ([[l-PDF|local_papers/durr_1992.pdf]])
*//An ontological basis for the quantum theory//, D. Bohm, B.J. Hiley and P.N. Kaloyerou (1987). ([[l-PDF|local_papers/bohm_hiley_kaloyerou_1986.pdf]])
*//The de Broglie pilot wave theory and the further development of new insights arising out of it//, D.J. Bohm and B.H. Hiley (1982). ([[l-PDF|local_papers/bohm_on_debroglie_1982.pdf]])
* //A suggested interpretation of the quantum theory in terms of hidden variables I and II// D. Bohm (1952) ([[I l-PDF|local_papers/bohm_1952_I.pdf]], [[II l-PDF|local_papers/bohm_1952_II.pdf]])
* //The wave nature of the electron// L. de Broglie (Nobel prize lecture, 1929). ([[l-PDF|local_papers/de_broglie_nobel_1929.pdf]])
__Objections, reactions, and other opinions__
* //The Bohm approach reassessed//, B.J. Hiley (2010). ([[l-PDF|local_papers/hiley_reassessed_2010.pdf]])
* //Misleading signposts along the de ~Broglie-Bohm road to quantum mechanics//, Michael Kiessling (2010) ([[l-PDF|local_papers/kiessling_2010.pdf]]).
*// De ~Broglie-Bohm pilot-wave theory: many worlds in denial?//, A. Valentini (2009). ([[l-PDF|local_papers/valentini_2008_denial.pdf]]) with [[comment|local_papers/brown_on_valentini.pdf]] by H.R. Brown.
*//Comment on "Experimental realization of Wheeler's delayed choice Gedanken Experiment"//, T. Norsen (2006). ([[l-PDF|local_papers/norsen_comment_2006.pdf]]).
* //Lost causes in physics - Bohmian mechanics//, R. Streater ([[online|http://www.mth.kcl.ac.uk/~streater/lostcauses.html#XI]]). 'Better steer clear of Bohmians!'
* //Argumentation about Bohmian mechanics// (reply to Streater above), Ilja Schmelzer ([[online|http://www.ilja-schmelzer.de/realism/BMarguments.php]]).
*//The reality in Bohmian quantum mechanics, or can you kill with an empty wave bullet?// L. Vaidman (2005). ([[l-PDF|local_papers/vaidman_2005.pdf]])
* //Quantum mechanics and dissidents//, Eric Dennis. ([[online|http://www.capmag.com/objective-science/articles/ed2_quantum_dissidents.htm]]).
* //Why isn't every physicist a Bohmian?//, Oliver Passon  (2005) ([[arxiv|http://arxiv.org/abs/quant-ph/0412119]], [[l-PDF|local_papers/passon_why_2005.pdf]])
* //How to teach quantum mechanics//, Oliver Passon  (2004) ([[l-PDF|local_papers/passon_teach_2004.pdf]])
* //On some early objections to Bohm's theory//, W. Myrvold (2003). ([[l-PDF|local_papers/myrvold_2003.pdf]])
* //Bohm's metaphors, causality, and the quantum potential//, M. Guarini, //Erkenntnis// ''59'', 77 (2003). ([[l-PDF|local_papers/guarini_2003.pdf]])
* //Experimental realization of a first test of de ~Broglie-Bohm theory//, G. Brida, E. Cagliero, G. Falzetta, M. Genovese, M. Gramegna and C. Novero (2002). ([[l-PDF|local_papers/brida_2002a.pdf]]). See [[comment|local_papers/brida_2002b.pdf]] by Akhavan and Golshani, and [[reply|local_papers/brida_2002c.pdf]].
* //The persistence of memory: surreal trajectories in Bohm's theory//, J.A. Barrett, //quant-ph/0002046// (2000) ([[l-PDF|local_papers/barrett_2000.pdf]]).
*//Why Bohm's quantum theory?//, H.D. Zeh (1999). ([[l-PDF|local_papers/zeh_1999.pdf]])
*//Slaying the Smoky dragon//, Jack Sarfatti on Bohm (review of Holland) (1996). ([[online|http://www.qedcorp.com/pcr/pcr/qmotion.html]])
* Surprise! Lubos Motl doesn't like it. See [[here|http://motls.blogspot.com/2007/12/david-bohm-born-90-years-ago.html]]. Er.. And [[here|http://motls.blogspot.com/2009/01/click-ball-to-change-its-color.html]]. And especially [[here|http://motls.blogspot.com/2009/01/bohmists-segregation-of-primitive-and.html]]. And [[here|http://motls.blogspot.com/2009/01/anti-quantum-zeal.html]].  (Ilja Schmelzer has a detailed rebuttal of this stuff [[here|http://ilja-schmelzer.de/realism/Motl.php]].)
__Popular Press__
*//Beyond the quantum//, A. Valentini (Physics World, 2009) ([[l-PDF|local_papers/valentini_physics_world_2009.pdf]])
*//Is quantum mechanics tried, true, wildly successful, and wrong?//, A. Valentini (Science, 2009) ([[l-PDF|local_papers/valentini_science_2009.pdf]])
*//Core reality//, New Scientist (2002) ([[online|http://www.newscientist.com/article/mg17423495.100-core-reality.html]]) - requires subscription to the magazine, ([[l-PDF|local_papers/newscientist.pdf]])
* //Interview with Antony Valentini// (2002). ([[website|http://www.metanexus.net/magazine/tabid/68/id/7405/Default.aspx]])
*//Quantum weirdness. How much of the strangeness lies in Feynman's legacy of catchphrases?//, Peter Holland (2000) ([[l-PDF|local_papers/holland_nature_2000.pdf]])
* //Slippery as an eel// Michael Berry, Physics World (1998). ([[l-PDF|local_papers/berry_1998.pdf]])
* //Look for truth no matter where it takes you//, Interview with F. David Peat , //What is Enlightenment?// magazine (1997). ([[online|http://www.enlightennext.org/magazine/j11/peat.asp]])
*//Conjurers of conjecture//, Peter Holland (1995). ([[online|http://www.timeshighereducation.co.uk/story.asp?storyCode=98244&sectioncode=26]])
__Relativity, quantum field theories, gravity__
*//Relativistic quantum mechanics and quantum field theory//, H. Nikolic (2010). ([[l-PDF|local_papers/nikolic_2010d.pdf]])
*//Pilot-wave theory and quantum fields//, W. Struyve (2010). ([[l-PDF|local_papers/struyve_review_2010.pdf]])
*//A relativistic hidden-variable interpretation for the massive vector field based on energy-momentum flows//, G. Horton and C. Dewdney (2010). ([[l-PDF|local_papers/horton_dewdney_2010.pdf]])
*//Superluminal velocities and nonlocality in relativistic mechanics with scalar potential//, H. Nikolic (2010). ([[l-PDF|local_papers/nikolic_2010b.pdf]])
*//Relativistic almost local hidden-variable theory//, H. Nikolic (2010) ([[l-PDF|local_papers/nikolic_2010c.pdf]])
*//QFT as pilot-wave theory of particle creation and destruction//, H. Nikolic (2010). ([[l-PDF|local_papers/nikolic_2010_qft.pdf]])
*//Making nonlocal reality compatible with relativity//, H. Nikolic (2010). ([[l-PDF|local_papers/nikolic_2010a.pdf]])
*//Overlaps in pilot-wave field theories//, I. Schmelzer (2010). ([[l-PDF|local_papers/schmelzer_2010.pdf]])
*//Classical and non-relativistic limits of a Lorentz-invariant Bohmian model for a system of spinless particles//, S. ~Hernandez-Zapata and E. ~Hernandez-Zapata (2010). ([[l-PDF|local_papers/hernandez-zapata_2010.pdf]])
*//Time in relativistic and nonrelativistic quantum mechanics//, H. Nikolic (2009). ([[l-PDF|local_papers/nikolic_2009.pdf]])
*//Are hypothetical superluminal influences between entangled particles compatible with relativity? Frequent objections and responses//, H. Nikolic (2009). ([[l-PDF|local_papers/nikolic_2009a.pdf]])
*//Was Einstein wrong? A quantum threat to special relativity.// D.Z. Albert and R. Galchen (2009). ([[online|http://www.sciam.com/article.cfm?id=was-einstein-wrong-about-relativity&print=true]])
*//De ~Broglie-Bohm interpretation for wave function of a toroidal black hole//, B. Wang (2009). ([[l-PDF|local_papers/wang_black_holes_2009.pdf]])
*//Bohmian quantization of the big rip//, N. ~Pinto-Neto and D.M. Pantoja (2009). ([[l-PDF|local_papers/pinto-neto_2009.pdf]])
*//Boson-fermion unification, superstrings, and Bohmian mechanics//, H. Nikolic (2009). ([[l-PDF|local_papers/nikolic_boson_fermion_2009.pdf]])
*//On relativistic elements of reality//, L. Marchildon (2008). ([[l-PDF|local_papers/marchildon_2008.pdf]])
*//Probability in relativistic Bohmian mechanics of particles and strings//, H. Nikolic (2008). ([[l-PDF|local_papers/nikolic_2008.pdf]])
*//Can we make a Bohmian electron reach the speed of light, at least for one instant?// R. Tumulka (2008) ([[l-PDF|local_papers/tumulka_speed_of_light_2008.pdf]])
*//Bohmian mechanics at space-time singularities. II. Spacelike singularities.// R. Tumulka (2008). ([[l-PDF|local_papers/tumulka_2008.pdf]])
*//Field beables for quantum field theory// W. Struyve (2007). ([[l-PDF|local_papers/struyve_2007a.pdf]])
*//A Dirac sea pilot-wave model for quantum field theory// S. Colin, W. Struyve (2007) ([[l-PDF|local_papers/struyve_2007b.pdf]])
*//Bohmian mechanics at space-time singularities. I. Timelike singularities.// R. Tumulka (2007). ([[l-PDF|local_papers/tumulka_2007.pdf]])
*//A minimalist pilot-wave model for quantum electrodynamics//, W.Struyve and H.Westman (2007). ([[l-PDF|local_papers/struyve_2007.pdf]])
*//Relativistic Bohmian interpretation of quantum mechanics//, H. Nikolic (2006). ([[l-PDF|local_papers/nikolic_2006.pdf]])
*//A non-inflationary model with scale-invariant cosmological perturbations//, P. Peter, E.J.C. Pinho, N. ~Pinto-Neto (2006). ([[l-PDF|local_papers/peter_2006.pdf]]) 
* //The unromantic pictures of quantum theory//, R.Tumulka (2006) ([[l-PDF|local_papers/tumulka_2006.pdf]]).
*//A radical rethinking of quantum gravity: rejecting Einstein's relativity and unifying Bohmian quantum mechanics with a ~Bell-neo-Lorentzian absolute time, space and gravity//, Quentin Smith (2005) - book chapter of 'Einstein, Relativity and Absolute Simultaneity' (Routledge) - partially available on Google Books (or in the TTI library).
*//Why special relativity should not be a template for a fundamental reformulation of quantum mechanics//, H.R. Brown and C.G. Timpson (2005). ([[l-PDF|local_papers/timpson_brown_2005b.pdf]])
*//Hidden variables and the large scale structure of spacetime// A. Valentini (2005). ([[l-PDF|local_papers/valentini_hidden_variables_2005.pdf]])
*//Bohmian mechanics and quantum field theory// D. Dürr, S. Goldstein, R. Tumulka, N. Zanghì (2004) ([[l-PDF|local_papers/durr_2004.pdf]]).
*//Implications of Lorentz covariance for the guidance equation in two-slit quantum interference//, P. Holland and C. Philippidis (2003). ([[l-PDF|local_papers/holland_lorentz_2003.pdf]])
*//A deterministic Bell model//, S. Colin (2003). ([[l-PDF|local_papers/colin_2003.pdf]])
*//The consistency of causal quantum geometrodynamics and quantum field theory//, N. ~Pinto-Neto and E. Sergio Santini (2002). ([[l-PDF|local_papers/pintoneto_santini_2002.pdf]])
*//A non-local, Lorentz-invariant, hidden-variable interpretation of relativistic quantum mechanics based on particle trajectories//, G. Horton and C. Dewdney (2001). ([[l-PDF|local_papers/horton_dewdney_2001.pdf]])
*//Photon wave mechanics: a de ~Broglie-Bohm approach// S. Esposito (1999) ([[l-PDF|local_papers/esposito_1999.pdf]]).
*//On Galilean and Lorentz invariance in pilot-wave dynamics//, A. Valentini (1997). ([[l-PDF|local_papers/valentini_2008_galilean.pdf]])
*//Nonlocality, Lorentz invariance, and Bohmian quantum mechanics// K. Berndl, D. Dürr, S. Goldstein, N. Zanghì (1996). ([[l-PDF|local_papers/berndl_1996.pdf]])
*//On pilot wave quantum cosmology//, Y. Shtanov (1995). ([[l-PDF|local_papers/shtanov_1995.pdf]])
*//Reexamining the assumption that elements of reality can be Lorentz invariant//, O. Cohen and B.J. Hiley (1995). ([[l-PDF|local_papers/cohen_hiley_1995.pdf]])
*//Comments on an article of Takabayasi concerning the formulation of quantum mechanics with classical pictures//, D. Bohm, Prog. Theo. Phys. 9, 273 (1953).
__Quantum equilibrium and nonequilibrium__
*//Timescales for dynamical relaxation to the Born rule//, M.D. Towler, N.J. Russell, A. Valentini (2011). ([[l-PDF|local_papers/born_rule_towler.pdf]])
*//Inflationary cosmology as a probe of primordial quantum mechanics// A. Valentini (2010). ([[l-PDF|local_papers/valentini_2010.pdf]])
*//Relative dispersion and quantum thermal equilibrium in de ~Broglie-Bohm mechanics//, A.F. Bennett (2010). ([[l-PDF|local_papers/bennett_2010.pdf]])
*//Quantum non-equilibrium and relaxation to equilibrium for a class of de ~Broglie-Bohm theories//, S. Colin and W. Struyve (2010) ([[l-PDF|local_papers/colin_struyve_2010.pdf]])
*//Density relaxation in de ~Broglie-Bohm mechanics//, A.F. Bennett (2009). ([[l-PDF|local_papers/bennett_2009.pdf]])
*//Normal typicality and von Neumann's quantum ergodic theorem//, S. Goldstein, J.L. Lebowitz, C. Mastrodonato, R. Tumulka and N. Zanghi. ([[l-PDF|local_papers/goldstein_2009.pdf]])
*// De ~Broglie-Bohm prediction of quantum violations for cosmological super-Hubble modes//, A. Valentini (2008). ([[l-PDF|local_papers/valentini_violation_2008.pdf]])
*//Astrophysical and cosmological tests of quantum theory//, A. Valentini (2007). ([[l-PDF|local_papers/valentini_tests_2007.pdf]]).
* //Typicality vs. Probability in trajectory-based formulations of quantum mechanics//, B. Galvan (2007). ([[l-PDF|local_papers/galvan_2007.pdf]])
* //On the uniqueness of quantum equilibrium in Bohmian mechanics//, S. Goldstein, W. Struyve (2007) ([[l-PDF|local_papers/goldstein_uniqueness_2007.pdf]]).
* //The "Past Hypothesis": Not even false//, J. Earman (2006). ([[l-PDF|local_papers/earman_2006.pdf]])
* // On the distribution of the wave function for systems in thermal equilibrium//, S. Goldstein, J. L. Lebowitz, R. Tumulka, and N. Zanghì. (2006) ([[l-PDF|local_papers/goldstein_equilibrium_2006.pdf]]). 
*//Smoothness of wave functions in thermal equilibrium//, R. Tumulka and N. Zanghì (2005). ([[l-PDF|local_papers/tumulka_smoothness_2005.pdf]])
*//Dynamical origin of quantum probabilities// A. Valentini and H. Westman (2005) ([[l-PDF|local_papers/valentini_2005.pdf]])
*//Universal signature of non-quantum systems//, A. Valentini (2004) ([[l-PDF|local_papers/valentini_signature_2004.pdf]])
*//Extreme test of quantum theory with black holes//, A. Valentini (2004) ([[l-PDF|local_papers/valentini_black_holes_2004.pdf]])
*//Black holes, information loss and hidden variables//, A. Valentini (2004). ([[l-PDF|local_papers/valentini_black_holes_2004b.pdf]])
* //Quantum equilibrium and the role of operators as observables in quantum theory//, D. Dürr, S. Goldstein, N. Zanghì (2003) ([[l-PDF|local_papers/durr_2003.pdf]])
*//Signal-locality in hidden-variables theories// A. Valentini (2002) ([[l-PDF|local_papers/valentini_2002.pdf]]).
* //Subquantum information and computation//, A. Valentini, Pramana - Journal of Physics, ''59'', 269 (2002). [[l-PDF|local_papers/valentini_2002b.pdf]]
* //Hidden variables, statistical mechanics and the early universe//, A. Valentini (2001) ([[l-PDF|local_papers/valentini_hidden_variables_2001.pdf]])
* //Boltzmann's approach to statistical mechanics//, S. Goldstein (2001). ([[l-PDF|local_papers/goldstein_2001.pdf]])
* //Science of chaos or chaos in science?//, J. Bricmont (1996) ([[l-PDF|local_papers/bricmont_1996.pdf]])
*//The distribution postulate in Bohm's theory//, J.A. Barrett (1995) ([[l-PDF|local_papers/barrett_1995.pdf]]) 
* //Quantum equilibrium and the origin of absolute uncertainty//, D. Dürr, S. Goldstein and N. Zanghì (1992). ([[l-PDF|local_papers/durr_1992b.pdf]]).
* //Signal-locality, uncertainty, and the subquantum H-theorem (I and II)// A. Valentini (1991). ([[I l-PDF|local_papers/valentini_htheorem_1991a.pdf]], [[II l-PDF|local_papers/valentini_htheorem_1991b.pdf]])
* //Proof that probability approaches $\Psi^2$ in causal interpretation of quantum theory//, D. Bohm (1953). ([[l-PDF|local_papers/bohm_1953.pdf]])
__Measurement, nonlocality, Bell and EPR__
*//Cosmology and entanglement//, M. Genovese (2009). ([[l-PDF|local_papers/genovese_2009.pdf]])
*//On the weak measurement of velocity in Bohmian mechanics//, D. Dürr, S. Goldstein, and N. Zanghì (2008) ([[l-PDF|local_papers/durr_velocity_2008.pdf]])
*//Comment on : A new proof of Bell's theorem based on Fourier series analysis// R. Tumulka (2008) ([[l-PDF|local_papers/tumulka_comment_2008.pdf]]) 
*//How Bohm's theory solves the measurement problem//, P.J. Lewis (2007). ([[l-PDF|local_papers/lewis_2007.pdf]])
*//The role of decoherence in quantum mechanics//, G. Bacciagaluppi (2007). ([[online|http://plato.stanford.edu/entries/qm-decoherence/]])
*//Empty waves in Bohmian quantum mechanics//, P.J. Lewis (2007). ([[l-PDF|local_papers/lewis_2007a.pdf]])
*//Against realism//, T. Norsen (2006). ([[l-PDF|local_papers/norsen_realism_2006.pdf]])
*//Proper and improper separability//, C.G. Timpson and H.R. Brown (2005). ([[l-PDF|local_papers/timpson_brown_2005.pdf]])
*//Decoherence, the measurement problem, and interpretations of quantum mechanics//, M. Schlosshauer (2004). ([[l-PDF|local_papers/schlosshauer_2004.pdf]])
*//The role of decoherence in quantum mechanics//, G. Bacciagaluppi (2003). ([[online|http://plato.stanford.edu/entries/qm-decoherence/]])
*//Entanglement and relativity//, C.G. Timpson and H.R. Brown (2002). ([[l-PDF|local_papers/timpson_and_brown_2002.pdf]])
* //Naive realism about operators//, M. Daumer, D. Dürr, S. Goldstein and N. Zanghì (1996) ([[l-PDF|local_papers/naive_realism_about_operators.pdf]]).
* //Quantum nonlocality as an axiom//, S. Popescu and D. Rohrlich (1994). ([[l-PDF|local_papers/popescu_1994.pdf]])
* //Angular-momentum measurement and nonlocality in Bohm's interpretation of quantum theory//, C. Dewdney and Z. Malik (1993) ([[l-PDF|local_papers/dewdney_malik_1993.pdf]]).
*//A quantum potential approach to the Wheeler delayed-choice experiment//, D.J. Bohm, C. Dewdney, B.H. Hiley (1985). ([[l-PDF|local_papers/bohm_delayed_choice_1985.pdf]])
__Miscellaneous__
* //On the quantum mechanical scattering statistics of many particles//, D. Dürr, M. Kolb, T. Moswer, S. Römer (2010). ([[l-PDF|local_papers/durr_scattering_2010.pdf]])
* //Bohmian mechanics without pilot waves//, B. Poirier (2010). ([[l-PDF|local_papers/poirier_2010.pdf]])
*//The theory of (exclusively) local beables//, T. Norsen (2010). ([[l-PDF|local_papers/norsen_beables_2010.pdf]])
*//Energy content of quantum systems and the alleged collapse of the wave function//, P.J. Riggs (2008). ([[l-PDF|local_papers/riggs_2009.pdf]])
* //Topological solutions of Bohmian quantum mechanics//, X. Shi and M. Yu (2009). ([[l-PDF|local_papers/shi_2009.pdf]])
*//Reflections on the de ~Broglie-Bohm quantum potential//, P.J. Riggs (2008). ([[l-PDF|local_papers/riggs_2008.pdf]])
*//Paradoxical reflection in quantum mechanics//, P.L. Garrido, S. Goldstein, J. Lukkarinen, R. Tumulka (2008). ([[l-PDF|local_papers/garrido_2008.pdf]])
* //Grete Hermann: an early contributor to quantum theory//, C.L. Herzenberg (2008). ([[l-PDF|local_papers/grete_hermann.pdf]])
*// De ~Broglie-Bohm guidance equations for arbitrary Hamiltonians//, A.Struyve, A.Valentini (2008). ([[l-PDF|local_papers/valentini_struyve_2008.pdf]]) 
*//Realism, the Interpretation of Quantum Theory, and Idealism.//, M. Donald (2008). ([[online|http://www.bss.phy.cam.ac.uk/~mjd1014/real.html]])
* //The early history of David Bohm's quantum mechanics through the perspective of Ludwik Fleck's thought collectives//, C. Forstner (2008). ([[l-PDF|local_papers/forstner_2008.pdf]])
*//Would Bohr be born if Bohm were born before Born?//, H. Nikolic (2007). ([[l-PDF|local_papers/nikolic_2007.pdf]])
*//What is erased in the quantum erasure//, B.J. Hiley and R.E. Callaghan (2007). ([[PDF|http://www.bbk.ac.uk/tpru/BasilHiley/QuantEraserLight.pdf]])
*//On a hydrogen atom//, H. Stupelis (2007). ([[l-PDF|local_papers/stupelis_2007.pdf]])
*//Leon Rosenfeld's Marxist defence of complementarity//, A.S. Jacobsen (2007). ([[l-PDF|local_papers/rosenfeld.pdf]])
* //The free-will theorem//, J. Conway and S. Kochen (2006). ([[PDF|local_papers/conway_kochen_2006.pdf]]). See also //The ~Conway-Kochen argument and relativistic GRW models//, A. Bassi and G. Ghirardi (2007). ([[PDF|local_papers/bassi_ghirardi_2007.pdf]]), //Comment on "The free-will theorem"//, R. Tumulka (2007). ([[PDF|local_papers/tumulka_free_will_2006.pdf]]), //Reply to the comments of Bassi, Ghirardi, and Tumulka on the free-will theorem//, J. Conway and S. kochen (2007). ([[PDF|local_papers/conway_kochen_reply_2007.pdf]]), //On the free-will postulate in quantum mechanics//, G. 't Hooft ([[PDF|local_papers/hooft_free_will_2007.pdf]]), //The point processes of the GRW theory of wave function collapse//, R. Tumulka (2009). ([[PDF|local_papers/tumulka_grw_2009.pdf]]) - skip to p. 214, and //What does the free-will theorem actually prove?// S. Goldstein, D.V. Tausk, R. Tumulka, N. Zanghì (2009) ([[PDF|local_papers/goldstein_free_will_2009.pdf]])
*//Quantum mechanics in multiply-connected spaces//,  D. Dürr, S. Goldstein, J. Taylor, R. Tumulka, N. Zanghì (2006). ([[l-PDF|local_papers/durr_topology_2006.pdf]])
*//Topological factors derived from Bohmian mechanics//, D. Dürr, S. Goldstein, J. Taylor, R. Tumulka, and N. Zanghì (2006). ([[l-PDF|local_papers/durr_topology_2006a.pdf]])
*//Determinate values for quantum observables//, R. Tumulka (2006). ([[l-PDF|local_papers/tumulka_2006_determinate.pdf]])
* //A tribute to James Cushing//, A. Valentini and M. Dickson (2005). ([[l-PDF|local_papers/valentini_on_cushing_2005.pdf]])
*//What's wrong with Einstein's 1927 hidden-variable interpretation of quantum mechanics?//, P.R. Holland (2005). ([[l-PDF|local_papers/holland_einstein_2005.pdf]])
* //Quantum back reaction and the particle law of motion//, P. Holland (2005). ([[l-PDF|local_papers/holland_2005.pdf]])
* //Two-time correlation functions: stochastic and quantum mechanics//, L. Feligioni, O. Panella, Y.N. Srivastava and A. Widom (2005) ([[l-PDF|local_papers/feligioni_2005.pdf]]).
* //Are all particles real?//, S. Goldstein, R. Tumulka, J. Taylor, N. Zanghì (2005). ([[l-PDF|local_papers/goldstein_real_particles_2005.pdf]])
*//The density matrix in the de ~Broglie-Bohm approach//, O.J.E. Maroney (2005). ([[l-PDF|local_papers/maroney_density_matrix_2005.pdf]])
*//Are all particles identical?//, S. Goldstein, R. Tumulka, J. Taylor, N. Zanghì (2004). ([[l-PDF|local_papers/goldstein_identical_particles_2004.pdf]])
*//Science and exile: David Bohm, the hot times of the Cold War, and his struggle for a new interpretation of quantum mechanics//, O. Freire (2004). ([[l-PDF|local_papers/freire_2004.pdf]])
*//On the role of density matrices in Bohmian mechanics//, D. Dürr, S. Goldstein, R. Tumulka, and N. Zanghì. ([[l-PDF|local_papers/durr_density_matrices_2003.pdf]])
*//Coulomb imaging of H2+ nuclear wave functions using the pilot-wave theory of quantum mechanics//, C.R. Courtney and L.J. Frasinski (2003). ([[l-PDF|local_papers/courtney_2003.pdf]])
* //Bader's interatomic surface and Bohmian mechanics//, L. delle Site (2002) ([[l-PDF|local_papers/delle_site_2002.pdf]]).
* //Hamiltonian theory of wave and particle in quantum mechanics I: Liouville's theorem and the interpretation of de ~Broglie-Bohm theory//, P.R. Holland (2001). ([[l-PDF|local_papers/holland_2001.pdf]])
* //Hamiltonian theory of wave and particle in quantum mechanics II: ~Hamilton-Jacobi theory and particle back reaction//, P.R. Holland (2001). ([[l-PDF|local_papers/holland_2001a.pdf]])
*//Berry's phase in pilot-wave theory//, E. Sjoqvist, H. Carlsen. ([[l-PDF|local_papers/berryphase_1998.pdf]])
*//A new trajectory interpretation of quantum mechanics//, P.R. Holland (1998). ([[l-PDF|local_papers/holland_1998.pdf]])
*//Are the Bader Laplacian and the Bohm quantum potential equivalent?//, C. Levit and J. Sarfatti ([[l-PDF|local_papers/sarfatti_1997.pdf]]).
*//Logical positivism//. ([[online|http://www.cscs.umich.edu/~crshalizi/notebooks/logical-positivism.html]])
*//Mott's cloud chamber theory made explicit and the relative-collapse interpretation of quantum mechanics thus obtained//, F. Herbut (1994). ([[l-PDF|local_papers/cloud_chamber.pdf]])
*//Inequivalence between the Schrödinger equation and the Madelung hydrodynamic equations//, T.C. Wallstrom (1994). ([[l-PDF|local_papers/wallstrom_1994.pdf]])
*//Cosmology and the pilot-wave interpretation of quantum mechanics//, F.J. Tipler (1984). ([[l-PDF|local_papers/tipler_1984.pdf]])
*//A new view of the universe//, B. Kristoffen (aka Kris Krogh) (date unknown). ([[l-PDF|local_papers/kristoffen.pdf]])
__Classical limit__
*//On the approach to thermal equilibrium of macroscopic quantum systems//, S. Goldstein, J.L. Lebowitz, C. Mastrodonato, R. Tumulka, N. Zanghì (2009). ([[l-PDF|local_papers/goldstein_2009b.pdf]])
*// Classical and Bohmian trajectories in semiclassical systems: Mismatch in dynamics, mismatch in reality?//, A. Matzkin and V. Nurock (2007). ([[l-PDF|local_papers/matzkin_2007.pdf]])
*//On the classical limit in Bohm's theory//, G.E. Bowman (2005). ([[l-PDF|local_papers/bowman_2005.pdf]])
*//On ~Hamilton-Jacobi theory as a classical root of quantum theory//, J. Butterfield (2002). ([[l-PDF|local_papers/butterfield_hj_2002.pdf]])
* //Seven steps towards the classical world//, V. Allori, D. Dürr, S. Goldstein and N. Zanghì, //J. Opt. B: Quantum Semiclass. Opt.//, ''4'', S482 (2002) ([[l-PDF|local_papers/classical_limit.pdf]])
*//On the classical limit of quantum mechanics//, V. Allori and N. Zanghì (2001). ([[l-PDF|local_papers/allori_2001.pdf]])
__Numerics and Computations__
*//Complex-extended Bohmian mechanics//, C. Chou and R.E.Wyatt (2010). ([[l-PDF|local_papers/chou_wyatt_2010.pdf]])
*//Schrödinger dynamics as a two-phase conserved flow: an alternative trajectory construction of quantum propagation//, P. Holland (2009). ([[l-PDF|local_papers/holland_2009.pdf]])
*//Quantum Trajectories 2008 - book of abstracts// (2008). ([[l-PDF|local_papers/quantum_trajectories_2008.pdf]])
*//Monte Carlo generation of Bohmian trajectories//, T.M. Coffey, R.E.Wyatt and W.C. Schieve (2008) ([[l-PDF|local_papers/coffey_2008.pdf]])
*//Unified derivation of Bohmian methods and the incorporation of interference effects//, Y. Goldfarb, J. Schiff and D.J. Tannor (2007) ([[l-PDF|local_papers/goldfarb_2007.pdf]]).
*//Quantum dynamics with Bohmian trajectories//, D.A. Deckert, D. Dürr and P. Pickl (2007) ([[l-PDF|local_papers/deckert_2007.pdf]]).
*//Solving the Schrodinger equations using the finite difference time domain method//, I.W. Sudiarta and D.J.W. Geldart (2007) ([[l-PDF|local_papers/finite_diff_schr_2007.pdf]]).
*//Bohmian mechanics with complex action: a new trajectory-based formulation of quantum mechanics//, Y. Goldfarb, I. Degani, D.J. Tannor (2006) ([[l-PDF|local_papers/goldfarb_2006.pdf]]) Comment by A. Sanz and S. ~Miret-Artes ([[l-PDF|local_papers/goldfarb_2006_comment.pdf]]). Reply by Goldfarb ([[l-PDF|local_papers/goldfarb_2006_reply.pdf]]).
*//Hidden variables as computational tools: the construction of a relativistic spinor field// P. Holland (2006). ([[l-PDF|local_papers/holland_2006.pdf]])
*//Quantum dynamics of hydrogen atom in complex space//, C.D. Yang (2005) ([[l-PDF|local_papers/yang_2005.pdf]])
*//Computing the wave function from trajectories: particle and wave pictures in quantum mechanics and their relation// P. Holland (2004) ([[l-PDF|local_papers/holland_2004.pdf]]).
*//Reconciling semiclassical and Bohmian mechanic. I : Stationary states// B. Poirier (2004) ([[l-PDF|local_papers/poirier_2004.pdf]])
*//Using quantum trajectories and adaptive grids to solve quantum dynamical problems//, R.E. Wyatt and E.R. Bittner (2003) ([[l-PDF|local_papers/wyatt_bittner_2003.pdf]]).
*//Estimating Bohm's quantum forces using Bayesian statistics//, J.B. Maddox and E.R. Bittner, //J. Chem. Phys.// ''119'', 6465 (2003) ([[l-PDF|local_papers/maddox_bittner_2003.pdf]])
*//A simple model of quantum trajectories//, T.A. Brun (2002). ([[l-PDF|local_papers/brun_2002.pdf]])
*//Multidimensional quantum dynamics with trajectories: a novel numerical implementation of Bohmian mechanics//, D. Nerukh and J.H. Frederick, //Chem. Phys. Lett.// ''332'', 145 (2000) ([[l-pDF|local_papers/nerukh_frederick_2000.pdf]]) 
*//Quantum wave packet dynamics with trajectories// C.L.Lopreore and R.E. Wyatt (1999) ([[l-PDF|local_papers/lopreore_1999.pdf]]).
*//Quantum wave packet dynamics with trajectories: wave synthesis along quantum paths// R.E. Wyatt (1999) ([[l-PDF|local_papers/wyatt_1999.pdf]]).
*//Multidimensional wave packet dynamics within the fluid dynamical formulation of the Schrodinger equation//, B.K. Dey, A. Askar, H. Rabitz (1998) ([[l-PDF|local_papers/dey_1998.pdf]]).
__Trajectories (general)__
*//N-slit interference: path integrals, Bohmian trajectories//, V.I. Sbitnev (2010). ([[l-PDF|local_papers/sbitnev_2010.pdf]])
*//Spin-dependent Bohmian electronic trajectories for helium//, J. Timko and E.R. Vrscay (2009) ([[l-PDF|local_papers/timko_vrscay_2009.pdf]])
*//Spin-like current from phase space distributions//, P. Holland (2009). ([[l-PDF|local_papers/holland_2009b.pdf]])
*//Bohmian trajectories and the path integral paradigm. Complexified Lagrangian mechanics//, V.I. Sbitnev (2009). ([[l-PDF|local_papers/sbitnev_2009.pdf]])
*//Complex spin and anti-spin dynamics; a generalization of de Broglie-bohm theory to complex space//, C. Yang (2009). ([[l-PDF|local_papers/yang_2009.pdf]])
*//Origin of chaos near critical points of quantum flow//C. Efthymiopoulos, C. Kalapotharakos and G. Contopoulos (2009). ([[l-PDF|local_papers/contopoulos_2009.pdf]])
*//Ordered and chaotic Bohmian trajectories//, G. Contopoulos and C. Efthymiopoulos (2008). ([[l-PDF|local_papers/contopoulos_2008.pdf]])
*//Trajectory interpretation of the uncertainty principle in 1D systems uusing complex Bohmian mechanics//, C. Yang (2008). ([[[l-PDF|local_papers/yang_2008.pdf]])
*//Grounding Bohmian mechanics in weak values and Bayesianism//, H.M. Wiseman (2007). ([[l-PDF|local_papers/wiseman_2007_bayesianism.pdf]])
*//Nodal points and the transition from ordered to chaotic Bohmian trajectories//C. Efthymiopoulos, C. Kalapotharakos and G. Contopoulos (2007). ([[l-PDF|local_papers/contopoulos_2007.pdf]])
*//Chaos in Bohmian quantum mechanics//, C. Efthymiopoulos and G. Contopoulos (2006). ([[l-PDF|local_papers/contopoulos_2006.pdf]])
*//Bohmian trajectories and the ether: where does the analogy fail?//, L. Marchildon (2006). ([[l-PDF|local_papers/marchildon_2006.pdf]])
*//Feynman's path integrals and Bohm's particle paths//, R. Tumulka (2005) ([[l-PDF|local_papers/tumulka_2005.pdf]])
*//Simple proof for global existence of Bohmian trajectories//, S. Teufel and R. Tumulka (2004). ([[l-PDF|local_papers/teufel_2004.pdf]])
*//The path integral approach in the frame work of causal interpretation//, M. Abolhasani and M. Golshani (2003). ([[l-PDF|local_papers/abolhasani_2003.pdf]])
*//Spin-dependent Bohm trajectories associated with an electronic transition in hydrogen//, C. Colijn and E.R. Vrscay (2003). ([[l-PDF|local_papers/colijn_vrscay_2003.pdf]])
*//On the motion of a single particle near a nodal line in the de ~Broglie-Bohm interpretation of quantum mechanics//, P. Falsaperla, G. Fonte (2003). ([[l-PDF|local_papers/falsaperla_2003.pdf]])
*//Spin-dependent Bohm trajectories for hydrogen eigenstates//, C. Colijn and E.R. Vrscay (2002). ([[l-PDF|local_papers/colijn_vrscay_2002.pdf]])
*//Bohmian trajectories for photons//, P. Ghose, A.S. Majumdar, S.Guha, J. Sau (2001) ([[l-PDF|local_papers/ghose_2001.pdf]])
*//Generic Bohmian trajectories of an isolated particle//, D. Appleby (1999). ([[l-PDF|local_papers/appleby_1999a.pdf]])
*//Bohmian trajectories post-decoherence//, D. Appleby (1999). ([[l-PDF|local_papers/appleby_1999b.pdf]])
*//Properties of the trajectories in Bohmian mechanics//, H. Frisk (1997). ([[l-PDF|local_papers/frisk_1997.pdf]])
__Hiley's work/algebraic approaches__
*//Hunting for snarks in quantum mechanics//, D. Hestenes (2010). ([[l-PDF|local_papers/hestenes_2010.pdf]])
* //The Bohm approach reassessed//, B.J. Hiley (2010). ([[l-PDF|local_papers/hiley_reassessed_2010.pdf]])
*//Zeno paradox for Bohmian trajectories: the unfolding of the metatron//, M.A. de Gosson and B.J. Hiley (2010). ([[[l-PDF|local_papers/hiley_sep2010b.pdf]])
*//Imprints of the quantum world in classical mechanics//, M.A. de Gosson and B.J. Hiley (2010) ([[l-PDF|local_papers/hiley_sep2010.pdf]])
*//Clifford algebras and the ~Dirac-Bohm quantum ~Hamilton-Jacobi equation//, B.J. Hiley (2010). ([[l-PDF|local_papers/hiley_2010a.pdf]])
*//Some remarks on the evolution of Bohm's proposals for an alternative to standard quantum mechanics//, B.J. Hiley (2010). ([[l-PDF|local_papers/hiley_2010b.pdf]])
*//On the relationship between the ~Wigner-Moyal and Bohm approaches to quantum mechanics: a step to a more general theory?//, B.J. Hiley (2010). ([[l-PDF|local_papers/hiley_2010c.pdf]])
*//An unconventional space-time model of electrons and its application to the many-electron problem//, W.A. Hofer (2010). ([[l-PDF|local_papers/hofer_2010.pdf]])
*//Process, distinction, groupoids and Clifford algebras: an alternative view of the quantum formalism//, B.J. Hiley (2009). ([[l-PDF|local_papers/hiley_2009a.pdf]])
*//The Clifford algebra approach to quantum mechanics A: the Schrödinger and Pauli particles//, B.J. Hiley and R.E. Callaghan (2009). ([[l-PDF|local_papers/hiley_2009b.pdf]])
*//The Clifford algebra approach to quantum mechanics B: the Dirac particle and its relation to the Bohm approach//, B.J. Hiley and R.E. Callaghan (2009). ([[l-PDF|local_papers/hiley_2009c.pdf]])
*//Quantum reality unveiled through process and the implicate order//, B.J. Hiley (2008) ([[l-PDF|local_papers/hiley_2008.pdf]])
*//Moyal's characteristic function, the density matrix and von Neumann's idempotent//, B.J. Hiley (2007). ([[l-PDF|local_papers/hiley_2007.pdf]])
*//Phase space description of quantum mechanics and non-commutative geometry: ~Wigner-Moyal and Bohm in a wider context//, B.J. Hiley (2007). ([[l-PDF|local_papers/hiley_2007b.pdf]])
*//Non-commutative quantum geometry: a re-appraisal of the Bohm approach to quantum theory//, B.J. Hiley (2005). ([[l-PDF|local_papers/hiley_2005.pdf]])
*//Schrödinger revisited: an algebraic approach//, M.R. Brown and B.J. Hiley (2004). ([[l-PDF|local_papers/brown_and_hiley_2004.pdf]])
*//Phase space descriptions of quantum phenomena//, B.J. Hiley (2003)([[l-PDF|local_papers/hiley_2003.pdf]])
* //From the Heisenberg picture to Bohm: a new perspective on active information and its relation to Shannon information//, B.J. Hiley (2002). ([[l-PDF|local_papers/hiley_2002.pdf]])
* //Non-commutative geometry, the Bohm interpretation, and the mind-matter relationship//, B.J. Hiley (2000). ([[l-PDF|local_papers/hiley_2000.pdf]])
*//Geometric algebra and its application to mathematical physics//, C.J.L. Doran (1994). ([[l-PDF|local_papers/doran_thesis.pdf]])
*//Imaginary numbers are not real - the geometric algebra of spacetime//, S. Gull, A. Lasenby and C. Doran (1993). ([[l-PDF|local_papers/gull_1993.pdf]])
*//Algebraic quantum mechanics and pregeometry//, D. Bohm, P.G. Davies and B.J. Hiley. ([[l-PDF|local_papers/bohm_hiley_1982.pdf]])
__Stochastic models__
*//Stochastic model of quantum mechanics - a perspective//, M.P. Davidson (2008). ([[l-PDF|local_papers/davidson_2008.pdf]])
* //Could quantum mechanics be an approximation to another theory?// L. Smolin (2008) ([[l-PDF|local_papers/smolin_2008.pdf]],[[PDF|http://aps.arxiv.org/abs/quant-ph/0609109]]) (Lubos Motl is rude about this [[here|http://motls.blogspot.com/2006/09/wavefunctions-and-hydrodynamics.html]])
* //A conceptual introduction to Nelson's mechanics//, G. Bacciagaluppi (2005). ([[l-PDF|local_papers/bacciagaluppi_2005.pdf]])
*//The Dirac equation in classical statistical mechanics//, G.N. Ord (2002). ([[l-PDF|local_papers/ord_2002.pdf]])
*//Entwined pairs and Schrödinger's equation//, G.N. Ord and R.B. Mann (2002). ([[l-PDF|local_papers/ord_mann_2002.pdf]])
* //Nelsonian mechanics revisited//, G. Bacciagaluppi. ([[l-PDF|local_papers/bacciagaluppi_nelson_1998.pdf]])
* //Time reversal of Markov processes and relativistic quantum theory//, M. Nagasawa (1997). ([[l-PDF|local_papers/nagasawa_1997.pdf]])
* //Quantum theory, theory of Brownian motions, and relativity theory//, M. Nagasawa (1996). ([[l-PDF|local_papers/nagasawa_1996.pdf]])
*//Inequivalence between the Schrödinger equation and the Madelung hydrodynamic equations//, T.C. Wallstrom (1994). ([[l-PDF|local_papers/wallstrom_1994.pdf]])
*//The principles of a stochastic formulation of quantum theory//, A. Kyprianidis (1992). ([[l-PDF|local_papers/kyprianidis_1992.pdf]])
*//Time reversal in stochastic processes and the Dirac equation//, D. G. C. ~McKeon and G. N. Ord (1992). ([[l-PDF|local_papers/mckeon_ord_1992.pdf]])
*//Non-locality and locality in the stochastic interpretation of quantum mechanics//, D. Bohm and B. Hiley (1989). ([[l-PDF|local_papers/bohm_hiley_nonlocality_1989.pdf]])
*//Non-locality in the stochastic interpretation of the quantum theory//, D. Bohm (1988). ([[l-PDF|local_papers/bohm_1988.pdf]])
*//Stochastic mechanics of a Dirac particle in two spacetime dimensions//, G. de Angelis, G. ~Jona-Lasinio, M. Serva and N. Zanghì (1986). ([[l-PDF|local_papers/angelis_1986.pdf]])
* //Model of the causal interpretation of quantum theory in terms of a fluid with irregular fluctuations//, D. Bohm and J.P. Vigier (1954). ([[l-PDF|local_papers/bohm_vigier_1954.pdf]]).
__Other interpretations of QM__
*//Quantum theory: interpretation cannot be avoided// E. Dennis and T. Norsen (2004). ([[l-PDF|local_papers/dennis_norsen_2004.pdf]])
*//On the common structure of Bohmian mechanics and the ~Ghirardi-Rimini-Weber theory// V. Allori, S. Goldstein, R. Tumulka, N. Zanghì (2008) ([[l-PDF|local_papers/valeri_2008.pdf]]).
*//The quantum formalism and the GRW formalism// S. Goldstein, R. Tumulka, and N,. Zanghì (2008). ([[l-PDF|local_papers/goldstein_grw_2008.pdf]])
*//Cramer's transactional interpretation and causal loop problems//, R.E. Kastner (2004). ([[l-PDF|local_papers/kastner_on_maudlin.pdf]])
*//The transactional interpretation of quantum mechanics//, J.G. Cramer (1986). ([[online|http://mist.npl.washington.edu/npl/int_rep/tiqm/TI_toc.html]])
__Quantum information__
*//Bohmian mechanics and quantum information//, S. Goldstein (2010). ([[l-PDF|local_papers/goldstein_2010.pdf]]).
* //The message of the quantum?// M. Daumer, D. Dürr, S. Goldstein, T. Maudlin, R. Tumulka, N. Zanghì (2006). ([[l-PDF|local_papers/message_2006.pdf]])
__Book reviews__
*//The causal theory revisited// [review of Riggs "Quantum Causality" textbook] , W. Struyve (2010). ([[l-PDF|local_papers/struyve_riggs_review.pdf]])
__Implicate order, consciousness, etc.__
*//Implications of Bohmian quantum ontology for psychopathology//, P. Pylkkänen (2010). ([[l-PDF|local_papers/pylkkanen_2010.pdf]])
*//Quantum approaches to consciousness//, H. Atmanspacher (2006). ([[online|http://plato.stanford.edu/entries/qt-consciousness/]])
*//A new theory of the relationship of mind and matter// D. Bohm (1990) ([[l-PDF|local_papers/bohm_mind_matter_1990.pdf]]).
__Talks__
* //Introduction to CFD//, P. Roe (2008) ([[l-PDF|local_papers/roe_cfd_lectures.pdf]]).
*//Multidimensional de ~Broglie-Bohm dynamics: the quantum motion with trajectories//, D. Nerukh ([[l-PPT|local_papers/nerukh_talk.ppt]]).
/***
|Name|GotoPlugin|
|Source|http://www.TiddlyTools.com/#GotoPlugin|
|Version|1.4.3|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|view any tiddler by entering it's title - displays list of possible matches|

''View a tiddler by typing its title and pressing //enter//.''  Input just enough to uniquely match a single tiddler title and ''press //enter// to auto-complete the title for you!!''  If multiple titles match your input, a list is displayed.  You can scroll-and-click (or use arrows+enter) to select/view a tiddler, or press //escape// to close the listbox to resume typing.  When the listbox is ''//not//'' being displayed, press //escape// to clear the current text input and start over.

Note: ''At any time, you can move the focus directly to the text input field by using the ~ALT-G keyboard shortcut.''
!!!!!Examples
<<<
| //IMPORTANT NOTE:// ''As of version 1.4.0 (2007.04.25),<br>to avoid conflict with javascript reserved keywords<br>the {{{<<goto>>}}} macro has been renamed to {{{<<gotoTiddler>>}}}'' |
syntax: {{{<<gotoTiddler quiet insert inputstyle liststyle>>}}}
All parameters are optional.
* ''quiet'' prevents //automatic// display of the list as each character is typed.  To view the list when ''quiet'', use //down// or //enter//.
* ''insert'' causes the selected tiddler title to be inserted into the tiddler source currently being edited (use with EditTemplate)
* ''inputstyle'' and ''liststyle'' are CSS declarations that modify the default input and listbox styles.  Note: styles containing spaces must be surrounded by ({{{"..."}}} or {{{'...'}}}) or ({{{[[...]]}}}).
{{{<<gotoTiddler>>}}}
<<gotoTiddler>>
{{{<<gotoTiddler quiet>>}}}
<<gotoTiddler quiet>>
{{{<<goto width:20em width:20em>>}}}
<<gotoTiddler width:20em width:20em>>

You can also invoke the macro with the "insert" keyword.  When used in the [[EditTemplate]], like this:
{{{
<span macro="gotoTiddler insert"></span>
}}}
it allows you to type/select a tiddler title, and instantly insert a link to that title (e.g. {{{[[TiddlerName]]}}}) into the tiddler source being edited.
<<<
!!!!!Configuration
<<<
You can create a tiddler tagged with <<tag systemConfig>> to control the maximum height of the listbox of tiddlers/shadows/tags. //The default values are shown below://
//{{{
config.macros.gotoTiddler.listMaxSize=10;
//}}}
<<<
!!!!!Installation
<<<
import (or copy/paste) the following tiddlers into your document:
''GotoPlugin'' (tagged with <<tag systemConfig>>)
<<<
!!!!!Revisions
<<<
''2007.10.31 [1.4.3]'' removed extra trailing comma on last property of config.macros.gotoTiddler object.  This fixes an error under InternetExplorer that was introduced 6 days ago... sure, I should have found it sooner, but... ''WHY DON'T PEOPLE TELL ME WHEN THINGS ARE BROKEN!!!!''
''2007.10.25 [1.4.2]'' added onclick handler for input field, so that clicking in field hides the listbox.
''2007.10.25 [1.4.1]'' re-wrote getItems() to cache list of tiddlers/shadows/tags and use case-folded simple text match instead of regular expression to find matching tiddlers.  This *vastly* reduces processing overhead between keystrokes, especially for documents with many (>1000) tiddlers.  Also, removed local definition of replaceSelection(), now supported directly by the TW2.2+ core, as well as via backward-compatible plugin (see [[CoreTweaksArchive]]).
''2007.04.25 [1.4.0]'' renamed macro from "goto" to "gotoTiddler".  This was necessary to avoid a fatal syntax error in Opera (and other browsers) that require strict adherence to ECMAScript 1.5 standards which defines the identifier "goto" as "reserved for FUTURE USE"... *sigh*
''2007.04.21 [1.3.2]'' in html definition, removed DIV around droplist (see 1.2.6 below).  It created more layout problems then it solved. :-(
''2007.04.01 [1.3.1]'' in processItem(), ensure that correct textarea field is found by checking for edit=="text" attribute
''2007.03.30 [1.3.0]'' tweak SideBarOptions shadow to automatically add {{{<<goto>>}}} when using default sidebar content
''2007.03.30 [1.2.6]'' in html definition, added DIV around droplist to fix IE problem where list appears next to input field instead of below it.  
''2007.03.28 [1.2.5]'' in processItem(), set focus to text area before setting selection (needed for IE to get correct selection 'range')
''2007.03.28 [1.2.4]'' added prompt for 'pretty text' when inserting a link into tiddler content
''2007.03.28 [1.2.3]'' added local copy of core replaceSelection() and modified for different replace logic
''2007.03.27 [1.2.2]'' in processItem(), use story.getTiddlerField() to retrieve textarea control
''2007.03.26 [1.2.1]'' in html, use either 'onkeydown' (IE) or 'onkeypress' (Moz) event to process <esc> key sooner, to prevent <esc> from 'bubbling up' to the tiddler (which will close the current editor).
''2007.03.26 [1.2.0]'' added support for optional "insert" keyword param. When used in [[EditTemplate]], (e.g. {{{<span macro="goto insert"></span>}}}) it triggers alternative processing: instead of displaying the selected tiddler, that tiddler's title is inserted into a tiddler's textarea edit field surrounded by {{{[[...]]}}}.
''2006.05.10 [1.1.2]'' when filling listbox, set selection to 'heading' item... auto-select first tiddler title when down/enter moves focus into listbox
''2006.05.08 [1.1.1]'' added accesskey ("G") to input field html (also set when field gets focus).  Also, inputKeyHandler() skips non-printing/non-editing keys. 
''2006.05.08 [1.1.0]'' added heading to listbox for better feedback (also avoids problems with 1-line droplist)
''2006.05.07 [1.0.0]'' list matches against tiddlers/shadows/tags.  input field auto-completion... 1st enter=complete matching input (or show list)... 2nd enter=view tiddler.  optional "quiet" param controls when listbox appears.
''2006.05.06 [0.5.0]'' added handling for enter (13), escape(27), and down(40) keys.   Change 'ondblclick' to 'onclick' for list handler to view tiddlers (suggested by Florian Cauvin - prevents unintended trigger of tiddler editor).  shadow titles inserted into list instead of appended to the end.
''2006.05.05 [0.0.0]'' started
<<<
!!!!!Credits
>This feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]
!!!!!Code
***/
//{{{
version.extensions.gotoTiddler = {major: 1, minor: 4, revision: 3, date: new Date(2007,10,31)};

// automatically tweak shadow SideBarOptions to add <<gotoTiddler>> macro above <<search>>
config.shadowTiddlers.SideBarOptions=config.shadowTiddlers.SideBarOptions.replace(/<<search>>/,"{{button{goto}}}\n<<gotoTiddler>><<search>>");

config.macros.gotoTiddler= { 
	handler:
	function(place,macroName,params) {
		var quiet=(params[0] && params[0]=="quiet"); if (quiet) params.shift();
		var insert=(params[0] && params[0]=="insert"); if (insert) params.shift();
		var instyle=params.shift(); if (!instyle) instyle="";
		var liststyle=params.shift(); if (!liststyle) liststyle="";
		var keyevent=window.event?"onkeydown":"onkeypress";
		createTiddlyElement(place,"span").innerHTML
			=this.html.replace(/%keyevent%/g,keyevent).replace(/%insert%/g,insert).replace(/%quiet%/g,quiet).replace(/%instyle%/g,instyle).replace(/%liststyle%/g,liststyle);
	},

	html:
	'<form onsubmit="return false" style="display:inline;margin:0;padding:0">\
		<input name=gotoTiddler type=text autocomplete="off" accesskey="G" style="%instyle%"\
			title="enter a tiddler title"\
			onclick="this.form.list.style.display=\'none\';"\
			onfocus="this.select(); this.setAttribute(\'accesskey\',\'G\');"\
			%keyevent%="return config.macros.gotoTiddler.inputEscKeyHandler(event,this,this.form.list);"\
			onkeyup="return config.macros.gotoTiddler.inputKeyHandler(event,this,this.form.list,%quiet%,%insert%);">\
		<select name=list style="%liststyle%;display:none;position:absolute"\
			onchange="if (!this.selectedIndex) this.selectedIndex=1;"\
			onblur="this.style.display=\'none\';"\
			%keyevent%="return config.macros.gotoTiddler.selectKeyHandler(event,this,this.form.gotoTiddler,%insert%);"\
			onclick="return config.macros.gotoTiddler.processItem(this.value,this.form.gotoTiddler,this,%insert%);">\
		</select>\
	</form>',

	getItems:
	function(val) {
		if (!this.items.length || val.length<2) { // starting new search, refresh cached list of tiddlers/shadows/tags
			this.items=new Array();
			var tiddlers=store.getTiddlers("title","excludeLists");
			for(var t=0; t<tiddlers.length; t++) this.items.push(tiddlers[t].title);
			for (var t in config.shadowTiddlers) this.items.pushUnique(t);
			var tags=store.getTags();
			for(var t=0; t<tags.length; t++) this.items.pushUnique(tags[t][0]);
		}
		var found = [];
		var match=val.toLowerCase();
		for(var i=0; i<this.items.length; i++)
			if (this.items[i].toLowerCase().indexOf(match)!=-1) found.push(this.items[i]);
		return found;
	},
	items: [], // cached list of tiddlers/shadows/tags

	getItemSuffix:
	function(t) {
		if (store.tiddlerExists(t)) return "";  // tiddler
		if (store.isShadowTiddler(t)) return " (shadow)"; // shadow
		return " (tag)"; // tag 
	},

	keyProcessed:
	function(ev) { // utility function: exits handler and prevents browser from processing the keystroke
		ev.cancelBubble=true; // IE4+
		try{event.keyCode=0;}catch(e){}; // IE5
		if (window.event) ev.returnValue=false; // IE6
		if (ev.preventDefault) ev.preventDefault(); // moz/opera/konqueror
		if (ev.stopPropagation) ev.stopPropagation(); // all
		return false;
	},

	inputEscKeyHandler:
	function(event,here,list) {
		var key=event.keyCode;
		// escape... hide list (2nd esc=clears input)
		if (key==27) {
			if (list.style.display=="none")
				here.value=here.defaultValue;
			list.style.display="none";
			return this.keyProcessed(event);
		}
		return true; // key bubbles up
	},

	inputKeyHandler:
	function(event,here,list,quiet,insert) {
		var key=event.keyCode;
		// non-printing chars... bubble up, except: backspace=8, enter=13, space=32, down=40, delete=46
		if (key<48) switch(key) { case 8: case 13: case 32: case 40: case 46: break; default: return true; }
		// blank input... if down/enter... fall through (list all)... else, and hide list
		if (!here.value.length && !(key==40 || key==13))
			{ list.style.display="none"; return this.keyProcessed(event); }
		// find matching items...
		var found = this.getItems(here.value);
		// matched one item using enter key, but not an *exact* match... autocomplete input field
		if (found.length==1 && quiet && key==13 && here.value!=found[0])
			{ list.style.display="none"; here.value=found[0]; return this.keyProcessed(event); }
		// no match or exact match using enter key, create/show tiddler
		if (found.length<2 && key==13)
			return this.processItem(found.length?found[0]:here.value,here,list,insert);
		// quiet/no match, make sure list is hidden
		list.style.display=(!quiet && found.length)?"block":"none";
		// no matches, key bubbles up
		if (!found.length) return true;
		// using down/enter key shows/moves to list...
		if (key==40 || key==13)  { list.style.display="block"; list.focus(); }
		// finally, if list is showing, fill it with found results...
		if (list.style.display!="none") {
			while (list.length > 0) list.options[0]=null; // clear list
			found.sort(); // alpha by title
			var hdr=found.length==1?this.listMatchMsg:this.listHeading.format([found.length]); // list 'heading'
			list.options[0]=new Option(hdr,"",false,false);
			for (var t=0; t<found.length; t++)  // fill list...
				list.options[list.length]=new Option(found[t]+this.getItemSuffix(found[t]),found[t],false,false);
			list.size=(found.length<this.listMaxSize?found.length:this.listMaxSize)+1; // resize list...
			list.selectedIndex=(key==40 || key==13)?1:0;
		}
		return true; // key bubbles up
	},
	listMaxSize: 10,
	listHeading: 'Found %0 matching titles:',
	listMatchMsg: 'Press enter to open tiddler...',

	selectKeyHandler:
	function(event,list,editfield,insert) {
		if (event.keyCode==27) // escape... hide list, move to edit field
			{ editfield.focus(); list.style.display="none"; return this.keyProcessed(event); }
		if (event.keyCode==13 && list.value.length) // enter... view selected item
			{ this.processItem(list.value,editfield,list,insert); return this.keyProcessed(event); }
		return true; // key bubbles up
	},

	processItem:
	function(title,here,list,insert) {
		if (!title.length) return; here.value=title; list.style.display='none';
		if (insert) {
			var tidElem=story.findContainingTiddler(here); if (!tidElem) { here.focus(); return false; }
			var e=story.getTiddlerField(tidElem.getAttribute("tiddler"),"text");
			if (!e||e.getAttribute("edit")!="text") return false;
			var txt=prompt(this.askForText,title); if (!txt||!txt.length) { here.focus(); return false; }
			e.focus(); // put focus on target field before setting selection
			replaceSelection(e,"[["+txt+"|"+title+"]]"); // insert selected tiddler as a PrettyLink
		}
		else
			story.displayTiddler(null,title); // show selected tiddler
		return false;
	},
	askForText: "Enter the text to display for this link"
}
//}}}
/***
|Name|HTMLFormattingPlugin|
|Source|http://www.TiddlyTools.com/#HTMLFormattingPlugin|
|Version|2.1.5|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|'HTML' formatter|
|Description|embed wiki syntax formatting inside of HTML content|

The shorthand Wiki-style formatting syntax of ~TiddlyWiki is very convenient and enables most content to be reasonably well presented. However, there are times when tried-and-true HTML formatting syntax allows more more precise control of the content display.

When HTML formatting syntax is embedded within a tiddler (in between {{{<}}}{{{html>}}} and {{{<}}}{{{/html>}}} markers) TiddlyWiki passes this content to the browser for processing as 'native' HTML.  However, TiddlyWiki does not also process the HTML source content for any embedded wiki-formatting syntax it may contain.  This means that while you can use HTML formatted content, you cannot mix wiki-formatted content within the HTML formatting.
!!!!!Usage
<<<
The ~HTMLFormatting plugin allows you to freely ''mix wiki-style formatting syntax within HTML formatted content'' by extending the action of the standard TiddlyWiki formatting handler.

When a tiddler is about to be displayed, ~TiddlyWiki looks for tiddler content contained within ''<{{{html}}}>'' and ''<{{{/html}}}>'' HTML tags.  This content (if any) is passed directly to the browser's internal "rendering engine" to process as ~HTML-formatted content.  Once the HTML formatting has been processed, all the pieces of text occuring in between the HTML formatting are then processed by the ~TiddlyWiki rendering engine, one piece at a time, so that normal wiki-style formatting can be applied to the individual text pieces.
<<<
!!!!!Line breaks
<<<
One major difference between Wiki formatting and HTML formatting is how "line breaks" are processed. Wiki formatting treats all line breaks as literal content to be displayed //as-is//. However, because HTML normally ignores line breaks and actually processes them as simple "word separators" instead, many people who write HTML include extra line breaks in their documents, just to make the "source code" easier to read.

Even though you can use HTML tags within your tiddler content, the default treatment for line breaks still follows the Wiki-style rule (i.e., all new lines are displayed as-is). When adding HTML content to a tiddler (especially if you cut-and-paste it from another web page), you should take care to avoid adding extra line breaks to the text.

If removing all the extra line breaks from your HTML content would be a big hassle, you can quickly //override the default Wiki-style line break rule// so that the line breaks use the standard HTML rules instead.  Placing a ''<{{{hide linebreaks}}}>'' tag within the tiddler's HTML content changes all line breaks to spaces before rendering the content, so that the literal line breaks will be processed as simple word-breaks instead.

Note: this does //not// alter the actual tiddler content that is stored in the document, just the manner in which it is displayed. Any line breaks contained in the tiddler will still be there when you edit its content. Also, to include a literal line break when the ''<{{{hide linebreaks}}}>'' tag is present, you will need to use a ''<{{{br}}}>'' or ''<{{{p}}}>'' HTML tag instead of simply typing a line break.
<<<
!!!!!How it works
<<<
The TW core support for HTML does not let you put ANY wiki-style syntax (including TW macros) *inside* the {{{<html>...</html>}}} block.  Everything between {{{<html>}}} and {{{</html>}}} is handed to the browser for processing and that is it.  Fortunately, this plugin ADDS the ability to let you put wiki-syntax (including macros) inside the html.  It does this by first giving the tiddler source content to the browser to process the HTML, and then handling any wiki-based syntax that remains afterward.

However, not all wiki syntax can be safely passed through the browser's parser. Specifically, any TW macros inside the HTML will get 'eaten' by the browser since the macro brackets, {{{<<...>>}}} use the "<" and ">" that normally delimit the HTML/XML syntax recognized by the browser's parser.

Similarly, you can't use InlineJavascript within the HTML because the {{{<script>...</script>}}} syntax will also be consumed by the browser and there will be nothing left to process afterward.  Note: unfortunately, even though the browser removes the {{{<script>...</script>}}} sequence, it doesn't actually execute the embedded javascript code that it removes, so any scripts contained inside of <html> blocks in TW are currently being ignored. :-(

As a work-around to allow TW *macros* (but not inline scripts) to exist inside of <html> formatted blocks of content, the plugin first converts the {{{<<}}} and {{{>>}}} into "%%(" and ")%%", making them "indigestible" so they can pass unchanged through the belly of the beast (the browser's HTML parser).

After the browser has done its job, the wiki syntax sequences (including the "undigested" macros) are contained in #text nodes in the browser-generated DOM elements.  The plugin then recursively locates and processes each #text node, converts the %%( and )%% back into {{{<<}}} and {{{>>}}}, passes the result to wikify() for further rendering of the wiki-formatted syntax into a containing SPAN that replaces the previous #text node.  At the end of this process, none of the encoded %%( and )%% sequences remain in the rendered tiddler output.
<<<
!!!!!Installation
<<<
import (or copy/paste) the following tiddlers into your document:
''HTMLFormattingPlugin'' (tagged with <<tag systemConfig>>)
^^documentation and javascript for HTMLFormatting handling^^
<<<
!!!!!Revision History
<<<
''2007.06.14 [2.1.5]'' in formatter, removed call to e.normalize().  Creates an INFINITE RECURSION error in Safari!!!!
''2006.09.10 [2.1.4]'' update formatter for 2.1 compatibility (use this.lookaheadRegExp instead of temp variable)
''2006.05.28 [2.1.3]'' in wikifyTextNodes(), decode the *value* of TEXTAREA nodes, but don't wikify() its children.  (thanks to "ayj" for bug report)
''2006.02.19 [2.1.2]'' in wikifyTextNodes(), put SPAN element into tiddler DOM (replacing text node), BEFORE wikifying the text content.  This ensures that the 'place' passed to any macros is correctly defined when the macro is evaluated, so that calls to story.findContainingTiddler(place) will work as expected. (Thanks for bug report from GeoffSlocock)
''2006.02.05 [2.1.1]'' wrapped wikifier hijack in init function to eliminate globals and avoid FireFox 1.5.0.1 crash bug when referencing globals
''2005.12.01 [2.1.0]'' don't wikify #TEXT nodes inside SELECT and TEXTAREA elements
''2005.11.06 [2.0.1]'' code cleanup
''2005.10.31 [2.0.0]'' replaced hijack wikify() with hijack config.formatters["html"] and simplified recursive WikifyTextNodes() code
''2005.10.09 [1.0.2]'' combined documentation and code into a single tiddler
''2005.08.05 [1.0.1]'' moved HTML and CSS definitions into plugin code instead of using separate tiddlers
''2005.07.26 [1.0.1]'' Re-released as a plugin. Added <{{{html}}}>...</{{{nohtml}}}> and <{{{hide newlines}}}> handling
''2005.07.20 [1.0.0]'' Initial Release (as code adaptation)
<<<
!!!!!Credits
<<<
This feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]
<<<
!!!!!Code
***/
//{{{
version.extensions.HTMLFormatting = {major: 2, minor: 1, revision: 5, date: new Date(2007,6,14)};

// find the formatter for HTML and replace the handler
initHTMLFormatter();
function initHTMLFormatter()
{
	for (var i=0; i<config.formatters.length && config.formatters[i].name!="html"; i++);
	if (i<config.formatters.length)	config.formatters[i].handler=function(w) {
		if (!this.lookaheadRegExp)  // fixup for TW2.0.x
			this.lookaheadRegExp = new RegExp(this.lookahead,"mg");
		this.lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = this.lookaheadRegExp.exec(w.source)
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
			var html=lookaheadMatch[1];
			// optionally suppress wiki-style literal handling of newlines
			// strip any carriage returns added by Internet Explorer's textarea edit field
			// encode newlines as \n so Internet Explorer's HTML parser won't eat them
			// encode macro brackets (<< and >>) so HTML parser won't eat them
			if (html.indexOf('<hide linebreaks>')!=-1) html=html.replace(regexpNewLine,' ');
			html=html.replace(regexpCarriageReturn,'');
			html=html.replace(regexpNewLine,'\\n');
			html=html.replace(/<</g,'%%(').replace(/>>/g,')%%');
			// create span to hold HTML
			// parse HTML and normalize the results
			// walk node tree and call wikify() on each text node
			var e = createTiddlyElement(w.output,"span");
			e.innerHTML=html;
			// REMOVED: e.normalize();  // THIS CAUSED INFINITE RECURSION IN SAFARI
			wikifyTextNodes(e);
			// advance to next parse position
			w.nextMatch = this.lookaheadRegExp.lastIndex;
		}
	}
}

// wikify text nodes remaining after HTML content is processed (pre-order recursion)
function wikifyTextNodes(theNode)
{
	// textarea node doesn't get wikified, just decoded... 
	if (theNode.nodeName.toLowerCase()=='textarea')
		theNode.value=theNode.value.replace(/\%%\(/g,'<<').replace(/\)\%%/g,'>>').replace(regexpBackSlashEn,'\n');
	else for (var i=0;i<theNode.childNodes.length;i++) {
		var theChild=theNode.childNodes.item(i);
		if (theChild.nodeName.toLowerCase()=='option') continue;
		if (theChild.nodeName.toLowerCase()=='select') continue;
		wikifyTextNodes(theChild);
		if (theChild.nodeName=='#text') {
			var txt=theChild.nodeValue;
			// decode macro brackets and newlines
			txt=txt.replace(/\%%\(/g,'<<').replace(/\)\%%/g,'>>').replace(regexpBackSlashEn,'\n');
			// replace text node with wikified() span
			var newNode=createTiddlyElement(null,"span");
			theNode.replaceChild(newNode,theChild);
			wikify(txt,newNode);
		}
	}
}
//}}}
/***
|Name|InlineJavascriptPlugin|
|Source|http://www.TiddlyTools.com/#InlineJavascriptPlugin|
|Version|1.6.2|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|Insert Javascript executable code directly into your tiddler content.|

''Call directly into TW core utility routines, define new functions, calculate values, add dynamically-generated TiddlyWiki-formatted output'' into tiddler content, or perform any other programmatic actions each time the tiddler is rendered.
!!!!!Usage
<<<
When installed, this plugin adds new wiki syntax for surrounding tiddler content with {{{<script>}}} and {{{</script>}}} markers, so that it can be treated as embedded javascript and executed each time the tiddler is rendered.

''Deferred execution from an 'onClick' link''
By including a {{{label="..."}}} parameter in the initial {{{<script>}}} marker, the plugin will create a link to an 'onclick' script that will only be executed when that specific link is clicked, rather than running the script each time the tiddler is rendered.  You may also include a {{{title="..."}}} parameter to specify the 'tooltip' text that will appear whenever the mouse is moved over the onClick link text

''External script source files:''
You can also load javascript from an external source URL, by including a src="..." parameter in the initial {{{<script>}}} marker (e.g., {{{<script src="demo.js"></script>}}}).  This is particularly useful when incorporating third-party javascript libraries for use in custom extensions and plugins.  The 'foreign' javascript code remains isolated in a separate file that can be easily replaced whenever an updated library file becomes available.

''Display script source in tiddler output''
By including the keyword parameter "show", in the initial {{{<script>}}} marker, the plugin will include the script source code in the output that it displays in the tiddler.

''Defining javascript functions and libraries:''
Although the external javascript file is loaded while the tiddler content is being rendered, any functions it defines will not be available for use until //after// the rendering has been completed.  Thus, you cannot load a library and //immediately// use it's functions within the same tiddler.  However, once that tiddler has been loaded, the library functions can be freely used in any tiddler (even the one in which it was initially loaded).

To ensure that your javascript functions are always available when needed, you should load the libraries from a tiddler that will be rendered as soon as your TiddlyWiki document is opened.  For example, you could put your {{{<script src="..."></script>}}} syntax into a tiddler called LoadScripts, and then add {{{<<tiddler LoadScripts>>}}} in your MainMenu tiddler.

Since the MainMenu is always rendered immediately upon opening your document, the library will always be loaded before any other tiddlers that rely upon the functions it defines.  Loading an external javascript library does not produce any direct output in the tiddler, so these definitions should have no impact on the appearance of your MainMenu.

''Creating dynamic tiddler content''
An important difference between this implementation of embedded scripting and conventional embedded javascript techniques for web pages is the method used to produce output that is dynamically inserted into the document:
* In a typical web document, you use the document.write() function to output text sequences (often containing HTML tags) that are then rendered when the entire document is first loaded into the browser window.
* However, in a ~TiddlyWiki document, tiddlers (and other DOM elements) are created, deleted, and rendered "on-the-fly", so writing directly to the global 'document' object does not produce the results you want (i.e., replacing the embedded script within the tiddler content), and completely replaces the entire ~TiddlyWiki document in your browser window.
* To allow these scripts to work unmodified, the plugin automatically converts all occurences of document.write() so that the output is inserted into the tiddler content instead of replacing the entire ~TiddlyWiki document.

If your script does not use document.write() to create dynamically embedded content within a tiddler, your javascript can, as an alternative, explicitly return a text value that the plugin can then pass through the wikify() rendering engine to insert into the tiddler display.  For example, using {{{return "thistext"}}} will produce the same output as {{{document.write("thistext")}}}.

//Note: your script code is automatically 'wrapped' inside a function, {{{_out()}}}, so that any return value you provide can be correctly handled by the plugin and inserted into the tiddler.  To avoid unpredictable results (and possibly fatal execution errors), this function should never be redefined or called from ''within'' your script code.//

''Accessing the ~TiddlyWiki DOM''
The plugin provides one pre-defined variable, 'place', that is passed in to your javascript code so that it can have direct access to the containing DOM element into which the tiddler output is currently being rendered.

Access to this DOM element allows you to create scripts that can:
* vary their actions based upon the specific location in which they are embedded
* access 'tiddler-relative' information (use findContainingTiddler(place))
* perform direct DOM manipulations (when returning wikified text is not enough)
<<<
!!!!!Examples
<<<
an "alert" message box:
><script show>
	alert('InlineJavascriptPlugin: this is a demonstration message');
</script>
dynamic output:
><script show>
	return (new Date()).toString();
</script>
wikified dynamic output:
><script show>
	return "link to current user: [["+config.options.txtUserName+"]]";
</script>
dynamic output using 'place' to get size information for current tiddler:
><script show>
   if (!window.story) window.story=window;
   var title=story.findContainingTiddler(place).id.substr(7);
   return title+" is using "+store.getTiddlerText(title).length+" bytes";
</script>
creating an 'onclick' button/link that runs a script:
><script label="click here" title="clicking this link will show an 'alert' box" show>
   if (!window.story) window.story=window;
   alert("Hello World!\nlinktext='"+place.firstChild.data+"'\ntiddler='"+story.findContainingTiddler(place).id.substr(7)+"'");
</script>
loading a script from a source url:
>http://www.TiddlyTools.com/demo.js contains:
>>{{{function demo() { alert('this output is from demo(), defined in demo.js') } }}}
>>{{{alert('InlineJavascriptPlugin: demo.js has been loaded'); }}}
><script src="demo.js" show>
	return "loading demo.js..."
</script>
><script label="click to execute demo() function" show>
	demo()
</script>
<<<
!!!!!Installation
<<<
import (or copy/paste) the following tiddlers into your document:
''InlineJavascriptPlugin'' (tagged with <<tag systemConfig>>)
<<<
!!!!!Revision History
<<<
''2007.11.26 [1.6.2]'' when converting "document.write()" function calls in inline code, allow whitespace between "write" and "(" so that "document.write ( foobar )" is properly converted.
''2007.11.16 [1.6.1]'' when rendering "onclick scripts", pass label text through wikifyPlainText() to parse any embedded wiki-syntax to enable use of HTML entities or even TW macros to generate dynamic label text.
''2007.02.19 [1.6.0]'' added support for title="..." to specify mouseover tooltip when using an onclick (label="...") script
''2006.10.16 [1.5.2]'' add newline before closing '}' in 'function out_' wrapper.  Fixes error caused when last line of script is a comment.
''2006.06.01 [1.5.1]'' when calling wikify() on script return value, pass hightlightRegExp and tiddler params so macros that rely on these values can render properly
''2006.04.19 [1.5.0]'' added 'show' parameter to force display of javascript source code in tiddler output
''2006.01.05 [1.4.0]'' added support 'onclick' scripts.  When label="..." param is present, a button/link is created using the indicated label text, and the script is only executed when the button/link is clicked.  'place' value is set to match the clicked button/link element.
''2005.12.13 [1.3.1]'' when catching eval error in IE, e.description contains the error text, instead of e.toString().  Fixed error reporting so IE shows the correct response text.  Based on a suggestion by UdoBorkowski
''2005.11.09 [1.3.0]'' for 'inline' scripts (i.e., not scripts loaded with src="..."), automatically replace calls to 'document.write()' with 'place.innerHTML+=' so script output is directed into tiddler content.  Based on a suggestion by BradleyMeck
''2005.11.08 [1.2.0]'' handle loading of javascript from an external URL via src="..." syntax
''2005.11.08 [1.1.0]'' pass 'place' param into scripts to provide direct DOM access 
''2005.11.08 [1.0.0]'' initial release
<<<
!!!!!Credits
<<<
This feature was developed by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]]
<<<
!!!!!Code
***/
//{{{
version.extensions.inlineJavascript= {major: 1, minor: 6, revision: 2, date: new Date(2007,11,26)};

config.formatters.push( {
	name: "inlineJavascript",
	match: "\\<script",
	lookahead: "\\<script(?: src=\\\"((?:.|\\n)*?)\\\")?(?: label=\\\"((?:.|\\n)*?)\\\")?(?: title=\\\"((?:.|\\n)*?)\\\")?( show)?\\>((?:.|\\n)*?)\\</script\\>",

	handler: function(w) {
		var lookaheadRegExp = new RegExp(this.lookahead,"mg");
		lookaheadRegExp.lastIndex = w.matchStart;
		var lookaheadMatch = lookaheadRegExp.exec(w.source)
		if(lookaheadMatch && lookaheadMatch.index == w.matchStart) {
			if (lookaheadMatch[1]) { // load a script library
				// make script tag, set src, add to body to execute, then remove for cleanup
				var script = document.createElement("script"); script.src = lookaheadMatch[1];
				document.body.appendChild(script); document.body.removeChild(script);
			}
			if (lookaheadMatch[5]) { // there is script code
				if (lookaheadMatch[4]) // show inline script code in tiddler output
					wikify("{{{\n"+lookaheadMatch[0]+"\n}}}\n",w.output);
				if (lookaheadMatch[2]) { // create a link to an 'onclick' script
					// add a link, define click handler, save code in link (pass 'place'), set link attributes
					var link=createTiddlyElement(w.output,"a",null,"tiddlyLinkExisting",wikifyPlainText(lookaheadMatch[2]));
					link.onclick=function(){try{return(eval(this.code))}catch(e){alert(e.description?e.description:e.toString())}}
					link.code="function _out(place){"+lookaheadMatch[5].replace(/document.write\s*\(/gi,'place.innerHTML+=(')+"\n};_out(this);"
					link.setAttribute("title",lookaheadMatch[3]?lookaheadMatch[3]:"");
					link.setAttribute("href","javascript:;");
					link.style.cursor="pointer";
				}
				else { // run inline script code
					var code="function _out(place){"+lookaheadMatch[5].replace(/document.write\s*\(/gi,'place.innerHTML+=(')+"\n};_out(w.output);"
					try { var out = eval(code); } catch(e) { out = e.description?e.description:e.toString(); }
					if (out && out.length) wikify(out,w.output,w.highlightRegExp,w.tiddler);
				}
			}
			w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
		}
	}
} )
//}}}
''Pilot-wave theory, Bohmian metaphysics, and the foundations of quantum mechanics''

Here are the slides from my pilot wave course given in the Lent Term 2009. If you just want to read a more up-to-date summary lecture in a popular style rather than the full technical course, scroll down to the next section.

Lecture 1 : 21st January 2009 
//An introduction to pilot-wave theory//
- [[Slides|http://casinoqmc.net/PWT/lectures/bohm1.pdf]]
- [[Movie 1|http://casinoqmc.net/PWT/lectures/movie1.wmv]] (double slit experiment - Tonomura)
- [[Movie 2|http://casinoqmc.net/PWT/lectures/movie2.mpg]] (diffraction at single slit - Innsbruck)

Lecture 2: 28th January 2009
//Pilot waves and the classical limit. Derivation and justification of the theory//
- [[Slides|http://casinoqmc.net/PWT/lectures/bohm2.pdf]]

Lecture 3: 4th February 2009
//Elementary wave mechanics and pilot waves, with nice examples.//
- [[Slides|http://casinoqmc.net/PWT/lectures/bohm3.pdf]]
- [[Movie 3|http://casinoqmc.net/PWT/lectures/movie3.mp4]] (H atom stationary state - Innsbruck)
- [[Movie 4|http://casinoqmc.net/PWT/lectures/movie4.mp4]] (H atom nonstationary state - Innsbruck)

Lecture 4: 11th February 2009
//The theory of measurement and the origin of randomness//
- [[Slides|http://casinoqmc.net/PWT/lectures/bohm4.pdf]]

Lecture 5: 18th February 2009
//Nonlocality, relativistic spacetime, and quantum equilibrium//
- [[Slides|http://casinoqmc.net/PWT/lectures/bohm5.pdf]]

Lecture 6: 25th February 2009
//Calculating things with quantum trajectories//
- [[Slides|http://casinoqmc.net/PWT/lectures/bohm6.pdf]]

Lecture 7: 4th March 2009
//Not even wrong. Why does nobody like pilot-wave theory?//
- [[Slides|http://casinoqmc.net/PWT/lectures/bohm7.pdf]]
- [[Movie|http://casinoqmc.net/PWT/lectures/solvay.mp4]] (1927 Solvay conference - includes audio commentary)

Lecture 8: 3pm Monday 16th March 2009 
//Bohmian metaphysics : the implicate order and other arcana//
- [[Slides|http://casinoqmc.net/PWT/lectures/bohm8.pdf]]

''Supplementary popular lecture'' (a convenient summary of the above)

MDT speaks about pilot wave theory to c. 200 people at the Cambridge University Physical Society
21st October 2009
//The return of pilot waves, or why Bohr, Heisenberg, Pauli, Born, Schrödinger, Oppenheimer, Feynman, Wheeler, von Neumann and Einstein were all wrong about quantum mechanics//
- [[Poster|http://casinoqmc.net/PWT/cups_poster.png]]
- [[Slides|http://casinoqmc.net/PWT/towler_pilot_waves.pdf]]
- [[Movie 1|http://casinoqmc.net/PWT/lectures/movie1.wmv]] (Double slit experiment - Tonomura)
- [[Movie 2|local_papers/obstacle.mpg]] (Pilot wave + particles hitting an obstacle)
- [[Movie 3|local_papers/colin1.avi]] (Particle trajectories with a moving node, standard guidance equation - Samuel Colin)
- [[Movie 4|local_papers/colin3.avi]] (Particle trajectories with a moving node, guidance equation with spin term - Samuel Colin.)
- [[Movie 5|http://casinoqmc.net/PWT/lectures/solvay.mp4]] (1927 Solvay conference - includes audio commentary)
- [[Movie 6|http://casinoqmc.net/PWT/local_papers/valentini.avi]] (Career advice from Antony Valentini)

''Additional lectures on this topic volunteered by members of the audience''

Jasper van Wezel: Wed 11th March 2009 3pm, TCM seminar room
//How basic condensed matter theory eliminates any need for 'interpreting' quantum mechanics//.

Matthew Donald: Wed 6th May 2009 3pm, TCM Seminar room
//Pilot wave theory: a response// 
PDF available [[here|http://people.bss.phy.cam.ac.uk/~mjd1014/bohma.html]].

''Further lectures in this series''
Antony Valentini: Mon 16th November 2009 3pm, Small Lecture Theatre, Cavendish Laboratory 
//Beyond the quantum// 
[[Poster|http://casinoqmc.net/PWT/av_poster.pdf]]

Mike Towler: Wed 13th January, 2010 11am, TCM Seminar Room
//Exchange, antisymmetry and Pauli repulsion//
[[Slides|http://casinoqmc.net/PWT/lectures/towler_pauli.pdf]]

Mike Towler: Wed 10th February, 2010 11am, TCM Seminar Room
//Dynamical relaxation to quantum equilibrium//

''21st-century directions in de ~Broglie-Bohm theory and beyond''
//International conference that I organized at my Tuscan confererence centre (28th August-4th September 2010).//
[[Conference web page|http://www.vallico.net/tti/deBB_10/conference.html]] (with slides of all the talks).



This is the web site for Mike Towler's graduate lecture course on the foundations of quantum mechanics, specializing in pilot-wave theory (otherwise known as Bohmian mechanics or de ~Broglie-Bohm theory). The lectures are at 3pm on Wednesday afternoons beginning on January 21st 2009 in the TCM seminar room, Cavendish Laboratory. On this site you can find a concise summary of what the course is about and why you might like to come to it, the lecture programme, the lectures slides (after I give them), and links to relevant papers and websites used in preparing the course (see 'Further reading' in the sidebar). All comments, questions and complaints to Mike at 'mdt26 at cam.ac.uk'.
<html>
<center>
<img src="telescope.jpg">
</center>
</html>
Mike Towler is a Royal Society Research Fellow at Cambridge University's Cavendish Laboratory and a College Lecturer in physics at Emmanuel College, Cambridge. You can find more information from [[his homepage|https://vallico.net/mike_towler]] or from the [[quantum Monte Carlo research page|https://vallico.net/casinoqmc/]] for his ex-group in the [[Cavendish Laboratory|http://www.cam.ac.uk]]'s [[TCM Group|http://www.tcm.phy.cam.ac.uk]]. Here are further links to [[Emmanuel College|http://www.emma.cam.ac.uk]], [[Mike's entry|http://www.emma.cam.ac.uk/teaching/fellows/display/index.cfm?fellow=179]]  in the list of fellows, and his [[list of publications|https://vallico.net/mike_towler/publications.html]]. You can also look at the page for the [[Towler Institute|https://vallico.net/tti/tti.html]] - his monastery, conference venue and centre for science, mountaineering and art.

This web site is a single HTML file which embodies the [[TiddlyWiki|http://www.tiddlywiki.com]] software; in principle it also uses [[jsmath|Plugin: jsMath]] for typesetting mathematics with Latex but I've turned this off due to missing font problems when the page is viewed by others. It can be copied and edited. See the [[TiddlyWiki user page|http://www.tiddlywiki.org]] or the   [[TiddlyWiki Wikipedia page|http://en.wikipedia.org/wiki/TiddlyWiki]] for more tips, advice and useful links. A list of plugins is [[here|http://tiddlyvault.tiddlyspot.com/]]. Here is a local [[hint sheet|http://casinoqmc.net/PWT/hints.pdf]].

<html>
<center>

</center>
</html>
Topic List
[[Main Page]]
[[Course summary]]
[[Lectures and slides]]
[[Further reading]]
<html><a href="bohm_poster.pdf" style="text-decoration: none;">Poster</a></html>
/***
|Name|NestedSlidersPlugin|
|Source|http://www.TiddlyTools.com/#NestedSlidersPlugin|
|Version|2.3.2|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Slider.prototype.stop|
|Description|show content in nest-able 'slider' or 'floating' panels, without needing to create separate tiddlers for each panel|

!!!!!Configuration
<<<
Enable animation for slider panels
<<option chkFloatingSlidersAnimate>> allow sliders to animate when opening/closing
>(note: This setting is in //addition// to the general option for enabling/disabling animation effects:
><<option chkAnimate>> enable animations (entire document)
>For slider animation to occur, you must also allow animation in general.

Debugging messages for 'lazy sliders' deferred rendering:
<<option chkDebugLazySliderDefer>> show debugging alert when deferring slider rendering
<<option chkDebugLazySliderRender>> show debugging alert when deferred slider is actually rendered
<<<
!!!!!Usage
<<<
When installed, this plugin adds new wiki syntax for embedding 'slider' panels directly into tiddler content.  Use {{{+++}}} and {{{===}}} to delimit the slider content.  You can also 'nest' these sliders as deep as you like (see complex nesting example below), so that expandable 'tree-like' hierarchical displays can be created.  This is most useful when converting existing in-line text content to create in-line annotations, footnotes, context-sensitive help, or other subordinate information displays.

Additional optional syntax elements let you specify
*default to open
*cookiename
*heading level
*floater (with optional CSS width value)
*transient display (clicking elsewhere closes panel)
*custom class/label/tooltip/accesskey
*alternate label/tooltip (displayed when panel is open)
*panelID (for later use with {{{<<DOM>>}}} macro.  See [[DOMTweaksPlugin]])
*automatic blockquote style on panel
*deferred rendering of panel content
The complete syntax, using all options, is:
//{{{
++++(cookiename)!!!!!^width^*{{class{[label=key|tooltip][altlabel|alttooltip]}}}#panelID:>...
content goes here
===
//}}}
where:
* {{{+++}}} (or {{{++++}}}) and {{{===}}}<br>marks the start and end of the slider definition, respectively.  When the extra {{{+}}} is used, the slider will be open when initially displayed.
* {{{(cookiename)}}}<br>saves the slider opened/closed state, and restores this state whenever the slider is re-rendered.
* {{{!}}} through {{{!!!!!}}}<br>displays the slider label using a formatted headline (Hn) style instead of a button/link style
* {{{^width^}}} (or just {{{^}}})<br>makes the slider 'float' on top of other content rather than shifting that content downward.  'width' must be a valid CSS value (e.g., "30em", "180px", "50%", etc.).  If omitted, the default width is "auto" (i.e., fit to content)
* {{{"*"}}} //(without the quotes)//<br>denotes "transient display": when a click occurs elsewhere in the document, the slider/floating panel will be automatically closed.  This is useful for creating 'pulldown menus' that automatically go away after they are used.  //Note: using SHIFT-click on a slider label will open/close that slider without triggering the automatic closing of any transient slider panels that are currently displayed, permitting ''temporary'' display of several transient panels at once.//
* """{{class{[label=key|tooltip][altlabel|alttooltip]}}}"""<br>uses label/tooltip/accesskey.  """{{class{...}}}""", """=key""", """|tooltip""" and """[altlabel|alttooltip]""" are optional.  'class' is any valid CSS class name, used to style the slider label text.  'key' must be a ''single letter only''.  altlabel/alttooltip specifiy alternative label/tooltip for use when slider/floating panel is displayed.
* {{{#panelID:}}}<br>defines a unique DOM element ID that is assigned to the panel element used to display the slider content.  This ID can then be used later to reposition the panel using the {{{<<DOM move id>>}}} macro (see [[DOMTweaksPlugin]]), or to access/modify the panel element through use of {{{document.getElementById(...)}}}) javascript code in a plugin or inline script.
* {{{">"}}} //(without the quotes)//<br>automatically adds blockquote formatting to slider content
* {{{"..."}}} //(without the quotes)//<br>defers rendering of closed sliders until the first time they are opened.  //Note: deferred rendering may produce unexpected results in some cases.  Use with care.//

//Note: to make slider definitions easier to read and recognize when editing a tiddler, newlines immediately following the {{{+++}}} 'start slider' or preceding the {{{===}}} 'end slider' sequence are automatically supressed so that excess whitespace is eliminated from the output.//
<<<
!!!!!Examples
<<<
simple in-line slider: 
{{{
+++
   content
===
}}}
+++
   content
===
----
use a custom label and tooltip: 
{{{
+++[label|tooltip]
   content
===
}}}
+++[label|tooltip]
   content
===
----
content automatically blockquoted: 
{{{
+++>
   content
===
}}}
+++>
   content
===
----
all options combined //(default open, cookie, heading, sized floater, transient, class, label/tooltip/key, blockquoted, deferred)//
{{{
++++(testcookie)!!!^30em^*{{big{[label=Z|click or press Alt-Z to open]}}}>...
   content
===
}}}
++++(testcookie)!!!^30em^*{{big{[label=Z|click or press Alt-Z to open]}}}>...
   content
===
----
complex nesting example:
{{{
+++[get info...=I|click for information or press Alt-I]
	put some general information here,
	plus a floating panel with more specific info:
	+++^10em^[view details...|click for details]
		put some detail here, which could in turn contain a transient panel,
		perhaps with a +++^25em^*[glossary definition]explaining technical terms===
	===
===
}}}
+++[get info...=I|click for information or press Alt-I]
	put some general information here,
	plus a floating panel with more specific info:
	+++^10em^[view details...|click for details]
		put some detail here, which could in turn contain a transient panel,
		perhaps with a +++^25em^*[glossary definition]explaining technical terms===
	===
===
<<<
!!!!!Installation
<<<
import (or copy/paste) the following tiddlers into your document:
''NestedSlidersPlugin'' (tagged with <<tag systemConfig>>)
<<<
!!!!!Revision History
<<<
''2007.11.14 - 2.3.2'' in onClickNestedSlider(), prevent SHIFT-click events from opening a new, empty browser window by setting "cancelBubble=true" and calling "stopPropagation()".  Note: SHIFT-click is still processed as a normal click (i.e., it toggles the slider panel display).  Also, using SHIFT-click will prevent 'transient' sliders from being automatically closed when another slider is opened, allowing you to *temporarily* display several transient sliders at once.
''2007.07.26 - 2.3.1'' in document.onclick(), propagate return value from hijacked core click handler to consume OR bubble up click as needed.  Fixes "IE click disease", whereby nearly every mouse click causes a page transition.
|please see [[NestedSlidersPluginHistory]] for additional revision details|
''2005.11.03 - 1.0.0'' initial public release
<<<
!!!!!Credits
<<<
This feature was implemented by EricShulman from [[ELS Design Studios|http:/www.elsdesign.com]] with initial research and suggestions from RodneyGomes, GeoffSlocock, and PaulPetterson.
<<<
!!!!!Code
***/
//{{{
version.extensions.nestedSliders = {major: 2, minor: 3, revision: 2, date: new Date(2007,11,14)};
//}}}

//{{{
// options for deferred rendering of sliders that are not initially displayed
if (config.options.chkDebugLazySliderDefer==undefined) config.options.chkDebugLazySliderDefer=false;
if (config.options.chkDebugLazySliderRender==undefined) config.options.chkDebugLazySliderRender=false;
if (config.options.chkFloatingSlidersAnimate==undefined) config.options.chkFloatingSlidersAnimate=false;

// default styles for 'floating' class
setStylesheet(".floatingPanel { position:absolute; z-index:10; padding:0.5em; margin:0em; \
	background-color:#eee; color:#000; border:1px solid #000; text-align:left; }","floatingPanelStylesheet");
//}}}

//{{{
config.formatters.push( {
	name: "nestedSliders",
	match: "\\n?\\+{3}",
	terminator: "\\s*\\={3}\\n?",
	lookahead: "\\n?\\+{3}(\\+)?(\\([^\\)]*\\))?(\\!*)?(\\^(?:[^\\^\\*\\[\\>]*\\^)?)?(\\*)?(?:\\{\\{([\\w]+[\\s\\w]*)\\{)?(\\[[^\\]]*\\])?(\\[[^\\]]*\\])?(?:\\}{3})?(\\#[^:]*\\:)?(\\>)?(\\.\\.\\.)?\\s*",
	handler: function(w)
		{
			lookaheadRegExp = new RegExp(this.lookahead,"mg");
			lookaheadRegExp.lastIndex = w.matchStart;
			var lookaheadMatch = lookaheadRegExp.exec(w.source)
			if(lookaheadMatch && lookaheadMatch.index == w.matchStart)
			{
				// var defopen=lookaheadMatch[1]
				// var cookiename=lookaheadMatch[2]
				// var header=lookaheadMatch[3]
				// var panelwidth=lookaheadMatch[4]
				// var transient=lookaheadMatch[5]
				// var class=lookaheadMatch[6]
				// var label=lookaheadMatch[7]
				// var openlabel=lookaheadMatch[8]
				// var panelID=lookaheadMatch[9]
				// var blockquote=lookaheadMatch[10]
				// var deferred=lookaheadMatch[11]

				// location for rendering button and panel
				var place=w.output;

				// default to closed, no cookie, no accesskey, no alternate text/tip
				var show="none"; var cookie=""; var key="";
				var closedtext=">"; var closedtip="";
				var openedtext="<"; var openedtip="";

				// extra "+", default to open
				if (lookaheadMatch[1]) show="block";

				// cookie, use saved open/closed state
				if (lookaheadMatch[2]) {
					cookie=lookaheadMatch[2].trim().slice(1,-1);
					cookie="chkSlider"+cookie;
					if (config.options[cookie]==undefined)
						{ config.options[cookie] = (show=="block") }
					show=config.options[cookie]?"block":"none";
				}

				// parse label/tooltip/accesskey: [label=X|tooltip]
				if (lookaheadMatch[7]) {
					var parts=lookaheadMatch[7].trim().slice(1,-1).split("|");
					closedtext=parts.shift();
					if (closedtext.substr(closedtext.length-2,1)=="=")	
						{ key=closedtext.substr(closedtext.length-1,1); closedtext=closedtext.slice(0,-2); }
					openedtext=closedtext;
					if (parts.length) closedtip=openedtip=parts.join("|");
					else { closedtip="show "+closedtext; openedtip="hide "+closedtext; }
				}

				// parse alternate label/tooltip: [label|tooltip]
				if (lookaheadMatch[8]) {
					var parts=lookaheadMatch[8].trim().slice(1,-1).split("|");
					openedtext=parts.shift();
					if (parts.length) openedtip=parts.join("|");
					else openedtip="hide "+openedtext;
				}

				var title=show=='block'?openedtext:closedtext;
				var tooltip=show=='block'?openedtip:closedtip;

				// create the button
				if (lookaheadMatch[3]) { // use "Hn" header format instead of button/link
					var lvl=(lookaheadMatch[3].length>6)?6:lookaheadMatch[3].length;
					var btn = createTiddlyElement(createTiddlyElement(place,"h"+lvl,null,null,null),"a",null,lookaheadMatch[6],title);
					btn.onclick=onClickNestedSlider;
					btn.setAttribute("href","javascript:;");
					btn.setAttribute("title",tooltip);
				}
				else
					var btn = createTiddlyButton(place,title,tooltip,onClickNestedSlider,lookaheadMatch[6]);
				btn.innerHTML=title; // enables use of HTML entities in label

				// set extra button attributes
				btn.setAttribute("closedtext",closedtext);
				btn.setAttribute("closedtip",closedtip);
				btn.setAttribute("openedtext",openedtext);
				btn.setAttribute("openedtip",openedtip);
				btn.sliderCookie = cookie; // save the cookiename (if any) in the button object
				btn.defOpen=lookaheadMatch[1]!=null; // save default open/closed state (boolean)
				btn.keyparam=key; // save the access key letter ("" if none)
				if (key.length) {
					btn.setAttribute("accessKey",key); // init access key
					btn.onfocus=function(){this.setAttribute("accessKey",this.keyparam);}; // **reclaim** access key on focus
				}
				btn.onmouseover=function(event) // mouseover on button aligns floater position with button
					{ if (window.adjustSliderPos) window.adjustSliderPos(this.parentNode,this,this.sliderPanel,this.sliderPanel.className); }

				// create slider panel
				var panelClass=lookaheadMatch[4]?"floatingPanel":"sliderPanel";
				var panelID=lookaheadMatch[9]; if (panelID) panelID=panelID.slice(1,-1); // trim off delimiters
				var panel=createTiddlyElement(place,"div",panelID,panelClass,null);
				panel.button = btn; // so the slider panel know which button it belongs to
				btn.sliderPanel=panel; // so the button knows which slider panel it belongs to
				panel.defaultPanelWidth=(lookaheadMatch[4] && lookaheadMatch[4].length>2)?lookaheadMatch[4].slice(1,-1):"";
				panel.setAttribute("transient",lookaheadMatch[5]=="*"?"true":"false");
				panel.style.display = show;
				panel.style.width=panel.defaultPanelWidth;
				panel.onmouseover=function(event) // mouseover on panel aligns floater position with button
					{ if (window.adjustSliderPos) window.adjustSliderPos(this.parentNode,this.button,this,this.className); }

				// render slider (or defer until shown) 
				w.nextMatch = lookaheadMatch.index + lookaheadMatch[0].length;
				if ((show=="block")||!lookaheadMatch[11]) {
					// render now if panel is supposed to be shown or NOT deferred rendering
					w.subWikify(lookaheadMatch[10]?createTiddlyElement(panel,"blockquote"):panel,this.terminator);
					// align floater position with button
					if (window.adjustSliderPos) window.adjustSliderPos(place,btn,panel,panelClass);
				}
				else {
					var src = w.source.substr(w.nextMatch);
					var endpos=findMatchingDelimiter(src,"+++","===");
					panel.setAttribute("raw",src.substr(0,endpos));
					panel.setAttribute("blockquote",lookaheadMatch[10]?"true":"false");
					panel.setAttribute("rendered","false");
					w.nextMatch += endpos+3;
					if (w.source.substr(w.nextMatch,1)=="\n") w.nextMatch++;
					if (config.options.chkDebugLazySliderDefer) alert("deferred '"+title+"':\n\n"+panel.getAttribute("raw"));
				}
			}
		}
	}
)

// TBD: ignore 'quoted' delimiters (e.g., "{{{+++foo===}}}" isn't really a slider)
function findMatchingDelimiter(src,starttext,endtext) {
	var startpos = 0;
	var endpos = src.indexOf(endtext);
	// check for nested delimiters
	while (src.substring(startpos,endpos-1).indexOf(starttext)!=-1) {
		// count number of nested 'starts'
		var startcount=0;
		var temp = src.substring(startpos,endpos-1);
		var pos=temp.indexOf(starttext);
		while (pos!=-1)  { startcount++; pos=temp.indexOf(starttext,pos+starttext.length); }
		// set up to check for additional 'starts' after adjusting endpos
		startpos=endpos+endtext.length;
		// find endpos for corresponding number of matching 'ends'
		while (startcount && endpos!=-1) {
			endpos = src.indexOf(endtext,endpos+endtext.length);
			startcount--;
		}
	}
	return (endpos==-1)?src.length:endpos;
}
//}}}

//{{{
window.onClickNestedSlider=function(e)
{
	if (!e) var e = window.event;
	var theTarget = resolveTarget(e);
	var theLabel = theTarget.firstChild.data;
	var theSlider = theTarget.sliderPanel
	var isOpen = theSlider.style.display!="none";

	// toggle label
	theTarget.innerHTML=isOpen?theTarget.getAttribute("closedText"):theTarget.getAttribute("openedText");
	// toggle tooltip
	theTarget.setAttribute("title",isOpen?theTarget.getAttribute("closedTip"):theTarget.getAttribute("openedTip"));

	// deferred rendering (if needed)
	if (theSlider.getAttribute("rendered")=="false") {
		if (config.options.chkDebugLazySliderRender)
			alert("rendering '"+theLabel+"':\n\n"+theSlider.getAttribute("raw"));
		var place=theSlider;
		if (theSlider.getAttribute("blockquote")=="true")
			place=createTiddlyElement(place,"blockquote");
		wikify(theSlider.getAttribute("raw"),place);
		theSlider.setAttribute("rendered","true");
	}
	// show/hide the slider
	if(config.options.chkAnimate && (theSlider.className!='floatingPanel' || config.options.chkFloatingSlidersAnimate))
		anim.startAnimating(new Slider(theSlider,!isOpen,e.shiftKey || e.altKey,"none"));
	else
		theSlider.style.display = isOpen ? "none" : "block";
	// reset to default width (might have been changed via plugin code)
	theSlider.style.width=theSlider.defaultPanelWidth;
	// align floater panel position with target button
	if (!isOpen && window.adjustSliderPos) window.adjustSliderPos(theSlider.parentNode,theTarget,theSlider,theSlider.className);
	// if showing panel, set focus to first 'focus-able' element in panel
	if (theSlider.style.display!="none") {
		var ctrls=theSlider.getElementsByTagName("*");
		for (var c=0; c<ctrls.length; c++) {
			var t=ctrls[c].tagName.toLowerCase();
			if ((t=="input" && ctrls[c].type!="hidden") || t=="textarea" || t=="select")
				{ ctrls[c].focus(); break; }
		}
	}
	var cookie=theTarget.sliderCookie;
	if (cookie && cookie.length) {
		config.options[cookie]=!isOpen;
		if (config.options[cookie]!=theTarget.defOpen)
			saveOptionCookie(cookie);
		else { // remove cookie if slider is in default display state
			var ex=new Date(); ex.setTime(ex.getTime()-1000);
			document.cookie = cookie+"=novalue; path=/; expires="+ex.toGMTString();
		}
	}
	// prevent SHIFT-CLICK from being processed by browser (opens blank window... yuck!)
	// but allow plain click to bubble up to page background (to dismiss open popup, if any)
	if (e.shiftKey) { e.cancelBubble=true; if (e.stopPropagation) e.stopPropagation(); }
	return false;
}
//}}}

//{{{
// click in document background closes transient panels 
document.nestedSliders_savedOnClick=document.onclick;
document.onclick=function(ev) { if (!ev) var ev=window.event; var target=resolveTarget(ev);
	// call original click handler
	if (document.nestedSliders_savedOnClick)
		var retval=document.nestedSliders_savedOnClick.apply(this,arguments);
	// if click was inside transient panel (or something contained by a transient panel)... leave it alone
	var p=target;
	while (p)
		if ((p.className=="floatingPanel"||p.className=="sliderPanel")&&p.getAttribute("transient")=="true") break;
		else p=p.parentNode;
	if (p) return retval;
	// otherwise, find and close all transient panels...
	var all=document.all?document.all:document.getElementsByTagName("DIV");
	for (var i=0; i<all.length; i++) {
		 // if it is not a transient panel, or the click was on the button that opened this panel, don't close it.
		if (all[i].getAttribute("transient")!="true" || all[i].button==target) continue;
		// otherwise, if the panel is currently visible, close it by clicking it's button
		if (all[i].style.display!="none") window.onClickNestedSlider({target:all[i].button}) 
	}
	return retval;
};
//}}}

//{{{
// adjust floating panel position based on button position
if (window.adjustSliderPos==undefined) window.adjustSliderPos=function(place,btn,panel,panelClass) {
	if (panelClass=="floatingPanel") {
		var left=0;
		var top=btn.offsetHeight; 
		if (place.style.position!="relative") {
			var left=findPosX(btn);
			var top=findPosY(btn)+btn.offsetHeight;
			var p=place; while (p && p.className!='floatingPanel') p=p.parentNode;
			if (p) { left-=findPosX(p); top-=findPosY(p); }
		}
		if (findPosX(btn)+panel.offsetWidth > getWindowWidth())  // adjust position to stay inside right window edge
			left-=findPosX(btn)+panel.offsetWidth-getWindowWidth()+15; // add extra 15px 'fudge factor'
		panel.style.left=left+"px"; panel.style.top=top+"px";
	}
}

function getWindowWidth() {
	if(document.width!=undefined)
		return document.width; // moz (FF)
	if(document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) )
		return document.documentElement.clientWidth; // IE6
	if(document.body && ( document.body.clientWidth || document.body.clientHeight ) )
		return document.body.clientWidth; // IE4
	if(window.innerWidth!=undefined)
		return window.innerWidth; // IE - general
	return 0; // unknown
}
//}}}

//{{{
// TW2.1 and earlier:
// hijack Slider animation handler 'stop' handler so overflow is visible after animation has completed
Slider.prototype.coreStop = Slider.prototype.stop;
Slider.prototype.stop = function()
	{ this.coreStop.apply(this,arguments); this.element.style.overflow = "visible"; }

// TW2.2+
// hijack Morpher animation handler 'stop' handler so overflow is visible after animation has completed
if (version.major+.1*version.minor+.01*version.revision>=2.2) {
	Morpher.prototype.coreStop = Morpher.prototype.stop;
	Morpher.prototype.stop = function()
		{ this.coreStop.apply(this,arguments); this.element.style.overflow = "visible"; }
}
//}}}
/***
|Name|NestedSlidersPluginHistory|
|Source|http://www.TiddlyTools.com/#NestedSlidersPluginHistory|
|Version|2.3.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|history|
|Requires||
|Overrides||
|Description|Archived Revision History for NestedSlidersPlugin|

!!!!!Archived Revision History for NestedSlidersPlugin
<<<
| Please see [[NestedSlidersPlugin]] for more recent revision details |
''2007.07.20 - 2.3.0'' added syntax for setting panel ID (#panelID:).  This allows individual slider panels to be repositioned within tiddler content simply by giving them a unique ID and then moving them to the desired location using the {{{<<DOM move id>>}}} macro.
''2007.07.19 - 2.2.0'' added syntax for alttext and alttip (button label and tooltip to be displayed when panel is open)
''2007.07.14 - 2.1.2'' corrected use of 'transient' attribute in IE to prevent (non-recursive) infinite loop
''2007.07.12 - 2.1.0'' replaced use of "*" for 'open/close on rollover' (which didn't work too well).  "*" now indicates 'transient' panels that are automatically closed if a click occurs somewhere else in the document.  This permits use of nested sliders to create nested "pulldown menus" that automatically disappear after interaction with them has been completed.  Also, in onClickNestedSlider(), use "theTarget.sliderCookie", instead of "this.sliderCookie" to correct cookie state tracking when automatically dismissing transient panels.
''2007.06.10 - 2.0.5'' add check to ensure that window.adjustSliderPanel() is defined before calling it (prevents error on shutdown when mouse event handlers are still defined)
''2007.05.31 - 2.0.4'' add handling to invoke adjustSliderPanel() for onmouseover events on slider button and panel.  This allows the panel position to be re-synced when the button position shifts due to changes in unrelated content above it on the page.  (thanks to Harsha for bug report)
''2007.03.30 - 2.0.3'' added chkFloatingSlidersAnimate (default to FALSE), so that slider animation can be disabled independent of the overall document animation setting (avoids strange rendering and focus problems in floating panels)
''2007.03.01 - 2.0.2'' for TW2.2+, hijack Morpher.prototype.stop so that "overflow:hidden" can be reset to "overflow:visible" after animation ends
''2007.03.01 - 2.0.1'' in hijack for Slider.prototype.stop, use apply() to pass params to core function
''2006.07.28 - 2.0.0'' added custom class syntax around label/tip/key syntax: {{{{{classname{[label=key|tip]}}}}}}
''2006.07.25 - 1.9.3'' when parsing slider, save default open/closed state in button element, then in onClickNestedSlider(), if slider state matches saved default, instead of saving cookie, delete it.  Significantly reduces the 'cookie overhead' when default slider states are used.
''2006.06.29 - 1.9.2'' in onClickNestedSlider(), when setting focus to first control, skip over type="hidden"
''2006.06.22 - 1.9.1'' added panel.defaultPanelWidth to save requested panel width, even after resizing has changed the style value
''2006.05.11 - 1.9.0'' added optional '^width^' syntax for floating sliders and '=key' syntax for setting an access key on a slider label
''2006.05.09 - 1.8.0'' in onClickNestedSlider(), when showing panel, set focus to first child input/textarea/select element
''2006.04.24 - 1.7.8'' in adjustSliderPos(), if floating panel is contained inside another floating panel, subtract offset of containing panel to find correct position
''2006.02.16 - 1.7.7'' corrected deferred rendering to account for use-case where show/hide state is tracked in a cookie
''2006.02.15 - 1.7.6'' in adjustSliderPos(), ensure that floating panel is positioned completely within the browser window (i.e., does not go beyond the right edge of the browser window)
''2006.02.04 - 1.7.5'' add 'var' to unintended global variable declarations to avoid FireFox 1.5.0.1 crash bug when assigning to globals
''2006.01.18 - 1.7.4'' only define adjustSliderPos() function if it has not already been provided by another plugin.  This lets other plugins 'hijack' the function even when they are loaded first.
''2006.01.16 - 1.7.3'' added adjustSliderPos(place,btn,panel,panelClass) function to permit specialized logic for placement of floating panels.  While it provides improved placement for many uses of floating panels, it exhibits a relative offset positioning error when used within *nested* floating panels.  Short-term workaround is to only adjust the position for 'top-level' floaters.
''2006.01.16 - 1.7.2'' added button property to slider panel elements so that slider panel can tell which button it belongs to.  Also, re-activated and corrected animation handling so that nested sliders aren't clipped by hijacking Slider.prototype.stop so that "overflow:hidden" can be reset to "overflow:visible" after animation ends
''2006.01.14 - 1.7.1'' added optional "^" syntax for floating panels.  Defines new CSS class, ".floatingPanel", as an alternative for standard in-line ".sliderPanel" styles.
''2006.01.14 - 1.7.0'' added optional "*" syntax for rollover handling to show/hide slider without requiring a click (Based on a suggestion by tw4efl)
''2006.01.03 - 1.6.2'' When using optional "!" heading style, instead of creating a clickable "Hn" element, create an "A" element inside the "Hn" element.  (allows click-through in SlideShowPlugin, which captures nearly all click events, except for hyperlinks)
''2005.12.15 - 1.6.1'' added optional "..." syntax to invoke deferred ('lazy') rendering for initially hidden sliders
removed checkbox option for 'global' application of lazy sliders
''2005.11.25 - 1.6.0'' added optional handling for 'lazy sliders' (deferred rendering for initially hidden sliders)
''2005.11.21 - 1.5.1'' revised regular expressions: if present, a single newline //preceding// and/or //following// a slider definition will be suppressed so start/end syntax can be place on separate lines in the tiddler 'source' for improved readability.  Similarly, any whitespace (newlines, tabs, spaces, etc.) trailing the 'start slider' syntax or preceding the 'end slider' syntax is also suppressed.
''2005.11.20 - 1.5.0'' added (cookiename) syntax for optional tracking and restoring of slider open/close state
''2005.11.11 - 1.4.0'' added !!!!! syntax to render slider label as a header (Hn) style instead of a button/link style
''2005.11.07 - 1.3.0'' removed alternative syntax {{{(((}}} and {{{)))}}} (so they can be used by other formatting extensions) and simplified/improved regular expressions to trim multiple excess newlines
''2005.11.05 - 1.2.1'' changed name to NestedSlidersPlugin
''2005.11.04 - 1.2.0'' added alternative character-mode syntax {{{(((}}} and {{{)))}}}
tweaked "eat newlines" logic for line-mode {{{+++}}} and {{{===}}} syntax
''2005.11.03 - 1.1.1'' fixed toggling of default tooltips ("more..." and "less...") when a non-default button label is used.  code cleanup, added documentation
''2005.11.03 - 1.1.0'' changed delimiter syntax from {{{(((}}} and {{{)))}}} to {{{+++}}} and {{{===}}}.  changed name to EasySlidersPlugin
''2005.11.03 - 1.0.0'' initial public release
<<<
/***
|<html><a name="Top"/></html>''Name:''|PartTiddlerPlugin|
|''Version:''|1.0.9 (2007-07-14)|
|''Source:''|http://tiddlywiki.abego-software.de/#PartTiddlerPlugin|
|''Author:''|UdoBorkowski (ub [at] abego-software [dot] de)|
|''Licence:''|[[BSD open source license]]|
|''CoreVersion:''|2.1.3|
|''Browser:''|Firefox 1.0.4+; InternetExplorer 6.0|
!Table of Content<html><a name="TOC"/></html>
* <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Description',null, event)">Description, Syntax</a></html>
* <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Applications',null, event)">Applications</a></html>
** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('LongTiddler',null, event)">Refering to Paragraphs of a Longer Tiddler</a></html>
** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Citation',null, event)">Citation Index</a></html>
** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('TableCells',null, event)">Creating "multi-line" Table Cells</a></html>
** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Tabs',null, event)">Creating Tabs</a></html>
** <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Sliders',null, event)">Using Sliders</a></html>
* <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Revisions',null, event)">Revision History</a></html>
* <html><a href="javascript:;" onclick="window.scrollAnchorVisible('Code',null, event)">Code</a></html>
!Description<html><a name="Description"/></html>
With the {{{<part aPartName> ... </part>}}} feature you can structure your tiddler text into separate (named) parts. 
Each part can be referenced as a "normal" tiddler, using the "//tiddlerName//''/''//partName//" syntax (e.g. "About/Features").  E.g. you may create links to the parts (e.g. {{{[[Quotes/BAX95]]}}} or {{{[[Hobbies|AboutMe/Hobbies]]}}}), use it in {{{<<tiddler...>>}}} or {{{<<tabs...>>}}} macros etc.


''Syntax:'' 
|>|''<part'' //partName// [''hidden''] ''>'' //any tiddler content// ''</part>''|
|//partName//|The name of the part. You may reference a part tiddler with the combined tiddler name "//nameOfContainerTidder//''/''//partName//. <<br>>If you use a partName containing spaces you need to quote it (e.g. {{{"Major Overview"}}} or {{{[[Shortcut List]]}}}).|
|''hidden''|When defined the content of the part is not displayed in the container tiddler. But when the part is explicitly referenced (e.g. in a {{{<<tiddler...>>}}} macro or in a link) the part's content is displayed.|
|<html><i>any&nbsp;tiddler&nbsp;content</i></html>|<html>The content of the part.<br>A part can have any content that a "normal" tiddler may have, e.g. you may use all the formattings and macros defined.</html>|
|>|~~Syntax formatting: Keywords in ''bold'', optional parts in [...]. 'or' means that exactly one of the two alternatives must exist.~~|
<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>

!Applications<html><a name="Applications"/></html>
!!Refering to Paragraphs of a Longer Tiddler<html><a name="LongTiddler"/></html>
Assume you have written a long description in a tiddler and now you want to refer to the content of a certain paragraph in that tiddler (e.g. some definition.) Just wrap the text with a ''part'' block, give it a nice name, create a "pretty link" (like {{{[[Discussion Groups|Introduction/DiscussionGroups]]}}}) and you are done.

Notice this complements the approach to first writing a lot of small tiddlers and combine these tiddlers to one larger tiddler in a second step (e.g. using the {{{<<tiddler...>>}}} macro). Using the ''part'' feature you can first write a "classic" (longer) text that can be read "from top to bottom" and later "reuse" parts of this text for some more "non-linear" reading.

<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>

!!Citation Index<html><a name="Citation"/></html>
Create a tiddler "Citations" that contains your "citations". 
Wrap every citation with a part and a proper name. 

''Example''
{{{
<part BAX98>Baxter, Ira D. et al: //Clone Detection Using Abstract Syntax Trees.// 
in //Proc. ICSM//, 1998.</part>

<part BEL02>Bellon, Stefan: //Vergleich von Techniken zur Erkennung duplizierten Quellcodes.// 
Thesis, Uni Stuttgart, 2002.</part>

<part DUC99>Ducasse, Stéfane et al: //A Language Independent Approach for Detecting Duplicated Code.// 
in //Proc. ICSM//, 1999.</part>
}}}

You may now "cite" them just by using a pretty link like {{{[[Citations/BAX98]]}}} or even more pretty, like this {{{[[BAX98|Citations/BAX98]]}}}.

<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>

!!Creating "multi-line" Table Cells<html><a name="TableCells"/></html>
You may have noticed that it is hard to create table cells with "multi-line" content. E.g. if you want to create a bullet list inside a table cell you cannot just write the bullet list
{{{
* Item 1
* Item 2
* Item 3
}}}
into a table cell (i.e. between the | ... | bars) because every bullet item must start in a new line but all cells of a table row must be in one line.

Using the ''part'' feature this problem can be solved. Just create a hidden part that contains the cells content and use a {{{<<tiddler >>}}} macro to include its content in the table's cell.

''Example''
{{{
|!Subject|!Items|
|subject1|<<tiddler ./Cell1>>|
|subject2|<<tiddler ./Cell2>>|

<part Cell1 hidden>
* Item 1
* Item 2
* Item 3
</part>
...
}}}

Notice that inside the {{{<<tiddler ...>>}}} macro you may refer to the "current tiddler" using the ".".

BTW: The same approach can be used to create bullet lists with items that contain more than one line.

<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>

!!Creating Tabs<html><a name="Tabs"/></html>
The build-in {{{<<tabs ...>>}}} macro requires that you defined an additional tiddler for every tab it displays. When you want to have "nested" tabs you need to define a tiddler for the "main tab" and one for every tab it contains. I.e. the definition of a set of tabs that is visually displayed at one place is distributed across multiple tiddlers.

With the ''part'' feature you can put the complete definition in one tiddler, making it easier to keep an overview and maintain the tab sets.

''Example''
The standard tabs at the sidebar are defined by the following eight tiddlers:
* SideBarTabs
* TabAll
* TabMore
* TabMoreMissing
* TabMoreOrphans
* TabMoreShadowed
* TabTags
* TabTimeline

Instead of these eight tiddlers one could define the following SideBarTabs tiddler that uses the ''part'' feature:
{{{
<<tabs txtMainTab 
    Timeline Timeline SideBarTabs/Timeline 
    All 'All tiddlers' SideBarTabs/All 
    Tags 'All tags' SideBarTabs/Tags 
    More 'More lists' SideBarTabs/More>>
<part Timeline hidden><<timeline>></part>
<part All hidden><<list all>></part>
<part Tags hidden><<allTags>></part>
<part More hidden><<tabs txtMoreTab 
    Missing 'Missing tiddlers' SideBarTabs/Missing 
    Orphans 'Orphaned tiddlers' SideBarTabs/Orphans 
    Shadowed 'Shadowed tiddlers' SideBarTabs/Shadowed>></part>
<part Missing hidden><<list missing>></part>
<part Orphans hidden><<list orphans>></part>
<part Shadowed hidden><<list shadowed>></part>
}}}

Notice that you can easily "overwrite" individual parts in separate tiddlers that have the full name of the part.

E.g. if you don't like the classic timeline tab but only want to see the 100 most recent tiddlers you could create a tiddler "~SideBarTabs/Timeline" with the following content:
{{{
<<forEachTiddler 
		sortBy 'tiddler.modified' descending 
		write '(index < 100) ? "* [["+tiddler.title+"]]\n":""'>>
}}}
<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>

!!Using Sliders<html><a name="Sliders"/></html>
Very similar to the build-in {{{<<tabs ...>>}}} macro (see above) the {{{<<slider ...>>}}} macro requires that you defined an additional tiddler that holds the content "to be slid". You can avoid creating this extra tiddler by using the ''part'' feature

''Example''
In a tiddler "About" we may use the slider to show some details that are documented in the tiddler's "Details" part.
{{{
...
<<slider chkAboutDetails About/Details details "Click here to see more details">>
<part Details hidden>
To give you a better overview ...
</part>
...
}}}

Notice that putting the content of the slider into the slider's tiddler also has an extra benefit: When you decide you need to edit the content of the slider you can just doubleclick the content, the tiddler opens for editing and you can directly start editing the content (in the part section). In the "old" approach you would doubleclick the tiddler, see that the slider is using tiddler X, have to look for the tiddler X and can finally open it for editing. So using the ''part'' approach results in a much short workflow.

<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>

!Revision history<html><a name="Revisions"/></html>
* v1.0.9 (2007-07-14)
** Bugfix: Error when using the SideBarTabs example and switching between "More" and "Shadow". Thanks to cmari for reporting the issue.
* v1.0.8 (2007-06-16)
** Speeding up display of tiddlers containing multiple pard definitions. Thanks to Paco Rivière for reporting the issue.
** Support "./partName" syntax inside <<tabs ...>> macro
* v1.0.7 (2007-03-07)
** Bugfix: <<tiddler "./partName">> does not always render correctly after a refresh (e.g. like it happens when using the "Include" plugin). Thanks to Morris Gray for reporting the bug.
* v1.0.6 (2006-11-07)
** Bugfix: cannot edit tiddler when UploadPlugin by Bidix is installed. Thanks to José Luis González Castro for reporting the bug.
* v1.0.5 (2006-03-02)
** Bugfix: Example with multi-line table cells does not work in IE6. Thanks to Paulo Soares for reporting the bug.
* v1.0.4 (2006-02-28)
** Bugfix: Shadow tiddlers cannot be edited (in TW 2.0.6). Thanks to Torsten Vanek for reporting the bug.
* v1.0.3 (2006-02-26)
** Adapt code to newly introduced Tiddler.prototype.isReadOnly() function (in TW 2.0.6). Thanks to Paulo Soares for reporting the problem.
* v1.0.2 (2006-02-05)
** Also allow other macros than the "tiddler" macro use the "." in the part reference (to refer to "this" tiddler)
* v1.0.1 (2006-01-27)
** Added Table of Content for plugin documentation. Thanks to RichCarrillo for suggesting.
** Bugfix: newReminder plugin does not work when PartTiddler is installed. Thanks to PauloSoares for reporting.
* v1.0.0 (2006-01-25)
** initial version
<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>

!Code<html><a name="Code"/></html>
<html><sub><a href="javascript:;" onclick="window.scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>
***/
//{{{
//============================================================================
//                           PartTiddlerPlugin

// Ensure that the PartTiddler Plugin is only installed once.
//
if (!version.extensions.PartTiddlerPlugin) {



version.extensions.PartTiddlerPlugin = {
    major: 1, minor: 0, revision: 9,
    date: new Date(2007, 6, 14), 
    type: 'plugin',
    source: "http://tiddlywiki.abego-software.de/#PartTiddlerPlugin"
};

if (!window.abego) window.abego = {};
if (version.major < 2) alertAndThrow("PartTiddlerPlugin requires TiddlyWiki 2.0 or newer.");

//============================================================================
// Common Helpers

// Looks for the next newline, starting at the index-th char of text. 
//
// If there are only whitespaces between index and the newline 
// the index behind the newline is returned, 
// otherwise (or when no newline is found) index is returned.
//
var skipEmptyEndOfLine = function(text, index) {
	var re = /(\n|[^\s])/g;
	re.lastIndex = index;
	var result = re.exec(text);
	return (result && text.charAt(result.index) == '\n') 
			? result.index+1
			: index;
}


//============================================================================
// Constants

var partEndOrStartTagRE = /(<\/part>)|(<part(?:\s+)((?:[^>])+)>)/mg;
var partEndTagREString = "<\\/part>";
var partEndTagString = "</part>";

//============================================================================
// Plugin Specific Helpers

// Parse the parameters inside a <part ...> tag and return the result.
//
// @return [may be null] {partName: ..., isHidden: ...}
//
var parseStartTagParams = function(paramText) {
	var params = paramText.readMacroParams();
	if (params.length == 0 || params[0].length == 0) return null;
	
	var name = params[0];
	var paramsIndex = 1;
	var hidden = false;
	if (paramsIndex < params.length) {
		hidden = params[paramsIndex] == "hidden";
		paramsIndex++;
	}
	
	return {
		partName: name, 
		isHidden: hidden
	};
}

// Returns the match to the next (end or start) part tag in the text, 
// starting the search at startIndex.
// 
// When no such tag is found null is returned, otherwise a "Match" is returned:
// [0]: full match
// [1]: matched "end" tag (or null when no end tag match)
// [2]: matched "start" tag (or null when no start tag match)
// [3]: content of start tag (or null if no start tag match)
//
var findNextPartEndOrStartTagMatch = function(text, startIndex) {
	var re = new RegExp(partEndOrStartTagRE);
	re.lastIndex = startIndex;
	var match = re.exec(text);
	return match;
}

//============================================================================
// Formatter

// Process the <part ...> ... </part> starting at (w.source, w.matchStart) for formatting.
//
// @return true if a complete part section (including the end tag) could be processed, false otherwise.
//
var handlePartSection = function(w) {
	var tagMatch = findNextPartEndOrStartTagMatch(w.source, w.matchStart);
	if (!tagMatch) return false;
	if (tagMatch.index != w.matchStart || !tagMatch[2]) return false;

	// Parse the start tag parameters
	var arguments = parseStartTagParams(tagMatch[3]);
	if (!arguments) return false;
	
	// Continue processing
	var startTagEndIndex = skipEmptyEndOfLine(w.source, tagMatch.index + tagMatch[0].length);
	var endMatch = findNextPartEndOrStartTagMatch(w.source, startTagEndIndex);
	if (endMatch && endMatch[1]) {
		if (!arguments.isHidden) {
			w.nextMatch = startTagEndIndex;
			w.subWikify(w.output,partEndTagREString);
		}
		w.nextMatch = skipEmptyEndOfLine(w.source, endMatch.index + endMatch[0].length);
		
		return true;
	}
	return false;
}

config.formatters.push( {
    name: "part",
    match: "<part\\s+[^>]+>",
	
	handler: function(w) {
		if (!handlePartSection(w)) {
			w.outputText(w.output,w.matchStart,w.matchStart+w.matchLength);
		}
	}
} )

//============================================================================
// Extend "fetchTiddler" functionality to also recognize "part"s of tiddlers 
// as tiddlers.

var currentParent = null; // used for the "." parent (e.g. in the "tiddler" macro)

// Return the match to the first <part ...> tag of the text that has the
// requrest partName.
//
// @return [may be null]
//
var findPartStartTagByName = function(text, partName) {
	var i = 0;
	
	while (true) {
		var tagMatch = findNextPartEndOrStartTagMatch(text, i);
		if (!tagMatch) return null;

		if (tagMatch[2]) {
			// Is start tag
	
			// Check the name
			var arguments = parseStartTagParams(tagMatch[3]);
			if (arguments && arguments.partName == partName) {
				return tagMatch;
			}
		}
		i = tagMatch.index+tagMatch[0].length;
	}
}

// Return the part "partName" of the given parentTiddler as a "readOnly" Tiddler 
// object, using fullName as the Tiddler's title. 
//
// All remaining properties of the new Tiddler (tags etc.) are inherited from 
// the parentTiddler.
// 
// @return [may be null]
//
var getPart = function(parentTiddler, partName, fullName) {
	var text = parentTiddler.text;
	var startTag = findPartStartTagByName(text, partName);
	if (!startTag) return null;
	
	var endIndexOfStartTag = skipEmptyEndOfLine(text, startTag.index+startTag[0].length);
	var indexOfEndTag = text.indexOf(partEndTagString, endIndexOfStartTag);

	if (indexOfEndTag >= 0) {
		var partTiddlerText = text.substring(endIndexOfStartTag,indexOfEndTag);
		var partTiddler = new Tiddler();
		partTiddler.set(
						fullName,
						partTiddlerText,
						parentTiddler.modifier,
						parentTiddler.modified,
						parentTiddler.tags,
						parentTiddler.created);
		partTiddler.abegoIsPartTiddler = true;
		return partTiddler;
	}
	
	return null;
}

// Hijack the store.fetchTiddler to recognize the "part" addresses.
//
var hijackFetchTiddler = function() {
	var oldFetchTiddler = store.fetchTiddler ;
	store.fetchTiddler = function(title) {
		var result = oldFetchTiddler.apply(this, arguments);
		if (!result && title) {
			var i = title.lastIndexOf('/');
			if (i > 0) {
				var parentName = title.substring(0, i);
				var partName = title.substring(i+1);
				var parent = (parentName == ".") 
						? store.resolveTiddler(currentParent)
						: oldFetchTiddler.apply(this, [parentName]);
				if (parent) {
					return getPart(parent, partName, parent.title+"/"+partName);
				}
			}
		}
		return result;	
	};
};

// for debugging the plugin is not loaded through the systemConfig mechanism but via a script tag. 
// At that point in the "store" is not yet defined. In that case hijackFetchTiddler through the restart function.
// Otherwise hijack now.
if (!store) {
	var oldRestartFunc = restart;
	window.restart = function() {
		hijackFetchTiddler();
		oldRestartFunc.apply(this,arguments);
	};
} else
	hijackFetchTiddler();




// The user must not edit a readOnly/partTiddler
//

config.commands.editTiddler.oldIsReadOnlyFunction = Tiddler.prototype.isReadOnly;

Tiddler.prototype.isReadOnly = function() {
	// Tiddler.isReadOnly was introduced with TW 2.0.6.
	// For older version we explicitly check the global readOnly flag
	if (config.commands.editTiddler.oldIsReadOnlyFunction) {
		if (config.commands.editTiddler.oldIsReadOnlyFunction.apply(this, arguments)) return true;
	} else {
		if (readOnly) return true;
	}

	return this.abegoIsPartTiddler;
}

config.commands.editTiddler.handler = function(event,src,title)
{
	var t = store.getTiddler(title);
	// Edit the tiddler if it either is not a tiddler (but a shadowTiddler)
	// or the tiddler is not readOnly
	if(!t || !t.abegoIsPartTiddler)
		{
		clearMessage();
		story.displayTiddler(null,title,DEFAULT_EDIT_TEMPLATE);
		story.focusTiddler(title,"text");
		return false;
		}
}

// To allow the "./partName" syntax in macros we need to hijack 
// the invokeMacro to define the "currentParent" while it is running.
// 
var oldInvokeMacro = window.invokeMacro;
function myInvokeMacro(place,macro,params,wikifier,tiddler) {
	var oldCurrentParent = currentParent;
	if (tiddler) currentParent = tiddler;
	try {
		oldInvokeMacro.apply(this, arguments);
	} finally {
		currentParent = oldCurrentParent;
	}
}
window.invokeMacro = myInvokeMacro;

// To correctly support the "./partName" syntax while refreshing we need to hijack 
// the config.refreshers.tiddlers to define the "currentParent" while it is running.
// 
(function() {
	var oldTiddlerRefresher= config.refreshers.tiddler;
	config.refreshers.tiddler = function(e,changeList) {
		var oldCurrentParent = currentParent;
		try {
			currentParent = e.getAttribute("tiddler");
			return oldTiddlerRefresher.apply(this,arguments);
		} finally {
			currentParent = oldCurrentParent;
		}
	};
})();

// Support "./partName" syntax inside <<tabs ...>> macro
(function() {
	var extendRelativeNames = function(e, title) {
		var nodes = e.getElementsByTagName("a");
		for(var i=0; i<nodes.length; i++) {
			var node = nodes[i];
			var s = node.getAttribute("content");
			if (s && s.indexOf("./") == 0)
				node.setAttribute("content",title+s.substr(1));
		}
	};
	var oldHandler = config.macros.tabs.handler;
	config.macros.tabs.handler = function(place,macroName,params,wikifier,paramString,tiddler) {
		var result = oldHandler.apply(this,arguments);
		if (tiddler)
			extendRelativeNames(place, tiddler.title);
		return result;
	};
})();

// Scroll the anchor anchorName in the viewer of the given tiddler visible.
// When no tiddler is defined use the tiddler of the target given event is used.
window.scrollAnchorVisible = function(anchorName, tiddler, evt) {
	var tiddlerElem = null;
	if (tiddler) {
		tiddlerElem = document.getElementById(story.idPrefix + tiddler);
	}
	if (!tiddlerElem && evt) {
		var target = resolveTarget(evt);
		tiddlerElem = story.findContainingTiddler(target);
	}
	if (!tiddlerElem) return;

	var children = tiddlerElem.getElementsByTagName("a");
	for (var i = 0; i < children.length; i++) {
		var child = children[i];
		var name = child.getAttribute("name");
		if (name == anchorName) {
			var y = findPosY(child);
			window.scrollTo(0,y);
			return;
		}
	}
}

} // of "install only once"
//}}}

/***
<html><sub><a href="javascript:;" onclick="scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>

!Licence and Copyright
Copyright (c) abego Software ~GmbH, 2006 ([[www.abego-software.de|http://www.abego-software.de]])

Redistribution and use in source and binary forms, with or without modification,
are permitted provided that the following conditions are met:

Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.

Redistributions in binary form must reproduce the above copyright notice, this
list of conditions and the following disclaimer in the documentation and/or other
materials provided with the distribution.

Neither the name of abego Software nor the names of its contributors may be
used to endorse or promote products derived from this software without specific
prior written permission.

THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT
SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
DAMAGE.

<html><sub><a href="javascript:;" onclick="scrollAnchorVisible('Top',null, event)">[Top]</sub></a></html>
***/
/***
|Name|Plugin: Scientific Notation|
|Created by|BobMcElrath|
|Email|my first name at my last name dot org|
|Location|http://bob.mcelrath.org/tiddlyjsmath-2.0.3.html|
|Version|1.0|
|Requires|[[TiddlyWiki|http://www.tiddlywiki.com]] &ge; 2.0.3, [[jsMath|http://www.math.union.edu/~dpvc/jsMath/]] &ge; 3.0, [[Plugin: jsMath]]|
!Description
This plugin will render numbers expressed in scientific notation, such as {{{3.5483e12}}} using the jsMath plugin to display it in an intuitive way such as 3.5483e12.  You may customize the number of significant figures displayed, as well as "normalize" numbers so that {{{47392.387e9}}} is displayed as 47392.387e9.
!Installation
Install the Requirements, above, add this tiddler to your tiddlywiki, and give it the {{{systemConfig}}} tag.
!History
* 1-Feb-06, version 1.0, Initial release
!Code
***/
//{{{
config.formatters.push({
  name: "scientificNotation",
  match: "\\b[0-9]+\\.[0-9]+[eE][+-]?[0-9]+\\b",
  element: "span",
  className: "math",
  normalize: true,                          // set to 'true' to convert numbers to X.XXX \times 10^{y}
  sigfigs: 3,                               // with this many digits in the mantissa
  handler: function(w) {
    var snRegExp = new RegExp("\\b([0-9]+(?:\\.[0-9]+)?)[eE]([-0-9+]+)\\b");
    var mymatch = snRegExp.exec(w.matchText);
    var mantissa = mymatch[1];
    var exponent = parseInt(mymatch[2]);
    // normalize the number.
    if(this.normalize) {
      mantissa = parseFloat(mantissa);
      while(mantissa > 10.0) {
        mantissa = mantissa / 10.0;
        exponent++; 
      }
      while(mantissa < 1.0) {
        mantissa = mantissa * 10.0;
        exponent--;
      }
      var sigfigsleft = this.sigfigs;
      mantissa = parseInt(mantissa) + "." + (Math.round(Math.pow(10,this.sigfigs-1)*mantissa)+"").substr(1,this.sigfigs-1);
    }
    var e = document.createElement(this.element);
    e.className = this.className;
    if(exponent == 0) {
      e.appendChild(document.createTextNode(mantissa));
    } else {
      e.appendChild(document.createTextNode(mantissa + "\\times 10^{" + exponent + "}"));
    }
    w.output.appendChild(e);
  }
});
//}}}
/***
|Name|Plugin: arXiv Links|
|Created by|BobMcElrath|
|Email|my first name at my last name dot org|
|Location|http://bob.mcelrath.org/tiddlyjsmath-2.0.3.html|
|Version|1.0|
|Requires|[[TiddlyWiki|http://www.tiddlywiki.com]] &ge; 2.0.3|
!Description
This formatting plugin will render links to the [[arXiv|http://www.arxiv.org]] preprint system.  If you type a paper reference such as hep-ph/0509024, it will be rendered as an external link to the abstract of that paper.
!Installation
Add this tiddler to your tiddlywiki, and give it the {{{systemConfig}}} tag.
!History
* 1-Feb-06, version 1.0, Initial release
!Code
***/
//{{{
config.formatters.push({
  name: "arXivLinks",
  match: "\\b(?:astro-ph|cond-mat|hep-ph|hep-th|hep-lat|gr-qc|nucl-ex|nucl-th|quant-ph|(?:cs|math|nlin|physics|q-bio)(?:\\.[A-Z]{2})?)/[0-9]{7}\\b",
  element: "a",
  handler: function(w) {
    var e = createExternalLink(w.output, "http://arxiv.org/abs/"+w.matchText);
    e.target = "_blank"; // open in new window
    w.outputText(e,w.matchStart,w.nextMatch);
  }
});
//}}}
/***
|Name|Plugin: jsMath|
|Created by|BobMcElrath|
|Email|my first name at my last name dot org|
|Location|http://bob.mcelrath.org/tiddlyjsmath.html|
|Version|1.5.1|
|Requires|[[TiddlyWiki|http://www.tiddlywiki.com]] &ge; 2.0.3, [[jsMath|http://www.math.union.edu/~dpvc/jsMath/]] &ge; 3.0|
!Description
LaTeX is the world standard for specifying, typesetting, and communicating mathematics among scientists, engineers, and mathematicians.  For more information about LaTeX itself, visit the [[LaTeX Project|http://www.latex-project.org/]].  This plugin typesets math using [[jsMath|http://www.math.union.edu/~dpvc/jsMath/]], which is an implementation of the TeX math rules and typesetting in javascript, for your browser.  Notice the small button in the lower right corner which opens its control panel.
!Installation
In addition to this plugin, you must also [[install jsMath|http://www.math.union.edu/~dpvc/jsMath/download/jsMath.html]] on the same server as your TiddlyWiki html file.  If you're using TiddlyWiki without a web server, then the jsMath directory must be placed in the same location as the TiddlyWiki html file.

I also recommend modifying your StyleSheet use serif fonts that are slightly larger than normal, so that the math matches surrounding text, and \\small fonts are not unreadable (as in exponents and subscripts).
{{{
.viewer {
  line-height: 125%;
  font-family: serif;
  font-size: 12pt;
}
}}}

If you had used a previous version of [[Plugin: jsMath]], it is no longer necessary to edit the main tiddlywiki.html file to add the jsMath <script> tag.  [[Plugin: jsMath]] now uses ajax to load jsMath.
!History
* 11-Nov-05, version 1.0, Initial release
* 22-Jan-06, version 1.1, updated for ~TW2.0, tested with jsMath 3.1, editing tiddlywiki.html by hand is no longer necessary.
* 24-Jan-06, version 1.2, fixes for Safari, Konqueror
* 27-Jan-06, version 1.3, improved error handling, detect if ajax was already defined (used by ZiddlyWiki)
* 12-Jul-06, version 1.4, fixed problem with not finding image fonts
* 26-Feb-07, version 1.5, fixed problem with Mozilla "unterminated character class".
* 27-Feb-07, version 1.5.1, Runs compatibly with TW 2.1.0+, by Bram Chen
!Examples
|!Source|!Output|h
|{{{The variable $x$ is real.}}}|The variable $x$ is real.|
|{{{The variable \(y\) is complex.}}}|The variable \(y\) is complex.|
|{{{This \[\int_a^b x = \frac{1}{2}(b^2-a^2)\] is an easy integral.}}}|This \[\int_a^b x = \frac{1}{2}(b^2-a^2)\] is an easy integral.|
|{{{This $$\int_a^b \sin x = -(\cos b - \cos a)$$ is another easy integral.}}}|This $$\int_a^b \sin x = -(\cos b - \cos a)$$ is another easy integral.|
|{{{Block formatted equations may also use the 'equation' environment \begin{equation}  \int \tan x = -\ln \cos x \end{equation} }}}|Block formatted equations may also use the 'equation' environment \begin{equation}  \int \tan x = -\ln \cos x \end{equation}|
|{{{Equation arrays are also supported \begin{eqnarray} a &=& b \\ c &=& d \end{eqnarray} }}}|Equation arrays are also supported \begin{eqnarray} a &=& b \\ c &=& d \end{eqnarray} |
|{{{I spent \$7.38 on lunch.}}}|I spent \$7.38 on lunch.|
|{{{I had to insert a backslash (\\) into my document}}}|I had to insert a backslash (\\) into my document|
!Code
***/
//{{{

// AJAX code adapted from http://timmorgan.org/mini
// This is already loaded by ziddlywiki...
if(typeof(window["ajax"]) == "undefined") {
  ajax = {
      x: function(){try{return new ActiveXObject('Msxml2.XMLHTTP')}catch(e){try{return new ActiveXObject('Microsoft.XMLHTTP')}catch(e){return new XMLHttpRequest()}}},
      gets: function(url){var x=ajax.x();x.open('GET',url,false);x.send(null);return x.responseText}
  }
}

// Load jsMath
jsMath = {
  Setup: {inited: 1},          // don't run jsMath.Setup.Body() yet
 Autoload: {root: new String(document.location).replace(/[^\/]*$/,'jsMath/')}  // URL to jsMath directory, change if necessary

};
var jsMathstr;
try {
jsMathstr = ajax.gets(jsMath.Autoload.root+"jsMath.js");
} catch(e) {
  alert("jsMath was not found: you must place the 'jsMath' directory in the same place as this file.  "
       +"The error was:\n"+e.name+": "+e.message);
  throw(e);  // abort eval
}
try {
  window.eval(jsMathstr);
} catch(e) {
  alert("jsMath failed to load.  The error was:\n"+e.name + ": " + e.message + " on line " + e.lineNumber);
}
jsMath.Setup.inited=0;  //  allow jsMath.Setup.Body() to run again

// Define wikifers for latex
config.formatterHelpers.mathFormatHelper = function(w) {
    var e = document.createElement(this.element);
    e.className = this.className;
    var endRegExp = new RegExp(this.terminator, "mg");
    endRegExp.lastIndex = w.matchStart+w.matchLength;
    var matched = endRegExp.exec(w.source);
    if(matched) {
        var txt = w.source.substr(w.matchStart+w.matchLength, 
            matched.index-w.matchStart-w.matchLength);
        if(this.keepdelim) {
          txt = w.source.substr(w.matchStart, matched.index+matched[0].length-w.matchStart);
        }
        e.appendChild(document.createTextNode(txt));
        w.output.appendChild(e);
        w.nextMatch = endRegExp.lastIndex;
    }
}

config.formatters.push({
  name: "displayMath1",
  match: "\\\$\\\$",
  terminator: "\\\$\\\$\\n?", // 2.0 compatability
  termRegExp: "\\\$\\\$\\n?",
  element: "div",
  className: "math",
  handler: config.formatterHelpers.mathFormatHelper
});

config.formatters.push({
  name: "inlineMath1",
  match: "\\\$", 
  terminator: "\\\$", // 2.0 compatability
  termRegExp: "\\\$",
  element: "span",
  className: "math",
  handler: config.formatterHelpers.mathFormatHelper
});

var backslashformatters = new Array(0);

backslashformatters.push({
  name: "inlineMath2",
  match: "\\\\\\\(",
  terminator: "\\\\\\\)", // 2.0 compatability
  termRegExp: "\\\\\\\)",
  element: "span",
  className: "math",
  handler: config.formatterHelpers.mathFormatHelper
});

backslashformatters.push({
  name: "displayMath2",
  match: "\\\\\\\[",
  terminator: "\\\\\\\]\\n?", // 2.0 compatability
  termRegExp: "\\\\\\\]\\n?",
  element: "div",
  className: "math",
  handler: config.formatterHelpers.mathFormatHelper
});

backslashformatters.push({
  name: "displayMath3",
  match: "\\\\begin\\{equation\\}",
  terminator: "\\\\end\\{equation\\}\\n?", // 2.0 compatability
  termRegExp: "\\\\end\\{equation\\}\\n?",
  element: "div",
  className: "math",
  handler: config.formatterHelpers.mathFormatHelper
});

// These can be nested.  e.g. \begin{equation} \begin{array}{ccc} \begin{array}{ccc} ...
backslashformatters.push({
  name: "displayMath4",
  match: "\\\\begin\\{eqnarray\\}",
  terminator: "\\\\end\\{eqnarray\\}\\n?", // 2.0 compatability
  termRegExp: "\\\\end\\{eqnarray\\}\\n?",
  element: "div",
  className: "math",
  keepdelim: true,
  handler: config.formatterHelpers.mathFormatHelper
});

// The escape must come between backslash formatters and regular ones.
// So any latex-like \commands must be added to the beginning of
// backslashformatters here.
backslashformatters.push({
    name: "escape",
    match: "\\\\.",
    handler: function(w) {
        w.output.appendChild(document.createTextNode(w.source.substr(w.matchStart+1,1)));
        w.nextMatch = w.matchStart+2;
    }
});

config.formatters=backslashformatters.concat(config.formatters);

window.wikify = function(source,output,highlightRegExp,tiddler)
{
    if(source && source != "") {
        if(version.major == 2 && version.minor > 0) {
            var wikifier = new Wikifier(source,getParser(tiddler),highlightRegExp,tiddler);
            wikifier.subWikifyUnterm(output);
        } else {
            var wikifier = new Wikifier(source,formatter,highlightRegExp,tiddler);
            wikifier.subWikify(output,null);
        }
        jsMath.ProcessBeforeShowing();
    }
}
//}}}
/%
|Name|QuickEditToolbar|
|Source|http://www.TiddlyTools.com/#QuickEditToolbar|
|Version|2.0.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.2|
|Type|script|
|Requires|InlineJavascriptPlugin, GotoPlugin, NestedSlidersPlugin|
|Overrides||
|Description|quickly insert TiddlyWiki tiddler links or common formatting sequences directly into tiddler content|

Usage (in EditTemplate):
	<div macro='tiddler QuickEditToolbar'></div>

The QuickEdit "macro" command can include optional "guideText" for any given macro, as an aide to entering macro parameters, by embedding placeholders or recommended default values into the macro syntax that is inserted into your tiddler content.  For built-in TW core macros, this guideText is defined in this script, below.  You can add guideText to your own plugin-defined macros by using the following javascript syntax:
	config.macros.macroName.guideText="guide text goes here";
example:
	config.macros.slider.guideText="cookie TiddlerName label tooltip"; 

%/<script>

// SET STYLESHEET (for toolbar button style)
setStylesheet(".quickEdit a { border:1px solid #999; -moz-border-radius:0; padding:0px 2px; \
	line-height:200%; font-weight:normal; }", "quickEditStyles");

setStylesheet(".quickEdit a { border:2px outset ButtonFace; -moz-appearance:button; padding:0px 3px; \
	background-color:ButtonFace; color:ButtonText !important;  line-height:200%; font-weight:normal; }", "quickEditStyles");

// SET MACRO GUIDE TEXT (for built-in core macros) (11/17 - TBD - incomplete list)
config.macros.edit.guideText="fieldname #rows";
config.macros.view.guideText="fieldname (link,wikified,date) format";
config.macros.slider.guideText="cookie TiddlerName label tooltip";
config.macros.option.guideText="(txtCookieName,chkCookieName)";
config.macros.tiddler.guideText="TiddlerName with: params...";

</script>/%

TOOLBAR DEFINITIONS BEGIN HERE...
= = = = = = = = = = = = = = = = =
%/{{hidden fine center quickEdit{<script>
	if (config.options.chkShowQuickEdit && !readOnly) place.style.display="block"; // show toolbar when enabled and not in "read only " mode
</script>/%

%/+++^20em^*{{tiddlyLink{[link|add a 'PrettyLink' to another tiddler - [[link text|TiddlerName]}}}
	{{fine smallform wrap{
	//enter/select a tiddler://
	<<gotoTiddler insert width:100%;margin:0;font-size:8pt; width:90%;font-size:8pt;>>}}}===<script>
		place.lastChild.button.title+="]]"; // because we can't use "]" directly in the slider's label/tooltip syntax
</script>/%

%/+++^*{{tiddlyLink{[macro|add a macro - <<macroName ...>>]}}}
	{{fine smallform wrap{
	<html><select onchange="config.quickEdit.setSelection(this,'\<\<'+this.value+'\>\>'); this.selectedIndex=0; return false;">
		<option value="">select a macro...</option>
	</select></html><script>
		// get alpha-sorted list of macros plus help text (if any) and load droplist
		var macros=[]; for (var m in config.macros) if (config.macros[m].handler) macros.push(m); macros.sort();
		var list=place.lastChild.firstChild;
		for (var i=0; i<macros.length; i++) { var m=macros[i];
			var help=config.macros[m].guideText; if (!help) help=""; else help=" "+help;
			list.options[list.length]=new Option(m,m+help,false,false);
			list.options[list.length-1].title="<<"+m+help+">>";
		}
	</script>}}}===/%

%/<script label="image" title="embed an image (jpg/gif/png) - [img[tooltip|URL]] or [img[tooltip|path/to/file.ext]]">
	var fn=config.quickEdit.promptForFilename("Enter/select an image file",getLocalPath(document.location.href),"");
	if (!fn) return false; // cancelled by user
	var tip=prompt("Enter a tooltip for this image",""); if (!tip) tip=""; else tip+="|";
	return config.quickEdit.setSelection(place,"[img["+tip+fn+"]]");
</script>/%

%/+++^*{{tiddlyLink{[tiddler|copy content from another tiddler]}}}
	{{fine smallform wrap{
	<html><select onchange="var text=store.getTiddlerText(this.value); if (!text) return false; this.selectedIndex=0; return config.quickEdit.setSelection(this,text);">
		<option value="">select a tiddler...</option>
	</select></html><script>
		// get alpha-sorted list of tiddlers
		var tids=store.getTiddlers("title");
		var list=place.lastChild.firstChild;
		for (var t=0; t<tids.length; t++) {
			list.options[list.length]=new Option(tids[t].title,tids[t].title,false,false);
			list.options[list.length-1].title=tids[t].getSubtitle();
		}
	</script>}}}===/%

%/<script label="file" title="insert content from an external text file">
	var fn=config.quickEdit.promptForFilename("Enter/select a text file",getLocalPath(document.location.href),"");
	if (!fn) return false; // cancelled by user
	var text=loadFile(getLocalPath(fn)); if (!text) { alert("Error: unable to read contents from '"+fn+"'"); return; }
	return config.quickEdit.setSelection(place,text);
</script>/%

%/ &nbsp; <script label="&nbsp;B&nbsp;" title="''bold''">
	return config.quickEdit.wrapSelection(place,"''","''");
</script>/%

%/<script label="&nbsp;I&nbsp;" title="//italics//">
	return config.quickEdit.wrapSelection(place,"//","//");
</script>/%

%/<script label="&nbsp;U&nbsp;" title="__underline__">
	return config.quickEdit.wrapSelection(place,"__","__");
</script>/%

%/<script label="&nbsp;S&nbsp;" title="--strikethrough--">
	return config.quickEdit.wrapSelection(place,"--","--");
</script>/%

%/ &nbsp; <script label="<nowiki>|</nowiki>&#x2261;&nbsp;" title="{{left{...}}}">
	return config.quickEdit.wrapSelection(place,"{{left{","}}}");
</script>/%

%/<script label="&nbsp;&#x2261;&nbsp;" title="{{center{...}}}">
	return config.quickEdit.wrapSelection(place,"{{center{","}}}");
</script>/%

%/<script label="&nbsp;&#x2261;|" title="{{right{...}}}">
	return config.quickEdit.wrapSelection(place,"{{right{","}}}");
</script>/%

%/<script label="<nowiki>|</nowiki>&#x2261;|" title="{{justify{{...}}}">
	return config.quickEdit.wrapSelection(place,"{{justify{","}}}");
</script>/%

%/<script label="&lt;&#x2261;&nbsp;" title="{{floatleft{...}}}">
	return config.quickEdit.wrapSelection(place,"{{floatleft{","}}}");
</script>/%

%/<script label="&nbsp;&#x2261;&gt;" title="{{floatright{...}}}">
	return config.quickEdit.wrapSelection(place,"{{floatright{","}}}");
</script>/%

%/ &nbsp; <script label="style" title="inline CSS styles - @@attr:value;attr:value;...@@">
	var css=prompt("Enter CSS attribute/value pairs (attr:val;attr:val;...;)","");
	if (!css) return false; // cancelled by user
	return config.quickEdit.wrapSelection(place,"@@"+css,"@@");
</script>/%

%/<script label="class" title="CSS class wrapper - {{classname classname etc{...}}}">
	var class=prompt("Enter a CSS classname","");
	if (!class) return false; // cancelled by user
	return config.quickEdit.wrapSelection(place,"{{"+class+"{","}}}");
</script>/%

%/<script label="color" title="text color - @@color:#RGB;...@@">
	var color=prompt("Enter a CSS color name or value (use RGB or RRGGBB notation):","FC3");
	if (!color) return false; // cancelled by user
	return config.quickEdit.wrapSelection(place,"@@color:#"+color+";","@@");
</script>/%

%/ &nbsp; <script label="quote" title="indented blockquote - <<<">
	return config.quickEdit.wrapSelection(place,"\n<<<\n","\n<<<\n");
</script>/%

%/<script label="mono" title="inline monospaced text - {{{...}}}">
	return config.quickEdit.wrapSelection(place,"{{{","}}}");
</script>/%

%/<script label="pre" title="multiline monospaced text box - {{{...}}}">
	return config.quickEdit.wrapSelection(place,"\n{{{\n","\n}}}\n");
</script>/%

%/ &nbsp; <script label="comment" title="comment - /%...%/">
	return config.quickEdit.wrapSelection(place,"/%","%/");
</script>/%

%/}}}/%
END OF TOOLBAR DEFINITIONS
= = = = = = = = = = = = = = = = =

%/<script>

// UTILITY FUNCTIONS (set/get edit field content and "select a file" prompting)
config.quickEdit = {
	setSelection: function(where,newtext) {
		var here=story.findContainingTiddler(where); if (!here) return false;
		var e=story.getTiddlerField(here.getAttribute("tiddler"),"text"); if (!e||e.getAttribute("edit")!="text") return false;
		e.focus(); replaceSelection(e,newtext);
		return false;
	},
	wrapSelection: function(where,before,after) {
		var here=story.findContainingTiddler(where); if (!here) return false;
		var e=story.getTiddlerField(here.getAttribute("tiddler"),"text"); if (!e||e.getAttribute("edit")!="text") return false;
		e.focus(); replaceSelection(e,before+config.quickEdit.getSelection(e)+after);
		return false;
	},
	getSelection: function(e) {
		var seltext="";
		if (e.setSelectionRange)
			seltext=e.value.substr(e.selectionStart,e.selectionEnd-e.selectionStart);
		else if (document.selection) {
			var range = document.selection.createRange();
			if (range.parentElement()==e)	seltext=range.text
		}
		return seltext;
	},
	promptForFilename: function(msg,path,file) {
		if(window.Components) { // moz
			try {
				netscape.security.PrivilegeManager.enablePrivilege('UniversalXPConnect');
				var nsIFilePicker = window.Components.interfaces.nsIFilePicker;
				var picker = Components.classes['@mozilla.org/filepicker;1'].createInstance(nsIFilePicker);
				picker.init(window, msg, nsIFilePicker.modeOpen);
				var thispath = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
				thispath.initWithPath(path);
				picker.displayDirectory=thispath;
				picker.defaultExtension='jpg';
				picker.defaultString=file;
				picker.appendFilters(nsIFilePicker.filterAll|nsIFilePicker.filterImages);
				if (picker.show()!=nsIFilePicker.returnCancel)
					var result="file:///"+picker.file.persistentDescriptor.replace(/\\/g,'/');
			}
			catch(e) { alert('error during local file access: '+e.toString()) }
		}
		else { // IE
			try { // XP only
				var s = new ActiveXObject('UserAccounts.CommonDialog');
				s.Filter='All files|*.*|JPG files|*.jpg|GIF files|*.gif|PNG files|*.png|';
				s.FilterIndex=1; // default to JPG files;
				s.InitialDir=path;
				s.FileName=file;
				if (s.showOpen()) var result=s.FileName;
			}
			catch(e) { var result=prompt(msg,path+file); } // fallback for non-XP IE
		}
		return result;
	}
}
</script>
/%
|Name|QuickEditToolbarCommand|
|Source|http://www.TiddlyTools.com/#QuickEditToolbarCommand|
|Version|1.0.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|script|
|Requires|InlineJavascriptPlugin, QuickEditToolbar|
|Overrides||
|Description|toggles QuickEditToolbar display and option setting|

Usage (in EditTemplate):
	<span class='toolbar' macro='tiddler QuickEditToolbarCommand'></span>

%/<script>

	// initial default is to NOT show the toolbar
	if (config.options.chkShowQuickEdit==undefined) config.options.chkShowQuickEdit=false;

</script><script label="toolbar" title="show QuickEditToolbar">

	// click on text toggles checkbox
	config.options.chkShowQuickEdit=!config.options.chkShowQuickEdit;

	// save cookie when toolbar shown, remove cookie when toolbar hidden
	if (config.options.chkShowQuickEdit)
		saveOptionCookie("chkShowQuickEdit");
	else {
		var ex=new Date(); ex.setTime(ex.getTime()-1000);
		document.cookie = "chkShowQuickEdit=novalue; path=/; expires="+ex.toGMTString();
	}

	// set link and title based on option state
	place.innerHTML=config.options.chkShowQuickEdit?"[toolbar]":"toolbar";
	place.title=(config.options.chkShowQuickEdit?"hide":"show")+" QuickEditToolbar";

	// refresh all actively displayed tiddler editor(s)
	story.forEachTiddler(function(t,e){if (story.isDirty(t)) refreshElements(e);});
	return false;

</script><script>
	var label=place.lastChild;

	// set link and title based on option state
	label.innerHTML=config.options.chkShowQuickEdit?"[toolbar]":"toolbar";
	label.title=(config.options.chkShowQuickEdit?"hide":"show")+" QuickEditToolbar";

	// style tweak for link text
	label.style.fontWeight="normal";
</script>
/***
|Name|RearrangeTiddlersPlugin|
|Source|http://www.TiddlyTools.com/#RearrangeTiddlersPlugin|
|Version|0.0.0|
|Author|Joe Raii|
|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Story.prototype.refreshTiddler|
|Description|drag tiddlers by title to re-order story column display|

adapted from: http://www.cs.utexas.edu/~joeraii/dragn/#Draggable
changes by ELS:
* hijack refreshTiddler() instead of overridding createTiddler()
* find title element by className instead of elementID
* set cursor style via code instead of stylesheet
* set tooltip help text
* set tiddler "position:relative" when starting drag event, restore saved value when drag ends
* update 2006.08.07: use getElementsByTagName("*") to find title element, even when it is 'buried' deep in tiddler DOM elements (due to custom template usage)
* update 2007.03.01: use apply() to invoke hijacked core function

***/
//{{{

Story.prototype.rearrangeTiddlersHijack_refreshTiddler = Story.prototype.refreshTiddler;
Story.prototype.refreshTiddler = function(title,template,unused1,unused2,unused3,unused4,unused5)
{
	this.rearrangeTiddlersHijack_refreshTiddler.apply(this,arguments);
	var theTiddler = document.getElementById(this.idPrefix + title); if (!theTiddler) return;
	var theHandle;
	var children=theTiddler.getElementsByTagName("*");
	for (var i=0; i<children.length; i++) if (hasClass(children[i],"title")) { theHandle=children[i]; break; }
	if (!theHandle) return theTiddler;

	Drag.init(theHandle, theTiddler, 0, 0, null, null);
	theHandle.style.cursor="move";
	theHandle.title="drag title to re-arrange tiddlers"
	theTiddler.onDrag = function(x,y,myElem) {
		if (this.style.position!="relative")
			{ this.savedstyle=this.style.position; this.style.position="relative"; }
		y = myElem.offsetTop;
		var next = myElem.nextSibling;
		var prev = myElem.previousSibling;
		if (next && y + myElem.offsetHeight > next.offsetTop + next.offsetHeight/2) { 
			myElem.parentNode.removeChild(myElem);
			next.parentNode.insertBefore(myElem, next.nextSibling);//elems[pos+1]);
			myElem.style["top"] = -next.offsetHeight/2+"px";
		}
		if (prev && y < prev.offsetTop + prev.offsetHeight/2) { 
			myElem.parentNode.removeChild(myElem);
			prev.parentNode.insertBefore(myElem, prev);
			myElem.style["top"] = prev.offsetHeight/2+"px";
		}
	};
	theTiddler.onDragEnd = function(x,y,myElem) {
		myElem.style["top"] = "0px";
		if (this.savedstyle!=undefined)
			this.style.position=this.savedstyle;
	}
	return theTiddler;
}

/**************************************************
 * dom-drag.js
 * 09.25.2001
 * www.youngpup.net
 **************************************************
 * 10.28.2001 - fixed minor bug where events
 * sometimes fired off the handle, not the root.
 **************************************************/

var Drag = {
	obj:null,

	init:
	function(o, oRoot, minX, maxX, minY, maxY) {
		o.onmousedown = Drag.start;
		o.root = oRoot && oRoot != null ? oRoot : o ;
		if (isNaN(parseInt(o.root.style.left))) o.root.style.left="0px";
		if (isNaN(parseInt(o.root.style.top))) o.root.style.top="0px";
		o.minX = typeof minX != 'undefined' ? minX : null;
		o.minY = typeof minY != 'undefined' ? minY : null;
		o.maxX = typeof maxX != 'undefined' ? maxX : null;
		o.maxY = typeof maxY != 'undefined' ? maxY : null;
		o.root.onDragStart = new Function();
		o.root.onDragEnd = new Function();
		o.root.onDrag = new Function();
	},

	start:
	function(e) {
		var o = Drag.obj = this;
		e = Drag.fixE(e);
		var y = parseInt(o.root.style.top);
		var x = parseInt(o.root.style.left);
		o.root.onDragStart(x, y, Drag.obj.root);
		o.lastMouseX = e.clientX;
		o.lastMouseY = e.clientY;
		if (o.minX != null) o.minMouseX = e.clientX - x + o.minX;
		if (o.maxX != null) o.maxMouseX = o.minMouseX + o.maxX - o.minX;
		if (o.minY != null) o.minMouseY = e.clientY - y + o.minY;
		if (o.maxY != null) o.maxMouseY = o.minMouseY + o.maxY - o.minY;
		document.onmousemove = Drag.drag;
		document.onmouseup = Drag.end;
		Drag.obj.root.style["z-index"] = "10";
		return false;
	},

	drag:
	function(e) {
		e = Drag.fixE(e);
		var o = Drag.obj;
		var ey = e.clientY;
		var ex = e.clientX;
		var y = parseInt(o.root.style.top);
		var x = parseInt(o.root.style.left);
		var nx, ny;
		if (o.minX != null) ex = Math.max(ex, o.minMouseX);
		if (o.maxX != null) ex = Math.min(ex, o.maxMouseX);
		if (o.minY != null) ey = Math.max(ey, o.minMouseY);
		if (o.maxY != null) ey = Math.min(ey, o.maxMouseY);
		nx = x + (ex - o.lastMouseX);
		ny = y + (ey - o.lastMouseY);
		Drag.obj.root.style["left"] = nx + "px";
		Drag.obj.root.style["top"] = ny + "px";
		Drag.obj.lastMouseX = ex;
		Drag.obj.lastMouseY = ey;
		Drag.obj.root.onDrag(nx, ny, Drag.obj.root);
		return false;
	},

	end:
	function() {
		document.onmousemove = null;
		document.onmouseup = null;
		Drag.obj.root.style["z-index"] = "0";
		Drag.obj.root.onDragEnd(parseInt(Drag.obj.root.style["left"]), parseInt(Drag.obj.root.style["top"]), Drag.obj.root);
		Drag.obj = null;
	},

	fixE:
	function(e) {
		if (typeof e == 'undefined') e = window.event;
		if (typeof e.layerX == 'undefined') e.layerX = e.offsetX;
		if (typeof e.layerY == 'undefined') e.layerY = e.offsetY;
		return e;
	}
};
//}}}
/***
|Name|RecentChangesPlugin|
|Source|http://www.TiddlyTools.com/#RecentChangesPlugin|
|Version|1.0.0|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <<br>>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides||
|Description|display droplist of recently changed tiddlers with goto, edit, and preview buttons|

!!!!!Usage
<<<
The {{{<<recentChanges>>}}} macro displays a droplist of all tiddlers that have been changed within the last N days (default=10 days).  
<<<
!!!!!Examples
<<<
{{{<<recentChanges>>}}}
<<recentChanges>>
or
{{{<<recentChanges #ofdays previewheight previewclass>>}}}
where:
* #ofdays specifies the time limit for list changed tiddlers.  Use 0 (zero) to list all tiddlers in the document
* previewheight is a CSS height measurement and sets the FIXED height of the tiddler preview area (default is 15em)
* previewclass is any CSS classname, and can be used to apply custom styles to the preview area (default is to use the standard 'viewer' class)
<<recentChanges 14 10em groupbox>>
<<<
!!!!!Installation
<<<
import (or copy/paste) the following tiddlers into your document:
RecentChangesPlugin
<<<
!!!!!Revision History
<<<
''2007.07.26 [2.0.0]'' re-written as plugin
''[1.0.0]'' initial release (as inline script ShowRecentChanges)
<<<
!!!!!Credits
<<<
This feature was developed by Eric Shulman / ELS Design Studios
<<<
!!!!!Code
***/
//{{{
version.extensions.recentChanges= {major: 2, minor: 0, revision: 0, date: new Date(2007,7,26)};

config.macros.recentChanges = {
	layout: '<form><!--\
		--><select size=1 name="list" style="width:69.5%" \
			onchange=" \
				this.form.goto.disabled=this.form.edit.disabled=this.form.preview.disabled=!this.value.length; \
				var target=this.parentNode.parentNode.nextSibling; removeChildren(target); \
				if (!this.value.length) \
					{ target.style.display=\'none\'; this.form.preview.value=\'preview\'; } \
				else if (target.style.display==\'block\') { \
					wikify(\'<\'+\'<tiddler [[\'+this.value+\']]>\'+\'>\',target); \
					target.style.display=\'block\'; \
					this.form.preview.value=\'done\'; \
				} \
			"><!--\
		-->%options%<!--\
		--></select><!--\
		--><input type="button" name="goto" value="goto" disabled title="view selected tiddler" style="width:10%" \
			onclick="var target=this.parentNode.parentNode.nextSibling; removeChildren(target); \
				target.style.display=\'none\'; this.form.preview.value=\'preview\'; \
				story.displayTiddler(story.findContainingTiddler(this),this.form.list.value); \
			"><!--\
		--><input type="button" name="edit" value="edit" disabled title="edit selected tiddler" style="width:10%" \
			onclick="var target=this.parentNode.parentNode.nextSibling; removeChildren(target); \
				target.style.display=\'none\'; this.form.preview.value=\'preview\'; \
				story.displayTiddler(story.findContainingTiddler(this),this.form.list.value,DEFAULT_EDIT_TEMPLATE); \
			"><!--\
		--><input type="button" name="preview" value="preview" disabled title="show/hide tiddler preview" style="width:10%" \
			onclick="var target=this.parentNode.parentNode.nextSibling; \
				if (this.value==\'preview\') { \
					removeChildren(target); \
					wikify(\'<\'+\'<tiddler [[\'+this.form.list.value+\']]>\'+\'>\',target); \
					target.style.display=this.form.list.value.length?\'block\':\'none\'; this.value=\'done\'; \
				} else { \
					removeChildren(target); \
					target.style.display=\'none\'; this.value=\'preview\'; \
				} \
			"><!--\
		--></form>',
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var days=10; if (!isNaN(params[0])) days=parseInt(params[0]); // time limit in days (use 0 for all tiddlers)
		var height='15em'; if (params[1]) height=params[1]; // preview area fixed height
		var previewclass='viewer'; if (params[2]) previewclass=params[2]; // preview area CSS class
		var tiddlers=store.getTiddlers('modified','excludeLists').reverse();
		var count=tiddlers.length;
		if (days) {
			var timelimit=(new Date()).getTime()-86400000*days;
			for (var count=0; count<tiddlers.length && tiddlers[count].modified>timelimit; count++);
		}
		var opts="";
		opts+='<option value="">';
		opts+=count+' tiddlers have changed since ';
		opts+=new Date(timelimit).formatString("DDD, MMM DDth YYYY 0hh:0mm");
		opts+=' ('+days+' days ago)';
		opts+='</option>';
		for (var i=0; i<count; i++) { var t=tiddlers[i];
			opts+='<option value="'+t.title+'">';
			opts+=t.modified.formatString('YYYY.0MM.0DD 0hh:0mm')+' - '+t.title;
			opts+='</option>';
		}
		createTiddlyElement(place,"div").innerHTML=this.layout.replace(/%options%/,opts);
		var preview=createTiddlyElement(place,"span",null,previewclass);
		preview.style.display='none';
		preview.style.whiteSpace='normal';
		preview.style.overflow='auto';
		preview.style.height=height
	}
}
//}}}
A graduate lecture course by Mike Towler (University of Cambridge, Lent term 2009)
De ~Broglie-Bohm pilot-wave theory and the 
foundations of quantum mechanics
/*{{{*/
#mainMenu {
  width: 11em;
}
.viewer {
   text-align: justify;
}

/*}}}*/
/***
|Name|TextAreaPlugin|
|Source|http://www.TiddlyTools.com/#TextAreaPlugin|
|Documentation|http://www.TiddlyTools.com/#TextAreaPluginInfo|
|Version|2.1.9|
|Author|Eric Shulman - ELS Design Studios|
|License|http://www.TiddlyTools.com/#LegalStatements <br>and [[Creative Commons Attribution-ShareAlike 2.5 License|http://creativecommons.org/licenses/by-sa/2.5/]]|
|~CoreVersion|2.1|
|Type|plugin|
|Requires||
|Overrides|Story.prototype.focusTiddler|
|Options|##Configuration|
|Description|Adds Find/Again keyboard search, autosize, and 'stretch bar' resize for textarea controls|
* ''Control-F'' and ''control-G'' will ''"Find text"'' and ''"find text aGain"'', respectively, allowing you to copy, find, paste, findagain, paste, etc to perform "search-and-replace" actions.  
* ''autosizeEditor'' - toggles the tiddler editor textarea height between fixed-height and "automatically fit the contents".
* ''resizeEditor'' - adds 'grab handle' below textarea to stretch field height
!!!!!Documentation
>see [[TextAreaPluginInfo]]
!!!!!Configuration
<<<
<<option chkTextAreaExtensions>> use control-f (find), control-g (find again) inside text area
<<option chkDisableAutoSelect>> place cursor at start of textarea instead of pre-selecting content
<<option chkResizeEditor>> modify shadow EditTemplate to add resizeable text area (and autosize command)
<<<
!!!!!Revisions
<<<
2008.01.08 [2.1.9] fixed default setting of uninitialized option values so that "false" is not treated as "undefined"
|please see [[TextAreaPluginInfo]] for additional revision details|
2006.01.22 [1.0.0] Moved from temporary "System Tweaks" tiddler into 'real' TextAreaPlugin tiddler.
<<<
!!!!!Code
***/
//{{{
version.extensions.TextAreaPlugin= {major: 2, minor: 1, revision: 9, date: new Date(2008,1,8)};

if (config.options.chkTextAreaExtensions===undefined) config.options.chkTextAreaExtensions=true;
if (config.options.chkDisableAutoSelect===undefined) config.options.chkDisableAutoSelect=true;
if (config.options.chkResizeEditor===undefined) config.options.chkResizeEditor=true;

// automatically tweak shadow EditTemplate to add "autosizeEditor" toolbar command
if (config.options.chkResizeEditor)
	config.shadowTiddlers.EditTemplate=config.shadowTiddlers.EditTemplate.replace(/deleteTiddler/,"deleteTiddler autosizeEditor");
// automatically tweak shadow EditTemplate to add "resizeEditor" macro
if (config.options.chkResizeEditor)
	config.shadowTiddlers.EditTemplate+="<span macro='resizeEditor'></span>";

// Put focus in a specified tiddler field
Story.prototype.TextAreaExtensions_focusTiddler=Story.prototype.focusTiddler;
Story.prototype.focusTiddler = function(title,field)
{
	this.TextAreaExtensions_focusTiddler.apply(this,arguments); // first call core
	var e = this.getTiddlerField(title,field);
	if (e && config.options.chkDisableAutoSelect) {
		if (e.setSelectionRange) // FF
			e.setSelectionRange(0,0);
		else if (e.createTextRange) // IE
			{ var r=e.createTextRange(); r.collapse(true); r.select(); }
	}
	if (e && config.options.chkTextAreaExtensions) addKeyDownHandlers(e);
}
//}}}

//{{{
function addKeyDownHandlers(e)
{
	// exit if not textarea or element doesn't allow selections
	if (e.tagName.toLowerCase()!="textarea"||!e.setSelectionRange||e.initialized) return;

	// utility function: exits keydown handler and prevents browser from processing the keystroke
	var processed=function(ev) {
		ev.cancelBubble=true; // IE4+
		try{event.keyCode=0;}catch(e){}; // IE5
		if (window.event) ev.returnValue=false; // IE6
		if (ev.preventDefault) ev.preventDefault(); // moz/opera/konqueror
		if (ev.stopPropagation) ev.stopPropagation(); // all
		return false;
	}
	// capture keydown in edit field
	e.saved_onkeydown=e.onkeydown; // save current keydown handler (if any)
	e.onkeydown=function(ev) { if (!ev) var ev=window.event;
		var key=ev.keyCode;
		if (!key) {
			var char=event.which?event.which:event.charCode;
			if (char==102) key=70;
			if (char==103) key=71;
		}
		// process CTRL-F (find matching text) or CTRL-G (find next match)
		if (ev.ctrlKey && (key==70||key==71)) {

			// prompt for text to find
			var defFind=e.findText?e.findText:e.value.substring(e.selectionStart,e.selectionEnd);
			if (key==70||!e.findText||!e.findText.length) // ctrl-f or no saved search text
				{ var f=prompt("find:", defFind); e.focus(); if (f) e.findText=f; }
			if (!e.findText||!e.findText.length) return processed(ev); //  if no search text, exit

			// do case-insensitive match with 'wraparound'...  if not found, alert and exit 
			var newstart=e.value.toLowerCase().indexOf(e.findText.toLowerCase(),e.selectionStart+1);
			if (newstart==-1) newstart=e.value.toLowerCase().indexOf(e.findText.toLowerCase());
			if (newstart==-1) { alert("'"+e.findText+"' not found"); e.focus(); return processed(ev); }

			// set new selection, scroll it into view, and report line position in status bar
			e.setSelectionRange(newstart,newstart+e.findText.length);
			var linecount=e.value.split('\n').length;
			var thisline=e.value.substr(0,e.selectionStart).split('\n').length;
			e.scrollTop=Math.floor((thisline-1-e.rows/2)*e.scrollHeight/linecount);
			window.status="line: "+thisline+"/"+linecount;
			return processed(ev);
		}
		if (e.saved_onkeydown) // call previous keydown handler (if any)
			e.saved_onkeydown(ev);
	}
	e.initialized=true;
}
//}}}

// // 'autosize' toolbar command
//{{{
config.commands.autosizeEditor = {
	text: 'autosize',
	tooltip: 'automatically adjust the editor height to fit the contents',
	text_alt: '\u221Aautosize',
	hideReadOnly: false,
	handler: function(event,src,title) {
		var here=story.findContainingTiddler(src); if (!here) return;
		var ta=here.getElementsByTagName('textarea'); if (!ta) return;
		for (i=0;i<ta.length;i++) {
			// only autosize textareas actually used to edit tiddler fields
			if (ta[i].getAttribute("edit")==undefined) continue;
			ta[i].button=src;
			if (!ta[i].maxed)
				config.commands.autosizeEditor.on(ta[i]);
			else
				config.commands.autosizeEditor.off(ta[i],true);
		}
		return false;
	},
	on: function(e) {
		if (e.maxed) return; // already autosizing!
		if (e.savedheight==undefined)
			e.savedheight=e.style.height;
		if (e.savedkeyup==undefined) {
			e.savedkeyup=e.onkeyup;
			e.onkeyup=function(ev) {
				if (!ev) var ev=window.event; var e=resolveTarget(ev);
				e.style.height=e.scrollHeight+'px';
				if (e.savedkeyup) e.savedkeyup();
			}
		}
		// IE reports error: "not implemented" for onkeypress
		if (!config.browser.isIE && e.savedkeypress==undefined) {
			e.savedkeypress=e.onkeypress;
			e.onkeypress=function(ev) {
				if (!ev) var ev=window.event; var e=resolveTarget(ev);
				if (ev.keyCode==33) { // PGUP
					if (window.scrollByPages) window.scrollByPages(-1);
					return false;
				}
				if (ev.keyCode==34) { // PGDN
					if (window.scrollByPages) window.scrollByPages(1);
					return false;
				}
				if (e.savedkeypress) e.savedkeypress();
			}
		}
		e.style.height=e.scrollHeight+'px';
		e.button.innerHTML=config.commands.autosizeEditor.text_alt;
		e.maxed=true;
	},
	off: function(e,resetHeight) {
		if (resetHeight) e.style.height=e.savedheight;
		e.onkeyup=e.savedkeyup;
		// IE reports error: "not implemented" for onkeypress
		if (!config.browser.isIE) e.onkeypress=e.savedkeypress;
		e.button.innerHTML=config.commands.autosizeEditor.text;
		e.maxed=false;
	}
};
//}}}

// // grab-and-stretch handle
//{{{
config.macros.resizeEditor = { // add stretch bar to editor textarea
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var here=story.findContainingTiddler(place); if (!here) return;
		var ta=here.getElementsByTagName('textarea');
		if (ta) for (i=0;i<ta.length;i++) {
			// only resize tiddler editor textareas
			if (ta[i].getAttribute("edit")==undefined) continue;
			new window.TextAreaResizer(ta[i]);
		}
	}
}

config.macros.resizeTiddler = { // add stretch bar to tiddler viewer element
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var here=story.findContainingTiddler(place); if (!here) return;
		var elems=here.getElementsByTagName('div');
		if (elems) for (i=0;i<elems.length;i++) if (hasClass(elems[i],'viewer')) break;
		if (i<elems.length) new window.TextAreaResizer(elems[i]);
	}
}

config.macros.resizeFrame = { // add stretch bar to iframes
	handler: function(place,macroName,params,wikifier,paramString,tiddler) {
		var here=story.findContainingTiddler(place); if (!here) return;
		var fr=here.getElementsByTagName('iframe');
		if (fr) for (i=0;i<fr.length;i++) new window.TextAreaResizer(fr[i]);
	}
}

// TextAreaResizer script by Jason Johnston ([email protected])
// Created August 2003.  Use freely, but give me credit.
// adds a handle below textareas that the user can drag with the mouse to resize the textarea.
// MODIFIED by ELS for cross-browser (IE) compatibility, including:
//    fixups and adjustments to CSS styles,
//    use 'old style' assignment of mouse event handlers instead of using addEventListener(),
//    use window.event if event param is null,
//    use offsetHeight instead of getComputedStyle()
//    use explicit window.* global scope declaration for functions called from event handlers

window.TextAreaResizer = function(elt) {
	this.element = elt;
	this.create();
}
window.TextAreaResizer.prototype = {
	create : function() {
		var elt = this.element;
		var thisRef = this;
		var h = this.handle = document.createElement("div");
		h.style.height = "3px"; // was 4px... looked too fat!
		h.style.overflow = "hidden"; // ELS: force IE to trim height to < 1em
		h.style.width="auto";
		h.style.backgroundColor = "#999"; // ELS: standard mid-tone (dark) gray
		h.style.cursor = "s-resize";
		h.title = "Drag to resize text box";
		h.onmousedown=function(evt){thisRef.dragStart(evt)};
		elt.parentNode.insertBefore(h, elt.nextSibling);
	},
	dragStart : function(evt) {
		if (!evt) var evt=window.event;
		this.dragStop(evt); // ELS: stop any current drag processing first
		var thisRef = this;
		this.dragStartY = evt.clientY;
		this.dragStartH = this.element.offsetHeight;
		document.savedmousemove=document.onmousemove;
		document.onmousemove=this.dragMoveHdlr=function(evt){thisRef.dragMove(evt)};
		document.savedmouseup=document.onmouseup;
		document.onmouseup=this.dragStopHdlr=function(evt){thisRef.dragStop(evt)};
	},
	dragMove : function(evt) {
		if (!evt) var evt=window.event;
		// ELS: make sure height is at least 10px
		var h=this.dragStartH+evt.clientY-this.dragStartY;
		if (h<10) h=10; this.element.style.height=h+"px";
		// ELS: match handle to textarea width (which may have changed due to document scrollbars)
		this.handle.style.width=(this.element.offsetWidth-4)+"px"; // 4-pixel fudge factor for textarea border edge
		// ELS: when manually resizing, disable autoresizing (without restoring saved height)
		if (this.element.maxed!=undefined && this.element.maxed)
			config.commands.autosizeEditor.off(this.element,false);
	},
	dragStop : function(evt) {
		if (!evt) var evt=window.event;
		document.onmousemove=(document.savedmousemove!=undefined)?document.savedmousemove:null;
		document.onmousemove=(document.savedmouseup!=undefined)?document.savedmouseup:null;
	},
	destroy : function() {
		var elt = this.element;
		elt.parentNode.removeChild(this.handle);
		elt.style.height = "";
	}
};
//}}}
Mike Towler