
저는 대학 프로젝트의 "사용 사례 흐름" 시퀀스 형식을 지정하기 위해 여러 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}%
}
IMO는 읽기가 더 즐겁습니다.
% 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
. 이 문자가 삽입되지 않기 ^^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
이는 해당 매크로의 동작과 완전히 다릅니다.