Можно ли игнорировать символы табуляции и новой строки при определении макроса?

Можно ли игнорировать символы табуляции и новой строки при определении макроса?

Я написал несколько сред LaTeX для форматирования последовательности "use case flow" для проекта колледжа. Будучи программистом, я нахожу довольно раздражающим отсутствие возможности использовать переводы строк и отступы (как в коде C/Java) для форматирования кода LaTeX и повышения его читабельности, поскольку я знаю, что должен знать о проблеме "ложных пробелов". Я знаю, что могу делать безопасные переводы строк с помощью %, но это все равно довольно странно.

Затем я вспомнил, что каждому символу, считываемому 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

Прежде всего, ваше намерение может быть реализовано просто путем установки \endlinechar=-1. Вам не нужно устанавливать catcode для , ^^Mпотому что \endlinechar-1это приводит к тому, что этот символ не вставляется. Вам не нужно устанавливать catcode для ^^I(tab), потому что пробелы и табуляции имеют catcode 10 и они просто игнорируются в начале каждой строки.

Но эта настройка опасна. Конечно, это не может быть помещено в обычный текст документа, потому что после:

 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и это совершенно другое поведение такого макроса.

Связанный контент