Como redefinir o comando \\ dentro de uma tabular usando expl3?

Como redefinir o comando \\ dentro de uma tabular usando expl3?

Quando tento redefinir \\dentro de uma tabela, minha redefinição não funciona. Eu entendi, o que provavelmente depois do gancho \AtBeginEnvironmentalgo redefine meu \\comando, mas não sei como consertar. Ajude-me por favor, como redefinir \\dentro de uma tabela. Obrigado a todos por qualquer ajuda.

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

Responder1

É difícil...

Bem, redefinir é na verdade a parte fácil: seu código não funcionou porque uma das primeiras coisas que o tabularambiente faz é \let \\=\@tabularcr, então sua redefinição acabou. Você tem que redefinir \@tabularcrem vez disso. Lembre-se também de que \\há um argumento opcional, então você também terá que lidar com isso. E como esse \@tabularcré o comando real que você deseja, você pode redefini-lo apenas uma vez, em vez de em todos os ambientes.

A parte difícil é que depois do \@tabularcrTeX começar a procurar por \omit, então se você fizer isso \messageneste ponto você quebrará completamente \multicolumn. Você deve emitir o \message(ou o que pretende fazer aqui)anteso original \@tabularcrou dentro \noalign.

Você provavelmente também deseja levar em consideração o arraypacote e o tabularx. arrayundefines \@tabularcre usa apenas \@arraycr, então você deve verificar isso. A redefinição vai depender se acontecer antes ou depois do carregamento do pacote, então coloquei \AtBeginDocumentpara ter certeza.


O genérico \kozlovskiy_tabular_cr:Nnnleva três argumentos:

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

então acontece

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

Essa linha irá xexpandir tudo:

  • \exp_not:Nimpede a expansão<cr command>
  • \IfValueT {#2} { * }expande para *ou nada, dependendo se houve uma *discussão
  • \IfValueT {#3} { [{#3}] }expande para [#3]ou nada, dependendo se houve um argumento opcional

e finalmente se tornar:

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

Observe também que tabularxo corpo do ambiente será executado várias vezes, então você pode querer:

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

informação relacionada