[1mdiff --git a/Documentation/en/contributor/programming-work.itexi b/Documentation/en/contributor/programming-work.itexi[m
[1mindex cc7a151e08..9a07b535d9 100644[m
[1m--- a/Documentation/en/contributor/programming-work.itexi[m
[1m+++ b/Documentation/en/contributor/programming-work.itexi[m
[36m@@ -24,6 +24,8 @@[m
@node Overview of LilyPond architecture[m
@section Overview of LilyPond architecture[m

[32m@center @sourceimage{architecture-diagram,6cm,,png}[m

LilyPond processes the input file into graphical and musical output in a[m
number of stages.  This process, along with the types of routines that[m
accomplish the various stages of the process, is described in this section.  A[m
[36m@@ -37,16 +39,19 @@[m [mexpressions in Scheme format.  In Scheme format, a music expression is a list[m
in tree form, with nodes that indicate the relationships between various music[m
events.  The LilyPond parser is written in Bison.[m

The second stage of LilyPond processing is @emph{iterating}.[31m  [m
Iterating[32m [massigns each music event to a context, which is the[31m [m
environment in which the[32m [mmusic [31mwill b[m[32mg[me[32mts[m finally engraved.  The context[31m [m
is responsible for all further[32m [mprocessing of the music.  It is[31m [m
during the iteration stage that contexts are[32m [mcreated as necessary[31m [m
to ensure that every note has a [32m@code{[mVoice[32m}[m type context (e.g.[32m,[m
[32m@code{[mVoice[32m}[m, [32m@code{[mTabVoice[32m}[m, [32m@code{[mDrumVoice[32m}[m, [32m@code{[mCueVoice[32m}[m,
[31m [m[32m@code{[mMensuralVoice[32m}[m, [32m@code{[mVaticanaVoice[32m}[m,
[32m@code{[mGregorianTranscriptionVoice[32m}[m), that the [32m@code{[mVoice[32m}[m type[31m [m
contexts exist in[32m [mappropriate [32m@code{[mStaff[32m}[m type contexts, and that[31m [m
parallel [32m@code{[mStaff[32m}[m type contexts exist[32m [min [32m@code{[mStaffGroup[31m [m[32m}[m
type contexts.  In addition, during the iteration stage each[32m [mmusic[31m [m
event is assigned a moment, or a time in the music when the event
begins.[m

Each type of music event has an associated iterator.  Iterators are defined in[m
[36m@@ -54,19 +59,18 @@[m [mEach type of music event has an associated iterator.  Iterators are defined in[m
event's iterator is called to deliver that music event to the appropriate[m
context(s).[m

The final stage of LilyPond processing is @emph{translation}.[31m  [m
During[32m [mtranslation, music events are prepared for graphical or[31m [m
midi output.  The[32m [mtranslation step is accomplished by the[31m [m
polymorphic base class [32m@code{[mTranslator[32m} [mthrough its two derived[31m [m
classes: [32m@code{[mEngraver[32m}[m (for graphical output) and
[32m@code{[mPerformer[32m}[m (for midi output).

Translators are defined in C++ files named @file{*-engraver.cc}[m
and @file{*-performer.cc}.[m
Much of the work of translating is handled by Scheme functions,[m
which is one of the keys to LilyPond's exceptional flexibility.[m

[31m@sourceimage{architecture-diagram,,,png}[m


@node LilyPond programming languages[m
@section LilyPond programming languages[m
[36m@@ -118,14 +122,14 @@[m [mGUILE Reference Manual} is available online.[m

@uref{http://mitpress.mit.edu/sicp/full-text/book/book.html, Structure and[m
Interpretation of Computer Programs}, a popular textbook used to teach[m
programming in Scheme[32m,[m is available in its entirety online.

An introduction to G[31muile[m[32mUILE[m/Scheme as used in LilyPond can be found in the
@rextend{Scheme tutorial}.[m

@subsection MetaFont[m

[31mMetaFont is used to create t[m[32mT[mhe music fonts used by LilyPond[32m are created with MetaFont[m.  A MetaFont
tutorial is available at @uref{http://metafont.tutorial.free.fr/, the[m
METAFONT tutorial page}.[m

[36m@@ -139,7 +143,9 @@[m [mReference} is available online in PDF format.[m

@subsection Python[m

[31mPy[m[32mVarious scripts [mth[32mat acc[mo[32mmpa[mn[32my[m [32mL[mi[31ms use[m[32mlyPon[md[32m,[m for [31mXML[m[32mexample[m
[32m@command{musicxml[m2ly[32m}[m [32mor @comm[mand[32m{lilypond-book}, are[m [32mwr[mi[32mtten in[m
[32mPython.  It is al[ms[32mo[m used for building the documentation and the
website.[m

Python documentation is available at @uref{http://www.python.org/doc/,[m
[36m@@ -164,18 +170,19 @@[m [mchanges are described in this section.[m

@subsection Modifying distribution files[m

Much of LilyPond is written in Scheme or LilyPond input files.[31m  [m
These[32m [mfiles are interpreted when the program is run, rather than[31m [m
being compiled[32m [mwhen the program is built, and are present in all[31m [m
LilyPond distributions.[32m  [mYou [31mwill[m[32mcan[m find @file{.ly} files in the[31m [m
@file{ly/} directory and the Scheme files in the[32m [m@file{scm/}[31m [m
directory.  Both Scheme [31mfiles [mand @file{.ly} files can be modified and
saved with any text editor.  It[31m'[m[32m i[ms probably wise to make a backup[31m [m
copy of[32m [myour files before you modify them, although you can[31m [m
reinstall if the[32m [mfiles become corrupted.

Once you[31m'[m[32m ha[mve modified the files, you can test the changes just by running
LilyPond on some input file.  It[31m'[m[32m i[ms a good idea to create a file that
demonstrates the feature you[31m'[m[32m a[mre trying to add.  This file will eventually
become a regression test and will be part of the LilyPond distribution.[m

@subsection Desired file formatting[m
[36m@@ -185,10 +192,10 @@[m [mendings (LF), rather than DOS (CR+LF) or MacOS 9 and earlier (CR).  Make[m
sure you use the necessary tools to ensure that Unix-style line endings are[m
preserved in the patches you create.[m

Tab characters should not be included in files for distribution.[31m  [m
All[32m [mindentation should be done with spaces.  Most editors [31mhave settings to[mallow[31m [m
the [31msetti[m[32mco[mn[31mg[m[32mtrol[m of tab stop[31ms[m [31ma[m[32msetti[mn[31md[m[32mgs,[m ensuring that no tab characters[31m [m
are[32m [mincluded in the file.

Scheme files and LilyPond files should be written according to standard[m
style guidelines.  Scheme file guidelines can be found at[m
[36m@@ -218,39 +225,41 @@[m [mThis can be a very helpful tool for deciding which directories to search[m
when looking for a function.[m


@subsection Using [32m@code{[mgrep[32m}[m [31mt[m[32mf[mo[32mr[m search[32ming[m

Having identified a likely subdirectory to search, the [32m@code{[mgrep[31m [m[32m}[m
utility can[32m [mbe used to search for a function name.  The format of[31m [m
the [32m@code{[mgrep[32m}[m command is

@example[m
grep -i [32m@var{[mfunctionName[32m}[m subdirectory/*
@end example[m

This command [31mwill [msearch[32mes[m all the contents of the directory
[31m [m[32m@code{[msubdirectory/[32m} [mand display[32ms[m every line in any of the files[31m [m
that contains[32m @var{[mfunctionName[32m}[m.  The @option{-i} option makes[31m [m
@command{grep} ignore[32m [mcase -- this can be very useful if you are[31m [m
not yet familiar with[32m [mour capitalization conventions.

The most likely directories to grep for function names are[31m [m
@file{scm/} for[32m [mscheme files, [32m@file{[mly/[32m}[m for [31ml[m[32mL[mily[31mp[m[32mP[mond input[31m [m
(@file{*.ly}) files, and @file{lily/} for C++[32m [mfiles.


@subsection Using [32m@code{[mgit grep[32m}[m [31mt[m[32mf[mo[32mr[m search[32ming[m

If you have used git to obtain the source, you have access to a[m
powerful tool to search for functions.  The command:[m

@example[m
git grep [32m@var{[mfunctionName[32m}[m
@end example[m

[31mwill [msearch[32mes[m through all of the files that are present in the git
repository looking for @var{functionName}.  It also presents the[31m [m
results[32m [mof the search using @code{less}, so the results are[31m [m
displayed one page[32m [mat a time.


@subsection Searching on the git repository at GitLab and Savannah[m

[36m@@ -262,11 +271,13 @@[m [mGitLab's web interface provides a built-in search.[m
Go to @uref{https://gitlab.com/lilypond/lilypond/}[m

@item[m
Type @var{functionName} in the search box on the top, and hit[31m [m
enter/return[32m.[m

@end itemize[m

Alternatively you can also use the equivalent of [32m@code{[mgit grep[31m [m[32m}[m
on the Savannah server.

@itemize[m

[36m@@ -274,14 +285,14 @@[m [mAlternatively you can also use the equivalent of git grep on the Savannah server[m
Go to @uref{https://git.sv.gnu.org/gitweb/?p=lilypond.git}[m

@item[m
In the pulldown box that says [32m@q{[mcommit[32m}[m, select [32m@q{[mgrep[32m}[m.

@item[m
Type @var{functionName} in the search box, and hit enter/return[32m.[m

@end itemize[m

This [31mwill [minitiate[32ms[m a search of the remote git repository.


@node Code style[m
[36m@@ -305,7 +316,8 @@[m [msource code.[m
@node Languages[m
@subsection Languages[m

C++ and Python are preferred.  Python code should use
[32m@uref{https://www.python.org/dev/peps/pep-0008/,[m PEP 8[32m}[m.


@node Filenames[m
