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