Pregunta:
¿Cuál es la diferencia entre los comandos \let
y \def
en TeX / LaTeX?
Idealmente, proporcione un ejemplo simple que ilustre la diferencia entre ellos.
Respuesta:
La diferencia está en el momento en que se evalúa el "lado derecho".
Por lo tanto, \let\foo\bar
define \foo
para que tenga el valor que \bar
tenía en el punto de definición . Por otro lado, \def\foo{\bar}
en efecto define \foo
para que tenga el valor que \bar
tiene en el punto de uso .
Considerar:
\def\bar{hello}
\let\fooi\bar
\def\fooii{\bar}
\fooi +\fooii
\def\bar{goodbye}
\fooi +\fooii
Esto produce
hello+hello
hello+goodbye
Este es un proceso simple.
Sin embargo, también es sutil, por lo que podría valer la pena destacar algunos puntos clave:
-
Cuando TeX encuentra secuencias de control como
\fooi
, las evalúa; si estas son macros (es decir, han sido definidas por\def
, o\let
igual a algo que fue definido por\def
), entonces el resultado es que se expandirán a otros tokens, que TeX examinará a su vez, y así sucesivamente, de forma recursiva, hasta que lo que queda son secuencias de control 'primitivas' o letras (estoy simplificando un poco). -
\fooi
expande directamente a los caractereshello
(porque\bar
lo hizo inicialmente y\fooi
se definió para tener el mismo valor ). -
\fooii
, por el contrario, se expande a\bar
, que luego se vuelve a examinar y expandir inmediatamente . En el primer caso,\bar
expande ahello
y en el segundo caso agoodbye
. La definición de\fooii
no ha cambiado, pero\bar
se ha redefinido en el medio. -
Tener una idea clara del proceso de esta expansión recursiva es muy útil para aprender a desarrollar y depurar macros TeX.