Puede, de hecho, conseguir exactamente lo que quiere:
\newcommand{\dialogueline}{\begingroup\catcode`\^^M=12 \[email protected]}
{\catcode`\^^M=12\gdef\[email protected]#1#2^^M{\begin{dialogue}{#1}#2\end{dialogue}\endgroup}}
Este código tiene que ser \makeatletter
-protected — ya sea rodeado de \makeatletter
/\makeatother
(edición: este significa que pone \makeatletter
antes de la definición, y \makeatother
después de ella), o en un archivo .sty
. Tenga en cuenta que un entorno denominado dialogue
define un comando llamado \dialogue
, por lo que necesita un nombre diferente. ¡No cambie el formato!
La forma en que funciona es que \dialogueline
es un comando que no toma argumentos, sino que se expande a múltiples secuencias. Primero, un token de apertura de grupo, para poner lo que sigue en su propio alcance. En segundo lugar, la secuencia \catcode`^^M=12
. LaTeX asigna a cada letra un catcode: un número que dice de qué tipo es. Por ejemplo, la barra diagonal inversa es catcode 0, el constructor del nombre de comando; las letras son catcode 11; y los caracteres de impresión que no son letras, como el signo at, son catcode 12. Esta secuencia hace ^^M
, el carácter de nueva línea, tiene catcode 12, por lo que podemos interactuar con él. Finalmente, escribimos el comando \[email protected]
, que hace el trabajo pesado.
A continuación, definimos \[email protected]
. Lo hacemos dentro de un grupo donde el carácter de nueva línea es catcode 12, tal como será donde se expande \dialogueline
. Tenga en cuenta que esta es la razón por la que no puede dividir la segunda línea con una nueva línea — que se interpretaría como texto. Luego, definimos \[email protected]
para tomar dos argumentos, finalizando con una nueva línea; se expande tomando el primer argumento (que pasa entre llaves) y pasándolo como un argumento al entorno dialogue
, y pasando el segundo argumento (todo después del primero y antes del final de la línea) como el cuerpo del entorno. Finalmente, \[email protected]
finaliza el grupo abierto en \dialogueline
, por lo que el cambio al código de cat de ^^M
no está visible en ningún otro lado. Dado esto, puede escribir
\dialogueline{Johnny} Some dialogue.
\dialogueline{Jane} I see.
y todo debería funcionar.
dependiendo del editor que use, es posible que también desee buscar en un paquete de fragmentos de código. – Mica
+1 Esta es una pregunta realmente interesante – Geoff