Un exemple complet
L’exemple següent defineix una ordre de marcatge per traçar un rectangle doble al voltant d’un fragment de text.
En primer lloc, ens cal construir un resultat aproximat utilitzant
marcatges. Una consulta a Ordres de marcatge de text ens mostra que és útil l’odre
\box
:
\markup \box \box HOLA![]()
Ara, considerem que és preferible tenir més separació entre el
text i els rectangles. Segons la documentació de \box
,
aquesta ordre usa una propietat box-padding
, el valor
predeterminat de la qual és 0.2. La documentació també menciona
com sobreescriure aquest valor:
\markup \box \override #'(box-padding . 0.6) \box A![]()
Després, l’emplenament o separació entre els dos rectangles ens sembla molt petit, així que també el sobreescriurem:
\markup \override #'(box-padding . 0.4) \box \override #'(box-padding . 0.6) \box A![]()
Repetir aquesta extensa ordre de marcatge un i un altre cop seria
un maldecap. Aquí és on cal una ordre de marcatge. Així doncs,
escrivim una ordre de marcatge double-box
, que agafa un
argument (el text). Dibuixa els dos rectangles i afegeix una
separació.
#(define-markup-command (double-box layout props text) (markup?) "Trazar un rectángulo doble rodeando el texto." (interpret-markup layout props #{\markup \override #'(box-padding . 0.4) \box \override #'(box-padding . 0.6) \box { #text }#}))
o, de forma equivalent,
#(define-markup-command (double-box layout props text) (markup?) "Trazar un rectángulo doble rodeando el texto." (interpret-markup layout props (markup #:override '(box-padding . 0.4) #:box #:override '(box-padding . 0.6) #:box text)))
text
és el nom de l’argument de l’ordre, i
markup?
és el tipus: l’identifica com un element de
marcatge. La funció interpret-markup
s’usa en gairebé
totes les ordres de marcatge: construeix un segell, usant
layout
, props
, i un element de marcatge. En el
segon cas, la marca es construeix usant el macro de l’Scheme
markup
, vegeu Construcció d’elements de marcatge a l’Scheme. La
transformació d’una expressió \markup
en una expressió de
marcatge de l’Scheme és directa.
L’ordre nova es pot usar com segueix:
\markup \double-box A
Fora bo fer una l’ordre double-box
que es pogués personalitzar
aquí, els valors d’emplenament box-padding
són fixos i no
es poden canviar per part d l’usuari. A més a més, fora millor
distingir la separació entre els dos rectangles, de l’emplenament
entre el rectangle intern i el text. Així docs, introduïm una
nova propietat, inter-box-padding
, per a l’emplenament
entre els rectangles. El box-padding
s’usarà per a
l’emplenament intern. Ara el codi nou és com es veu a
continuació:
#(define-markup-command (double-box layout props text) (markup?) #:properties ((inter-box-padding 0.4) (box-padding 0.6)) "Trazar un rectángulo doble rodeando el texto." (interpret-markup layout props #{\markup \override #`(box-padding . ,inter-box-padding) \box \override #`(box-padding . ,box-padding) \box { #text } #}))
De nou, la versió equivalent que utilitza la macro de marcatge seria:
#(define-markup-command (double-box layout props text) (markup?) #:properties ((inter-box-padding 0.4) (box-padding 0.6)) "Traç d'un rectangle doble rodejant el test." (interpret-markup layout props (markup #:override `(box-padding . ,inter-box-padding) #:box #:override `(box-padding . ,box-padding) #:box text)))
Aquí la paraula clau #:properties
s’usa de manera que les
propietats inter-box-padding
i box-padding
es
llegeixen a partir de l’argument props
, i se’ls
proporcionen uns valors predeterminats si les propietats no estan
definides.
Després, aquests valors s’usen per sobreescriure les propietats
box-padding
usades per les dues instruccions \box
.
Observeu l’apòstrof invertit i la coma a l’argument de
\override
: ens permeten introduir un valor de variable dins
d’una expressió literal.
Ara, l’ordre es pot usar dins d’un element de marcatge, i l’emplenament dels rectangles es pot personalitzar:
#(define-markup-command (double-box layout props text) (markup?) #:properties ((inter-box-padding 0.4) (box-padding 0.6)) "Traç d'un rectangle doble rodejant el text." (interpret-markup layout props #{\markup \override #`(box-padding . ,inter-box-padding) \box \override #`(box-padding . ,box-padding) \box { #text } #})) \markup \double-box A \markup \override #'(inter-box-padding . 0.8) \double-box A \markup \override #'(box-padding . 1.0) \double-box A![]()