Activar un personaje en una macro

Activar un personaje en una macro

Pensé que era inteligente, así que puseeste codigopara permitir localmente saltos dentro de las matemáticas en línea en una macro:

\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}

Ahora bien, esto falla; primer error:

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

¿Qué causa este error?

Respuesta1

El truco consiste en hacer la coma.matematicas activas

De esta manera, el comando \MakeCommaBreakablepuede ir correctamenteadentrola fórmula, por lo que el efecto de la activación matemática es limitado.

\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}

ingrese la descripción de la imagen aquí

¿Cuál es el problema con tu código?

Primero, incluso si está arreglado, estás activando la coma en el nivel externo, lo cual no es unBuena cosa. Pero esta no es la razón principal: cuando TeX lee la definición de \MakeBreakableComma, el texto de reemplazo se tokeniza y ,tiene el código de categoría 12, por lo que no puede seguir \def.

Con el \lowercasetruco, lo que TeX ve es una coma activa, porque \lowercaseno cambia los códigos de categoría.

podríaactive la coma en lugar de solo las matemáticas, pero no lo recomendaría, porque si está activa no puede usarla en las especificaciones de opciones, por ejemplo. En cambio, un personaje activo en matemáticas adopta la “vestimenta activa” solo cuando TeX examina códigos matemáticos.

Para completar, también puedes colocarlo \MakeBreakableCommaen el nivel exterior, ytodolas comas en las fórmulas matemáticas se volverían rompibles: definitivamente no se recomienda, porque no querrás romper algo como f(x,y).

Respuesta2

En el momento en que \def\MakeCommaBreakablese escaneó el cuerpo, el código ,de entrada \def,aún no tiene el código cat establecido en 13, y después del escaneo, el código cat se guardará, por lo que no se verá afectado por el cambio del código cat dentro del cuerpo de la definición, por lo que TeX se quejará de la secuencia de control. falta después /def. Usar Plain TeX en lugar de LaTeX puede generar un mensaje de error más intuitivo:

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

Supongo que desea obtener un comando rompible, pero hay algún problema con only \discretionary{}{}{}, que si no hay espacio estirable (pegamento) en una línea, TeX casi siempre se quejará de que el cuadro está demasiado lleno. Depende de sus necesidades, es posible que desee o no ese pegamento o cambiar su tamaño.

La forma correcta podría ser:

\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

información relacionada