
Escrevi vários ambientes LaTeX para formatar uma sequência de "fluxo de casos de uso" para um projeto universitário. Sendo um programador de computador, acho muito chato não poder usar novas linhas e recuo (como código C/Java) para formatar o código LaTeX e torná-lo mais legível, pois sei que devo estar ciente do problema dos "espaços espúrios" . Eu sei que posso criar novas linhas seguras usando %
, mas ainda é bem estranho.
Então, lembrei que cada caractere lido pelo TeX possui um 'catcode' atribuído que rege seu comportamento, e existe um catcode para caracteres que devem ser ignorados (9). Então, tive a ideia de alterar temporariamente os catcodes para novas linhas e tabulações (que serão usadas para formatação do código) e ignorá-los enquanto as macros estão sendo definidas. Por exemplo, este código:
% UCSubFlow counter definition, etc
\newenvironment{subflow}[1]{%
\subparagraph{Subflow \arabic{UCSubFlow}: #1}%
\stepcounter{UCSubFlow}%
\begin{enumerate}%
}{%
\end{enumerate}%
}
torna-se, IMO, mais agradável de ler:
% 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
O espaçamento no início da linha são tabulações, não espaços (eles ainda são usados). Estou assumindo que:
- Na maioria das vezes, as macros não usam
<tab>
s em sua definição - Na maioria das vezes, as macros não possuem grandes parágrafos de texto. Se eu quiser iniciar um parágrafo na minha macro, é melhor usar
\par
- Macros sempre podem ser escritas em uma linha (as muito longas, mas de qualquer maneira uma linha)
Eu usei isso no meu documento e parece estar tudo bem. O ambiente funciona conforme o esperado e não parece ter quebrado nada. É verdade que meu ambiente é bastante simples (uma lista especial). Minha pergunta é:esse 'hack' é seguro em geral quando se trata de gravação de macros, ou existe algum perigo oculto? (especialmente se eu usar macros de outros pacotes dentro da minha macro)
Responder1
Primeiro de tudo, sua intenção pode ser realizada de forma simples configurando \endlinechar=-1
. Você não precisa definir catcode porque ^^M
faz \endlinechar-1
com que esse caractere não seja inserido. Você não precisa definir catcode para ^^I
(tab) porque espaços e tabulações têm catcode 10 e são simplesmente ignorados no início de cada linha.
Mas esta configuração é perigosa. Claro, isso não pode ser colocado no texto normal do documento, porque depois:
Hello
world!
nós temos Helloworld! como resultado. E a utilização desta configuração apenas durante a leitura de macros? Imagine a definição:
\def\a{Hello
world!}
então ocorre o mesmo problema acima. E o problema pode estar mais oculto, por exemplo:
\def\b{\ifnum\something=0
123%
\else
456%
\fi
}
Agora, se o espaço estiver presente no final de cada linha então temos, if(somenthing=0) 123 else 456 fi
mas se o espaço não estiver presente aqui então temos if(something=0123) else 456 fi
e este é um comportamento completamente diferente dessa macro.