¿Existe alguna diferencia entre definir una variable usando \def
y usar \define
, cuando se usa sin un número entre corchetes, p. ej. \def\somecommand{\percent}
y \define\somecommand{\percent}
? ¿Puedo usar siempre \define
en lugares donde \def
pueda usarse?
Comentarios
Responder
Como referencia: hay dos definiciones de \define
: la primera en syst-aux.mkiv muestra el comportamiento que mencionó Egreg en su comentario: si la macro ya está definida, la deja como está. (Un complemento, \redefine
le permite sobrescribir la definición actual de macro independientemente de que esté en uso). Irónicamente, esta definición preliminar se sobrescribe sin nota tan pronto como se carga el formato core-sys.mkiv (mientras que \redefine
permanece para siempre).
El actual La definición de la macro \define
proporcionada por la interfaz de usuario no solo verifica las secuencias de control previamente definidas con el mismo nombre, sino que también sirve como una especie de notación corta para argumentos obligatorios. Tiene el esquema
\define [<digit>] <macro> {<definition>}
donde el primer argumento, un dígito, especifica el número de argumentos que la nueva macro va a aceptar. Obviamente, esto puede resultar en definiciones más cortas. A modo de comparación, el selector
\def\sevenofnine#1#2#3#4#5#6#7#8#9{#7} \starttext \sevenofnine abcdefghi\par \stoptext
requiere menos escritura con la macro \define
:
\define[9]\sevenofnine{#7}
Por lo tanto, estas definiciones pueden resultar en un código más legible, lo que siempre es bueno cuando se escribe TEX.
Desafortunadamente, \define
envoltorio quita gran parte de la expresividad de los \def
sencillos. En contexto, como habrá notado, las macros que toman argumentos opcionales son comunes con respecto a la interfaz de usuario. Por ejemplo, simplemente no puede reemplazar la segunda \def
inición en el siguiente fragmento con una expresión equivalente usando \define
:
\unprotect \def\myfoo{\dosingleempty\do_my_foo} \def\do_my_foo[#1]#2{% \iffirstargument{\bf\WORD#1}\fi #2\par% } \protect \starttext \myfoo{bar} \myfoo[foo]{bar} \stoptext
Esto se debe a que con \define
no puede especificar los delimitadores de argumentos (aquí: corchetes) necesarios para argumentos opcionales, por lo que básicamente sus macros se limitan a tomar solo argumentos obligatorios (entre corchetes). Por la misma razón, tampoco hay forma de definir entornos \{start|stop}something
baratos:
\let\stopfoo\relax \def\startfoo#1\stopfoo{\bgroup\bold#1\egroup} %%% ^^^^^^^^ not possible \starttext \startfoo bar \stopfoo \stoptext
(La interfaz de usuario para esto es \definestartstop
(cf. core-sys.mkiv ), de todos modos.)
Finalmente, hoy en día el inconveniente más importante de \define
es que no permite argumentos de estilo mkvi . Simplemente no hay forma de referirse a un parámetro por su nombre si no puede asignarle uno en primer lugar.
% macros=mkvi \unprotect \def\foo{\dosingleempty\do_foo} \def\do_foo[#optional]#mandatory{% \bgroup\sansbold#optional\space\egroup #mandatory\par% } \protect \starttext \foo{bar} \foo[foo]{bar} \stoptext
Entonces, si desea escribir una macro seriamente, pronto aprenderá a evitar \define
, mientras que es seguro para tareas menos complejas.
Comentarios
- Gracias por esta útil respuesta. Punto de aclaración: cuando dices " argumentos al estilo mkiv ", ¿eso significa argumentos con nombre, como en tu ejemplo? ¿Tiene una referencia sobre dónde puedo leer más sobre esos?
- @LarsH Sí, las macros Mk VI (¡no MkIV!) Son las que tienen nombres de parámetros (opcionales). No estoy seguro de que exista documentación a nivel de usuario además de la fuente: el código del preprocesador se puede encontrar en
luat-mac.lua
(para Contexto) yluatex-preprocessor.lua
para Luatex-Plain. Hth. - Lo siento, mi error.
- No ' no sé si este fue el caso en el momento de escribir esta respuesta, pero hoy las macros definidas usando
\define
están protegidas por e-TeX. Para que sea expandible, uno tiene que usar\defineexpandable
(o simple\def
).
\define\xyz{...}
, cuando\xyz
ya está definido emite una advertencia, pero realiza la definición de todas formas. Por supuesto,\def
no ' no emite ninguna advertencia.