¿Cómo redefinir el comando \\ dentro de una tabla usando expl3?

¿Cómo redefinir el comando \\ dentro de una tabla usando expl3?

Cuando intento redefinir \\dentro de una tabla, mi redefinición no funciona. Entendí que probablemente después del gancho \AtBeginEnvironmentalgo redefine mi \\comando, pero no sé cómo solucionarlo. Ayúdenme por favor, cómo redefinir \\dentro de una tabla. Gracias a todos por cualquier ayuda.

\documentclass{article}
\usepackage{expl3,etoolbox}
\ExplSyntaxOn
\AtBeginEnvironment{tabular}{
\cs_set_eq:Nc \\ {orig_endofline}
\cs_gset_protected:Npn \\ {
\orig_endofline
\message{new_line}
}
}
\ExplSyntaxOff
\author{Alexandr Kozlovskiy}
\title{test}
\begin{document}
\maketitle{}
\begin{tabular}{cc}
a&b\\
\end{tabular}
\end{document}

Respuesta1

Es dificil...

Bueno, redefinir es en realidad la parte fácil: su código no funcionó porque una de las primeras cosas tabularque hace el entorno es \let \\=\@tabularcr, por lo que su redefinición desapareció. Tienes que redefinir \@tabularcren su lugar. Recuerde también que \\tiene un argumento opcional, por lo que también debe afrontarlo. Y dado que \@tabularcres el comando real que desea, puede redefinirlo sólo una vez, en lugar de en cada entorno.

La parte difícil es que después \@tabularcr, TeX comienza a buscar \omit, por lo que si lo haces \messageen este punto, te romperás por completo \multicolumn. Tienes que emitir el \message(o lo que sea que pretendas hacer aquí)antesel original \@tabularcr, o el interior \noalign.

Probablemente también quieras tener en cuenta el arraypaquete y tabularx. arrayundefines \@tabularcry uses only \@arraycr, por lo que debes verificar eso. La redefinición dependerá si ocurre antes o después de que se cargue el paquete, así que lo pongo \AtBeginDocumentpara estar seguro.


El genérico \kozlovskiy_tabular_cr:Nnntoma tres argumentos:

\kozlovskiy_tabular_cr:Nnn <cr command> <star arg> <opt arg>

entonces lo hace

\use:x { \exp_not:N #1 \IfValueT {#2} { * } \IfValueT {#3} { [{#3}] } }

Esa línea expandirá xtodo:

  • \exp_not:Npreviene la expansión de<cr command>
  • \IfValueT {#2} { * }se expande a *o nada, dependiendo de si hubo una *discusión
  • \IfValueT {#3} { [{#3}] }se expande a [#3]o nada, dependiendo de si había un argumento opcional

y finalmente convertirse en:

<cr command> <star arg (if present)> <opt arg (if present)>

También tenga en cuenta que tabularxejecutará el cuerpo del entorno varias veces, por lo que es posible que desee:

\cs_new_protected:Npn \kozlovskiy_tabular_cr:Nnn #1 #2 #3
  {
    \use:x { \exp_not:N #1 \IfValueT {#2} { * } \IfValueT {#3} { [{#3}] } }
    \token_if_eq_meaning:NNF \@footnotetext \TX@trial@ftn
      { \noalign { \message{<<<<new_line>>>>} } }
  }

\documentclass{article}
\usepackage{expl3,xparse}
\usepackage{array,tabularx,colortbl}
\ExplSyntaxOn
\makeatletter
\cs_new_protected:Npn \kozlovskiy_tabular_cr:Nnn #1 #2 #3
  {
    % \message{new_line} % before or
    \use:x { \exp_not:N #1 \IfValueT {#2} { * } \IfValueT {#3} { [{#3}] } }
    \noalign { \message{<<<<new_line>>>>} } % after in \noalign
    %
    % \message{new_line} % this breaks \multicolumn
  }
\AtBeginDocument
  {
    \@ifpackageloaded{array}{ }
      {
        \cs_new_eq:NN \LTX@tabularcr \@tabularcr
        \RenewDocumentCommand \@tabularcr { s o }
          { \kozlovskiy_tabular_cr:Nnn \LTX@tabularcr {#1} {#2} }
      }
    \cs_new_eq:NN \LTX@arraycr \@arraycr
    \RenewDocumentCommand \@arraycr { s o }
      { \kozlovskiy_tabular_cr:Nnn \LTX@arraycr {#1} {#2} }
  }
\ExplSyntaxOff
\author{Alexandr Kozlovskiy}
\title{test}
\begin{document}
\maketitle{}
\begin{tabular}{cc}
a&b\\
\multicolumn{2}{c}{c and d}\\
\end{tabular}
\begin{tabularx}{2cm}{Xc}
a&b\\
\multicolumn{2}{c}{c and d}\\
\end{tabularx}
\end{document}

información relacionada