Sintaxi de la definició d’ordre de marcatge (Extender LilyPond)

#### Sintaxi de la definició d’ordre de marcatge

Es poden definir ordres noves de marcatge usant el macro de l’Scheme `define-markup-command`, al nivell sintàctic superior.

    (define-markup-command (nom-ordre disposició props arg1 arg2 …)
        (tipus-arg1? tipus-arg2? …)
        [ #:properties ((propietat1 valor-predeterminat1)
                        …) ]
      …command body…)

Els arguments són

`nom-ordre`

  nom de l’ordre de marcatge

`layout`

  la definició de ‘disposició’.

`props`

  una llista de llistes associatives, que contenen totes les propietats actives.

`argi`

  argument i-éssim d’ordre

`tipus-argi?`

  predicat de tipus per a l’argument i-éssim

Si l’ordre utilitza propietats dels arguments `props`, es pot usar la paraula clau `#:properties` per especificar quines propietats es fan servir, així com els seus valors per defecte.

Els arguments es distingeixen segons el seu tipus:

- un marcatge, que correspon al predicat de tipus `markup?`;
- una llista de marcatges, que correspon al predicat de tipus `markup-list?`;
- qualsevol altre tipus de l’Scheme, que correspon a predicats de tipus com ara `list?`, `number?`, `boolean?`, etc.

No existeix cap limitació en l’ordre dels arguments (després dels arguments estàndard `layout` i `props`). No obstant això, les funcions de marcatge que agafen un element de marcatge com el seu últim argument són una mica especials perquè podem aplicar-les a una llista de marcatge i el resultat és una llista de marcatges on la funció de marcatge (amb els arguments antecedents especificats) s’ha aplicat a tots els elements de la llista de marcatges original.

Atès que la replicació dels arguments precedents per aplicar una funció de marcatge a una llista de marcatges és poc costosa principalment pels arguments de l’Scheme, s’eviten les caigudes de rendiment simplement mitjançant la utilització d’arguments de l’Scheme per als arguments antecedents de les funcions de marcatge que agafen un marcatge com el seu últim argument.

Les ordres de marcatge tenen un cicle de vida relativament complex. El cos de la definició d’una ordre de marcatge és responsable de la conversió dels arguments de l’ordre de marcatge en una expressió de segell que es retorna. Molt sovint això es fa cridant a la funció `interpret-markup` sobre una expressió de marcatge, i passant-li els arguments layout i props. En general aquests arguments es coneixen en una fase molt tardana de la composició tipogràfica. Les expressions de marcatge ja tenen els seus components muntats dins d’expressions de marcatge quan s’expandeixen les ordres `\markup` (dins de l’Scheme). L’avaluació i la comprovació de tipus dels arguments de l’ordre de marcatge es realitza en el moment en el qual s’interpreten `\markup` o `markup`.

Però la conversió real d’expressions de marcatge en expressions de segell mitjançant l’execució dels cossos en funció de marcatge sols es realitza quan es crida `interpret-markup` sobre una expressió de marcatge.

#### Extender LilyPond v2.26.0 (stable-branch).

- Appendix A Tutorial de l’Scheme
  - A.1 Introducció a l’Scheme
    - A.1.1 Banc de sorra de l’Scheme
    - A.1.2 Variables de l’Scheme
    - A.1.3 Tipus de dades simples de l’Scheme
    - A.1.4 Tipus de dades compostes de l’Scheme
      - Parelles
      - Llistes
      - Llistes associatives (llistes-A)
      - Taules de hash
    - A.1.5 Càlculs a l’Scheme
    - A.1.6 Procediments de l’Scheme
      - Definició de procediments
      - Predicats
      - Valors de retorn
    - A.1.7 Condicionals de l’Scheme
      - if
      - cond
  - A.2 Scheme dins del LilyPond
    - A.2.1 Sintaxi de l’Scheme del LilyPond
    - A.2.2 Variables del LilyPond
    - A.2.3 Variables d’entrada i l’Scheme
    - A.2.4 Importació de l’Scheme dins del LilyPond
    - A.2.5 Propietats dels objectes
    - A.2.6 Variables del LilyPond compostes
      - Desplaçaments
      - Fraccions
      - Dimensions
      - Llistes-A de propietats
      - Cadenes de llistes-A
    - A.2.7 Representació interna de la música
  - A.3 Construcció de funcions complicades
    - A.3.1 Presentació de les expressions musicals
    - A.3.2 Propietats musicals
    - A.3.3 Duplicació una nota amb lligadures (exemple)
    - A.3.4 Afegir articulacions a les notes (exemple)
- B Interfícies per a programadors
  - B.1 Blocs de codi del LilyPond
  - B.2 Funcions de l’Scheme
    - B.2.1 Definició de funcions de l’Scheme
    - B.2.2 Ús de les funcions de l’Scheme
    - B.2.3 Funcions de l’Scheme buides
  - B.3 Funcions musicals
    - B.3.1 Definicions de funcions musicals
    - B.3.2 Ús de les funcions musicals
    - B.3.3 Funcions de substitució senzilles
    - B.3.4 Funcions de substitució intermèdies
    - B.3.5 Matemàtiques dins de les funcions
    - B.3.6 Funcions sense arguments
    - B.3.7 Funcions musicals buides
  - B.4 Funcions d’esdeveniments
  - B.5 Funcions de marcatge
    - B.5.1 Construcció d’elements de marcatge a l’Scheme
    - B.5.2 Com funcionen internament els elements de marcatge
    - B.5.3 Definició d’una ordre nova de marcatge
      - Sintaxi de la definició d’ordre de marcatge
      - Quant a les propietats
      - Un exemple complet
      - Adaptació d’ordres incorporades
    - B.5.4 Definició de noves ordres de llista de marcatge
  - B.6 Contextos per a programadors
    - B.6.1 Avaluació de contextos
    - B.6.2 Execució d’una funció sobre tots els objectes de la presentació
  - B.7 Funcions de callback
  - B.8 Ajustaments difícils
- C Interfícies de l’Scheme del LilyPond
- Appendix D GNU Free Documentation License
- Appendix E Índex del LilyPond