¿\ Def y \ definen lo mismo en ConTeXt?

¿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

  • Por lo que veo, \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.

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) y luatex-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).

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *