@end ignore
+@item
+The markup-list-command @code{\table} is now available.
+Each column may be aligned differently.
+@lilypond[quote,verbatim]
+\markuplist {
+ \override #'(padding . 2)
+ \table
+ #'(0 1 0 -1)
+ {
+ \underline { center-aligned right-aligned center-aligned left-aligned }
+ one "1" thousandth "0.001"
+ eleven "11" hundredth "0.01"
+ twenty "20" tenth "0.1"
+ thousand "1000" one "1.0"
+ }
+}
+@end lilypond
+
@item
A new page breaking function @code{ly:one-line-auto-height-breaking}
places a whole score on a single line and changes the page width
@unnumberedsubsec Updating @code{git-cl}
LilyDev users should make sure that they always have the latest
-version of git-cl installed. It is possible that changes may have been
-made to git-cl that are not (yet) included in the version of LilyDev has
-been installed.
+version of git-cl installed. It is possible that changes have been
+made to git-cl that are not (yet) included in the version of LilyDev
+that you are using.
@noindent
Using a terminal run the following commands:
@subsubheading Set up login accounts
-Because the @code{git-cl} updates two separate websites (Google's
-Rietveld Code Review Tool and LilyPond's issue tracker) you @emph{must}
-have a valid user login and password to both sites.
+Because @code{git-cl} updates two separate websites (Google's Rietveld
+Code Review Tool and LilyPond's issue tracker) you @emph{must} have a
+valid user account (login and password) for both sites.
@noindent
-Although that it may appear that you have to use a @q{Google} email
-address for the Rietveld Code Review Tool when you sign up, you can
-instead select the option @qq{I prefer to use my current email address}
-during sign up.
+For the Rietveld Code Review Tool you will need a Google account. Note
+that a Google account does not require that you have or use a @q{Google}
+email address. You can use @emph{any} email address for your Google
+account. Just select the option @qq{I prefer to use my current email
+address} when you sign up.
+
+@warning{In order for @code{git-cl} to work, your Google Account
+Settings must have the @q{Access for less secure apps} set to
+@q{Allowed}. This is normally the default setting.}
@noindent
-For a user login to the LilyPond issue tracker, please send your
-request, preferably using the email address you want to use for your
-login, to the LilyPond Developer's mailing list
-(@code{lilypond-devel@@gnu.org}).
+For the LilyPond issue tracker, please request a user account by sending
+an email to the LilyPond Developer's mailing list
+(@code{lilypond-devel@@gnu.org}), preferably using the same email
+address that you want to use for your user login.
@subsubheading Authorising git-cl for the LilyPond issue tracker
@enumerate
@item
-Once a valid login has been given for the LilyPond issye tracker, go to
-the @q{Account settings} and select the @q{OAuth} tab.
+Once you have been given a valid login for the LilyPond issue tracker,
+go to the @q{Account settings} and select the @q{OAuth} tab.
@item
Locate the @q{Register New Application} section and enter @code{git-cl}
@q{git-cl} listed under the @q{My Applications} section.
@item
-Click on the @q{Generate Bearer Token} button. You should now see
+Click on the @q{Generate Bearer Token} button. You should now see
@q{git-cl} listed under the @q{Authorized Applications} section along
with a value for the @q{Bearer Token} entry. This value is used, in the
next steps, to allow git-cl to access and update the LilyPond issue
@enumerate
@item
-Using a terminal, move to top source directory of the
-@code{$LILYPOND_GIT} directory and then run @code{git-cl} with the
-@code{config} option:
+Using a terminal, move to the top level of the @code{$LILYPOND_GIT}
+directory and then run @code{git-cl} with the @code{config} option:
@example
cd $LILYPOND_GIT
git-cl config
@end example
+@noindent
+You will see a series of prompts. For most of them you can simply
+accept the default value by responding with a newline (i.e. by pressing
+return or enter).
+
@item
-When prompted for the @code{Rietveld server}:
+The prompt for the @code{Rietveld server} (the patch review tool), which
+defaults to @code{codereview.appspot.com}
@example
Rietveld server (host[:port]) [codereview.appspot.com]:
@end example
@item
-When prompted for the @code{Allura server} (the LilyPond issue tracker):
+The prompt for the @code{Allura server} (the issue tracker), which
+defaults to @code{https://sourceforge.net/p/testlilyissues/issues/}
@example
Allura server [https://sourceforge.net/p/testlilyissues/issues/]:
@item
When prompted for the @code{Allura bearer token} copy/paste the value
generated in the previous steps for
-@emph{Authorising git-cl for the LilyPond issue tracker}:
+@emph{Authorising git-cl for the LilyPond issue tracker}
@smallexample
-Allura bearer token (see https://sourceforge.net/auth/oauth/) [fdbfca60801533465480]:
+Allura bearer token (see https://sourceforge.net/auth/oauth/): fdbfca60801533465480
@end smallexample
-@warning{The above is a @q{fake} bearer token just to illustrate the
-example. Do not use this value.}
+@warning{The above is a @q{fake} bearer token used just for
+illustration. Do not use this value.}
@item
-Finally, when prompted for the @code{CC list} entry, add the LilyPond
-Developer's group email.
+Finally, the prompt for the @code{CC list}, which defaults to
+@code{lilypond-devel@@gnu.org}, the LilyPond Developer's email list.
@example
CC list ("x" to clear) [lilypond-devel@@gnu.org]:
@uref{http://codereview.appspot.com/}
@end example
-@subsubheading @command{git-cl} install
-
-LilyDev users should skip over these @q{install} instructions.
-
-@enumerate
-
-@item
-Install @command{git-cl} by entering:
-
-@example
-git clone https://github.com/gperciva/git-cl.git
-@end example
-
-If that command fails for some reason, try this instead:
-
-@example
-git clone git://github.com/gperciva/git-cl.git
-@end example
-
-@item
-Add the @file{git-cl/} directory to your PATH,
-or create a symbolic link to the @command{git-cl}
-and @command{upload.py} scripts in one of your PATH
-directories (such as @file{$HOME/bin}).
-
-In GNU/Linux you can add directories to PATH
-by adding this line to a hidden file @file{.bashrc},
-located in your home directory:
-
-@example
-PATH=~/type-here-directory-containing-git-cl:"$@{PATH@}"
-@end example
-
-@end enumerate
-
-@subsubheading @command{git-cl} configuration
-
-LilyDev users should perform these @q{configuration} instructions.
-
-@enumerate
-@item
-You must own a Google account login; please create one if you do not
-have one already.
-
-@noindent
-Note that a google account does not need to be a Gmail account; you can
-use @emph{any} email address for your google account when you sign up.
-
-@warning{In order for @code{git-cl} to work as expected, your Google
-Account Settings must have the @q{Access for less secure apps} set to
-@q{Allowed}. This is normally the default setting.}
-
-@item
-Move into the top source directory and then configure
-@command{git-cl} with the following commands:
-
-@example
-cd $LILYPOND_GIT
-git-cl config
-@end example
-
-For the @qq{Rietveld server} question, the default value
-(@qq{codereview.appspot.com}) should be accepted by
-answering with a newline (CR).
-
-The @qq{CC list} question should be answered with:
-
-@example
-lilypond-devel@@gnu.org
-@end example
-
-The @qq{Tree status URL} value should be left blank. So should
-the @qq{ViewVC URL} value, since it is used by @command{git-cl
-dcommit} which is only for repositories which use @command{git
-svn} (LilyPond doesn't).
-
-@end enumerate
-
-@subsubheading Uploading patch set
-
-This section assumes that you have already configured the
-@command{git-cl} @q{helper-script}. See @ref{git-cl}.
+You can upload a patch for review by using our custom @code{git-cl}
+@q{helper-script}. This section assumes you have already installed,
+updated, and configured @code{git-cl}. See @ref{git-cl}.
@warning{Unless you are familiar with branches, only work on one
set of changes at once.}
@noindent
where <reference SHA1 ID> is the SHA1 ID of the commit to be used
as a reference source for the patch. Generally, this will be the
-SHA1 ID of origin/master, and in that case the command:
+SHA1 ID of origin/master, and in that case you can just use the command:
@example
git-cl upload origin/master
@end example
-@noindent
-can be used.
-
@end itemize
First you will see a terminal editor where you can edit the
"Like @code{\\override}, for markup lists."
(interpret-markup-list layout (cons (list new-prop) props) args))
+(define-markup-list-command (table layout props column-align lst)
+ (number-list? markup-list?)
+ #:properties ((padding 0)
+ (baseline-skip))
+ "@cindex creating a table.
+
+Returns a table.
+
+@var{column-align} specifies how each column is aligned, possible values are
+-1, 0, 1. The number of elements in @var{column-align} determines how many
+columns will be printed.
+The entries to print are given by @var{lst}, a markup-list. If needed, the last
+row is filled up with @code{point-stencil}s.
+Overriding @code{padding} may be used to increase columns horizontal distance.
+Overriding @code{baseline-skip} to increase rows vertical distance.
+@lilypond[verbatim,quote]
+\\markuplist {
+ \\override #'(padding . 2)
+ \\table
+ #'(0 1 0 -1)
+ {
+ \\underline { center-aligned right-aligned center-aligned left-aligned }
+ one \number 1 thousandth \number 0.001
+ eleven \number 11 hundredth \number 0.01
+ twenty \number 20 tenth \number 0.1
+ thousand \number 1000 one \number 1.0
+ }
+}
+@end lilypond
+"
+
+ (define (split-lst initial-lst lngth result-lst)
+ ;; split a list into a list of sublists of length lngth
+ ;; eg. (split-lst '(1 2 3 4 5 6) 2 '())
+ ;; -> ((1 2) (3 4) (5 6))
+ (cond ((not (integer? (/ (length initial-lst) lngth)))
+ (ly:warning
+ "Can't split list of length ~a into ~a parts, returning empty list"
+ (length initial-lst) lngth)
+ '())
+ ((null? initial-lst)
+ (reverse result-lst))
+ (else
+ (split-lst
+ (drop initial-lst lngth)
+ lngth
+ (cons (take initial-lst lngth) result-lst)))))
+
+ (define (dists-list init padding lst)
+ ;; Returns a list, where each element of `lst' is
+ ;; added to the sum of the previous elements of `lst' plus padding.
+ ;; `init' will be the first element of the resulting list. The addition
+ ;; starts with the values of `init', `padding' and `(car lst)'.
+ ;; eg. (dists-list 0.01 0.1 '(1 2 3 4)))
+ ;; -> (0.01 1.11 3.21 6.31 10.41)
+ (if (or (not (number? init))
+ (not (number? padding))
+ (not (number-list? lst)))
+ (begin
+ (ly:warning
+ "not fitting argument for `dists-list', return empty lst ")
+ '())
+ (reverse
+ (fold (lambda (elem rl) (cons (+ elem padding (car rl)) rl))
+ (list init)
+ lst))))
+
+ (let* (;; get the number of columns
+ (columns (length column-align))
+ (init-stils (interpret-markup-list layout props lst))
+ ;; If the given markup-list is the result of a markup-list call, their
+ ;; length may not be easily predictable, thus we add point-stencils
+ ;; to fill last row of the table.
+ (rem (remainder (length init-stils) columns))
+ (filled-stils
+ (if (zero? rem)
+ init-stils
+ (append init-stils (make-list (- columns rem) point-stencil))))
+ ;; get the stencils in sublists of length `columns'
+ (stils
+ (split-lst filled-stils columns '()))
+ ;; procedure to return stencil-length
+ ;; If it is nan, return 0
+ (lengths-proc
+ (lambda (m)
+ (let ((lngth (interval-length (ly:stencil-extent m X))))
+ (if (nan? lngth) 0 lngth))))
+ ;; get the max width of each column in a list
+ (columns-max-x-lengths
+ (map
+ (lambda (x)
+ (apply max 0
+ (map
+ lengths-proc
+ (map (lambda (l) (list-ref l x)) stils))))
+ (iota columns)))
+ ;; create a list of (basic) distances, which each column should
+ ;; moved, using `dists-list'. Some padding may be added.
+ (dist-sequence
+ (dists-list 0 padding columns-max-x-lengths))
+ ;; Get all stencils of a row, moved accurately to build columns.
+ ;; If the items of a column are aligned other than left, we need to
+ ;; move them to avoid collisions:
+ ;; center aligned: move all items half the width of the widest item
+ ;; right aligned: move all items the full width of the widest item.
+ ;; Added to the default-offset calculated in `dist-sequence'.
+ ;; `stencils-for-row-proc' needs four arguments:
+ ;; stil - a stencil
+ ;; dist - a numerical value as basic offset in X direction
+ ;; column - a numerical value for the column we're in
+ ;; x-align - a numerical value how current column should be
+ ;; aligned, where (-1, 0, 1) means (LEFT, CENTER, RIGHT)
+ (stencils-for-row-proc
+ (lambda (stil dist column x-align)
+ (ly:stencil-translate-axis
+ (ly:stencil-aligned-to stil X x-align)
+ (cond ((member x-align '(0 1))
+ (let* (;; get the stuff for relevant column
+ (stuff-for-column
+ (map
+ (lambda (s) (list-ref s column))
+ stils))
+ ;; get length of every column-item
+ (lengths-for-column
+ (map lengths-proc stuff-for-column))
+ (widest
+ (apply max 0 lengths-for-column)))
+ (+ dist (/ widest (if (= x-align 0) 2 1)))))
+ (else dist))
+ X)))
+ ;; get a list of rows using `ly:stencil-add' on a list of stencils
+ (rows
+ (map
+ (lambda (stil-list)
+ (apply ly:stencil-add
+ (map
+ ;; the procedure creating the stencils:
+ stencils-for-row-proc
+ ;; the procedure's args:
+ stil-list
+ dist-sequence
+ (iota columns)
+ column-align)))
+ stils)))
+ (space-lines baseline-skip rows)))
+
(define-markup-list-command (map-markup-commands layout props compose args)
(procedure? markup-list?)
"This applies the function @var{compose} to every markup in