マクロを定義するときにタブと改行を無視しても安全ですか?

マクロを定義するときにタブと改行を無視しても安全ですか?

私は大学のプロジェクトで「ユースケースフロー」シーケンスをフォーマットするために、いくつかの LaTeX 環境を作成しました。コンピュータ プログラマーとして、LaTeX コードをフォーマットして読みやすくするために、改行やインデント (C/Java コードのように) を使用できないのは非常に不便です。「不要なスペース」の問題を認識している必要があるからです。 を使用して安全な改行を作成できることはわかっています%が、それでもかなり奇妙です。

そこで、TeX が読み取る各文字には、その動作を制御する「catcode」が割り当てられていること、そして無視しなければならない文字の catcode があることを思い出しました (9)。そこで、改行とタブ (コードのフォーマットに使用される) の catcode を一時的に変更し、マクロが定義されている間はそれらを無視するというアイデアを思いつきました。たとえば、次のコード:

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

私の意見としては、より楽しく読めるものになります:

% 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

行頭のスペースはスペースではなくタブです (スペースは引き続き使用されます)。次のことを想定しています。

  • ほとんどの場合、マクロは<tab>定義にsを使用しません
  • ほとんどの場合、マクロには長い段落のテキストはありません。マクロで段落を開始したい場合は、\par
  • マクロは常に 1 行で記述できます (非常に長いものでも 1 行で記述できます)

ドキュメントで使用しましたが、問題ないようです。環境は期待どおりに動作し、何も壊れていないようです。確かに、私の環境は非常に単純です (特別なリスト)。私の質問は次のとおりです。この「ハック」は、マクロの記述に関しては一般的に安全ですか、それとも隠れた危険がありますか? (特に、マクロ内で他のパッケージのマクロを使用する場合)

答え1

まず、 を設定することで簡単に目的を達成できます\endlinechar=-1。 ではこの文字が挿入されない^^Mため、 に catcode を設定する必要はありません。スペースとタブの catcode は 10 であり、各行の先頭では単に無視されるため、 (tab)\endlinechar-1に catcode を設定する必要はありません。^^I

しかし、この設定は危険です。もちろん、これを通常の文書のテキストに配置することはできません。

 Hello
 world!

結果として Helloworld! が得られます。この設定はマクロの読み取り時にのみ使用されるのでしょうか? 定義を想像してみてください:

\def\a{Hello
       world!}

すると、上記と同じ問題が発生します。また、問題はさらに隠れている可能性があります。たとえば、次のようになります。

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

ここで、各行の末尾にスペースがある場合は次のようになりますif(somenthing=0) 123 else 456 fiが、スペースがない場合は次のようになります。if(something=0123) else 456 fiこれは、このようなマクロの動作とはまったく異なります。

関連情報