Espacio entre macros en \edef

Espacio entre macros en \edef

Me pregunto cómo conseguir un espacio entre dos macros en una edefdeclaración. Mi objetivo es guardar un nombre de archivo del formulario FirstName LastNameen una macro y luego usar esa macro en un includegraphicscomando.

El problema es que todo lo que intenté arroja un resultado no deseado.

\edef\PictureName{\FirstName \LastName}    ➞ "FirstNameLastName"
\edef\PictureName{\FirstName{} \LastName}  ➞ "FirstName{} LastName"
\edef\PictureName{{\FirstName} \LastName}  ➞ "{FirstName} LastName"
\edef\PictureName{\FirstName\ \LastName}   ➞ "FirstName\ LastName"

Por lo tanto, no se almacena espacio \PictureNameo se almacenan paréntesis adicionales o una barra invertida. ¿Cómo puedo hacer esto correctamente?

Respuesta1

El problema que ves es el habitual."TeX ignora los espacios después de las secuencias de control", sin embargo, aquí no se puede arreglar como lo haría al producir una salida tipográfica. En ese caso, cualquier método que separe el carácter de espacio de la secuencia de control (y producirá un espacio, por supuesto) en la entrada funcionará:

\FirstName{} \LastName
\FirstName{ }\LastName
{\FirstName} \LastName
\FirstName\ \LastName
\FirstName\space\LastName
\@firstofone{\FirstName} \LastName % assuming the usual definition of \@firstofone

sin embargo, aquí estás en un contexto de solo expansión y en este caso necesitas algo, una ficha de espacio o algo quese expandea una ficha de espacio, mientras la separa de la secuencia de control. Los métodos con llaves y con espacio de control no funcionan aquí porque las llaves no se expanden, por lo que no se ven afectadas por la \edefexpansión de '. Sí funcionan a la hora de componer porque en ese contexto (forman un grupo y) desaparecen. El espacio de control \tampoco se expande, así que \edefdéjalo como está.

Tanto Plain como LaTeX definen \def\space{ }, por lo que puedes hacer:

\edef\PictureName{\FirstName\space\LastName}

que, en el contexto de solo expansión de \edef, se expandirá \FirstName(sin siquiera mirar \spacetodavía), y luego se expandirá \spacea un token espacial y luego se expandirá \LastName.

El \@firstofonemétodo también funcionará porque \@firstofonetambién funciona mediante (una) expansión:

\edef\PictureName{\@firstofone{\FirstName} \LastName}

esto se expandirá \@firstofone{\FirstName}, que se convierte en \FirstName, que luego se expande también. Luego se ve la ficha de espacio y luego\LastName se expande. Vea esta pregunta relacionada:Conversión de caracteres espaciales en fichas espaciales.

Respuesta2

Para divertirnos,
tengamos dos tareas, no solo una.
Puedes jugar el juego
"reciclando" \PictureName:

P.ej:

\def\PictureName{ \LastName}%
\edef\PictureName{\FirstName\PictureName}%

O:

\def\PictureName{ }%
\edef\PictureName{\FirstName\PictureName\LastName}%

O:

\def\PictureName#1{%
  \edef\PictureName{\FirstName#1\LastName}%
}%
\PictureName{ }%

O:

\def\PictureName#1{#1}%
\edef\PictureName{\PictureName{\FirstName} \LastName}%

O:

\def\PictureName#1{#1}%
\edef\PictureName{\FirstName\PictureName{ \LastName}}%

O:

\def\PictureName#1{#1}%
\edef\PictureName{\FirstName\PictureName{} \LastName}%

O:

\def\PictureName#1{#1}%
\edef\PictureName{\FirstName\PictureName{ }\LastName}%

O:

\def\PictureName!{}%
\edef\PictureName{\FirstName\PictureName! \LastName}%

información relacionada