{"action":"created","issue":{"url":"https://api.github.com/repos/snaekobbi/issues/issues/7","labels_url":"https://api.github.com/repos/snaekobbi/issues/issues/7/labels{/name}","comments_url":"https://api.github.com/repos/snaekobbi/issues/issues/7/comments","events_url":"https://api.github.com/repos/snaekobbi/issues/issues/7/events","html_url":"https://github.com/snaekobbi/issues/issues/7","id":66160430,"number":7,"title":"Volume breaking requirements","user":{"login":"bertfrees","id":1167989,"avatar_url":"https://avatars.githubusercontent.com/u/1167989?v=3","gravatar_id":"","url":"https://api.github.com/users/bertfrees","html_url":"https://github.com/bertfrees","followers_url":"https://api.github.com/users/bertfrees/followers","following_url":"https://api.github.com/users/bertfrees/following{/other_user}","gists_url":"https://api.github.com/users/bertfrees/gists{/gist_id}","starred_url":"https://api.github.com/users/bertfrees/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bertfrees/subscriptions","organizations_url":"https://api.github.com/users/bertfrees/orgs","repos_url":"https://api.github.com/users/bertfrees/repos","events_url":"https://api.github.com/users/bertfrees/events{/privacy}","received_events_url":"https://api.github.com/users/bertfrees/received_events","type":"User","site_admin":false},"labels":[{"url":"https://api.github.com/repos/snaekobbi/issues/labels/2%20-%20In%20progress","name":"2 - In progress","color":"CCCCCC"}],"state":"open","locked":false,"assignee":null,"milestone":{"url":"https://api.github.com/repos/snaekobbi/issues/milestones/3","html_url":"https://github.com/snaekobbi/issues/milestones/volume%20breaking%20(1)","labels_url":"https://api.github.com/repos/snaekobbi/issues/milestones/3/labels","id":1051891,"number":3,"title":"volume breaking (1)","description":"","creator":{"login":"bertfrees","id":1167989,"avatar_url":"https://avatars.githubusercontent.com/u/1167989?v=3","gravatar_id":"","url":"https://api.github.com/users/bertfrees","html_url":"https://github.com/bertfrees","followers_url":"https://api.github.com/users/bertfrees/followers","following_url":"https://api.github.com/users/bertfrees/following{/other_user}","gists_url":"https://api.github.com/users/bertfrees/gists{/gist_id}","starred_url":"https://api.github.com/users/bertfrees/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bertfrees/subscriptions","organizations_url":"https://api.github.com/users/bertfrees/orgs","repos_url":"https://api.github.com/users/bertfrees/repos","events_url":"https://api.github.com/users/bertfrees/events{/privacy}","received_events_url":"https://api.github.com/users/bertfrees/received_events","type":"User","site_admin":false},"open_issues":1,"closed_issues":0,"state":"open","created_at":"2015-04-03T14:55:44Z","updated_at":"2015-04-03T14:55:44Z","due_on":null,"closed_at":null},"comments":9,"created_at":"2015-04-03T14:52:45Z","updated_at":"2015-07-13T18:31:08Z","closed_at":null,"body":"Volume breaking is a constrained optimization problem. We have to optimize an objective function with respect to some variables subject to (soft or hard) constraints. In this issue I want to find out what the variables, constraints and objectives are.\r\n\r\nPossible objectives/constraints are:\r\n- to limit the size of volume\r\n- to minimize the number of volumes\r\n- to maximize the similarity in size\r\n- to have sensible break points\r\n- to force certain breaks\r\n- to disallow/discourage breaking at certain positions\r\n\r\nIn the following table I list up the possible motives for these objectives/constraints, and at the same time I draw parallels to line breaking and page breaking because they are such similar problems and similar techniques can be used to solve them.\r\n\r\n<table>\r\n<thead>\r\n<tr>\r\n<th></th>\r\n<th>line breaking</th>\r\n<th>page breaking</th>\r\n<th>volume breaking</th>\r\n</tr>\r\n</thead>\r\n<tbody>\r\n<tr>\r\n<th>limit size</th>\r\n<td>limited by page width (hard limit)</td>\r\n<td>limited by page height (hard limit)</td>\r\n<td>\r\n<ul>\r\n<li>volumes not too heavy</li>\r\n<li>must fit in mailbox</li>\r\n<li>limit on ring/wire binders</li>\r\n<li>ideal size can be lower than hard upper limit</li>\r\n</ul>\r\n</td>\r\n</tr>\r\n<tr>\r\n<th>minimize count</th>\r\n<td>maximal use of available space</td>\r\n<td>maximal use of available space</td>\r\n<td>\r\n<ul>\r\n<li>reduce overhead (title pages etc.)</li>\r\n<li>minimise the need for the reader to switch volumes</li>\r\n</ul>\r\n</td>\r\n</tr>\r\n<tr>\r\n<th>similar in size</th>\r\n<td>straight right margins? what about last line?</td>\r\n<td>equal bottom margins? what about last page?</td>\r\n<td>\r\n<ul>\r\n<li>for aesthetic reasons</li>\r\n<li>in order to minimize size of largest volume for a given number of volumes</li>\r\n<li>a significantly smaller (or bigger) last volume can also make sense when it contains exclusively an appendix</li>\r\n</ul>\r\n</td>\r\n</tr>\r\n<tr>\r\n<th>sensible breaks</th>\r\n<td>prefer at white space, not too many hyphens</td>\r\n<td>why?</td>\r\n<td>prefer at the beginning of sections</td>\r\n</tr>\r\n<tr>\r\n<th>forced breaks</th>\r\n<td>why?</td>\r\n<td>why?</td>\r\n<td>why? aesthetic reasons?</td>\r\n</tr>\r\n<tr>\r\n<th>disallowed breaks</th>\r\n<td></td>\r\n<td></td>\r\n<td>\r\n<ul>\r\n<li>avoid inside lists</li>\r\n<li>preferably not in the middle of a sentence</li>\r\n</ul>\r\n</td>\r\n</tr>\r\n</tbody>\r\n</table>\r\n\r\nThe next table show possible ways of optimizing the solution and controlling the objective function:\r\n\r\n<table>\r\n<thead>\r\n<tr>\r\n<th></th>\r\n<th>line breaking (<a href=\"http://snaekobbi.github.io/braille-css-spec/#line-breaking\">css spec</a>)</th>\r\n<th>page breaking (<a href=\"http://snaekobbi.github.io/braille-css-spec/#page-breaking\">css spec</a>)</th>\r\n<th>volume breaking (<a href=\"http://snaekobbi.github.io/braille-css-spec/#volume-breaking\">css spec</a>)</th>\r\n</tr>\r\n</thead>\r\n<tbody>\r\n<tr>\r\n<th>limit size</th>\r\n<td></td>\r\n<td></td>\r\n<td><a href=\"http://snaekobbi.github.io/braille-css-spec/#dfn-max-length\">max-length</a></td>\r\n</tr>\r\n<tr>\r\n<th>minimize count</th>\r\n<td><a href=\"http://snaekobbi.github.io/braille-css-spec/#dfn-auto\">hyphens</a>: auto</td>\r\n<td></td>\r\n<td></td>\r\n</tr>\r\n<tr>\r\n<th>similar in size</th>\r\n<td></td>\r\n<td></td>\r\n<td><a href=\"http://snaekobbi.github.io/braille-css-spec/#dfn-min-length\">min-length</a>, <a href=\"http://snaekobbi.github.io/braille-css-spec/#dfn-max-length\">max-length</a></td>\r\n</tr>\r\n<tr>\r\n<th>sensible breaks</th>\r\n<td>\r\n<ul>\r\n<li>lefthyphenmin</li>\r\n<li>don't hyphenate second to last line if last line has enough space</li>\r\n</ul>\r\n</td>\r\n<td>prefer at <a href=\"http://www.w3.org/TR/2012/WD-css3-break-20120823/#btw-blocks\">class A</a></td>\r\n<td><a href=\"http://snaekobbi.github.io/braille-css-spec/#h4_controlling-volume-breaks\">volume-break</a>: prefer</td>\r\n</tr>\r\n<tr>\r\n<th>forced breaks</th>\r\n<td><a href=\"http://www.w3.org/TR/2012/WD-css3-text-20121113/#forced-line-break\">preserved line breaks</a> (<a href=\"http://snaekobbi.github.io/braille-css-spec/#dfn-white-space\">white-space</a>: pre)</td>\r\n<td><a href=\"http://snaekobbi.github.io/braille-css-spec/#h4_controlling-page-breaks\">page-break</a>: always</td>\r\n<td><a href=\"http://snaekobbi.github.io/braille-css-spec/#h4_controlling-volume-breaks\">volume-break</a>: always</td>\r\n</tr>\r\n<tr>\r\n<th>disallowed breaks</th>\r\n<td>avoid if not at <a href=\"http://www.w3.org/TR/2012/WD-css3-text-20121113/#soft-wrap-opportunity\">soft wrap opportunity</a></td>\r\n<td>\r\n<ul>\r\n<li>avoid at <a href=\"http://www.w3.org/TR/2012/WD-css3-break-20120823/#btw-lines\">class B</a></li>\r\n<li><a href=\"http://snaekobbi.github.io/braille-css-spec/#h4_controlling-page-breaks\">page-break</a>: avoid</li>\r\n<li><a href=\"http://snaekobbi.github.io/braille-css-spec/#dfn-orphans\">orphans</a></li>\r\n<li><a href=\"http://snaekobbi.github.io/braille-css-spec/#dfn-widows\">widows</a></li>\r\n</ul>\r\n</td>\r\n<td><a href=\"http://snaekobbi.github.io/braille-css-spec/#h4_controlling-volume-breaks\">volume-break</a>: avoid</td>\r\n</tr>\r\n</tbody>\r\n</table>\r\n\r\n\r\n<!---\r\n@huboard:{\"milestone_order\":31.5,\"order\":45.0,\"custom_state\":\"\"}\r\n-->\r\n"},"comment":{"url":"https://api.github.com/repos/snaekobbi/issues/issues/comments/121016485","html_url":"https://github.com/snaekobbi/issues/issues/7#issuecomment-121016485","issue_url":"https://api.github.com/repos/snaekobbi/issues/issues/7","id":121016485,"user":{"login":"bertfrees","id":1167989,"avatar_url":"https://avatars.githubusercontent.com/u/1167989?v=3","gravatar_id":"","url":"https://api.github.com/users/bertfrees","html_url":"https://github.com/bertfrees","followers_url":"https://api.github.com/users/bertfrees/followers","following_url":"https://api.github.com/users/bertfrees/following{/other_user}","gists_url":"https://api.github.com/users/bertfrees/gists{/gist_id}","starred_url":"https://api.github.com/users/bertfrees/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/bertfrees/subscriptions","organizations_url":"https://api.github.com/users/bertfrees/orgs","repos_url":"https://api.github.com/users/bertfrees/repos","events_url":"https://api.github.com/users/bertfrees/events{/privacy}","received_events_url":"https://api.github.com/users/bertfrees/received_events","type":"User","site_admin":false},"created_at":"2015-07-13T18:31:08Z","updated_at":"2015-07-13T18:31:08Z","body":"I've updated the third column of the table with your feedback."}}