
Me pregunto cómo conseguir un espacio entre dos macros en una edef
declaración. Mi objetivo es guardar un nombre de archivo del formulario FirstName LastName
en una macro y luego usar esa macro en un includegraphics
comando.
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 \PictureName
o 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 \edef
expansió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 \edef
dé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 \space
todavía), y luego se expandirá \space
a un token espacial y luego se expandirá \LastName
.
El \@firstofone
método también funcionará porque \@firstofone
tambié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}%