매크로에서 문자를 활성화하기

매크로에서 문자를 활성화하기

나는 내가 똑똑하다고 생각해서 넣었다.이 코드인라인 수학 내에서 매크로로의 중단을 로컬에서 허용하려면 다음을 수행하십시오.

\documentclass{article}
\def\MakeCommaBreakable{%
    \def\OldComma{,}
    \catcode`\,=13
    \def,{%
        \ifmmode%
        \OldComma\discretionary{}{}{}%
        \else%
        \OldComma%
        \fi%
    }%
}
\begin{document}
    \MakeCommaBreakable
    $xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx$
\end{document}

이제 이것은 실패합니다. 첫 번째 오류:

! Missing control sequence inserted.
<inserted text> 
                \inaccessible 
l.14    \MakeCommaBreakable

이 오류의 원인은 무엇입니까?

답변1

비결은 쉼표를 만드는 것입니다.수학 활성

이렇게 하면 명령이 \MakeCommaBreakable제대로 실행될 수 있습니다.내부에공식이므로 수학 활성화 효과가 제한됩니다.

\documentclass{article}
\usepackage{amsmath}

\newcommand{\MakeCommaBreakable}{%
  \mathchardef\normalcomma=\mathcode`,
  \begingroup\lccode`~=`,\lowercase{\endgroup\let~}\BreakableComma
  \mathcode`,="8000
}
\newcommand{\BreakableComma}{%
  \normalcomma\mspace{0mu plus 6mu}\penalty0
}

\begin{document}

$\MakeCommaBreakable xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx,
  xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx,
  xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx$

\end{document}

여기에 이미지 설명을 입력하세요

코드에 어떤 문제가 있나요?

첫째, 고정되어 있더라도 외부 수준에서 쉼표를 활성화하는 것입니다.좋은 것. 그러나 이것이 주된 이유는 아닙니다. TeX가 의 정의를 읽을 때 \MakeBreakableComma대체 텍스트가 토큰화되고 ,범주 코드 12가 있으므로 를 따를 수 없습니다 \def.

트릭 을 사용하면 \lowercaseTeX가 보는 것은 활성 쉼표입니다. 왜냐하면 \lowercase카테고리 코드를 변경하지 않기 때문입니다.

~할 것 같다수학을 활성화하는 대신 쉼표를 활성화하지만 권장하지는 않습니다. 예를 들어 활성화되어 있으면 옵션 사양에서 사용할 수 없기 때문입니다. 대신 수학 활성 문자는 TeX가 수학 코드를 검사할 때만 "활성 드레스"를 입습니다.

\MakeBreakableComma완전성을 위해 외부 수준에 배치할 수도 있습니다 .모두수학 공식의 쉼표는 깨질 수 있습니다. 와 같은 것을 깨고 싶지 않기 때문에 절대 권장하지 않습니다 f(x,y).

답변2

\def\MakeCommaBreakable의 본문이 스캔될 때 ,in에는 \def,아직 13으로 설정된 catcode가 없으며 스캔 후 catcode가 저장되므로 정의 본문 내부의 catcode 변경에 영향을 받지 않으므로 TeX는 제어 순서를 불평합니다. 이후에 이 없습니다 /def. LaTeX 대신 Plain TeX를 사용하면 보다 직관적인 오류 메시지가 표시될 수 있습니다.

! Missing control sequence inserted.
<inserted text> 
                \inaccessible 
<to be read again> 
                   ,
\MakeCommaBreakable ... {,} \catcode `\,=13 \def ,
                                                  {\ifmmode \OldComma \discr...
l.12 \MakeCommaBreakable

\discretionary{}{}{}나는 당신이 깨뜨릴 수 있는 명령을 얻고 싶다고 가정하지만 , 줄에 늘릴 수 있는 공간(접착제)이 없으면 TeX는 거의 항상 가득 찬 상자에 대해 불평할 것이라는 문제가 있습니다 . 필요에 따라 접착제를 원하거나 원하지 않을 수도 있고 크기를 변경할 수도 있습니다.

올바른 방법은 다음과 같습니다.

\bgroup
% make sure it is defined before catcode change to prevent infinite expand
\gdef\OldComma{,}
\catcode`\,=13
\gdef\MakeCommaBreakable{%
    \catcode`\,=13
    \def,{%
        \ifmmode
% You don't need to place % after control token, because
% TeX already ignores them.
% Also, consider use math glue to give some adjustable spacing, otherwise
% TeX would almost always report overfull box for a long line like this
        \OldComma\>\allowbreak
        \else
        \OldComma
        \fi
    }%
}
\egroup
\MakeCommaBreakable
    $xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx, xxx$
\bye

관련 정보