B.5.1 Construcción de elementos de marcado en Scheme (Extender LilyPond)

#### B.5.1 Construcción de elementos de marcado en Scheme

Las expresiones de marcado se representan internamente en Scheme usando el macro `markup`:

    (markup expr)

Para ver una expresión de marcado en su forma de Scheme, utilice la instrucción `\displayScheme`:

    \displayScheme
    \markup {
      \column {
        \line { \bold \italic "hola" \raise #0.4 "mundo" }
        \larger \line { fulano fulanito menganito }
      }
    }

La compilación del código anterior envía a la consola lo siguiente:

    (markup
      #:line
      (#:column
       (#:line
        (#:bold (#:italic "hola") #:raise 0.4 "mundo")
        #:larger
        (#:line ("fulano" "fulanito" "menganito")))))

Para evitar que el marcado se imprima en la página, use ‘`\void \displayScheme marcado`’. Asimismo, como ocurre con la instrucción `\displayMusic`, la salida de `\displayScheme` se puede guardar en un archivo externo. Véase Presentación de las expresiones musicales.

Este ejemplo muestra las principales reglas de traducción entre la sintaxis del marcado normal de LilyPond y la sintaxis del marcado de Scheme. La utilización de `#{ … #}` para escribir en la sintaxis de LilyPond será con frecuencia lo más conveniente, pero explicamos cómo usar la macro `markup` para obtener una solución sólo con Scheme.

> LilyPond | Scheme
> `\markup marcado1` | `(markup marcado1)`
> `\markup { marcado1 marcado2 … }` | `(markup marcado1 marcado2 …)`
> `\instrucción` | `#:instrucción`
> `\variable` | `variable`
> `\center-column { … }` | `#:center-column (… )`
> `cadena` | `"cadena"`
> `#argumento-de-scheme` | `argumento-de-scheme`

Todo el lenguaje Scheme está accesible dentro del macro `markup`. Por ejemplo, podemos usar llamadas a funciones dentro de `markup` para así manipular cadenas de caracteres. Esto es útil si se están definiendo instrucciones de marcado nuevas (véase Definición de una instrucción de marcado nueva).

#### Advertencias y problemas conocidos

El argumento markup-list de instrucciones como `#:line`, `#:center-column` y `#:column` no puede ser una variable ni el resultado de la llamada a una función.

    (markup #:line (funcion-que-devuelve-marcados))

no es válido. Hay que usar las funciones `make-line-markup`, `make-center-column-markup` o `make-column-markup` en su lugar:

    (markup (make-line-markup (funcion-que-devuelve-marcados)))

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

- Appendix A Tutorial de Scheme
  - A.1 Introducción a Scheme
    - A.1.1 Cajón de arena de Scheme
    - A.1.2 Variables de Scheme
    - A.1.3 Tipos de datos simples de Scheme
    - A.1.4 Tipos de datos compuestos de Scheme
      - Parejas
      - Listas
      - Listas asociativas (listas-A)
      - Tablas de hash
    - A.1.5 Cálculos en Scheme
    - A.1.6 Procedimientos de Scheme
      - Definir procedimientos
      - Predicados
      - Valores de retorno
    - A.1.7 Condicionales de Scheme
      - if
      - cond
  - A.2 Scheme dentro de LilyPond
    - A.2.1 Sintaxis del Scheme de LilyPond
    - A.2.2 Variables de LilyPond
    - A.2.3 Depuración del código de Scheme
    - A.2.4 Variables de entrada y Scheme
    - A.2.5 Importación de Scheme dentro de LilyPond
    - A.2.6 Propiedades de los objetos
    - A.2.7 Variables de LilyPond compuestas
      - Desplazamientos
      - Fracciones
      - Dimensiones
      - Listas-A de propiedades
      - Cadenas de listas-A
    - A.2.8 El modelo de caja de LilyPond
    - A.2.9 Representación interna de la música
  - A.3 Construir funciones complicadas
    - A.3.1 Una primera aproximación (ejemplo)
    - A.3.2 Presentación de las expresiones musicales
    - A.3.3 Propiedades musicales
    - A.3.4 Duplicar una nota con ligaduras (ejemplo)
    - A.3.5 Añadir articulaciones a las notas (ejemplo)
- B Interfaces para programadores
  - B.1 Bloques de código de LilyPond
  - B.2 Funciones de Scheme
    - B.2.1 Definición de funciones de Scheme
    - B.2.2 Uso de las funciones de Scheme
    - B.2.3 Funciones de Scheme vacías
  - B.3 Funciones musicales
    - B.3.1 Definiciones de funciones musicales
    - B.3.2 Uso de las funciones musicales
    - B.3.3 Funciones de sustitución sencillas
    - B.3.4 Funciones de sustitución intermedias
    - B.3.5 Matemáticas dentro de las funciones
    - B.3.6 Funciones sin argumentos
    - B.3.7 Funciones musicales vacías
  - B.4 Funciones de eventos
  - B.5 Funciones de marcado
    - B.5.1 Construcción de elementos de marcado en Scheme
    - B.5.2 Cómo funcionan internamente los elementos de marcado
    - B.5.3 Definición de una instrucción de marcado nueva
      - Sintaxis de la definición de instrucciones de marcado
      - Acerca de las propiedades
      - Un ejemplo completo
      - Adaptación de instrucciones incorporadas
      - Convertir elementos de marcado en cadenas
    - B.5.4 Definición de nuevas instrucciones de lista de marcado
  - B.6 Contextos para programadores
    - B.6.1 Evaluación de contextos
    - B.6.2 Ejecutar una función sobre todos los objetos de la presentación
  - B.7 Funciones de callback
  - B.8 Contenedores Unpure-pure
  - B.9 Trucos difíciles
- C Interfaces de Scheme de LilyPond
- Appendix D GNU Free Documentation License
- Appendix E Índice