¿Es seguro ignorar las pestañas y las nuevas líneas al definir una macro?

¿Es seguro ignorar las pestañas y las nuevas líneas al definir una macro?

He escrito varios entornos LaTeX para formatear una secuencia de "flujo de casos de uso" para un proyecto universitario. Como programador de computadoras, me resulta bastante molesto no poder usar nuevas líneas y sangrías (como el código C/Java) para formatear el código LaTeX y hacerlo más legible, ya que sé que debo tener en cuenta el problema de los "espacios falsos". . Sé que puedo crear nuevas líneas seguras usando %, pero sigue siendo bastante extraño.

Entonces recordé que a cada carácter leído por TeX se le ha asignado un 'catcode' que gobierna su comportamiento, y hay un catcode para los caracteres que deben ser ignorados (9). Entonces, tuve la idea de cambiar temporalmente los códigos cat para nuevas líneas y pestañas (que se usarán para formatear el código) e ignorarlos mientras se definen las macros. Por ejemplo, este código:

% UCSubFlow counter definition, etc
\newenvironment{subflow}[1]{%
\subparagraph{Subflow \arabic{UCSubFlow}: #1}%
\stepcounter{UCSubFlow}%
\begin{enumerate}%
}{%
\end{enumerate}%
}

se convierte, en mi opinión, en más agradable de leer:

% Ignore tabs and newlines
\catcode9=9
\catcode13=9

% UCSubFlow counter definition, etc
\newenvironment{subflow}[1]{
    \subparagraph{Subflow \arabic{UCSubFlow}: #1}
    \stepcounter{UCSubFlow}
    \begin{enumerate}
}{
    \end{enumerate}
}
% More macro definitions...

% Return tabs and newlines back to normal
\catcode9=10
\catcode13=5

El espaciado al inicio de la línea son tabulaciones, no espacios (todavía se usan). Supongo que:

  • La mayoría de las veces, las macros no usan <tab>s en su definición.
  • La mayoría de las veces, las macros no tienen grandes párrafos de texto. Si quiero comenzar un párrafo en mi macro, es mejor usar\par
  • Las macros siempre se pueden escribir en una línea (las muy largas, pero una línea de todos modos)

Lo he usado en mi documento y parece estar todo bien. El entorno funciona como se esperaba y no parece haber roto nada. Por supuesto, mi entorno es bastante simple (una lista especial). Mi pregunta es:¿Es este 'truco' seguro en general cuando se trata de escritura de macros, o existe algún peligro oculto? (especialmente si uso macros de otros paquetes dentro de mi macro)

Respuesta1

En primer lugar, su intención se puede realizar de forma sencilla configurando \endlinechar=-1. No es necesario configurar el código cat porque ^^Mcausa \endlinechar-1que este carácter no esté insertado. No es necesario establecer el código cat para ^^I(tabulación) porque los espacios y las pestañas tienen el código cat 10 y simplemente se ignoran al principio de cada línea.

Pero este escenario es peligroso. Por supuesto, esto no se puede poner en el texto normal de un documento, porque después:

 Hello
 world!

obtenemos ¡Hola mundo! como el resultado. ¿Y el uso de esta configuración sólo durante la lectura de macros? Imagina la definición:

\def\a{Hello
       world!}

entonces ocurre el mismo problema que el anterior. Y el problema puede estar más oculto, por ejemplo:

\def\b{\ifnum\something=0
            123%
        \else
            456%
        \fi
}

Ahora, si el espacio está presente al final de cada línea entonces tenemos if(somenthing=0) 123 else 456 fipero si el espacio no está presente aquí entonces tenemos if(something=0123) else 456 fiy este es un comportamiento completamente diferente de dicha macro.

información relacionada